diff options
| author | Pranith Kumar K <pkarampu@redhat.com> | 2018-08-27 11:46:33 +0530 | 
|---|---|---|
| committer | Pranith Kumar K <pkarampu@redhat.com> | 2018-08-28 19:42:55 +0530 | 
| commit | ccaad48f51d4e8d3de001dc3907df68c69f8792b (patch) | |
| tree | 817981603b393d9e60400ed83308ee0b10970778 /tests | |
| parent | 37f77b124283c3252ef00935628ff30b3e5696e6 (diff) | |
cluster/afr: Delegate metadata heal with pending xattrs to SHD
Problem:
When metadata-self-heal is triggered on the mount, it blocks
lookup until metadata-self-heal completes. But that can lead
to hangs when lot of clients are accessing a directory which
needs metadata heal and all of them trigger heals waiting
for other clients to complete heal.
Fix:
Only when the heal is needed but the pending xattrs are not set,
trigger metadata heal that could block lookup. This is the only
case where different clients may give different metadata to the
clients without heals, which should be avoided.
Updates bz#1622821
Change-Id: I6089e9fda0770a83fb287941b229c882711f4e66
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Diffstat (limited to 'tests')
| -rwxr-xr-x | tests/basic/afr/client-side-heal.t | 28 | ||||
| -rw-r--r-- | tests/bugs/glusterfs/bug-906646.t | 10 | 
2 files changed, 25 insertions, 13 deletions
diff --git a/tests/basic/afr/client-side-heal.t b/tests/basic/afr/client-side-heal.t index eba7dc2b3c4..1e9336184b5 100755 --- a/tests/basic/afr/client-side-heal.t +++ b/tests/basic/afr/client-side-heal.t @@ -17,6 +17,7 @@ TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;  echo "some data" > $M0/datafile  EXPECT 0 echo $?  TEST touch $M0/mdatafile +TEST touch $M0/mdatafile-backend-direct-modify  TEST mkdir $M0/dir  #Kill a brick and perform I/O to have pending heals. @@ -29,6 +30,7 @@ EXPECT 0 echo $?  #pending metadata heal  TEST chmod +x $M0/mdatafile +TEST chmod +x $B0/${V0}0/mdatafile-backend-direct-modify  #pending entry heal. Also causes pending metadata/data heals on file{1..5}  TEST touch $M0/dir/file{1..5} @@ -40,9 +42,12 @@ TEST $CLI volume start $V0 force  EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0  #Medatada heal via explicit lookup must not happen -TEST ls $M0/mdatafile +TEST getfattr -d -m. -e hex $M0/mdatafile +TEST ls $M0/mdatafile-backend-direct-modify -#Inode refresh must not trigger data and entry heals. +TEST [[ "$(stat -c %A $B0/${V0}0/mdatafile-backend-direct-modify)" != "$(stat -c %A $B0/${V0}1/mdatafile-backend-direct-modify)" ]] + +#Inode refresh must not trigger data metadata and entry heals.  #To trigger inode refresh for sure, the volume is unmounted and mounted each time.  #Check that data heal does not happen.  EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 @@ -52,7 +57,6 @@ TEST cat $M0/datafile  EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0  TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;  TEST ls $M0/dir -  #No heal must have happened  EXPECT 8 get_pending_heal_count $V0 @@ -61,21 +65,25 @@ TEST $CLI volume set $V0 cluster.data-self-heal on  TEST $CLI volume set $V0 cluster.metadata-self-heal on  TEST $CLI volume set $V0 cluster.entry-self-heal on -#Metadata heal is triggered by lookup without need for inode refresh. -TEST ls $M0/mdatafile -EXPECT 7 get_pending_heal_count $V0 - -#Inode refresh must trigger data and entry heals. +#Inode refresh must trigger data metadata and entry heals.  #To trigger inode refresh for sure, the volume is unmounted and mounted each time.  EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0  TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0; +TEST ls $M0/mdatafile-backend-direct-modify + +TEST [[ "$(stat -c %A $B0/${V0}0/mdatafile-backend-direct-modify)" == "$(stat -c %A $B0/${V0}1/mdatafile-backend-direct-modify)" ]] + + +TEST getfattr -d -m. -e hex $M0/mdatafile +EXPECT_WITHIN $HEAL_TIMEOUT 7 get_pending_heal_count $V0 +  TEST cat $M0/datafile  EXPECT_WITHIN $HEAL_TIMEOUT 6 get_pending_heal_count $V0  EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0  TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;  TEST ls $M0/dir -EXPECT 5 get_pending_heal_count $V0 +EXPECT_WITHIN $HEAL_TIMEOUT 5 get_pending_heal_count $V0  TEST cat  $M0/dir/file1  TEST cat  $M0/dir/file2 @@ -83,5 +91,5 @@ TEST cat  $M0/dir/file3  TEST cat  $M0/dir/file4  TEST cat  $M0/dir/file5 -EXPECT 0 get_pending_heal_count $V0 +EXPECT_WITHIN $HEAL_TIMEOUT 0 get_pending_heal_count $V0  cleanup; diff --git a/tests/bugs/glusterfs/bug-906646.t b/tests/bugs/glusterfs/bug-906646.t index 45c85d9f67c..37b8fe5c8eb 100644 --- a/tests/bugs/glusterfs/bug-906646.t +++ b/tests/bugs/glusterfs/bug-906646.t @@ -13,7 +13,6 @@ TEST pidof glusterd  TEST $CLI volume create $V0 replica $REPLICA $H0:$B0/${V0}-00 $H0:$B0/${V0}-01 $H0:$B0/${V0}-10 $H0:$B0/${V0}-11  TEST $CLI volume start $V0 -TEST $CLI volume set $V0 cluster.self-heal-daemon off  TEST $CLI volume set $V0 cluster.background-self-heal-count 0  ## Mount FUSE with caching disabled @@ -82,10 +81,15 @@ EXPECT 1 xattr_query_check ${backend_paths_array[1]} "trusted.name"  # restart the brick process  TEST $CLI volume start $V0 force -EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 `expr $brick_id - 1` +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 3 -cat $pth >/dev/null +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0  # check backends - xattr should not be present anywhere  EXPECT 1 xattr_query_check ${backend_paths_array[0]} "trusted.name"  EXPECT 1 xattr_query_check ${backend_paths_array[1]} "trusted.name"  | 
