summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmar Tumballi <amar@gluster.com>2011-04-05 04:00:26 +0000
committerVijay Bellur <vijay@gluster.com>2011-04-06 10:51:52 -0700
commit322ed6812d9a5b3c975b5c949ff5adfd16d40eb4 (patch)
treeab0d0c65e00f4a7da570338c79ad9a54fcbf55c5
parentb8ae8d95a814d9329c34e6bf3d705c0fc07115b7 (diff)
protocol/client: make sure to send only genuine events up to parent
that way parent notify logic is fine. also, remove 'xlator_notify()' call in code, instead use 'default_notify()' Signed-off-by: Amar Tumballi <amar@gluster.com> Signed-off-by: Vijay Bellur <vijay@gluster.com> BUG: 2584 (Inode number changes on a directory when one of subvolumes is down in replicate) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2584
-rw-r--r--xlators/protocol/client/src/client-handshake.c49
-rw-r--r--xlators/protocol/client/src/client.c31
-rw-r--r--xlators/protocol/client/src/client.h4
3 files changed, 48 insertions, 36 deletions
diff --git a/xlators/protocol/client/src/client-handshake.c b/xlators/protocol/client/src/client-handshake.c
index b5c894fdcff..bb658fd0cf3 100644
--- a/xlators/protocol/client/src/client-handshake.c
+++ b/xlators/protocol/client/src/client-handshake.c
@@ -375,24 +375,16 @@ unwind:
int
client_notify_parents_child_up (xlator_t *this)
{
- xlator_list_t *parent = NULL;
-
- /* As fuse is not 'parent' of any translator now, triggering its
- CHILD_UP event is hacky in case client has only client protocol */
- if (!this->parents && this->ctx && this->ctx->master) {
- /* send notify to 'ctx->master' if it exists */
- xlator_notify (this->ctx->master, GF_EVENT_CHILD_UP,
- this->graph);
- } else {
+ clnt_conf_t *conf = NULL;
+ int ret = 0;
- parent = this->parents;
- while (parent) {
- xlator_notify (parent->xlator, GF_EVENT_CHILD_UP,
- this);
- parent = parent->next;
- }
- }
+ conf = this->private;
+ ret = default_notify (this, GF_EVENT_CHILD_UP, NULL);
+ if (ret)
+ gf_log (this->name, GF_LOG_INFO,
+ "notify of CHILD_UP failed");
+ conf->last_sent_event = GF_EVENT_CHILD_UP;
return 0;
}
@@ -809,7 +801,6 @@ client_setvolume_cbk (struct rpc_req *req, struct iovec *iov, int count, void *m
clnt_conf_t *conf = NULL;
xlator_t *this = NULL;
dict_t *reply = NULL;
- xlator_list_t *parent = NULL;
char *process_uuid = NULL;
char *remote_error = NULL;
char *remote_subvol = NULL;
@@ -875,13 +866,11 @@ client_setvolume_cbk (struct rpc_req *req, struct iovec *iov, int count, void *m
remote_error ? remote_error : strerror (op_errno));
errno = op_errno;
if (op_errno == ESTALE) {
- parent = this->parents;
- while (parent) {
- xlator_notify (parent->xlator,
- GF_EVENT_VOLFILE_MODIFIED,
- this);
- parent = parent->next;
- }
+ ret = default_notify (this, GF_EVENT_VOLFILE_MODIFIED, NULL);
+ if (ret)
+ gf_log (this->name, GF_LOG_INFO,
+ "notify of VOLFILE_MODIFIED failed");
+ conf->last_sent_event = GF_EVENT_VOLFILE_MODIFIED;
}
goto out;
}
@@ -938,13 +927,11 @@ out:
* tell the parents that i am all ok..
*/
gf_log (this->name, GF_LOG_INFO, "sending CHILD_CONNECTING event");
- parent = this->parents;
- while (parent) {
- xlator_notify (parent->xlator,
- GF_EVENT_CHILD_CONNECTING, this);
- parent = parent->next;
- }
-
+ ret = default_notify (this, GF_EVENT_CHILD_CONNECTING, NULL);
+ if (ret)
+ gf_log (this->name, GF_LOG_INFO,
+ "notify of CHILD_CONNECTING failed");
+ conf->last_sent_event = GF_EVENT_CHILD_CONNECTING;
conf->connecting= 1;
}
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)
diff --git a/xlators/protocol/client/src/client.h b/xlators/protocol/client/src/client.h
index 221ba542e4f..21451b37e2d 100644
--- a/xlators/protocol/client/src/client.h
+++ b/xlators/protocol/client/src/client.h
@@ -60,6 +60,10 @@ typedef struct clnt_conf {
connection is established */
gf_lock_t rec_lock;
int skip_notify;
+
+ int last_sent_event; /* Flag used to make sure we are
+ not repeating the same event
+ which was sent earlier */
} clnt_conf_t;
typedef struct _client_fd_ctx {