summaryrefslogtreecommitdiffstats
path: root/xlators/cluster
diff options
context:
space:
mode:
authorRavishankar N <ravishankar@redhat.com>2015-07-17 16:04:01 +0530
committerRaghavendra G <rgowdapp@redhat.com>2015-07-22 23:45:17 -0700
commit94372373ee355e42dfe1660a50315adb4f019d64 (patch)
treeda92d850dbe7298fddbc46639ff22fd212d8748e /xlators/cluster
parent175f1737fb6fe9450702556b24bf395bac97cef1 (diff)
dht: send lookup even for fd based operations during rebalance
Problem: dht_rebalance_inprogress_task() was not sending lookups to the destination subvolume for a file undergoing writes during rebalance. Due to this, afr was not able to populate the read_subvol and failed the write with EIO. Fix: Send lookup for fd based operations as well. Thanks to Raghavendra G for helping with the RCA. Change-Id: I638c203abfaa45b29aa5902ffd76e692a8212a19 BUG: 1244165 Signed-off-by: Ravishankar N <ravishankar@redhat.com> Reviewed-on: http://review.gluster.org/11713 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: N Balachandran <nbalacha@redhat.com> Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'xlators/cluster')
-rw-r--r--xlators/cluster/dht/src/dht-helper.c53
1 files changed, 30 insertions, 23 deletions
diff --git a/xlators/cluster/dht/src/dht-helper.c b/xlators/cluster/dht/src/dht-helper.c
index bbb0180076b..c242cb2f2fe 100644
--- a/xlators/cluster/dht/src/dht-helper.c
+++ b/xlators/cluster/dht/src/dht-helper.c
@@ -987,7 +987,8 @@ dht_migration_complete_check_task (void *data)
gf_msg (this->name, GF_LOG_ERROR, -ret,
DHT_MSG_FILE_LOOKUP_FAILED,
"%s: failed to lookup the file on %s",
- tmp_loc.path, this->name);
+ tmp_loc.path ? tmp_loc.path : uuid_utoa (tmp_loc.gfid),
+ this->name);
local->op_errno = -ret;
ret = -1;
goto out;
@@ -1007,7 +1008,8 @@ dht_migration_complete_check_task (void *data)
gf_msg (this->name, GF_LOG_ERROR, 0,
DHT_MSG_GFID_MISMATCH,
"%s: gfid different on the target file on %s",
- tmp_loc.path, dst_node->name);
+ tmp_loc.path ? tmp_loc.path :
+ uuid_utoa (tmp_loc.gfid), dst_node->name);
ret = -1;
local->op_errno = EIO;
goto out;
@@ -1187,28 +1189,34 @@ dht_rebalance_inprogress_task (void *data)
local->rebalance.target_node = dst_node;
if (local->loc.inode) {
- /* lookup on dst */
- ret = syncop_lookup (dst_node, &local->loc, &stbuf, NULL,
- NULL, NULL);
- if (ret) {
- gf_msg (this->name, GF_LOG_ERROR, -ret,
- DHT_MSG_FILE_LOOKUP_ON_DST_FAILED,
- "%s: failed to lookup the file on %s",
- local->loc.path, dst_node->name);
- ret = -1;
- goto out;
- }
+ loc_copy (&tmp_loc, &local->loc);
+ } else {
+ tmp_loc.inode = inode_ref (inode);
+ gf_uuid_copy (tmp_loc.gfid, inode->gfid);
+ }
- if (gf_uuid_compare (stbuf.ia_gfid, local->loc.inode->gfid)) {
- gf_msg (this->name, GF_LOG_ERROR, 0,
- DHT_MSG_GFID_MISMATCH,
- "%s: gfid different on the target file on %s",
- local->loc.path, dst_node->name);
- ret = -1;
- goto out;
- }
+ /* lookup on dst */
+ ret = syncop_lookup (dst_node, &tmp_loc, &stbuf, NULL,
+ NULL, NULL);
+ if (ret) {
+ gf_msg (this->name, GF_LOG_ERROR, -ret,
+ DHT_MSG_FILE_LOOKUP_ON_DST_FAILED,
+ "%s: failed to lookup the file on %s",
+ tmp_loc.path ? tmp_loc.path : uuid_utoa (tmp_loc.gfid),
+ dst_node->name);
+ ret = -1;
+ goto out;
}
+ if (gf_uuid_compare (stbuf.ia_gfid, tmp_loc.inode->gfid)) {
+ gf_msg (this->name, GF_LOG_ERROR, 0,
+ DHT_MSG_GFID_MISMATCH,
+ "%s: gfid different on the target file on %s",
+ tmp_loc.path ? tmp_loc.path : uuid_utoa (tmp_loc.gfid),
+ dst_node->name);
+ ret = -1;
+ goto out;
+ }
ret = 0;
if (list_empty (&inode->fd_list))
@@ -1219,7 +1227,6 @@ dht_rebalance_inprogress_task (void *data)
*/
SYNCTASK_SETID (0, 0);
- tmp_loc.inode = inode;
inode_path (inode, NULL, &path);
if (path)
tmp_loc.path = path;
@@ -1245,7 +1252,6 @@ dht_rebalance_inprogress_task (void *data)
open_failed = 1;
}
}
- GF_FREE (path);
SYNCTASK_SETID (frame->root->uid, frame->root->gid);
@@ -1266,6 +1272,7 @@ done:
ret = 0;
out:
+ loc_wipe (&tmp_loc);
return ret;
}