Whamcloud - gitweb
LU-12577 llog: protect partial updates from readers
[fs/lustre-release.git] / lustre / tests / sanity.sh
index 8306005..58f7462 100755 (executable)
@@ -77,8 +77,8 @@ if (( $LINUX_VERSION_CODE >= $(version_code 4.18.0) &&
        ALWAYS_EXCEPT+=" 411"
 fi
 
-#                                  5          12     8   12  (min)"
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 135 136 300o"
+#                                  5              12     8   12  (min)"
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 60i 64b 68 71 115 135 136 300o"
 
 if [ "$mds1_FSTYPE" = "zfs" ]; then
        # bug number for skipped test:
@@ -3321,6 +3321,7 @@ run_test 27P "basic ops on foreign dir of foreign_symlink type"
 
 test_27Q() {
        rm -f $TMP/$tfile $TMP/$tfile.loop $TMP/$tfile.none $TMP/$tfile.broken
+       stack_trap "rm -f $TMP/$tfile*"
 
        test_mkdir $DIR/$tdir-1
        test_mkdir $DIR/$tdir-2
@@ -8267,6 +8268,34 @@ test_60h() {
 }
 run_test 60h "striped directory with missing stripes can be accessed"
 
+function t60i_load() {
+       mkdir $DIR/$tdir
+       #define OBD_FAIL_LLOG_PAUSE_AFTER_PAD               0x131c
+       $LCTL set_param fail_loc=0x131c fail_val=1
+       for ((i=0; i<5000; i++)); do
+               touch $DIR/$tdir/f$i
+       done
+}
+
+test_60i() {
+       changelog_register || error "changelog_register failed"
+       local cl_user="${CL_USERS[$SINGLEMDS]%% *}"
+       changelog_users $SINGLEMDS | grep -q $cl_user ||
+               error "User $cl_user not found in changelog_users"
+       changelog_chmask "ALL"
+       t60i_load &
+       local PID=$!
+       for((i=0; i<100; i++)); do
+               changelog_dump >/dev/null ||
+                       error "can't read changelog"
+       done
+       kill $PID
+       wait $PID
+       changelog_deregister || error "changelog_deregister failed"
+       $LCTL set_param fail_loc=0
+}
+run_test 60i "llog: new record vs reader race"
+
 test_61a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run"
 
@@ -8820,8 +8849,7 @@ test_65n() {
        which getfattr > /dev/null 2>&1 || skip_env "no getfattr command"
        which setfattr > /dev/null 2>&1 || skip_env "no setfattr command"
 
-       local root_layout=$(save_layout $MOUNT)
-       stack_trap "restore_layout $MOUNT $root_layout" EXIT
+       save_layout_restore_at_exit $MOUNT
 
        # new subdirectory under root directory should not inherit
        # the default layout from root
@@ -16082,6 +16110,56 @@ test_160m() {
 }
 run_test 160m "Changelog clear race"
 
+test_160n() {
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
+       [[ $MDS1_VERSION -ge $(version_code 2.14.51) ]] ||
+               skip "Need MDS version at least 2.14.51"
+       local cl_users
+       local cl_user1
+       local cl_user2
+       local pid1
+       local first_rec
+       local last_rec=0
+
+       # Create a user
+       changelog_register || error "first changelog_register failed"
+
+       cl_users=(${CL_USERS[mds1]})
+       cl_user1="${cl_users[0]}"
+
+       # generate some changelog records to accumulate on MDT0
+       test_mkdir -i0 -c1 $DIR/$tdir || error "test_mkdir $tdir failed"
+       first_rec=$(changelog_users $SINGLEMDS |
+                       awk '/^current.index:/ { print $NF }')
+       while (( last_rec < (( first_rec + 65000)) )); do
+               createmany -m $DIR/$tdir/$tfile 10000 ||
+                       error "create $DIR/$tdir/$tfile failed"
+
+               for i in $(seq 0 10000); do
+                       mrename $DIR/$tdir/$tfile$i $DIR/$tdir/$tfile-new$i \
+                               > /dev/null
+               done
+
+               unlinkmany $DIR/$tdir/$tfile-new 10000 ||
+                       error "unlinkmany failed unlink"
+               last_rec=$(changelog_users $SINGLEMDS |
+                       awk '/^current.index:/ { print $NF }')
+               echo last record $last_rec
+               (( last_rec == 0 )) && error "no changelog found"
+       done
+
+#define OBD_FAIL_MDS_CHANGELOG_DEL      0x16c
+       do_facet mds1 $LCTL set_param fail_loc=0x8000016c fail_val=0
+
+       __changelog_clear mds1 $cl_user1 0 &
+       pid1=$!
+       sleep 2
+       __changelog_clear mds1 $cl_user1 0 ||
+               error "fail to cancel record for $cl_user1"
+       wait $pid1
+       [[ $? -eq 0 ]] || error "fail to cancel record for $cl_user2"
+}
+run_test 160n "Changelog destroy race"
 
 test_161a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run"