From eb2001232249d30bf6d4a89e1454615dad7916a6 Mon Sep 17 00:00:00 2001 From: Krutika Dhananjay Date: Thu, 12 May 2016 15:06:59 +0530 Subject: features/shard: Get hard-link-count in {unlink,rename}_cbk before deleting shards Backport of http://review.gluster.org/#/c/14334/ Change-Id: I41321d8b00a10f1bd5b0a7b008f673b1aa240d0c BUG: 1337837 Signed-off-by: Krutika Dhananjay Reviewed-on: http://review.gluster.org/14450 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Pranith Kumar Karampuri --- tests/bugs/shard/unlinks-and-renames.t | 282 +++++++++++++++++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 tests/bugs/shard/unlinks-and-renames.t (limited to 'tests/bugs') diff --git a/tests/bugs/shard/unlinks-and-renames.t b/tests/bugs/shard/unlinks-and-renames.t new file mode 100644 index 00000000000..751874c1e6b --- /dev/null +++ b/tests/bugs/shard/unlinks-and-renames.t @@ -0,0 +1,282 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup + +# The aim of this test script is to exercise the various codepaths of unlink +# and rename fops in sharding and make sure they work fine. +# + +################################################# +################### UNLINK ###################### +################################################# + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1} +TEST $CLI volume set $V0 features.shard 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/new + +###################################### +##### Unlink with /.shard absent ##### +###################################### +TEST truncate -s 5M $M0/dir/foo +TEST ! stat $B0/${V0}0/.shard +TEST ! stat $B0/${V0}1/.shard +# Test to ensure that unlink doesn't fail due to absence of /.shard +TEST unlink $M0/dir/foo + +################################################## +##### Unlink of a sharded file without holes ##### +################################################## +# Create a 9M sharded file +TEST dd if=/dev/zero of=$M0/dir/new bs=1024 count=9216 +gfid_new=$(get_gfid_string $M0/dir/new) +# Ensure its shards are created. +TEST stat $B0/${V0}0/.shard/$gfid_new.1 +TEST stat $B0/${V0}1/.shard/$gfid_new.1 +TEST stat $B0/${V0}0/.shard/$gfid_new.2 +TEST stat $B0/${V0}1/.shard/$gfid_new.2 +TEST unlink $M0/dir/new +TEST ! stat $B0/${V0}0/.shard/$gfid_new.1 +TEST ! stat $B0/${V0}1/.shard/$gfid_new.1 +TEST ! stat $B0/${V0}0/.shard/$gfid_new.2 +TEST ! stat $B0/${V0}1/.shard/$gfid_new.2 +TEST ! stat $M0/dir/new +TEST ! stat $B0/${V0}0/dir/new +TEST ! stat $B0/${V0}1/dir/new + +####################################### +##### Unlink with /.shard present ##### +####################################### +TEST truncate -s 5M $M0/dir/foo +gfid_foo=$(get_gfid_string $M0/dir/foo) +# Ensure its shards are absent. +TEST ! stat $B0/${V0}0/.shard/$gfid_foo.1 +TEST ! stat $B0/${V0}1/.shard/$gfid_foo.1 +# Test to ensure that unlink of a sparse file works fine. +TEST unlink $M0/dir/foo +TEST ! stat $B0/${V0}0/dir/foo +TEST ! stat $B0/${V0}1/dir/foo +TEST ! stat $M0/dir/foo + +############################################################# +##### Unlink of a file with only one block (the zeroth) ##### +############################################################# +TEST touch $M0/dir/foo +TEST dd if=/dev/zero of=$M0/dir/foo bs=1024 count=1024 +# Test to ensure that unlink of a sparse file works fine. +TEST unlink $M0/dir/foo +TEST ! stat $B0/${V0}0/dir/foo +TEST ! stat $B0/${V0}1/dir/foo +TEST ! stat $M0/dir/foo + +#################################################### +##### Unlink of a sharded file with hard-links ##### +#################################################### +# Create a 9M sharded file +TEST dd if=/dev/zero of=$M0/dir/original bs=1024 count=9216 +gfid_original=$(get_gfid_string $M0/dir/original) +# Ensure its shards are created. +TEST stat $B0/${V0}0/.shard/$gfid_original.1 +TEST stat $B0/${V0}1/.shard/$gfid_original.1 +TEST stat $B0/${V0}0/.shard/$gfid_original.2 +TEST stat $B0/${V0}1/.shard/$gfid_original.2 +# Create a hard link. +TEST ln $M0/dir/original $M0/link +# Now delete the original file. +TEST unlink $M0/dir/original +# Ensure the shards are still intact. +TEST stat $B0/${V0}0/.shard/$gfid_original.1 +TEST stat $B0/${V0}1/.shard/$gfid_original.1 +TEST stat $B0/${V0}0/.shard/$gfid_original.2 +TEST stat $B0/${V0}1/.shard/$gfid_original.2 +TEST ! stat $M0/dir/original +TEST stat $M0/link +TEST stat $B0/${V0}0/link +TEST stat $B0/${V0}1/link +# Now delete the last link. +TEST unlink $M0/link +# Ensure that the shards are all cleaned up. +TEST ! stat $B0/${V0}0/.shard/$gfid_original.1 +TEST ! stat $B0/${V0}1/.shard/$gfid_original.1 +TEST ! stat $B0/${V0}0/.shard/$gfid_original.2 +TEST ! stat $B0/${V0}1/.shard/$gfid_original.2 +TEST ! stat $M0/link +TEST ! stat $B0/${V0}0/link +TEST ! stat $B0/${V0}1/link + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 + +cleanup + +################################################# +################### RENAME ###################### +################################################# + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1} +TEST $CLI volume set $V0 features.shard on +TEST $CLI volume start $V0 +TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0 + +TEST mkdir $M0/dir +TEST touch $M0/dir/src +TEST touch $M0/dir/dst + +###################################### +##### Rename with /.shard absent ##### +###################################### +TEST truncate -s 5M $M0/dir/dst +TEST ! stat $B0/${V0}0/.shard +TEST ! stat $B0/${V0}1/.shard +# Test to ensure that rename doesn't fail due to absence of /.shard +TEST mv -f $M0/dir/src $M0/dir/dst +TEST ! stat $M0/dir/src +TEST stat $M0/dir/dst +TEST ! stat $B0/${V0}0/dir/src +TEST ! stat $B0/${V0}1/dir/src +TEST stat $B0/${V0}0/dir/dst +TEST stat $B0/${V0}1/dir/dst + +################################################## +##### Rename to a sharded file without holes ##### +################################################## +TEST unlink $M0/dir/dst +TEST touch $M0/dir/src +# Create a 9M sharded file +TEST dd if=/dev/zero of=$M0/dir/dst bs=1024 count=9216 +gfid_dst=$(get_gfid_string $M0/dir/dst) +# Ensure its shards are created. +TEST stat $B0/${V0}0/.shard/$gfid_dst.1 +TEST stat $B0/${V0}1/.shard/$gfid_dst.1 +TEST stat $B0/${V0}0/.shard/$gfid_dst.2 +TEST stat $B0/${V0}1/.shard/$gfid_dst.2 +TEST mv -f $M0/dir/src $M0/dir/dst +TEST ! stat $B0/${V0}0/.shard/$gfid_dst.1 +TEST ! stat $B0/${V0}1/.shard/$gfid_dst.1 +TEST ! stat $B0/${V0}0/.shard/$gfid_dst.2 +TEST ! stat $B0/${V0}1/.shard/$gfid_dst.2 +TEST ! stat $M0/dir/src +TEST stat $M0/dir/dst +TEST ! stat $B0/${V0}0/dir/src +TEST ! stat $B0/${V0}1/dir/src +TEST stat $B0/${V0}0/dir/dst +TEST stat $B0/${V0}1/dir/dst + +################################################### +##### Rename of dst file with /.shard present ##### +################################################### +TEST unlink $M0/dir/dst +TEST touch $M0/dir/src +TEST truncate -s 5M $M0/dir/dst +# Test to ensure that unlink of a sparse file works fine. +TEST mv -f $M0/dir/src $M0/dir/dst +TEST ! stat $M0/dir/src +TEST stat $M0/dir/dst +TEST ! stat $B0/${V0}0/dir/src +TEST ! stat $B0/${V0}1/dir/src +TEST stat $B0/${V0}0/dir/dst +TEST stat $B0/${V0}1/dir/dst + +############################################################### +##### Rename of dst file with only one block (the zeroth) ##### +############################################################### +TEST unlink $M0/dir/dst +TEST touch $M0/dir/src +TEST dd if=/dev/zero of=$M0/dir/dst bs=1024 count=1024 +# Test to ensure that unlink of a sparse file works fine. +TEST mv -f $M0/dir/src $M0/dir/dst +TEST ! stat $M0/dir/src +TEST stat $M0/dir/dst +TEST ! stat $B0/${V0}0/dir/src +TEST ! stat $B0/${V0}1/dir/src +TEST stat $B0/${V0}0/dir/dst +TEST stat $B0/${V0}1/dir/dst + +######################################################## +##### Rename to a dst sharded file with hard-links ##### +######################################################## +TEST unlink $M0/dir/dst +TEST touch $M0/dir/src +# Create a 9M sharded file +TEST dd if=/dev/zero of=$M0/dir/dst bs=1024 count=9216 +gfid_dst=$(get_gfid_string $M0/dir/dst) +# Ensure its shards are created. +TEST stat $B0/${V0}0/.shard/$gfid_dst.1 +TEST stat $B0/${V0}1/.shard/$gfid_dst.1 +TEST stat $B0/${V0}0/.shard/$gfid_dst.2 +TEST stat $B0/${V0}1/.shard/$gfid_dst.2 +# Create a hard link. +TEST ln $M0/dir/dst $M0/link +# Now rename src to the dst. +TEST mv -f $M0/dir/src $M0/dir/dst +# Ensure the shards are still intact. +TEST stat $B0/${V0}0/.shard/$gfid_dst.1 +TEST stat $B0/${V0}1/.shard/$gfid_dst.1 +TEST stat $B0/${V0}0/.shard/$gfid_dst.2 +TEST stat $B0/${V0}1/.shard/$gfid_dst.2 +TEST ! stat $M0/dir/src +TEST ! stat $B0/${V0}0/dir/src +TEST ! stat $B0/${V0}1/dir/src +# Now rename another file to the last link. +TEST touch $M0/dir/src2 +TEST mv -f $M0/dir/src2 $M0/link +# Ensure that the shards are all cleaned up. +TEST ! stat $B0/${V0}0/.shard/$gfid_dst.1 +TEST ! stat $B0/${V0}1/.shard/$gfid_dst.1 +TEST ! stat $B0/${V0}0/.shard/$gfid_dst.2 +TEST ! stat $B0/${V0}1/.shard/$gfid_dst.2 +TEST ! stat $M0/dir/src2 +TEST ! stat $B0/${V0}0/dir/src2 +TEST ! stat $B0/${V0}1/dir/src2 + +# Rename with non-existent dst and a sharded src +TEST touch $M0/dir/src +TEST dd if=/dev/zero of=$M0/dir/src bs=1024 count=9216 +gfid_src=$(get_gfid_string $M0/dir/src) +# Ensure its shards are created. +TEST stat $B0/${V0}0/.shard/$gfid_src.1 +TEST stat $B0/${V0}1/.shard/$gfid_src.1 +TEST stat $B0/${V0}0/.shard/$gfid_src.2 +TEST stat $B0/${V0}1/.shard/$gfid_src.2 +# Now rename src to the dst. +TEST mv $M0/dir/src $M0/dir/dst + +TEST stat $B0/${V0}0/.shard/$gfid_src.1 +TEST stat $B0/${V0}1/.shard/$gfid_src.1 +TEST stat $B0/${V0}0/.shard/$gfid_src.2 +TEST stat $B0/${V0}1/.shard/$gfid_src.2 +TEST ! stat $M0/dir/src +TEST ! stat $B0/${V0}0/dir/src +TEST ! stat $B0/${V0}1/dir/src +TEST stat $M0/dir/dst +TEST stat $B0/${V0}0/dir/dst +TEST stat $B0/${V0}1/dir/dst + +# Rename with non-existent dst and a sharded src with no shards +TEST touch $M0/dir/src +TEST dd if=/dev/zero of=$M0/dir/src bs=1024 count=1024 +gfid_src=$(get_gfid_string $M0/dir/src) +TEST ! stat $B0/${V0}0/.shard/$gfid_src.1 +TEST ! stat $B0/${V0}1/.shard/$gfid_src.1 +# Now rename src to the dst. +TEST mv $M0/dir/src $M0/dir/dst +TEST ! stat $M0/dir/src +TEST ! stat $B0/${V0}0/dir/src +TEST ! stat $B0/${V0}1/dir/src +TEST stat $M0/dir/dst +TEST stat $B0/${V0}0/dir/dst +TEST stat $B0/${V0}1/dir/dst + +cleanup -- cgit