From f9345933b75cf7181358d1e791d3741b7b73771b Mon Sep 17 00:00:00 2001 From: Ravishankar N Date: Tue, 30 Jul 2019 17:05:22 +0530 Subject: afr: restore timestamp of parent dir during entry-heal Fixes: bz#1741044 Change-Id: I29e338bac62104233a6f80212df8d0fb016affda Signed-off-by: Ravishankar N (cherry picked from commit 8e9c53ebf16705b9a1db2fc486dc24a5cb244ddd) --- .../bug-1734370-entry-heal-restore-time.t | 78 ++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 tests/bugs/replicate/bug-1734370-entry-heal-restore-time.t (limited to 'tests') diff --git a/tests/bugs/replicate/bug-1734370-entry-heal-restore-time.t b/tests/bugs/replicate/bug-1734370-entry-heal-restore-time.t new file mode 100644 index 00000000000..26f3b2615fd --- /dev/null +++ b/tests/bugs/replicate/bug-1734370-entry-heal-restore-time.t @@ -0,0 +1,78 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../afr.rc + +cleanup; + +function time_stamps_match { + path=$1 + mtime_source_b0=$(get_mtime $B0/${V0}0/$path) + atime_source_b0=$(get_atime $B0/${V0}0/$path) + mtime_source_b2=$(get_mtime $B0/${V0}2/$path) + atime_source_b2=$(get_atime $B0/${V0}2/$path) + mtime_sink_b1=$(get_mtime $B0/${V0}1/$path) + atime_sink_b1=$(get_atime $B0/${V0}1/$path) + + #The same brick must be the source of heal for both atime and mtime. + if [[ ( $mtime_source_b0 -eq $mtime_sink_b1 && $atime_source_b0 -eq $atime_sink_b1 ) || \ + ( $mtime_source_b2 -eq $mtime_sink_b1 && $atime_source_b2 -eq $atime_sink_b1 ) ]] + then + echo "Y" + else + echo "N" + fi + +} + +# Test that the parent dir's timestamps are restored during entry-heal. +GET_MDATA_PATH=$(dirname $0)/../../utils +build_tester $GET_MDATA_PATH/get-mdata-xattr.c + +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}; +TEST $CLI volume start $V0; + +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1 +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2 + +############################################################################### +TEST mkdir $M0/DIR +TEST kill_brick $V0 $H0 $B0/${V0}1 +TEST touch $M0/DIR/FILE + +TEST $CLI volume start $V0 force +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 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 +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0 + +EXPECT "Y" time_stamps_match DIR + +############################################################################### +# Repeat the test with ctime feature disabled. +TEST $CLI volume set $V0 features.ctime off +TEST mkdir $M0/DIR2 +TEST kill_brick $V0 $H0 $B0/${V0}1 +TEST touch $M0/DIR2/FILE + +TEST $CLI volume start $V0 force +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0 +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 +TEST $CLI volume heal $V0 +EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0 + +EXPECT "Y" time_stamps_match DIR2 + +TEST rm $GET_MDATA_PATH/get-mdata-xattr +cleanup; -- cgit