Whamcloud - gitweb
LU-8295 tests: comply with OBD_RACE() behavior 17/21117/12
authorBruno Faccini <bruno.faccini@intel.com>
Thu, 30 Jun 2016 23:11:14 +0000 (01:11 +0200)
committerOleg Drokin <oleg.drokin@intel.com>
Sat, 17 Dec 2016 05:40:47 +0000 (05:40 +0000)
Have conf-sanity/test_41c better comply with OBD_RACE() internal
behavior when creating a racy situation with 2 similar mount
cmds being run in parallel.

CFS_FAIL_ONCE must be set, and fail_loc must only be reset when
it is sure that both mount commands have reached the race
rendez-vous, in order to have OBD_RACE() behave as expected.

start() function is no longer used to avoid extra tools which
surround mount command to interfer due to concurrency.

Signed-off-by: Bruno Faccini <bruno.faccini@intel.com>
Change-Id: Ic513c82c4fd1395d88144cf1c590a08dfd3c11e5
Reviewed-on: https://review.whamcloud.com/21117
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: John L. Hammond <john.hammond@intel.com>
Reviewed-by: Jian Yu <jian.yu@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/tests/conf-sanity.sh

index a4be4c1..76934d3 100755 (executable)
@@ -2881,24 +2881,45 @@ test_41c() {
           $server_version -lt $(version_code 2.5.11) ]] ||
                { skip "Need MDS version 2.5.4+ or 2.5.26+ or 2.6.52+"; return; }
 
+       # ensure mds1 ost1 have been created even if running sub-test standalone
        cleanup
+       setup
+       cleanup || error "cleanup failed"
+
+       # using directly mount command instead of start() function to avoid
+       # any side effect of // with others/externals tools/features
+       # ("zpool import", ...)
+
        # MDT concurrent start
 
        LOAD_MODULES_REMOTE=true load_modules
        do_facet $SINGLEMDS "lsmod | grep -q libcfs" ||
                error "MDT concurrent start: libcfs module not loaded"
 
+       local mds1dev=$(mdsdevname 1)
+       local mds1mnt=$(facet_mntpt mds1)
+       local mds1fstype=$(facet_fstype mds1)
+       local mds1opts=$MDS_MOUNT_OPTS
+
+       if [ $mds1fstype == ldiskfs ] &&
+          ! do_facet mds1 test -b $mds1dev; then
+               mds1opts=$(csa_add "$mds1opts" -o loop)
+       fi
+       if [[ $mds1fstype == zfs ]]; then
+               import_zpool mds1 || return ${PIPESTATUS[0]}
+       fi
+
        #define OBD_FAIL_TGT_MOUNT_RACE 0x716
-       do_facet $SINGLEMDS "$LCTL set_param fail_loc=0x716"
-       start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS &
+       do_facet mds1 "$LCTL set_param fail_loc=0x80000716"
+
+       do_facet mds1 mount -t lustre $mds1dev $mds1mnt $mds1opts &
        local pid=$!
-       start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS &
-       do_facet $SINGLEMDS "$LCTL set_param fail_loc=0x0"
-       local pid2=$!
-       wait $pid2
+
+       do_facet mds1 mount -t lustre $mds1dev $mds1mnt $mds1opts
        local rc2=$?
        wait $pid
        local rc=$?
+       do_facet mds1 "$LCTL set_param fail_loc=0x0"
        if [ $rc -eq 0 ] && [ $rc2 -ne 0 ]; then
                echo "1st MDT start succeed"
                echo "2nd MDT start failed with $rc2"
@@ -2921,17 +2942,30 @@ test_41c() {
        do_rpc_nodes $oss_list "lsmod | grep -q libcfs" ||
                error "OST concurrent start: libcfs module not loaded"
 
+       local ost1dev=$(ostdevname 1)
+       local ost1mnt=$(facet_mntpt ost1)
+       local ost1fstype=$(facet_fstype ost1)
+       local ost1opts=$OST_MOUNT_OPTS
+
+       if [ $ost1fstype == ldiskfs ] &&
+          ! do_facet ost1 test -b $ost1dev; then
+               ost1opts=$(csa_add "$ost1opts" -o loop)
+       fi
+       if [[ $ost1fstype == zfs ]]; then
+               import_zpool ost1 || return ${PIPESTATUS[0]}
+       fi
+
        #define OBD_FAIL_TGT_MOUNT_RACE 0x716
-       do_facet ost1 "$LCTL set_param fail_loc=0x716"
-       start ost1 $(ostdevname 1) $OST_MOUNT_OPTS &
+       do_facet ost1 "$LCTL set_param fail_loc=0x80000716"
+
+       do_facet ost1 mount -t lustre $ost1dev $ost1mnt $ost1opts &
        pid=$!
-       start ost1 $(ostdevname 1) $OST_MOUNT_OPTS &
-       do_facet ost1 "$LCTL set_param fail_loc=0x0"
-       pid2=$!
-       wait $pid2
+
+       do_facet ost1 mount -t lustre $ost1dev $ost1mnt $ost1opts
        rc2=$?
        wait $pid
        rc=$?
+       do_facet ost1 "$LCTL set_param fail_loc=0x0"
        if [ $rc -eq 0 ] && [ $rc2 -ne 0 ]; then
                echo "1st OST start succeed"
                echo "2nd OST start failed with $rc2"