From 6b2e2fb0903fc56105c267881f202a4865a8b6c7 Mon Sep 17 00:00:00 2001 From: Shehjar Tikoo Date: Wed, 22 Sep 2010 03:32:16 +0000 Subject: distribute: Propagate CHILD-UP when all subvols are up Signed-off-by: Shehjar Tikoo Signed-off-by: Vijay Bellur BUG: 1643 (Initial requests after mount ESTALE if DHT subvolumes connect after nfs startup) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1643 --- xlators/cluster/dht/src/dht-common.c | 20 +++++++++++++++++--- xlators/cluster/dht/src/dht-common.h | 1 + 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 92ea5854e20..bec412c4188 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -4555,6 +4555,10 @@ dht_notify (xlator_t *this, int event, void *data, ...) dht_conf_t *conf = NULL; int ret = -1; + /* Notify is on by default for all events except CHILD_UP. Do not + * notify parent for CHILD_UP till all distribute children have come up. + */ + int notify = 1; conf = this->private; @@ -4580,7 +4584,13 @@ dht_notify (xlator_t *this, int event, void *data, ...) LOCK (&conf->subvolume_lock); { - conf->subvolume_status[cnt] = 1; + if (!conf->subvolume_status[cnt]) { + conf->subvolume_status[cnt] = 1; + ++conf->upsubvols; + } + + if (conf->upsubvols != conf->subvolume_cnt) + notify = 0; } UNLOCK (&conf->subvolume_lock); @@ -4608,14 +4618,18 @@ dht_notify (xlator_t *this, int event, void *data, ...) LOCK (&conf->subvolume_lock); { - conf->subvolume_status[cnt] = 0; + if (conf->subvolume_status[cnt]) { + conf->subvolume_status[cnt] = 0; + --conf->upsubvols; + } } UNLOCK (&conf->subvolume_lock); break; } - ret = default_notify (this, event, data); + if (notify) + ret = default_notify (this, event, data); return ret; } diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 0d028a2e542..918eb566b19 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -156,6 +156,7 @@ struct dht_conf { void *private; /* Can be used by wrapper xlators over dht */ gf_boolean_t use_readdirp; + int upsubvols; /* Count the number of online children*/ }; typedef struct dht_conf dht_conf_t; -- cgit