summaryrefslogtreecommitdiffstats
path: root/xlators/cluster
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/cluster')
-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;