diff options
author | Avra Sengupta <asengupt@redhat.com> | 2013-12-26 05:38:44 +0000 |
---|---|---|
committer | Avra Sengupta <asengupt@redhat.com> | 2014-01-09 01:00:31 +0000 |
commit | ade2e39f33c833dcf9811f46fca4c6f443b0f09b (patch) | |
tree | 59034e2c3c5cb3c2b3a8e82df90154fdc9a20cbb /xlators/mgmt/glusterd/src/glusterd-mgmt-handler.c | |
parent | d12308bc5bc3fd200f67a1167e1bb350713037ab (diff) |
glusterd/multiple volume locks: Fix for lock requests received in synctasked volume locks
The synctasked volume lock function was locking every node with
it's own UUID, instead of received UUID, which resulted in deadlock
when multiple snapshot commands were executed.
Change-Id: Ida76da1a057eae04178c202d626f9c1e671c1fee
BUG: 1043862
Signed-off-by: Avra Sengupta <asengupt@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-mgmt-handler.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-mgmt-handler.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-mgmt-handler.c b/xlators/mgmt/glusterd/src/glusterd-mgmt-handler.c index 236d9b72f..2ebe372cc 100644 --- a/xlators/mgmt/glusterd/src/glusterd-mgmt-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-mgmt-handler.c @@ -63,6 +63,8 @@ glusterd_syctasked_volume_lock (rpcsvc_request_t *req, this = THIS; GF_ASSERT (this); GF_ASSERT (req); + GF_ASSERT (ctx); + GF_ASSERT (ctx->dict); ret = dict_get_int32 (ctx->dict, "volcount", &volcount); if (ret) { @@ -72,21 +74,22 @@ glusterd_syctasked_volume_lock (rpcsvc_request_t *req, "Failed to get volname"); goto out; } - ret = glusterd_volume_lock (volname, MY_UUID); + ret = glusterd_volume_lock (volname, ctx->uuid); if (ret) gf_log (this->name, GF_LOG_ERROR, "Unable to acquire local lock for %s", volname); } else { /* Trying to acquire volume locks on multiple volumes */ - ret = glusterd_multiple_volumes_lock (ctx->dict, MY_UUID); + ret = glusterd_multiple_volumes_lock (ctx->dict, ctx->uuid); if (ret) gf_log ("", GF_LOG_ERROR, - "Failed to acquire volume locks on localhost"); + "Failed to acquire volume locks for %s", + uuid_utoa (ctx->uuid)); } out: - glusterd_mgmt_v3_vol_lock_send_resp (req, ret); + ret = glusterd_mgmt_v3_vol_lock_send_resp (req, ret); gf_log (this->name, GF_LOG_TRACE, "Returning %d", ret); return ret; @@ -749,20 +752,21 @@ glusterd_syctasked_volume_unlock (rpcsvc_request_t *req, "Failed to get volname"); goto out; } - ret = glusterd_volume_unlock (volname, MY_UUID); + ret = glusterd_volume_unlock (volname, ctx->uuid); if (ret) gf_log (this->name, GF_LOG_ERROR, - "Unable to acquire local lock for %s", volname); + "Unable to release lock for %s", volname); } else { /* Trying to release volume locks on multiple volumes */ - ret = glusterd_multiple_volumes_unlock (ctx->dict, MY_UUID); + ret = glusterd_multiple_volumes_unlock (ctx->dict, ctx->uuid); if (ret) gf_log ("", GF_LOG_ERROR, - "Failed to release volume locks on localhost"); + "Failed to release volume locks for %s", + uuid_utoa(ctx->uuid)); } out: - glusterd_mgmt_v3_vol_unlock_send_resp (req, ret); + ret = glusterd_mgmt_v3_vol_unlock_send_resp (req, ret); gf_log (this->name, GF_LOG_TRACE, "Returning %d", ret); return ret; |