Patchwork [BUG:1643,3/4] distribute: Propagate CHILD-UP when all subvols are up

login
register
Submitter Shehjar Tikoo
Date 2010-09-22 09:02:16
Message ID <1285146137-2648-3-git-send-email-shehjart@gluster.com>
Download mbox | patch
Permalink /patch/4920/
State Accepted
Headers show

Comments

Shehjar Tikoo - 2010-09-22 09:02:16
From: Shehjar Tikoo <shehjart@gluster.com>


Signed-off-by: Shehjar Tikoo <shehjart@gluster.com>
---
 xlators/cluster/dht/src/dht-common.c |   20 +++++++++++++++++---
 xlators/cluster/dht/src/dht-common.h |    1 +
 2 files changed, 18 insertions(+), 3 deletions(-)

Patch

diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
index 92ea585..bec412c 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 0d028a2..918eb56 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;