diff options
Diffstat (limited to 'tests/bugs/distribute')
25 files changed, 1804 insertions, 0 deletions
diff --git a/tests/bugs/distribute/bug-1042725.t b/tests/bugs/distribute/bug-1042725.t new file mode 100644 index 00000000000..5497eb8bc00 --- /dev/null +++ b/tests/bugs/distribute/bug-1042725.t @@ -0,0 +1,49 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +#Basic checks +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info + +#Create a distributed volume +TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2}; +TEST $CLI volume start $V0 + +# Mount FUSE +TEST glusterfs -s $H0 --volfile-id $V0 $M0 + +#Create files +TEST mkdir $M0/foo +TEST touch $M0/foo/{1..20} +for file in {1..20}; do + ln $M0/foo/$file $M0/foo/${file}_linkfile; +done + +#Stop one of the brick +TEST kill_brick ${V0} ${H0} ${B0}/${V0}1 + +rm -rf $M0/foo 2>/dev/null +TEST stat $M0/foo + +touch $M0/foo/{1..20} 2>/dev/null +touch $M0/foo/{1..20}_linkfile 2>/dev/null + +TEST $CLI volume start $V0 force; +sleep 5 +function verify_duplicate { + count=`ls $M0/foo | sort | uniq --repeated | grep [0-9] -c` + echo $count +} +EXPECT 0 verify_duplicate + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0; +TEST ! $CLI volume info $V0; + +cleanup; diff --git a/tests/bugs/distribute/bug-1063230.t b/tests/bugs/distribute/bug-1063230.t new file mode 100755 index 00000000000..944c6c296f6 --- /dev/null +++ b/tests/bugs/distribute/bug-1063230.t @@ -0,0 +1,29 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 $H0:$B0/brick0 $H0:$B0/brick1 +TEST $CLI volume start $V0 + +sleep 5 + +TEST glusterfs -s $H0 --volfile-id $V0 $M0 + +var=`gluster volume rebalance $V0 start force` + +EXPECT "0" echo $? + +var1="volume rebalance: $V0: success: Rebalance on $V0 has \ +been started successfully. Use rebalance status command to \ +check status of the rebalance process." + +echo $var | grep "$var1" + +EXPECT "0" echo $? + +cleanup diff --git a/tests/bugs/distribute/bug-1066798.t b/tests/bugs/distribute/bug-1066798.t new file mode 100755 index 00000000000..e53e1aebf2b --- /dev/null +++ b/tests/bugs/distribute/bug-1066798.t @@ -0,0 +1,86 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +TESTS_EXPECTED_IN_LOOP=200 + +## Start glusterd +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume info; + +## Lets create volume +TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}; + +## Verify volume is created +EXPECT "$V0" volinfo_field $V0 'Volume Name'; +EXPECT 'Created' volinfo_field $V0 'Status'; + +## Start volume and verify +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; +TEST glusterfs -s $H0 --volfile-id=$V0 $M0 + +############################################################ +#TEST_PLAN# +#Create a file +#Store the hashed brick information +#Create hard links to it +#Remove the hashed brick +#Check now all the hardlinks are migrated in to "OTHERBRICK" +#Check also in mount point for all the files +#check there is no failures and skips for migration +############################################################ + +TEST touch $M0/file1; + +file_perm=`ls -l $M0/file1 | grep file1 | awk '{print $1}'`; + +if [ -f $B0/${V0}1/file1 ] +then + HASHED=$B0/${V0}1 + OTHER=$B0/${V0}2 +else + HASHED=$B0/${V0}2 + OTHER=$B0/${V0}1 +fi + +#create hundred hard links +for i in {1..50}; +do +TEST_IN_LOOP ln $M0/file1 $M0/link$i; +done + + +TEST $CLI volume remove-brick $V0 $H0:${HASHED} start +EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0" "$H0:${HASHED}"; + +#check consistency in mount point +#And also check all the links are migrated to OTHER +for i in {1..50} +do +TEST_IN_LOOP [ -f ${OTHER}/link${i} ]; +TEST_IN_LOOP [ -f ${M0}/link${i} ]; +done; + +#check in OTHER that all the files has proper permission (Means no +#linkto files) + +for i in {1..50} +do +link_perm=`ls -l $OTHER | grep -w link${i} | awk '{print $1}'`; +TEST_IN_LOOP [ "${file_perm}" == "${link_perm}" ] + +done + +#check that remove-brick status should not have any failed or skipped files + +var=`$CLI volume remove-brick $V0 $H0:${HASHED} status | grep completed` + +TEST [ `echo $var | awk '{print $5}'` = "0" ] +TEST [ `echo $var | awk '{print $6}'` = "0" ] + +cleanup diff --git a/tests/bugs/distribute/bug-1086228.t b/tests/bugs/distribute/bug-1086228.t new file mode 100755 index 00000000000..e14ea572b61 --- /dev/null +++ b/tests/bugs/distribute/bug-1086228.t @@ -0,0 +1,34 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../fileio.rc +. $(dirname $0)/../../dht.rc +cleanup; + +## Start and create a volume +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2} +TEST $CLI volume start $V0; +TEST glusterfs --direct-io-mode=yes --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0; + +echo "D" > $M0/file1; +TEST chmod +st $M0/file1; + +TEST $CLI volume add-brick $V0 $H0:$B0/${V0}"3" +TEST $CLI volume rebalance $V0 start force + +EXPECT_WITHIN "10" "0" rebalance_completed +count=0 +for i in `ls $B0/$V0"3"`; + do + var=`stat -c %A $B0/$V0"3"/$i | cut -c 4`; + echo $B0/$V0"3"/$i $var + if [ "$var" != "S" ]; then + count=$((count + 1)) + fi + done + +TEST [[ $count == 0 ]] +cleanup diff --git a/tests/bugs/distribute/bug-1088231.t b/tests/bugs/distribute/bug-1088231.t new file mode 100755 index 00000000000..89823ee0800 --- /dev/null +++ b/tests/bugs/distribute/bug-1088231.t @@ -0,0 +1,161 @@ +#!/bin/bash +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../fileio.rc +. $(dirname $0)/../../dht.rc + + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1} +TEST $CLI volume set $V0 cluster.randomize-hash-range-by-gfid on +TEST $CLI volume start $V0 +TEST glusterfs --volfile-id=/$V0 --aux-gfid-mount --volfile-server=$H0 $M0 +TEST mkdir $M0/a + + +## Bug Description: In case of dht_discover code path, which is triggered +## when lookup done is nameless lookup, at the end of the lookup, even if +## it finds that self-heal is needed to fix-the layout it wont heal because +## healing code path is not added under nameless lookup. + +## What to test: With Patch, Even in case of nameless lookup, if layout +## needs to be fixed, the it will be fixed wherever lookup is successfull +## and it will not create any directory for subvols having ENOENT as it is +## nameless lookup. + +gfid_with_hyphen=`getfattr -n glusterfs.gfid.string $M0/a 2>/dev/null \ + | grep glusterfs.gfid.string | cut -d '"' -f 2` + +TEST setfattr -x trusted.glusterfs.dht $B0/$V0"0"/a + +TEST stat $M0/.gfid/$gfid_with_hyphen + +## Assuming that we have two bricks, we can have two permutations of layout +## Case 1: Brick - A Brick - B +## 0 - 50 51-100 +## +## Case 2: Brick - A Brick - B +## 51 - 100 0 - 50 +## +## To ensure layout is assigned properly, the following tests should be +## performed. +## +## Case 1: Layout_b0_s = 0; Layout_b0_e = 50, Layout_b1_s=51, +## Layout_b1_e = 100; +## +## layout_b1_s = layout_b0_e + 1; +## layout_b0_s = layout_b1_e + 1; but b0_s is 0, so change to 101 +## then compare +## Case 2: Layout_b0_s = 51, Layout_b0_e = 100, Layout_b1_s=0, +## Layout_b1_e = 51 +## +## layout_b0_s = Layout_b1_e + 1; +## layout_b1_s = Layout_b0_e + 1; but b1_s is 0, so chage to 101. + + +##Extract Layout +layout_b0_s=`get_layout $B0/$V0"0"/a | cut -c19-26` +layout_b0_e=`get_layout $B0/$V0"0"/a | cut -c27-34` +layout_b1_s=`get_layout $B0/$V0"1"/a | cut -c19-26` +layout_b1_e=`get_layout $B0/$V0"1"/a | cut -c27-34` + + +##Add 0X to perform Hex arithematic +layout_b0_s="0x"$layout_b0_s +layout_b0_e="0x"$layout_b0_e +layout_b1_s="0x"$layout_b1_s +layout_b1_e="0x"$layout_b1_e + + + +## Logic of converting starting layout "0" to "Max_value of layout + 1" +comp1=$(($layout_b0_s + 0)) +if [ "$comp1" == "0" ];then + comp1=4294967296 +fi + +comp2=$(($layout_b1_s + 0)) +if [ "$comp2" == "0" ];then + comp2=4294967296 +fi + +diff1=$(($layout_b0_e + 1)) +diff2=$(($layout_b1_e + 1)) + + +healed=0 + +if [ "$comp1" == "$diff1" ] && [ "$comp2" == "$diff2" ]; then + healed=$(($healed + 1)) +fi + +if [ "$comp1" == "$diff2" ] && [ "$comp2" == "$diff1" ]; then + healed=$(($healed + 1)) +fi + +TEST [ $healed == 1 ] + +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1} +TEST $CLI volume set $V0 cluster.randomize-hash-range-by-gfid on +TEST $CLI volume start $V0 +TEST glusterfs --volfile-id=/$V0 --aux-gfid-mount --volfile-server=$H0 $M0 +TEST mkdir $M0/a + +gfid_with_hyphen=`getfattr -n glusterfs.gfid.string $M0/a 2>/dev/null \ + | grep glusterfs.gfid.string | cut -d '"' -f 2` + +TEST setfattr -x trusted.glusterfs.dht $B0/$V0"0"/a +TEST setfattr -x trusted.glusterfs.dht $B0/$V0"1"/a + +TEST stat $M0/.gfid/$gfid_with_hyphen + +##Extract Layout +layout_b0_s=`get_layout $B0/$V0"0"/a | cut -c19-26` +layout_b0_e=`get_layout $B0/$V0"0"/a | cut -c27-34` +layout_b1_s=`get_layout $B0/$V0"1"/a | cut -c19-26` +layout_b1_e=`get_layout $B0/$V0"1"/a | cut -c27-34` + + +##Add 0X to perform Hex arithematic +layout_b0_s="0x"$layout_b0_s +layout_b0_e="0x"$layout_b0_e +layout_b1_s="0x"$layout_b1_s +layout_b1_e="0x"$layout_b1_e + + + +## Logic of converting starting layout "0" to "Max_value of layout + 1" +comp1=$(($layout_b0_s + 0)) +if [ "$comp1" == "0" ];then + comp1=4294967296 +fi + +comp2=$(($layout_b1_s + 0)) +if [ "$comp2" == "0" ];then + comp2=4294967296 +fi + +diff1=$(($layout_b0_e + 1)) +diff2=$(($layout_b1_e + 1)) + + +healed=0 + +if [ "$comp1" == "$diff1" ] && [ "$comp2" == "$diff2" ]; then + healed=$(($healed + 1)) +fi + +if [ "$comp1" == "$diff2" ] && [ "$comp2" == "$diff1" ]; then + healed=$(($healed + 1)) +fi + +TEST [ $healed == 1 ] +cleanup + diff --git a/tests/bugs/distribute/bug-1099890.t b/tests/bugs/distribute/bug-1099890.t new file mode 100644 index 00000000000..4a4450166e9 --- /dev/null +++ b/tests/bugs/distribute/bug-1099890.t @@ -0,0 +1,125 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../dht.rc + +## TO-DO: Fix the following once the dht du refresh interval issue is fixed: +## 1. Do away with sleep(1). +## 2. Do away with creation of empty files. + +cleanup; + +TEST glusterd; +TEST pidof glusterd; + +# Create 2 loop devices, one per brick. +TEST truncate -s 100M $B0/brick1 +TEST truncate -s 100M $B0/brick2 + +TEST L1=`SETUP_LOOP $B0/brick1` +TEST MKFS_LOOP $L1 + +TEST L2=`SETUP_LOOP $B0/brick2` +TEST MKFS_LOOP $L2 + +TEST mkdir -p $B0/${V0}{1,2} + +TEST MOUNT_LOOP $L1 $B0/${V0}1 +TEST MOUNT_LOOP $L2 $B0/${V0}2 + +# Create a plain distribute volume with 2 subvols. +TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}; + +TEST $CLI volume start $V0; +EXPECT "Started" volinfo_field $V0 'Status'; + +TEST $CLI volume quota $V0 enable; + +TEST $CLI volume set $V0 features.quota-deem-statfs on + +TEST $CLI volume quota $V0 limit-usage / 150MB; + +TEST $CLI volume set $V0 cluster.min-free-disk 50% + +TEST glusterfs -s $H0 --volfile-id=$V0 $M0 + +# Make sure quota-deem-statfs is working as expected +EXPECT "150M" echo `df -h $M0 -P | tail -1 | awk {'print $2'}` + +# Create a new file 'foo' under the root of the volume, which hashes to subvol-0 +# of DHT, that consumes 40M +TEST dd if=/dev/zero of=$M0/foo bs=5120k count=8 + +TEST stat $B0/${V0}1/foo +TEST ! stat $B0/${V0}2/foo + +# Create a new file 'bar' under the root of the volume, which hashes to subvol-1 +# of DHT, that consumes 40M +TEST dd if=/dev/zero of=$M0/bar bs=5120k count=8 + +TEST ! stat $B0/${V0}1/bar +TEST stat $B0/${V0}2/bar + +# Touch a zero-byte file on the root of the volume to make sure the statfs data +# on DHT is refreshed +sleep 1; +TEST touch $M0/empty1; + +# At this point, the available space on each subvol {60M,60M} is greater than +# their min-free-disk {50M,50M}, but if this bug still exists, then +# the total available space on the volume as perceived by DHT should be less +# than min-free-disk, i.e., +# +# consumed space returned per subvol by quota = (40M + 40M) = 80M +# +# Therefore, consumed space per subvol computed by DHT WITHOUT the fix would be: +# (80M/150M)*100 = 53% +# +# Available space per subvol as perceived by DHT with the bug = 47% +# which is less than min-free-disk + +# Now I create a file that hashes to subvol-1 (counting from 0) of DHT. +# If this bug still exists,then DHT should be routing this creation to subvol-0. +# If this bug is fixed, then DHT should be routing the creation to subvol-1 only +# as it has more than min-free-disk space available. + +TEST dd if=/dev/zero of=$M0/file bs=1k count=1 +sleep 1; +TEST ! stat $B0/${V0}1/file +TEST stat $B0/${V0}2/file + +# Touch another zero-byte file on the root of the volume to refresh statfs +# values stored by DHT. + +TEST touch $M0/empty2; + +# Now I create a new file that hashes to subvol-0, at the end of which, there +# will be less than min-free-disk space available on it. +TEST dd if=/dev/zero of=$M0/fil bs=5120k count=4 +sleep 1; +TEST stat $B0/${V0}1/fil +TEST ! stat $B0/${V0}2/fil + +# Touch to refresh statfs info cached by DHT + +TEST touch $M0/empty3; + +# Now I create a file that hashes to subvol-0 but since it has less than +# min-free-disk space available, its data will be cached on subvol-1. + +TEST dd if=/dev/zero of=$M0/zz bs=5120k count=1 + +TEST stat $B0/${V0}1/zz +TEST stat $B0/${V0}2/zz + +EXPECT "$V0-client-1" dht_get_linkto_target "$B0/${V0}1/zz" + +EXPECT "1" is_dht_linkfile "$B0/${V0}1/zz" + +force_umount $M0 +$CLI volume stop $V0 +UMOUNT_LOOP ${B0}/${V0}{1,2} +rm -f ${B0}/brick{1,2} + +cleanup diff --git a/tests/bugs/distribute/bug-1117851.t b/tests/bugs/distribute/bug-1117851.t new file mode 100755 index 00000000000..c93a05e1d47 --- /dev/null +++ b/tests/bugs/distribute/bug-1117851.t @@ -0,0 +1,95 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +create_files () { + for i in {1..1000}; do + orig=$(printf %s/abc%04d $1 $i) + real=$(printf %s/src%04d $1 $i) + # Make sure lots of these have linkfiles. + echo "This is file $i" > $orig + mv $orig $real + done + sync +} + +move_files_inner () { + sfile=$M0/status_$(basename $1) + echo "running" > $sfile + for i in {1..1000}; do + src=$(printf %s/src%04d $1 $i) + dst=$(printf %s/dst%04d $1 $i) + mv $src $dst 2> /dev/null + done + echo "done" > $sfile +} + +move_files () { + move_files_inner $* & +} + +check_files () { + errors=0 + for i in {1..1000}; do + if [ ! -f $(printf %s/dst%04d $1 $i) ]; then + if [ -f $(printf %s/src%04d $1 $i) ]; then + echo "file $i didnt get moved" > /dev/stderr + else + echo "file $i is MISSING" > /dev/stderr + errors=$((errors+1)) + fi + fi + done + if [ $((errors)) != 0 ]; then + : ls -l $1 > /dev/stderr + fi + return $errors +} + +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 "$V0" volinfo_field $V0 'Volume Name'; +EXPECT 'Created' volinfo_field $V0 'Status'; +EXPECT '6' brick_count $V0 + +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; + +## Mount FUSE with caching disabled (read-write) +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0; + +TEST create_files $M0 + +## Mount FUSE with caching disabled (read-write) again +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M1; + +TEST move_files $M0 +TEST move_files $M1 + +# It's regrettable that renaming 1000 files might take more than 30 seconds, +# but on our test systems sometimes it does, so double the time from what we'd +# use otherwise. There still seem to be some spurious failures, 1 in 20 when +# this does not complete, added an additional 15 seconds to take false reports +# out of the system, during test runs. +EXPECT_WITHIN 75 "done" cat $M0/status_0 +EXPECT_WITHIN 75 "done" cat $M1/status_1 + +TEST umount $M0 +TEST umount $M1 +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0; +TEST check_files $M0 + +TEST $CLI volume stop $V0; +EXPECT 'Stopped' volinfo_field $V0 'Status'; + +TEST $CLI volume delete $V0; +TEST ! $CLI volume info $V0; + +cleanup; diff --git a/tests/bugs/distribute/bug-1122443.t b/tests/bugs/distribute/bug-1122443.t new file mode 100644 index 00000000000..3e2455e6382 --- /dev/null +++ b/tests/bugs/distribute/bug-1122443.t @@ -0,0 +1,59 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../dht.rc + +make_files() { + mkdir $1 && \ + ln -s ../ $1/symlink && \ + mknod $1/special_b b 1 2 && \ + mknod $1/special_c c 3 4 && \ + mknod $1/special_u u 5 6 && \ + mknod $1/special_p p && \ + touch -h --date=@1 $1/symlink && \ + touch -h --date=@2 $1/special_b && + touch -h --date=@3 $1/special_c && + touch -h --date=@4 $1/special_u && + touch -h --date=@5 $1/special_p +} + +bug_1113050_workaround() { + # Test if graph change has settled (bug-1113050?) + test=$(stat -c "%n:%Y" $1 2>&1 | tr '\n' ',') + if [ $? -eq 0 ] ; then + echo RECONNECTED + else + echo WAITING + fi + return 0 +} + +cleanup + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/${V0}0 +TEST $CLI volume start $V0 + +# Mount FUSE and create symlink +TEST glusterfs -s $H0 --volfile-id $V0 $M0 +TEST make_files $M0/subdir + +# Get mtime before migration +BEFORE="$(stat -c %n:%Y $M0/subdir/* | tr '\n' ',')" + +# Migrate brick +TEST $CLI volume add-brick $V0 $H0:$B0/${V0}1 +TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}0 start +EXPECT_WITHIN $REBALANCE_TIMEOUT "0" remove_brick_completed +TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}0 commit + +# Get mtime after migration +EXPECT_WITHIN 5 RECONNECTED bug_1113050_workaround $M0/subdir/* +AFTER="$(stat -c %n:%Y $M0/subdir/* | tr '\n' ',')" + +# Check if mtime is unchanged +TEST [ "$AFTER" == "$BEFORE" ] + +cleanup diff --git a/tests/bugs/distribute/bug-1125824.t b/tests/bugs/distribute/bug-1125824.t new file mode 100755 index 00000000000..a944b360db3 --- /dev/null +++ b/tests/bugs/distribute/bug-1125824.t @@ -0,0 +1,100 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../nfs.rc + +create_files () { + for i in {1..10}; do + orig=$(printf %s/file%04d $1 $i) + echo "This is file $i" > $orig + done + for i in {1..10}; do + mkdir $(printf %s/dir%04d $1 $i) + done + sync +} + +create_dirs () { + for i in {1..10}; do + mkdir $(printf %s/dir%04d $1 $i) + create_files $(printf %s/dir%04d $1 $i) + done + sync +} + +stat_files () { + for i in {1..10}; do + orig=$(printf %s/file%04d $1 $i) + stat $orig + done + for i in {1..10}; do + stat $(printf %s/dir%04d $1 $i) + done + sync +} + +stat_dirs () { + for i in {1..10}; do + stat $(printf %s/dir%04d $1 $i) + stat_files $(printf %s/dir%04d $1 $i) + done + sync +} + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info; + +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4}; + +EXPECT "$V0" volinfo_field $V0 'Volume Name'; +EXPECT 'Created' volinfo_field $V0 'Status'; +EXPECT '4' brick_count $V0 + +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; + +EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available; +TEST mount_nfs $H0:/$V0 $N0 + +# Create and poulate the NFS inode tables +TEST create_dirs $N0 +TEST stat_dirs $N0 + +# add-bricks changing the state of the volume where some bricks +# would have some directories and others would not +TEST $CLI volume add-brick $V0 replica 2 $H0:$B0/${V0}{5,6,7,8} + +# Post this dht_access was creating a mess for directories which is fixed +# with this commit. The issues could range from getting ENOENT or +# ESTALE or entries missing to directories not having complete +# layouts. +TEST cd $N0 +TEST ls -lR + +TEST $CLI volume rebalance $V0 start force +EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0 + +# tests to check post rebalance if layouts and entires are fine and +# accessible by NFS to clear the volume +TEST ls -lR +rm -rf ./* +# There are additional bugs where NFS+DHT does not delete all entries +# on an rm -rf, so we do an additional rm -rf to ensure all is done +# and we are facing this transient issue, rather than a bad directory +# layout that is cached in memory +TEST rm -rf ./* + +# Get out of the mount, so that umount can work +TEST cd / + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0 +TEST $CLI volume stop $V0; +EXPECT 'Stopped' volinfo_field $V0 'Status'; +TEST $CLI volume delete $V0; +TEST ! $CLI volume info $V0; + +cleanup; diff --git a/tests/bugs/distribute/bug-1161156.t b/tests/bugs/distribute/bug-1161156.t new file mode 100755 index 00000000000..dfaea90b414 --- /dev/null +++ b/tests/bugs/distribute/bug-1161156.t @@ -0,0 +1,54 @@ +#!/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 mkdir -p $N0/newdir + +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 limit-usage /newdir 5MB +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 rename within a directory. It should pass even when the +# corresponding directory quota is filled. +TEST mv $N0/dir/file $N0/dir/newfile_3 + +# rename should fail here with disk quota exceeded +TEST ! mv $N0/dir/newfile_3 $N0/newdir/ + +# cleanup +umount_nfs $N0 +cleanup; diff --git a/tests/bugs/distribute/bug-853258.t b/tests/bugs/distribute/bug-853258.t new file mode 100755 index 00000000000..b2d7f2b771a --- /dev/null +++ b/tests/bugs/distribute/bug-853258.t @@ -0,0 +1,45 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd + +mkdir -p $H0:$B0/${V0}0 +mkdir -p $H0:$B0/${V0}1 +mkdir -p $H0:$B0/${V0}2 +mkdir -p $H0:$B0/${V0}3 + +# Create and start a volume. +TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2 +TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status'; + +# Force assignment of initial ranges. +TEST $CLI volume rebalance $V0 fix-layout start +EXPECT_WITHIN $REBALANCE_TIMEOUT "fix-layout completed" rebalance_status_field $V0 + +# Get the original values. +xattrs="" +for i in $(seq 0 2); do + xattrs="$xattrs $(dht_get_layout $B0/${V0}$i)" +done + +# Expand the volume and force assignment of new ranges. +TEST $CLI volume add-brick $V0 $H0:$B0/${V0}3 +# Force assignment of initial ranges. +TEST $CLI volume rebalance $V0 fix-layout start +EXPECT_WITHIN $REBALANCE_TIMEOUT "fix-layout completed" rebalance_status_field $V0 + +for i in $(seq 0 3); do + xattrs="$xattrs $(dht_get_layout $B0/${V0}$i)" +done + +overlap=$( $PYTHON $(dirname $0)/overlap.py $xattrs) +# 2863311531 = 0xaaaaaaab = 2/3 overlap +TEST [ "$overlap" -ge 2863311531 ] + +cleanup diff --git a/tests/bugs/distribute/bug-860663.c b/tests/bugs/distribute/bug-860663.c new file mode 100644 index 00000000000..bee4e7d40b1 --- /dev/null +++ b/tests/bugs/distribute/bug-860663.c @@ -0,0 +1,43 @@ +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <fcntl.h> +#include <string.h> +#include <err.h> +#include <sys/param.h> + +int +main(argc, argv) + int argc; + char **argv; +{ + char *basepath; + char path[MAXPATHLEN + 1]; + unsigned int count; + int i, fd; + + if (argc != 3) + errx(1, "usage: %s path count", argv[0]); + + basepath = argv[1]; + count = atoi(argv[2]); + + if (count > 999999) + errx(1, "count too big"); + + if (strlen(basepath) > MAXPATHLEN - 6) + errx(1, "path too long"); + + for (i = 0; i < count; i++) { + (void)sprintf(path, "%s%06d", basepath, i); + + fd = open(path, O_CREAT|O_RDWR, 0644); + if (fd == -1) + err(1, "create %s failed", path); + + if (close(fd) != 0) + warn("close %s failed", path); + } + + return 0; +} diff --git a/tests/bugs/distribute/bug-860663.t b/tests/bugs/distribute/bug-860663.t new file mode 100644 index 00000000000..f250a736e41 --- /dev/null +++ b/tests/bugs/distribute/bug-860663.t @@ -0,0 +1,54 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc + +cleanup; + +function file_count() +{ + val=1 + + if [ "$1" == "$2" ] + then + val=0 + fi + echo $val +} + +BRICK_COUNT=3 + +build_tester $(dirname $0)/bug-860663.c + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2 +TEST $CLI volume start $V0 + +## Mount FUSE +TEST glusterfs -s $H0 --volfile-id $V0 $M0; + +TEST $(dirname $0)/bug-860663 $M0/files 10000 + +ORIG_FILE_COUNT=`ls -l $M0 | wc -l`; +TEST [ $ORIG_FILE_COUNT -ge 10000 ] + +# Kill a brick process +kill -9 `cat $GLUSTERD_WORKDIR/vols/$V0/run/$H0-d-backends-${V0}1.pid`; + +TEST $CLI volume rebalance $V0 fix-layout start + +sleep 30; + +TEST ! $(dirname $0)/bug-860663 $M0/files 10000 + +TEST $CLI volume start $V0 force + +sleep 5; + +NEW_FILE_COUNT=`ls -l $M0 | wc -l`; + +EXPECT "0" file_count $ORIG_FILE_COUNT $NEW_FILE_COUNT + +rm -f $(dirname $0)/bug-860663 +cleanup; diff --git a/tests/bugs/distribute/bug-862967.t b/tests/bugs/distribute/bug-862967.t new file mode 100644 index 00000000000..07b053787ba --- /dev/null +++ b/tests/bugs/distribute/bug-862967.t @@ -0,0 +1,59 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc + +cleanup; + +function uid_gid_compare() +{ + val=1 + + if [ "$1" == "$3" ] + then + if [ "$2" == "$4" ] + then + val=0 + fi + fi + echo "$val" +} + +BRICK_COUNT=3 + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2 +TEST $CLI volume set $V0 stat-prefetch off +TEST $CLI volume start $V0 + +## Mount FUSE +TEST glusterfs --attribute-timeout=0 --entry-timeout=0 --gid-timeout=-1 -s $H0 --volfile-id $V0 $M0; + +# change dir permissions +mkdir $M0/dir; +chown 1:1 $M0/dir; + +# Kill a brick process + +kill -9 `cat $GLUSTERD_WORKDIR/vols/$V0/run/$H0-d-backends-${V0}1.pid`; +# change dir ownership +NEW_UID=36; +NEW_GID=36; +chown $NEW_UID:$NEW_GID $M0/dir; + +# bring the brick back up +TEST $CLI volume start $V0 force + +sleep 10; + +ls -l $M0/dir; + +# check if uid/gid is healed on backend brick which was taken down +BACKEND_UID=`stat -c %u $B0/${V0}1/dir`; +BACKEND_GID=`stat -c %g $B0/${V0}1/dir`; + + +EXPECT "0" uid_gid_compare $NEW_UID $NEW_GID $BACKEND_UID $BACKEND_GID + +cleanup; diff --git a/tests/bugs/distribute/bug-882278.t b/tests/bugs/distribute/bug-882278.t new file mode 100755 index 00000000000..8cb51474720 --- /dev/null +++ b/tests/bugs/distribute/bug-882278.t @@ -0,0 +1,73 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +cleanup + +# Is there a good reason to require --fqdn elsewhere? It's worse than useless +# here. +H0=$(hostname -s) + +function recreate { + # The rm is necessary so we don't get fooled by leftovers from old runs. + rm -rf $1 && mkdir -p $1 +} + +function count_lines { + grep "$1" $2/* | wc -l +} + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info; + +## Start and create a volume +TEST recreate ${B0}/${V0}-0 +TEST recreate ${B0}/${V0}-1 +TEST $CLI volume create $V0 $H0:$B0/${V0}-{0,1} +TEST $CLI volume set $V0 cluster.nufa on + +function volinfo_field() +{ + local vol=$1; + local field=$2; + + $CLI volume info $vol | grep "^$field: " | sed 's/.*: //'; +} + + +## Verify volume is created +EXPECT "$V0" volinfo_field $V0 'Volume Name'; +EXPECT 'Created' volinfo_field $V0 'Status'; + +## Start volume and verify +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; + +## Mount native +special_option="--xlator-option ${V0}-dht.local-volume-name=${V0}-client-1" +TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $special_option $M0 + +## Create a bunch of test files. +for i in $(seq 0 99); do + echo hello > $(printf $M0/file%02d $i) +done + +## Make sure the files went to the right place. There might be link files in +## the other brick, but they won't have any contents. +EXPECT "0" count_lines hello ${B0}/${V0}-0 +EXPECT "100" count_lines hello ${B0}/${V0}-1 + +if [ "$EXIT_EARLY" = "1" ]; then + exit 0; +fi + +## Finish up +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $CLI volume stop $V0; +EXPECT 'Stopped' volinfo_field $V0 'Status'; + +TEST $CLI volume delete $V0; +TEST ! $CLI volume info $V0; + +cleanup; diff --git a/tests/bugs/distribute/bug-884455.t b/tests/bugs/distribute/bug-884455.t new file mode 100755 index 00000000000..59413cd5408 --- /dev/null +++ b/tests/bugs/distribute/bug-884455.t @@ -0,0 +1,84 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../dht.rc + +cleanup; + +function layout_compare() +{ + res=0 + + if [ "$1" == "$2" ] + then + res=1 + fi + if [ "$1" == "$3" ] + then + res=1 + fi + if [ "$2" == "$3" ] + then + res=1 + fi + + echo $res +} + +function get_layout() +{ + layout1=`getfattr -n trusted.glusterfs.dht -e hex $1 2>&1|grep dht |cut -d = -f2` + layout2=`getfattr -n trusted.glusterfs.dht -e hex $2 2>&1|grep dht |cut -d = -f2` + layout3=`getfattr -n trusted.glusterfs.dht -e hex $3 2>&1|grep dht |cut -d = -f2` + + ret=$(layout_compare $layout1 $layout2 $layout3) + + if [ $ret -ne 0 ] + then + echo 1 + else + echo 0 + fi + +} + +BRICK_COUNT=3 + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 +## set subvols-per-dir option +TEST $CLI volume set $V0 subvols-per-directory 2 +TEST $CLI volume start $V0 + +## Mount FUSE +TEST glusterfs -s $H0 --volfile-id $V0 $M0; + +TEST mkdir $M0/dir{1..10} 2>/dev/null; + +## Add-brick n run rebalance to force re-write of layout +TEST $CLI volume add-brick $V0 $H0:$B0/${V0}2 +sleep 5; + +## trigger dir self heal on client +TEST ls -l $M0 2>/dev/null; + +TEST $CLI volume rebalance $V0 start force + +EXPECT_WITHIN $REBALANCE_TIMEOUT "0" rebalance_completed + +## check for layout overlaps. +EXPECT "0" get_layout $B0/${V0}0 $B0/${V0}1 $B0/${V0}2 +EXPECT "0" get_layout $B0/${V0}0/dir1 $B0/${V0}1/dir1 $B0/${V0}2/dir1 +EXPECT "0" get_layout $B0/${V0}0/dir2 $B0/${V0}1/dir2 $B0/${V0}2/dir2 +EXPECT "0" get_layout $B0/${V0}0/dir3 $B0/${V0}1/dir3 $B0/${V0}2/dir3 +EXPECT "0" get_layout $B0/${V0}0/dir4 $B0/${V0}1/dir4 $B0/${V0}2/dir4 +EXPECT "0" get_layout $B0/${V0}0/dir5 $B0/${V0}1/dir5 $B0/${V0}2/dir5 +EXPECT "0" get_layout $B0/${V0}0/dir6 $B0/${V0}1/dir6 $B0/${V0}2/dir6 +EXPECT "0" get_layout $B0/${V0}0/dir7 $B0/${V0}1/dir7 $B0/${V0}2/dir7 +EXPECT "0" get_layout $B0/${V0}0/dir8 $B0/${V0}1/dir8 $B0/${V0}2/dir8 +EXPECT "0" get_layout $B0/${V0}0/dir9 $B0/${V0}1/dir9 $B0/${V0}2/dir9 +EXPECT "0" get_layout $B0/${V0}0/dir10 $B0/${V0}1/dir10 $B0/${V0}2/dir10 + +cleanup; diff --git a/tests/bugs/distribute/bug-884597.t b/tests/bugs/distribute/bug-884597.t new file mode 100755 index 00000000000..d6a2c65f370 --- /dev/null +++ b/tests/bugs/distribute/bug-884597.t @@ -0,0 +1,173 @@ +#!/bin/bash +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../dht.rc +. $(dirname $0)/../../volume.rc + +cleanup; +BRICK_COUNT=3 +function uid_gid_compare() +{ + val=1 + + if [ "$1" == "$3" ] + then + if [ "$2" == "$4" ] + then + val=0 + fi + fi + echo "$val" +} + + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2 +TEST $CLI volume start $V0 + +## Mount FUSE +TEST glusterfs --attribute-timeout=0 --entry-timeout=0 -s $H0 --volfile-id $V0 $M0; + +i=1 +NEW_UID=36 +NEW_GID=36 + +TEST touch $M0/$i + +chown $NEW_UID:$NEW_GID $M0/$i +## rename till file gets a linkfile + +has_link=0 +while [ $i -lt 100 ] +do + mv $M0/$i $M0/$(( $i+1 )) + if [ $? -ne 0 ] + then + break + fi + let i++ + file_has_linkfile $i + has_link=$? + if [ $has_link -eq 2 ] + then + break; + fi +done + +TEST [ $has_link -eq 2 ] + +get_hashed_brick $i +cached=$? + +# check if uid/gid on linkfile is created with correct uid/gid +BACKEND_UID=`stat -c %u $B0/${V0}$cached/$i`; +BACKEND_GID=`stat -c %g $B0/${V0}$cached/$i`; + +EXPECT "0" uid_gid_compare $NEW_UID $NEW_GID $BACKEND_UID $BACKEND_GID + +# remove linkfile from backend, and trigger a lookup heal. uid/gid should match +rm -rf $B0/${V0}$cached/$i + +# without a unmount, we are not able to trigger a lookup based heal + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 + +## Mount FUSE +TEST glusterfs --attribute-timeout=0 --entry-timeout=0 -s $H0 --volfile-id $V0 $M0; + +lookup=`ls -l $M0/$i 2>/dev/null` + +# check if uid/gid on linkfile is created with correct uid/gid +BACKEND_UID=`stat -c %u $B0/${V0}$cached/$i`; +BACKEND_GID=`stat -c %g $B0/${V0}$cached/$i`; + +EXPECT "0" uid_gid_compare $NEW_UID $NEW_GID $BACKEND_UID $BACKEND_GID +# create hardlinks. Make sure a linkfile gets created + +i=1 +NEW_UID=36 +NEW_GID=36 + +TEST touch $M0/file +chown $NEW_UID:$NEW_GID $M0/file; + +## ln till file gets a linkfile + +has_link=0 +while [ $i -lt 100 ] +do + ln $M0/file $M0/link$i + if [ $? -ne 0 ] + then + break + fi + file_has_linkfile link$i + has_link=$? + if [ $has_link -eq 2 ] + then + break; + fi + let i++ +done + +TEST [ $has_link -eq 2 ] + +get_hashed_brick link$i +cached=$? + +# check if uid/gid on linkfile is created with correct uid/gid +BACKEND_UID=`stat -c %u $B0/${V0}$cached/link$i`; +BACKEND_GID=`stat -c %g $B0/${V0}$cached/link$i`; + +EXPECT "0" uid_gid_compare $NEW_UID $NEW_GID $BACKEND_UID $BACKEND_GID + +## UID/GID creation as different user +i=1 +NEW_UID=36 +NEW_GID=36 + +TEST touch $M0/user_file1 +TEST chown $NEW_UID:$NEW_GID $M0/user_file1; + +## Give permission on volume, so that different users can perform rename + +TEST chmod 0777 $M0 + +## Add a user known as ABC and perform renames +TEST `useradd -M ABC 2>/dev/null` + +TEST cd $M0 +## rename as different user till file gets a linkfile + +has_link=0 +while [ $i -lt 100 ] +do + su -m ABC -c "mv $M0/user_file$i $M0/user_file$(( $i+1 ))" + if [ $? -ne 0 ] + then + break + fi + let i++ + file_has_linkfile user_file$i + has_link=$? + if [ $has_link -eq 2 ] + then + break; + fi +done + +TEST [ $has_link -eq 2 ] + +## del user ABC +TEST userdel ABC + +get_hashed_brick user_file$i +cached=$? + +# check if uid/gid on linkfile is created with correct uid/gid +BACKEND_UID=`stat -c %u $B0/${V0}$cached/user_file$i`; +BACKEND_GID=`stat -c %g $B0/${V0}$cached/user_file$i`; + +EXPECT "0" uid_gid_compare $NEW_UID $NEW_GID $BACKEND_UID $BACKEND_GID +cleanup; diff --git a/tests/bugs/distribute/bug-907072.t b/tests/bugs/distribute/bug-907072.t new file mode 100755 index 00000000000..1e8bd280f32 --- /dev/null +++ b/tests/bugs/distribute/bug-907072.t @@ -0,0 +1,47 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../fileio.rc +. $(dirname $0)/../../dht.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +TEST glusterd; +TEST pidof glusterd; + +TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1,2,3}; +TEST $CLI volume start $V0; + +TEST glusterfs -s $H0 --volfile-id $V0 $M0; + +TEST mkdir $M0/test; + +OLD_LAYOUT0=`get_layout $B0/${V0}0/test`; +OLD_LAYOUT1=`get_layout $B0/${V0}1/test`; +OLD_LAYOUT2=`get_layout $B0/${V0}2/test`; +OLD_LAYOUT3=`get_layout $B0/${V0}3/test`; + +TEST killall glusterfsd; + +# Delete directory on one brick +TEST rm -rf $B0/${V}1/test; + +# And only layout xattr on another brick +TEST setfattr -x trusted.glusterfs.dht $B0/${V0}2/test; + +TEST $CLI volume start $V0 force; + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST glusterfs -s $H0 --volfile-id $V0 $M0; +TEST stat $M0/test; + +NEW_LAYOUT0=`get_layout $B0/${V0}0/test`; +NEW_LAYOUT1=`get_layout $B0/${V0}1/test`; +NEW_LAYOUT2=`get_layout $B0/${V0}2/test`; +NEW_LAYOUT3=`get_layout $B0/${V0}3/test`; + +EXPECT $OLD_LAYOUT0 echo $NEW_LAYOUT0; +EXPECT $OLD_LAYOUT1 echo $NEW_LAYOUT1; +EXPECT $OLD_LAYOUT2 echo $NEW_LAYOUT2; +EXPECT $OLD_LAYOUT3 echo $NEW_LAYOUT3; diff --git a/tests/bugs/distribute/bug-912564.t b/tests/bugs/distribute/bug-912564.t new file mode 100755 index 00000000000..d437728f83b --- /dev/null +++ b/tests/bugs/distribute/bug-912564.t @@ -0,0 +1,92 @@ +#!/bin/bash + +# Test that the rsync and "extra" regexes cause rename-in-place without +# creating linkfiles, when they're supposed to. Without the regex we'd have a +# 1/4 chance of each file being assigned to the right place, so with 16 files +# we have a 1/2^32 chance of getting the correct result by accident. + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +function count_linkfiles { + local i + local count=0 + for i in $(seq $2 $3); do + x=$(find $1$i -perm -1000 | wc -l) + # Divide by two because of the .glusterfs links. + count=$((count+x/2)) + done + echo $count +} + +# This function only exists to get around quoting difficulties in TEST. +function set_regex { + $CLI volume set $1 cluster.extra-hash-regex '^foo(.+)bar$' +} + +cleanup; + +TEST glusterd +TEST pidof glusterd + +mkdir -p $H0:$B0/${V0}0 +mkdir -p $H0:$B0/${V0}1 +mkdir -p $H0:$B0/${V0}2 +mkdir -p $H0:$B0/${V0}3 + +# Create and start a volume. +TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 \ + $H0:$B0/${V0}2 $H0:$B0/${V0}3 +TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status'; + +# Mount it. +TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0 + +# Make sure the rsync regex works, by verifying that no linkfiles are +# created. +rm -f $M0/file* +for i in $(seq 0 15); do + fn=$(printf file%x $i) + tmp_fn=$(printf .%s.%d $fn $RANDOM) + echo testing > $M0/$tmp_fn + mv $M0/$tmp_fn $M0/$fn +done +lf=$(count_linkfiles $B0/$V0 0 3) +TEST [ "$lf" -eq "0" ] + +# Make sure that linkfiles *are* created for normal files. +rm -f $M0/file* +for i in $(seq 0 15); do + fn=$(printf file%x $i) + tmp_fn=$(printf foo%sbar $fn) + echo testing > $M0/$tmp_fn + mv $M0/$tmp_fn $M0/$fn +done +lf=$(count_linkfiles $B0/$V0 0 3) +TEST [ "$lf" -ne "0" ] + +# Make sure that setting an extra regex suppresses the linkfiles. +TEST set_regex $V0 +rm -f $M0/file* +for i in $(seq 0 15); do + fn=$(printf file%x $i) + tmp_fn=$(printf foo%sbar $fn) + echo testing > $M0/$tmp_fn + mv $M0/$tmp_fn $M0/$fn +done +lf=$(count_linkfiles $B0/$V0 0 3) +TEST [ "$lf" -eq "0" ] + +# Re-test the rsync regex, to make sure the extra one didn't break it. +rm -f $M0/file* +for i in $(seq 0 15); do + fn=$(printf file%x $i) + tmp_fn=$(printf .%s.%d $fn $RANDOM) + echo testing > $M0/$tmp_fn + mv $M0/$tmp_fn $M0/$fn +done +lf=$(count_linkfiles $B0/$V0 0 3) +TEST [ "$lf" -eq "0" ] + +cleanup diff --git a/tests/bugs/distribute/bug-915554.t b/tests/bugs/distribute/bug-915554.t new file mode 100755 index 00000000000..5caf4834b8c --- /dev/null +++ b/tests/bugs/distribute/bug-915554.t @@ -0,0 +1,76 @@ +#!/bin/bash +# +# Bug <915554> +# +# This test checks for a condition where a rebalance migrates a file and does +# not preserve the original file size. This can occur due to hole preservation +# logic in the file migration code. If a file size is aligned to a disk sector +# boundary (512b) and the tail portion of the file is zero-filled, the file +# may end up truncated to the end of the last data region in the file. +# +### + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../dht.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd + +BRICK_COUNT=3 +# create, start and mount a two brick DHT volume +TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2 +TEST $CLI volume start $V0 + +TEST glusterfs --attribute-timeout=0 --entry-timeout=0 --gid-timeout=-1 -s $H0 --volfile-id $V0 $M0; + +i=1 +# Write some data to a file and extend such that the file is sparse to a sector +# aligned boundary. +echo test > $M0/$i +TEST truncate -s 1M $M0/$i + +# cache the original size +SIZE1=`stat -c %s $M0/$i` + +# rename till file gets a linkfile + +while [ $i -ne 0 ] +do + test=`mv $M0/$i $M0/$(( $i+1 )) 2>/dev/null` + if [ $? -ne 0 ] + then + echo "rename failed" + break + fi + let i++ + file_has_linkfile $i + has_link=$? + if [ $has_link -eq 2 ] + then + break; + fi +done + +# start a rebalance (force option to overide checks) to trigger migration of +# file + +TEST $CLI volume rebalance $V0 start force + +# check if rebalance has completed for upto 15 secs + +EXPECT_WITHIN $REBALANCE_TIMEOUT "0" rebalance_completed + +# validate the file size after the migration +SIZE2=`stat -c %s $M0/$i` + +TEST [ $SIZE1 -eq $SIZE2 ] + +TEST rm -f $M0/$i +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 + +cleanup; diff --git a/tests/bugs/distribute/bug-921408.t b/tests/bugs/distribute/bug-921408.t new file mode 100755 index 00000000000..b1887f8ae22 --- /dev/null +++ b/tests/bugs/distribute/bug-921408.t @@ -0,0 +1,90 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../fileio.rc +. $(dirname $0)/../../dht.rc +. $(dirname $0)/../../volume.rc + +cleanup; +wait_check_status () +{ + n=0 + while [ $n -lt $1 ] + do + ret=$(rebalance_completed) + if [ $ret == "0" ] + then + return 0; + else + sleep 1 + n=`expr $n + 1`; + fi + done + return 1; +} + +addbr_rebal_till_layout_change() +{ + val=1 + l=$1 + i=1 + while [ $i -lt 5 ] + do + $CLI volume add-brick $V0 $H0:$B0/${V0}$l &>/dev/null + $CLI volume rebalance $V0 fix-layout start &>/dev/null + wait_check_status $REBALANCE_TIMEOUT + if [ $? -eq 1 ] + then + break + fi + NEW_LAYOUT=`get_layout $B0/${V0}0` + if [ $OLD_LAYOUT == $NEW_LAYOUT ] + then + i=`expr $i + 1`; + l=`expr $l + 1`; + else + val=0 + break + fi + done + return $val +} +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/${V0}0 +TEST $CLI volume set $V0 subvols-per-directory 1 +TEST $CLI volume start $V0 + +TEST glusterfs -s $H0 --volfile-id $V0 $M0; + +TEST mkdir $M0/test +TEST touch $M0/test/test + +fd=`fd_available` +TEST fd_open $fd "rw" $M0/test/test + +OLD_LAYOUT=`get_layout $B0/${V0}0` + +addbr_rebal_till_layout_change 1 + +TEST [ $? -eq 0 ] + +for i in $(seq 1 1000) +do + ls -l $M0/ >/dev/null + ret=$? + if [ $ret != 0 ] + then + break + fi +done + +TEST [ $ret == 0 ]; +TEST fd_close $fd; + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0 + +cleanup diff --git a/tests/bugs/distribute/bug-924265.t b/tests/bugs/distribute/bug-924265.t new file mode 100755 index 00000000000..67c21de97cb --- /dev/null +++ b/tests/bugs/distribute/bug-924265.t @@ -0,0 +1,35 @@ +#!/bin/bash + +# Test that setting cluster.dht-xattr-name works, and that DHT consistently +# uses the specified name instead of the default. + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +# We only care about the exit code, so keep it quiet. +function silent_getfattr { + getfattr $* &> /dev/null +} + +cleanup + +TEST glusterd +TEST pidof glusterd + +mkdir -p $H0:$B0/${V0}0 + +# Create a volume and set the option. +TEST $CLI volume create $V0 $H0:$B0/${V0}0 +TEST $CLI volume set $V0 cluster.dht-xattr-name trusted.foo.bar + +# Start and mount the volume. +TEST $CLI volume start $V0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status'; +TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0 + +# Create a directory and make sure it has the right xattr. +mkdir $M0/test +TEST ! silent_getfattr -n trusted.glusterfs.dht $B0/${V0}0/test +TEST silent_getfattr -n trusted.foo.bar $B0/${V0}0/test + +cleanup diff --git a/tests/bugs/distribute/bug-961615.t b/tests/bugs/distribute/bug-961615.t new file mode 100644 index 00000000000..00938e8fa9b --- /dev/null +++ b/tests/bugs/distribute/bug-961615.t @@ -0,0 +1,34 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +#This test tests that an extra fd_unref does not happen in rebalance +#migration completion check code path in dht + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 +TEST $CLI volume set $V0 performance.quick-read off +TEST $CLI volume set $V0 performance.io-cache off +TEST $CLI volume set $V0 performance.write-behind off +TEST $CLI volume set $V0 performance.stat-prefetch off +TEST $CLI volume set $V0 performance.read-ahead off +TEST $CLI volume start $V0 +TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 +TEST touch $M0/1 +#This rename creates a link file for 10 in the other volume. +TEST mv $M0/1 $M0/10 +#Lets keep writing to the file which will trigger rebalance completion check +dd if=/dev/zero of=$M0/10 bs=1k & +bg_pid=$! +#Now rebalance force will migrate file '10' +TEST $CLI volume rebalance $V0 start force +EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0 +#If the bug exists mount would have crashed by now +TEST ls $M0 +kill -9 $bg_pid > /dev/null 2>&1 +wait > /dev/null 2>&1 +cleanup diff --git a/tests/bugs/distribute/bug-973073.t b/tests/bugs/distribute/bug-973073.t new file mode 100755 index 00000000000..aac4afdc226 --- /dev/null +++ b/tests/bugs/distribute/bug-973073.t @@ -0,0 +1,48 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../dht.rc + +## Steps followed are one descibed in bugzilla + +cleanup; + +function get_layout() +{ + layout1=`getfattr -n trusted.glusterfs.dht -e hex $1 2>&1` + + if [ $? -ne 0 ] + then + echo 1 + else + echo 0 + fi + +} + +BRICK_COUNT=3 + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2 +TEST $CLI volume start $V0 + +## Mount FUSE +TEST glusterfs -s $H0 --volfile-id $V0 $M0; + +TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 start + +## remove-brick status == rebalance_status +EXPECT_WITHIN $REBALANCE_TIMEOUT "0" remove_brick_completed + +TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 stop + +TEST $CLI volume rebalance $V0 fix-layout start + +EXPECT_WITHIN $REBALANCE_TIMEOUT "0" rebalance_completed + +TEST mkdir $M0/dir 2>/dev/null; + +EXPECT "0" get_layout $B0/${V0}2/dir +cleanup; diff --git a/tests/bugs/distribute/overlap.py b/tests/bugs/distribute/overlap.py new file mode 100755 index 00000000000..15f2da473f1 --- /dev/null +++ b/tests/bugs/distribute/overlap.py @@ -0,0 +1,59 @@ +#!/usr/bin/python + +import sys + +def calculate_one (ov, nv): + old_start = int(ov[18:26],16) + old_end = int(ov[26:34],16) + new_start = int(nv[18:26],16) + new_end = int(nv[26:34],16) + if (new_end < old_start) or (new_start > old_end): + #print '%s, %s -> ZERO' % (ov, nv) + return 0 + all_start = max(old_start,new_start) + all_end = min(old_end,new_end) + #print '%s, %s -> %08x' % (ov, nv, all_end - all_start + 1) + return all_end - all_start + 1 + +def calculate_all (values): + total = 0 + nv_index = len(values) / 2 + for old_val in values[:nv_index]: + new_val = values[nv_index] + nv_index += 1 + total += calculate_one(old_val,new_val) + return total + +""" +test1_vals = [ + '0x0000000000000000000000003fffffff', # first quarter + '0x0000000000000000400000007fffffff', # second quarter + '0x000000000000000080000000ffffffff', # second half + '0x00000000000000000000000055555554', # first third + '0x000000000000000055555555aaaaaaa9', # second third + '0x0000000000000000aaaaaaaaffffffff', # last third +] + +test2_vals = [ + '0x0000000000000000000000003fffffff', # first quarter + '0x0000000000000000400000007fffffff', # second quarter + '0x000000000000000080000000ffffffff', # second half + '0x00000000000000000000000055555554', # first third + # Next two are (incorrectly) swapped. + '0x0000000000000000aaaaaaaaffffffff', # last third + '0x000000000000000055555555aaaaaaa9', # second third +] + +print '%08x' % calculate_one(test1_vals[0],test1_vals[3]) +print '%08x' % calculate_one(test1_vals[1],test1_vals[4]) +print '%08x' % calculate_one(test1_vals[2],test1_vals[5]) +print '= %08x' % calculate_all(test1_vals) +print '%08x' % calculate_one(test2_vals[0],test2_vals[3]) +print '%08x' % calculate_one(test2_vals[1],test2_vals[4]) +print '%08x' % calculate_one(test2_vals[2],test2_vals[5]) +print '= %08x' % calculate_all(test2_vals) +""" + +if __name__ == '__main__': + # Return decimal so bash can reason about it. + print '%d' % calculate_all(sys.argv[1:]) |