diff options
author | shishir gowda <sgowda@redhat.com> | 2013-07-09 09:09:30 +0530 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2013-07-17 22:49:38 -0700 |
commit | ad5ab1216066495589d73015f47183cc26f10eb6 (patch) | |
tree | bb321f27a60c6d8d1a9da78d86a34c1a438d6d0d /xlators/cluster/dht | |
parent | da50f61174dad89699da40212746b398b576ca15 (diff) |
dht: fix dht_discover_cbk doing a wrong layout set.
with the sequence of operations are like below, we have issues
with current code (MP == mountpoint):
T0,MP1# mkdir /abcd (Succeeds on hash_subvol)
T1,MP2# mkdir /abcd (Gets EEXIST as dir exists in hash_subvol)
T2,MP2# mkdir /.gfid/<abcd's gfid>/xyz (lookup happens on abcd's
gfid, calls dht_discover)
T3,MP1# (Completes mkdir(), goes to dir_selfheal to set the layouts).
T4,MP2# (dht_discover_cbk gets success for lookup as the entry
existed, as layout is not yet written, it says normalize
done, found holes).
T5,MP2# (as layout anomaly is not considered an issue in this patch,
dht_layout_set happens on inode, with all xlators pointing
to 0s)
T6,MP1# (completes mkdir call, inode has proper layouts)
T7,MP2# mkdir /.gfid/<abcd's gfid>/xyz fails with ENOENT
(with log saying no subvol found for hash value of xyz.
Porting Amar's fix from down-stream beta branch.
Change-Id: Ibdc37ee614c96158a1330af19cad81a39bee2651
BUG: 982913
Original-author: Amar Tumballi <amarts@redhat.com>
Signed-off-by: shishir gowda <sgowda@redhat.com>
Reviewed-on: http://review.gluster.org/5302
Reviewed-by: Amar Tumballi <amarts@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators/cluster/dht')
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index ab64f6d2364..746dd1a8afe 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -208,9 +208,16 @@ dht_discover_complete (xlator_t *this, call_frame_t *discover_frame) goto out; } if (ret != 0) { - gf_log (this->name, GF_LOG_DEBUG, + gf_log (this->name, GF_LOG_WARNING, "normalizing failed on %s " "(overlaps/holes present)", local->loc.path); + /* We may need to do the lookup again */ + /* in discover call, parent is not know, and basename + * of entry is also not available. Without which we + * cannot build a layout correctly to heal it. Hence + * returning ESTALE */ + op_errno = ESTALE; + goto out; } if (local->inode) |