diff options
-rw-r--r-- | tests/bugs/shard/bug-1258334.t | 41 | ||||
-rw-r--r-- | xlators/features/shard/src/shard.c | 7 |
2 files changed, 44 insertions, 4 deletions
diff --git a/tests/bugs/shard/bug-1258334.t b/tests/bugs/shard/bug-1258334.t new file mode 100644 index 00000000000..c89caaba3f7 --- /dev/null +++ b/tests/bugs/shard/bug-1258334.t @@ -0,0 +1,41 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc + +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1} +TEST $CLI volume set $V0 features.shard on +TEST $CLI volume set $V0 performance.strict-write-ordering on +TEST $CLI volume start $V0 + +TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0 + +TEST mkdir $M0/dir +TEST touch $M0/dir/foo +TEST touch $M0/dir/bar +TEST touch $M0/dir/new + +TEST truncate -s 14M $M0/dir/foo +TEST truncate -s 14M $M0/dir/bar + +# Perform writes that fall on the 2nd block of "foo" (counting from 0) +TEST dd if=/dev/zero of=$M0/dir/foo bs=1024 seek=10240 count=2048 conv=notrunc + +# Perform writes that fall on the 2nd block of "bar" (counting from 0) +TEST dd if=/dev/zero of=$M0/dir/bar bs=1024 seek=10240 count=2048 conv=notrunc + +# Now unlink "foo". If the bug exists, it should fail with EINVAL. +TEST unlink $M0/dir/foo + +# Now rename "new" to "bar". If the bug exists, it should fail with EINVAL. +TEST mv -f $M0/dir/new $M0/dir/bar + +TEST dd if=/dev/zero of=$M0/dir/new bs=1024 count=5120 + +# Now test that this fix does not break unlink of files without holes +TEST unlink $M0/dir/new + +cleanup diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c index 6fb57168371..8b784eca1a8 100644 --- a/xlators/features/shard/src/shard.c +++ b/xlators/features/shard/src/shard.c @@ -1789,13 +1789,12 @@ shard_unlink_shards_do (call_frame_t *frame, xlator_t *this, inode_t *inode) return 0; } + local->call_count = call_count = count; + cur_block = 1; SHARD_SET_ROOT_FS_ID (frame, local); while (cur_block <= last_block) { - /* The base file is unlinked in the end to mark the - * successful completion of the fop. - */ - if (cur_block == 0) { + if (!local->inode_list[cur_block]) { cur_block++; continue; } |