diff options
author | Amar Tumballi <amarts@redhat.com> | 2012-03-22 13:51:23 +0530 |
---|---|---|
committer | Vijay Bellur <vijay@gluster.com> | 2012-03-22 04:19:18 -0700 |
commit | 2db6b286d091346b4386fd6091eb22bd9d3ea7a0 (patch) | |
tree | b0538a64baddcf123908d197d765cc35275806c7 /xlators/mgmt/glusterd/src/glusterd-handler.c | |
parent | 1522ac5c15516156bb33f8d47b0c0e7de6cd411f (diff) |
glusterd: fix bugs of syncop for operations
* free the stack created for synctask
* use different key than 'operation' in dictionary as thats being used
already by other glusterd operations
* send proper frame to 'rpc_clnt_submit()' API, as it gets used
internally
* also make sure to destroy the above frame in all _cbk()
* move everything specific to synctask into one file, so it is easy to
maintain
Change-Id: Ia1a4414fffec6f9e51700295947eea4a2104a8c2
Signed-off-by: Amar Tumballi <amarts@redhat.com>
BUG: 805802
Reviewed-on: http://review.gluster.com/3000
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Krishnan Parthasarathi <kp@gluster.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-handler.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 165 |
1 files changed, 0 insertions, 165 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 0ee3bfd2440..6ea40bc4d6c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -951,139 +951,6 @@ out: return ret; } -int -gd_sync_task_begin (void *data) -{ - int ret = -1; - dict_t *dict = NULL; - dict_t *rsp_dict = NULL; - glusterd_peerinfo_t *peerinfo = NULL; - glusterd_conf_t *conf = NULL; - uuid_t tmp_uuid = {0,}; - char *errstr = NULL; - glusterd_op_t op = 0; - int32_t tmp_op = 0; - gf_boolean_t local_locked = _gf_false; - - conf = THIS->private; - - dict = data; - - ret = dict_get_int32 (dict, "operation", &tmp_op); - if (ret) - goto out; - - op = tmp_op; - - ret = -1; - rsp_dict = dict_new (); - if (!rsp_dict) - goto out; - - /* Lock everything */ - ret = glusterd_lock (conf->uuid); - if (ret) - goto out; - /* successful lock in local node */ - local_locked = _gf_true; - - list_for_each_entry (peerinfo, &conf->peers, uuid_list) { - ret = gd_syncop_mgmt_lock (peerinfo->rpc, - conf->uuid, tmp_uuid); - if (ret) - goto out; - /* TODO: Only on lock successful nodes it should unlock */ - } - - /* stage op */ - ret = glusterd_op_stage_validate (op, dict, &errstr, rsp_dict); - if (ret) - goto out; - - list_for_each_entry (peerinfo, &conf->peers, uuid_list) { - ret = gd_syncop_mgmt_stage_op (peerinfo->rpc, - conf->uuid, tmp_uuid, - op, dict, &rsp_dict, &errstr); - if (ret) { - if (errstr) - ret = dict_set_dynstr (dict, "error", errstr); - - ret = -1; - goto out; - } - } - - /* commit op */ - ret = glusterd_op_commit_perform (op, dict, &errstr, rsp_dict); - if (ret) - goto out; - - list_for_each_entry (peerinfo, &conf->peers, uuid_list) { - ret = gd_syncop_mgmt_commit_op (peerinfo->rpc, - conf->uuid, tmp_uuid, - op, dict, &rsp_dict, &errstr); - if (ret) { - if (errstr) - ret = dict_set_dynstr (dict, "error", errstr); - - ret = -1; - goto out; - } - } - - ret = 0; -out: - if (local_locked) { - /* unlock everything as we help successful local lock */ - list_for_each_entry (peerinfo, &conf->peers, uuid_list) { - /* No need to check the error code, as it is possible - that if 'lock' on few nodes failed, it would come - here, and unlock would fail on nodes where lock - never was sent */ - gd_syncop_mgmt_unlock (peerinfo->rpc, - conf->uuid, tmp_uuid); - } - - /* Local node should be the one to be locked first, - unlocked last to prevent races */ - glusterd_unlock (conf->uuid); - } - - if (rsp_dict) - dict_unref (rsp_dict); - - return ret; -} - -int -gd_sync_task_completion (int op_ret, call_frame_t *sync_frame, void *data) -{ - int ret = 0; - dict_t *dict = NULL; - rpcsvc_request_t *req = NULL; - int32_t tmp_op = 0; - glusterd_op_t op = 0; - - dict = data; - - req = sync_frame->local; - sync_frame->local = NULL; - - ret = dict_get_int32 (dict, "operation", &tmp_op); - if (ret) - goto out; - op = tmp_op; - - ret = glusterd_op_send_cli_response (op, op_ret, 0, req, NULL, - "operation failed"); - -out: - if (dict) - dict_unref (dict); - - return ret; -} - int32_t glusterd_op_begin (rpcsvc_request_t *req, glusterd_op_t op, void *ctx) { @@ -1094,38 +961,6 @@ glusterd_op_begin (rpcsvc_request_t *req, glusterd_op_t op, void *ctx) return ret; } - -int32_t -glusterd_op_begin_synctask (rpcsvc_request_t *req, glusterd_op_t op, - void *dict) -{ - int ret = 0; - call_frame_t *dummy_frame = NULL; - glusterfs_ctx_t *ctx = NULL; - - dummy_frame = create_frame (THIS, THIS->ctx->pool); - if (!dummy_frame) - goto out; - - dummy_frame->local = req; - - ret = dict_set_int32 (dict, "operation", op); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, - "dict set failed for setting operations"); - goto out; - } - - ctx = glusterfs_ctx_get (); - - ret = synctask_new (ctx->env, gd_sync_task_begin, - gd_sync_task_completion, - dummy_frame, dict); -out: - return ret; -} - - int glusterd_handle_reset_volume (rpcsvc_request_t *req) { |