diff options
author | Krishnan Parthasarathi <kparthas@redhat.com> | 2012-10-15 23:15:18 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2012-11-18 22:21:35 -0800 |
commit | 0f87154a4ba93fc042c4308a6f51a5b6582802ac (patch) | |
tree | fb071d334fad111c2d6bf551bd5a43801644d3a6 | |
parent | cb884f7eac134866ca47701d3208055acecbf9a0 (diff) |
glusterd: copy peers that participate in volume xaction
- To avoid working with a mutable list of peers in
the scope of a volume xaction.
Change-Id: I228ae96bccdce127026eff8320adb37b17e2cc6a
BUG: 862834
Signed-off-by: Krishnan Parthasarathi <kparthas@redhat.com>
Reviewed-on: http://review.gluster.org/4113
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-syncop.c | 24 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 2 |
2 files changed, 14 insertions, 12 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-syncop.c b/xlators/mgmt/glusterd/src/glusterd-syncop.c index d7947281ea8..89c26418315 100644 --- a/xlators/mgmt/glusterd/src/glusterd-syncop.c +++ b/xlators/mgmt/glusterd/src/glusterd-syncop.c @@ -477,6 +477,7 @@ gd_sync_task_begin (dict_t *op_ctx, rpcsvc_request_t * req) dict_t *req_dict = NULL; dict_t *rsp_dict = NULL; glusterd_peerinfo_t *peerinfo = NULL; + glusterd_peerinfo_t *tmp = NULL; glusterd_conf_t *conf = NULL; uuid_t tmp_uuid = {0,}; glusterd_op_t op = 0; @@ -504,12 +505,16 @@ gd_sync_task_begin (dict_t *op_ctx, rpcsvc_request_t * req) /* successful lock in local node */ local_locked = _gf_true; + INIT_LIST_HEAD (&conf->xaction_peers); list_for_each_entry (peerinfo, &conf->peers, uuid_list) { + if (peerinfo->state.state != GD_FRIEND_STATE_BEFRIENDED) + continue; + ret = gd_syncop_mgmt_lock (peerinfo->rpc, MY_UUID, tmp_uuid); - if (ret) - goto out; - /* TODO: Only on lock successful nodes it should unlock */ + if (ret == 0) + list_add_tail (&peerinfo->op_peers_list, + &conf->xaction_peers); } ret = glusterd_op_build_payload (&req_dict, &op_errstr, op_ctx); @@ -521,7 +526,7 @@ gd_sync_task_begin (dict_t *op_ctx, rpcsvc_request_t * req) if (ret) goto out; - list_for_each_entry (peerinfo, &conf->peers, uuid_list) { + list_for_each_entry (peerinfo, &conf->xaction_peers, op_peers_list) { ret = gd_syncop_mgmt_stage_op (peerinfo->rpc, MY_UUID, tmp_uuid, op, req_dict, &rsp_dict, @@ -543,7 +548,7 @@ gd_sync_task_begin (dict_t *op_ctx, rpcsvc_request_t * req) if (ret) goto out; - list_for_each_entry (peerinfo, &conf->peers, uuid_list) { + list_for_each_entry (peerinfo, &conf->xaction_peers, op_peers_list) { ret = gd_syncop_mgmt_commit_op (peerinfo->rpc, MY_UUID, tmp_uuid, op, req_dict, &rsp_dict, @@ -559,14 +564,11 @@ gd_sync_task_begin (dict_t *op_ctx, rpcsvc_request_t * req) 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 */ + list_for_each_entry_safe (peerinfo, tmp, &conf->xaction_peers, + op_peers_list) { gd_syncop_mgmt_unlock (peerinfo->rpc, MY_UUID, tmp_uuid); + list_del_init (&peerinfo->op_peers_list); } /* Local node should be the one to be locked first, diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 0bf5beee884..00a6bd16343 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -112,7 +112,7 @@ typedef struct { struct _volfile_ctx *volfile; pthread_mutex_t mutex; struct list_head peers; -// struct list_head pending_peers; + struct list_head xaction_peers; gf_boolean_t verify_volfile_checksum; gf_boolean_t trace; uuid_t uuid; |