summaryrefslogtreecommitdiffstats
path: root/xlators/protocol/client/src/client.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/protocol/client/src/client.c')
-rw-r--r--xlators/protocol/client/src/client.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/xlators/protocol/client/src/client.c b/xlators/protocol/client/src/client.c
index 22394f59fcd..ee8aecc2264 100644
--- a/xlators/protocol/client/src/client.c
+++ b/xlators/protocol/client/src/client.c
@@ -1859,10 +1859,14 @@ client_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,
"handshake msg returned %d", ret);
} else {
//conf->rpc->connected = 1;
- ret = default_notify (this, GF_EVENT_CHILD_UP, NULL);
- if (ret)
- gf_log (this->name, GF_LOG_WARNING,
- "default notify failed");
+ if (conf->last_sent_event != GF_EVENT_CHILD_UP) {
+ ret = default_notify (this, GF_EVENT_CHILD_UP,
+ NULL);
+ if (ret)
+ gf_log (this->name, GF_LOG_INFO,
+ "CHILD_UP notify failed");
+ conf->last_sent_event = GF_EVENT_CHILD_UP;
+ }
}
break;
}
@@ -1874,7 +1878,20 @@ client_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,
if (conf->connected)
gf_log (this->name, GF_LOG_NORMAL,
"disconnected");
- default_notify (this, GF_EVENT_CHILD_DOWN, NULL);
+
+ /* If the CHILD_DOWN event goes to parent xlator
+ multiple times, the logic of parent xlator notify
+ may get screwed up.. (eg. CHILD_MODIFIED event in
+ replicate), hence make sure events which are passed
+ to parent are genuine */
+ if (conf->last_sent_event != GF_EVENT_CHILD_DOWN) {
+ ret = default_notify (this, GF_EVENT_CHILD_DOWN,
+ NULL);
+ if (ret)
+ gf_log (this->name, GF_LOG_INFO,
+ "CHILD_DOWN notify failed");
+ conf->last_sent_event = GF_EVENT_CHILD_DOWN;
+ }
} else {
if (conf->connected)
gf_log (this->name, GF_LOG_DEBUG,
@@ -1923,6 +1940,7 @@ notify (xlator_t *this, int32_t event, void *data, ...)
"got %d, calling default_notify ()", event);
default_notify (this, event, data);
+ conf->last_sent_event = event;
break;
}
@@ -2241,6 +2259,8 @@ init (xlator_t *this)
LOCK_INIT (&conf->rec_lock);
+ conf->last_sent_event = -1; /* To start with we don't have any events */
+
this->private = conf;
/* If it returns -1, then its a failure, if it returns +1 we need
@@ -2258,6 +2278,7 @@ init (xlator_t *this)
goto out;
}
+
ret = client_init_rpc (this);
out:
if (ret)