diff options
Diffstat (limited to 'glusterfsd/src/glusterfsd-mgmt.c')
-rw-r--r-- | glusterfsd/src/glusterfsd-mgmt.c | 98 |
1 files changed, 66 insertions, 32 deletions
diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c index c17bf3bb6fc..ca706d1020d 100644 --- a/glusterfsd/src/glusterfsd-mgmt.c +++ b/glusterfsd/src/glusterfsd-mgmt.c @@ -1761,12 +1761,6 @@ out: return ret; } - -/* XXX: move these into @ctx */ -static char *oldvolfile = NULL; -static int oldvollen; - - int mgmt_getspec_cbk (struct rpc_req *req, struct iovec *iov, int count, void *myframe) @@ -1777,7 +1771,10 @@ mgmt_getspec_cbk (struct rpc_req *req, struct iovec *iov, int count, int ret = 0, locked = 0; ssize_t size = 0; FILE *tmpfp = NULL; - char *volfilebuf = NULL; + char *volfile_id = NULL; + gf_volfile_t *volfile_obj = NULL; + gf_volfile_t *volfile_tmp = NULL; + char sha256_hash[SHA256_DIGEST_LENGTH] = {0, }; frame = myframe; ctx = frame->this->ctx; @@ -1804,14 +1801,29 @@ mgmt_getspec_cbk (struct rpc_req *req, struct iovec *iov, int count, ret = 0; size = rsp.op_ret; + glusterfs_compute_sha256 ((const unsigned char *) rsp.spec, size, + sha256_hash); + + volfile_id = frame->local; + LOCK (&ctx->volfile_lock); { locked = 1; - if (size == oldvollen && (memcmp (oldvolfile, rsp.spec, size) == 0)) { - gf_log (frame->this->name, GF_LOG_INFO, - "No change in volfile, continuing"); - goto out; + list_for_each_entry (volfile_obj, &ctx->volfile_list, + volfile_list) { + if (!strcmp (volfile_id, volfile_obj->vol_id)) { + if (!strncmp (sha256_hash, + volfile_obj->volfile_checksum, + sizeof (volfile_obj->volfile_checksum))) { + gf_log (frame->this->name, GF_LOG_INFO, + "No change in volfile," + "continuing"); + goto out; + } + volfile_tmp = volfile_obj; + break; + } } tmpfp = tmpfile (); @@ -1835,21 +1847,19 @@ mgmt_getspec_cbk (struct rpc_req *req, struct iovec *iov, int count, * return -1(or -ve) =======> Some Internal Error occurred during the operation */ - ret = glusterfs_volfile_reconfigure (oldvollen, tmpfp, ctx, oldvolfile); + ret = glusterfs_volfile_reconfigure (tmpfp, ctx); if (ret == 0) { gf_log ("glusterfsd-mgmt", GF_LOG_DEBUG, "No need to re-load volfile, reconfigure done"); - if (oldvolfile) - volfilebuf = GF_REALLOC (oldvolfile, size); - else - volfilebuf = GF_CALLOC (1, size, gf_common_mt_char); - if (!volfilebuf) { + if (!volfile_tmp) { ret = -1; + gf_log ("mgmt", GF_LOG_ERROR, "Graph " + "reconfigure succeeded with out having " + "checksum."); goto out; } - oldvolfile = volfilebuf; - oldvollen = size; - memcpy (oldvolfile, rsp.spec, size); + strncpy (volfile_tmp->volfile_checksum, sha256_hash, + sizeof (volfile_tmp->volfile_checksum)); goto out; } @@ -1865,19 +1875,23 @@ mgmt_getspec_cbk (struct rpc_req *req, struct iovec *iov, int count, if (ret) goto out; - if (oldvolfile) - volfilebuf = GF_REALLOC (oldvolfile, size); - else - volfilebuf = GF_CALLOC (1, size, gf_common_mt_char); + if (!volfile_tmp) { + volfile_tmp = GF_CALLOC (1, sizeof (gf_volfile_t), + gf_common_volfile_t); + if (!volfile_tmp) { + ret = -1; + goto out; + } - if (!volfilebuf) { - ret = -1; - goto out; + INIT_LIST_HEAD (&volfile_tmp->volfile_list); + list_add (&volfile_tmp->volfile_list, + &ctx->volfile_list); + snprintf (volfile_tmp->vol_id, + sizeof (volfile_tmp->vol_id), "%s", + volfile_id); } - - oldvolfile = volfilebuf; - oldvollen = size; - memcpy (oldvolfile, rsp.spec, size); + strncpy (volfile_tmp->volfile_checksum, sha256_hash, + sizeof (volfile_tmp->volfile_checksum)); } UNLOCK (&ctx->volfile_lock); @@ -1894,7 +1908,11 @@ out: if (locked) UNLOCK (&ctx->volfile_lock); - STACK_DESTROY (frame->root); + if (frame) { + GF_FREE (frame->local); + frame->local = NULL; + STACK_DESTROY (frame->root); + } free (rsp.spec); @@ -1941,6 +1959,15 @@ glusterfs_volfile_fetch_one (glusterfs_ctx_t *ctx, char *volfile_id) req.key = volfile_id; req.flags = 0; + /* + * We are only storing one variable in local, hence using the same + * variable. If multiple local variable is required, create a struct. + */ + frame->local = gf_strdup (volfile_id); + if (!frame->local) { + ret = -1; + goto out; + } dict = dict_new (); if (!dict) { @@ -1990,6 +2017,13 @@ out: GF_FREE (req.xdata.xdata_val); if (dict) dict_unref (dict); + if (ret && frame) { + /* Free the frame->local fast, because we have not used memget + */ + GF_FREE (frame->local); + frame->local = NULL; + STACK_DESTROY (frame->root); + } return ret; } |