diff options
author | Shyam <srangana@redhat.com> | 2014-11-06 10:43:37 -0500 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2014-11-17 00:25:42 -0800 |
commit | dfc49143841fe84f846346a30dadce797940eebc (patch) | |
tree | 1d594ddf2748dc4031fc089ae268c101ced1e5d4 | |
parent | 73be0be8149398b68213cb158cf94313169b5006 (diff) |
cluster/dht: Fix subvol check, to correctly determine cached file rename
The check to treat rename as a critical failure ignored when the cached
file is being renamed to new name, as the new name falls on the same
subvol as the cached file. This is in addition to when the target of the
rename does not exist.
The current change is simpler, as the rename logic, renames the cached
file in case the target exists and falls on the same subvol as source
name, OR the target does not exist and the hash of target falls on the
same subvol as source cached. These conditions mean we are renaming the
source, other conditions mean we are renaming the source linkto file
which we do not want to treat as a critical failure (and we also instruct
marker that it is an internal FOP and to not account for the same).
Change-Id: I4414e61a0d2b28a429fa747e545ef953e48cfb5b
BUG: 1161156
Signed-off-by: Shyam <srangana@redhat.com>
Reviewed-on: http://review.gluster.org/9063
Reviewed-by: N Balachandran <nbalacha@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: susant palai <spalai@redhat.com>
Reviewed-by: venkatesh somyajulu <vsomyaju@redhat.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
-rwxr-xr-x | tests/bugs/bug-1161156.t | 48 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-rename.c | 2 |
2 files changed, 49 insertions, 1 deletions
diff --git a/tests/bugs/bug-1161156.t b/tests/bugs/bug-1161156.t new file mode 100755 index 00000000000..12ebc45bdd3 --- /dev/null +++ b/tests/bugs/bug-1161156.t @@ -0,0 +1,48 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../nfs.rc + +function usage() +{ + local QUOTA_PATH=$1; + $CLI volume quota $V0 list $QUOTA_PATH | \ + grep "$QUOTA_PATH" | awk '{print $4}' +} + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info; + +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4,5,6}; +EXPECT 'Created' volinfo_field $V0 'Status'; + +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; + +# Testing with NFS for no particular reason +EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available +TEST mount_nfs $H0:/$V0 $N0 +mydir="dir" +TEST mkdir -p $N0/$mydir + +TEST dd if=/dev/zero of=$N0/$mydir/file bs=1k count=10240 + +TEST $CLI volume quota $V0 enable +TEST $CLI volume quota $V0 limit-usage / 20MB +TEST $CLI volume quota $V0 soft-timeout 0 +TEST $CLI volume quota $V0 hard-timeout 0 + +TEST dd if=/dev/zero of=$N0/$mydir/newfile_1 bs=512 count=10240 +# wait for write behind to complete. +EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "15.0MB" usage "/" +TEST ! dd if=/dev/zero of=$N0/$mydir/newfile_2 bs=1k count=10240 + +# Test the rename, it should fail due to space restrictions +TEST ! mv $N0/dir/file $N0/dir/newfile_3 + +# cleanup +umount_nfs $N0 +cleanup; diff --git a/xlators/cluster/dht/src/dht-rename.c b/xlators/cluster/dht/src/dht-rename.c index eac3975ccbe..c8a05a3939d 100644 --- a/xlators/cluster/dht/src/dht-rename.c +++ b/xlators/cluster/dht/src/dht-rename.c @@ -642,7 +642,7 @@ dht_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (op_ret == -1) { /* Critical failure: unable to rename the cached file */ - if (src_cached == dst_cached) { + if (prev->this == src_cached) { gf_msg (this->name, GF_LOG_WARNING, op_errno, DHT_MSG_RENAME_FAILED, "%s: Rename on %s failed, (gfid = %s) ", |