From da74288339563759f568aa5052fdce4c45ebcd22 Mon Sep 17 00:00:00 2001 From: Vijay Bellur Date: Thu, 30 Sep 2010 11:41:07 +0000 Subject: glusterfsd: perform init new graph if re-configure fails Signed-off-by: Vijay Bellur Signed-off-by: Vijay Bellur BUG: 1235 (Bug for all pump/migrate commits) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1235 --- glusterfsd/src/glusterfsd-mgmt.c | 10 ++++------ libglusterfs/src/xlator.c | 16 ++++++++++++---- xlators/protocol/client/src/client.c | 35 +++++++++++++++++++++++++++-------- 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c index ac0abfac35e..b1fa5ca47e4 100644 --- a/glusterfsd/src/glusterfsd-mgmt.c +++ b/glusterfsd/src/glusterfsd-mgmt.c @@ -229,7 +229,7 @@ out: return ret; } -/* Function has 3types of return value 0, -ve , 1 +/* Function has 3types of return value 0, -ve , 1 * return 0 =======> reconfiguration of options has succeded * return 1 =======> the graph has to be reconstructed and all the xlators should be inited * return -1(or -ve) =======> Some Internal Error occured during the operation @@ -249,7 +249,7 @@ glusterfs_volfile_reconfigure (FILE *newvolfile_fp) goto out; if (!oldvollen) { - ret = 1; // Has to call INIT for the whole graph + ret = 1; // Has to call INIT for the whole graph goto out; } fwrite (oldvolfile, oldvollen, 1, oldvolfile_fp); @@ -300,6 +300,7 @@ glusterfs_volfile_reconfigure (FILE *newvolfile_fp) if (ret) { gf_log ("glusterfsd-mgmt", GF_LOG_DEBUG, "Could not reconfigure new options in old graph"); + goto out; } ret = 0; @@ -359,13 +360,12 @@ mgmt_getspec_cbk (struct rpc_req *req, struct iovec *iov, int count, /* Check if only options have changed. No need to reload the * volfile if topology hasn't changed. - * glusterfs_volfile_reconfigure returns 3 possible return states + * glusterfs_volfile_reconfigure returns 3 possible return states * return 0 =======> reconfiguration of options has succeded * return 1 =======> the graph has to be reconstructed and all the xlators should be inited * return -1(or -ve) =======> Some Internal Error occured during the operation */ - ret = glusterfs_volfile_reconfigure (tmpfp); if (ret == 0) { gf_log ("glusterfsd-mgmt", GF_LOG_DEBUG, @@ -378,8 +378,6 @@ mgmt_getspec_cbk (struct rpc_req *req, struct iovec *iov, int count, goto out; } - - ret = glusterfs_process_volfp (ctx, tmpfp); if (ret) goto out; diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index a09dd2e1eb0..105ee497b17 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -921,6 +921,7 @@ xlator_reconfigure_rec (xlator_t *old_xl, xlator_t *new_xl) { xlator_list_t *trav1 = NULL; xlator_list_t *trav2 = NULL; + int32_t ret = 0; if (old_xl == NULL || new_xl == NULL) { gf_log ("xlator", GF_LOG_DEBUG, "invalid argument"); @@ -931,7 +932,10 @@ xlator_reconfigure_rec (xlator_t *old_xl, xlator_t *new_xl) trav2 = new_xl->children; while (trav1 && trav2) { - xlator_reconfigure_rec (trav1->xlator, trav2->xlator); + ret = xlator_reconfigure_rec (trav1->xlator, trav2->xlator); + + if (ret) + goto out; gf_log (trav1->xlator->name, GF_LOG_DEBUG, "reconfigured"); @@ -939,12 +943,16 @@ xlator_reconfigure_rec (xlator_t *old_xl, xlator_t *new_xl) trav2 = trav2->next; } - if (old_xl->reconfigure) - old_xl->reconfigure (old_xl, new_xl->options); + if (old_xl->reconfigure) { + ret = old_xl->reconfigure (old_xl, new_xl->options); + if (ret) + goto out; + } else gf_log (old_xl->name, GF_LOG_DEBUG, "No reconfigure() found"); - return 0; +out: + return ret; } int diff --git a/xlators/protocol/client/src/client.c b/xlators/protocol/client/src/client.c index b703b88f4b7..84f3778393f 100644 --- a/xlators/protocol/client/src/client.c +++ b/xlators/protocol/client/src/client.c @@ -1769,14 +1769,18 @@ int reconfigure (xlator_t *this, dict_t *options) { int ret = 0; - int timeout_ret=0; - int ping_timeout; - int frame_timeout; + int timeout_ret = 0; + int ping_timeout = 0; + int frame_timeout = 0; clnt_conf_t *conf = NULL; + char *old_remote_subvol = NULL; + char *new_remote_subvol = NULL; + int subvol_ret = 0; + + - conf = this->private; - + timeout_ret = dict_get_int32 (options, "frame-timeout", &frame_timeout); if (timeout_ret == 0) { @@ -1798,7 +1802,7 @@ reconfigure (xlator_t *this, dict_t *options) goto out; } - + gf_log (this->name, GF_LOG_DEBUG, "Reconfiguring otion frame-timeout to %d", frame_timeout); @@ -1827,15 +1831,30 @@ reconfigure (xlator_t *this, dict_t *options) ret = -1; goto out; } - + gf_log (this->name, GF_LOG_DEBUG, "Reconfiguring " "'option ping-timeout' to %d", ping_timeout); conf->opt.ping_timeout = ping_timeout; } + subvol_ret = dict_get_str (this->options, "remote-subvolume", + &old_remote_subvol); + + if (subvol_ret == 0) { + + subvol_ret = dict_get_str (options, "remote-subvolume", + &new_remote_subvol); + + if (subvol_ret == 0) { + if (strcmp (old_remote_subvol, new_remote_subvol)) { + ret = 1; + goto out; + } + } + } + out: return ret; - } -- cgit