summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShehjar Tikoo <shehjart@gluster.com>2010-09-22 03:32:16 +0000
committerVijay Bellur <vijay@dev.gluster.com>2010-09-22 04:14:23 -0700
commit6b2e2fb0903fc56105c267881f202a4865a8b6c7 (patch)
tree49467f7c86a8ddd344b45ee4c7cd4f129ef0363f
parenta4c948aca6058049523e31acf33ce5770f8693ad (diff)
distribute: Propagate CHILD-UP when all subvols are up
Signed-off-by: Shehjar Tikoo <shehjart@gluster.com> Signed-off-by: Vijay Bellur <vijay@dev.gluster.com> 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
-rw-r--r--xlators/cluster/dht/src/dht-common.c20
-rw-r--r--xlators/cluster/dht/src/dht-common.h1
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;