diff options
Diffstat (limited to 'libglusterfs')
-rw-r--r-- | libglusterfs/src/cluster-syncop.c | 7 | ||||
-rw-r--r-- | libglusterfs/src/syncop.c | 4 | ||||
-rw-r--r-- | libglusterfs/src/syncop.h | 2 |
3 files changed, 12 insertions, 1 deletions
diff --git a/libglusterfs/src/cluster-syncop.c b/libglusterfs/src/cluster-syncop.c index 98a46c85e4b..36945d69379 100644 --- a/libglusterfs/src/cluster-syncop.c +++ b/libglusterfs/src/cluster-syncop.c @@ -31,13 +31,18 @@ if (syncbarrier_init (&__local.barrier)) \ break; \ frame->local = &__local; \ + for (__i = 0; __i < numsubvols; __i++) { \ + if (on[__i]) { \ + __count++; \ + } \ + } \ + __local.barrier.waitfor = __count; \ for (__i = 0; __i < numsubvols; __i++) { \ if (!on[__i]) \ continue; \ STACK_WIND_COOKIE (frame, cluster_##fop##_cbk, \ (void *)(long) __i, subvols[__i], \ subvols[__i]->fops->fop, args); \ - __count++; \ } \ syncbarrier_wait (&__local.barrier, __count); \ syncbarrier_destroy (&__local.barrier); \ diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c index 3fa798a4342..246229f1cc2 100644 --- a/libglusterfs/src/syncop.c +++ b/libglusterfs/src/syncop.c @@ -1086,6 +1086,7 @@ syncbarrier_init (struct syncbarrier *barrier) pthread_cond_init (&barrier->cond, 0); barrier->count = 0; + barrier->waitfor = 0; INIT_LIST_HEAD (&barrier->waitq); return pthread_mutex_init (&barrier->guard, 0); @@ -1162,6 +1163,8 @@ __syncbarrier_wake (struct syncbarrier *barrier) } barrier->count++; + if (barrier->waitfor && (barrier->count < barrier->waitfor)) + return 0; pthread_cond_signal (&barrier->cond); if (!list_empty (&barrier->waitq)) { @@ -1169,6 +1172,7 @@ __syncbarrier_wake (struct syncbarrier *barrier) list_del_init (&task->waitq); synctask_wake (task); } + barrier->waitfor = 0; return 0; } diff --git a/libglusterfs/src/syncop.h b/libglusterfs/src/syncop.h index 0d0da58f4cf..a9cdee1fa00 100644 --- a/libglusterfs/src/syncop.h +++ b/libglusterfs/src/syncop.h @@ -138,6 +138,8 @@ struct syncbarrier { pthread_cond_t cond; /* waiting non-synctasks */ struct list_head waitq; /* waiting synctasks */ int count; /* count the number of wakes */ + int waitfor; /* no. of wakes until which task can be in + waitq before being woken up. */ }; typedef struct syncbarrier syncbarrier_t; |