From f834bbc2714a52db7955474ee362321c4f6617ce Mon Sep 17 00:00:00 2001 From: Avra Sengupta Date: Thu, 21 Nov 2013 03:48:32 +0000 Subject: glusterd/mgmtv3: Fetching snap mount path per brick. Fetching snap mount path per brick during pre-validate and aggregating it before commit to generate all brick volfiles and all client volfiles on all nodes. Added changes to propagate the same cg-id by generating it in pre-validate and sending the same to all the nodes during commit Also fixed volume-id mismatches caused in snap-volumes leading to failures of volume status Change-Id: I0b8ed81ac93077cd50313e6eeed00f71932cf2ac Signed-off-by: Avra Sengupta Signed-off-by: Rajesh Joseph --- xlators/mgmt/glusterd/src/glusterd-mgmt.c | 67 +++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 4 deletions(-) (limited to 'xlators/mgmt/glusterd/src/glusterd-mgmt.c') diff --git a/xlators/mgmt/glusterd/src/glusterd-mgmt.c b/xlators/mgmt/glusterd/src/glusterd-mgmt.c index 539705021..852d60fb4 100644 --- a/xlators/mgmt/glusterd/src/glusterd-mgmt.c +++ b/xlators/mgmt/glusterd/src/glusterd-mgmt.c @@ -371,9 +371,30 @@ out: return ret; } +int +glusterd_pre_validate_aggr_rsp_dict (glusterd_op_t op, dict_t *aggr, dict_t *rsp) +{ + int ret = 0; + + switch (op) { + case GD_OP_SNAP: + ret = glusterd_snap_pre_validate_use_rsp_dict (aggr, rsp); + if (ret) + goto out; + break; + default: + ret = -1; + gf_log ("", GF_LOG_ERROR, "Invalid op (%s)", gd_op_list[op]); + + break; + } +out: + return ret; +} + int32_t gd_mgmt_v3_pre_validate_cbk_fn (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) + int count, void *myframe) { int ret = -1; struct syncargs *args = NULL; @@ -382,6 +403,7 @@ gd_mgmt_v3_pre_validate_cbk_fn (struct rpc_req *req, struct iovec *iov, call_frame_t *frame = NULL; int op_ret = -1; int op_errno = -1; + dict_t *rsp_dict = NULL; GF_ASSERT(req); GF_ASSERT(iov); @@ -403,11 +425,39 @@ gd_mgmt_v3_pre_validate_cbk_fn (struct rpc_req *req, struct iovec *iov, if (ret < 0) goto out; + if (rsp.dict.dict_len) { + /* Unserialize the dictionary */ + rsp_dict = dict_new (); + + ret = dict_unserialize (rsp.dict.dict_val, + rsp.dict.dict_len, + &rsp_dict); + if (ret < 0) { + GF_FREE (rsp.dict.dict_val); + goto out; + } else { + rsp_dict->extra_stdfree = rsp.dict.dict_val; + } + } + uuid_copy (args->uuid, rsp.uuid); + pthread_mutex_lock (&args->lock_dict); + { + ret = glusterd_pre_validate_aggr_rsp_dict (rsp.op, args->dict, + rsp_dict); + } + pthread_mutex_unlock (&args->lock_dict); + if (ret) + gf_log ("", GF_LOG_ERROR, "%s", + "Failed to aggregate response from " + " node/brick"); op_ret = rsp.op_ret; op_errno = rsp.op_errno; out: + if (rsp_dict) + dict_unref (rsp_dict); + gd_mgmt_v3_collate_errors (args, op_ret, op_errno, NULL, GLUSTERD_MGMT_V3_PRE_VALIDATE, peerinfo, rsp.uuid); @@ -460,7 +510,7 @@ out: int glusterd_mgmt_v3_pre_validate (glusterd_conf_t *conf, glusterd_op_t op, - dict_t *req_dict, char **op_errstr, int npeers) + dict_t *req_dict, char **op_errstr, int npeers) { int ret = -1; int peer_cnt = 0; @@ -483,7 +533,7 @@ glusterd_mgmt_v3_pre_validate (glusterd_conf_t *conf, glusterd_op_t op, /* Pre Validation on local node */ ret = gd_mgmt_v3_pre_validate_fn (op, req_dict, op_errstr, - rsp_dict); + rsp_dict); if (ret) { gf_log (this->name, GF_LOG_ERROR, @@ -504,6 +554,15 @@ glusterd_mgmt_v3_pre_validate (glusterd_conf_t *conf, glusterd_op_t op, goto out; } + ret = glusterd_pre_validate_aggr_rsp_dict (op, req_dict, + rsp_dict); + if (ret) { + gf_log ("", GF_LOG_ERROR, "%s", + "Failed to aggregate response from " + " node/brick"); + goto out; + } + dict_unref (rsp_dict); rsp_dict = NULL; @@ -513,7 +572,7 @@ glusterd_mgmt_v3_pre_validate (glusterd_conf_t *conf, glusterd_op_t op, } /* Sending Pre Validation req to other nodes in the cluster */ - gd_syncargs_init (&args, NULL); + gd_syncargs_init (&args, req_dict); synctask_barrier_init((&args)); peer_cnt = 0; list_for_each_entry (peerinfo, peers, op_peers_list) { -- cgit