diff options
| author | Venkatesh Somyajulu <vsomyaju@redhat.com> | 2014-06-17 15:09:50 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vbellur@redhat.com> | 2014-06-17 05:39:22 -0700 | 
| commit | 93832829016a0a51a8938c0c89c6bd09b3229c9f (patch) | |
| tree | 46bf0526f0585e1046141cd265dfb3afd1844cd5 /tests | |
| parent | 3a499d170de2c7df06b127b709d27c64cef98886 (diff) | |
cluster/dht: Do layout self healing of directory for nameless lookup
Problem: Currently in the  nameless lookup code path, if at the
         end of the lookup, even if it detects that layout
         anamolies are there, layout healing will not be done as
         there is no code to heal it.
         So there can be race between mkdir and lookup.
         Assume mkdir is going on from some other mount point,
         Say, M1. Directories are created on some nodes but layout
         is not set yet.
         Now from M2, nameless lookup goes, lookup will be success
         full as the directory is present on some of the nodes, but
         it won't heal layout. Now if create goes after lookup fop,
         because layout is absent, file creation will fail.
Fix:     Included the code of layout self-heal in the nameless
         lookup path. At the end of lookup, layout will be computed
         as it would have been in the named lookup, but it will be
         set to those node only, where directory is present.
         So after that if create fop goes, the probabiliy to get the
         subvolume with proper hash-range is high now, so reduces
         the race window.
Other:  Whenever a directory is created, we have to choose a brick
        from which we start allocating layout in a circular fashion.
        To calculate this starting brick, I have changed the candidate
        from name of the directory to gfid of the directory
        But to compute where a given file belongs, we will still
        use the name of the file. Hash computed from the name of the
        file should belong to any one of the directory-hash-range
        Calculation of hash for a file is acting as a consumer and the
        setting of directory layout based on gfid is acting as a producer,
        which are independent from each other.
Change-Id: I3808c55082cd1b5c72d2c77cbbc063f55aa38bee
BUG: 1095888
Signed-off-by: Venkatesh Somyajulu <vsomyaju@redhat.com>
Reviewed-on: http://review.gluster.org/7493
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Raghavendra Bhat <raghavendra@redhat.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'tests')
| -rwxr-xr-x | tests/bugs/bug-1088231.t | 161 | 
1 files changed, 161 insertions, 0 deletions
diff --git a/tests/bugs/bug-1088231.t b/tests/bugs/bug-1088231.t new file mode 100755 index 00000000000..da6adaeb173 --- /dev/null +++ b/tests/bugs/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 +  | 
