#!/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 successful ## 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 ## new healing code don't attempt healing if inode is already ## populated. So, unmount and remount before we do stat. TEST umount $M0 TEST glusterfs --volfile-id=/$V0 --aux-gfid-mount --volfile-server=$H0 $M0 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 echo `get_layout $B0/$V0"0"/a` echo `get_layout $B0/$V0"1"/a` 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 ## new healing code don't attempt healing if inode is already ## populated. So, unmount and remount before we do stat. TEST umount $M0 TEST glusterfs --volfile-id=/$V0 --aux-gfid-mount --volfile-server=$H0 $M0 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