Whamcloud - gitweb
LU-235 fix sanity test 36g to work with remote OSS
[fs/lustre-release.git] / lustre / tests / sanity.sh
old mode 100755 (executable)
new mode 100644 (file)
index 18ee710..107035b
@@ -9,7 +9,7 @@
 set -e
 
 ONLY=${ONLY:-"$*"}
-# bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 12653 12653 5188 16260 19742 
+# bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 12653 12653 5188 16260 19742
 ALWAYS_EXCEPT="                27u   42a  42b  42c  42d  45   51d   65a   65e   68b  $SANITY_EXCEPT"
 # bug number for skipped test: 2108 9789 3637 9789 3561 5188/5749 1443
 #ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"27m 42a 42b 42c 42d 45 68 76"}
@@ -47,8 +47,6 @@ READS=${READS:-"reads"}
 MUNLINK=${MUNLINK:-munlink}
 SOCKETSERVER=${SOCKETSERVER:-socketserver}
 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
-IOPENTEST1=${IOPENTEST1:-iopentest1}
-IOPENTEST2=${IOPENTEST2:-iopentest2}
 MEMHOG=${MEMHOG:-memhog}
 DIRECTIO=${DIRECTIO:-directio}
 ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
@@ -72,7 +70,6 @@ init_logging
 
 [ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 24v 27m 36f 36g 36h 51b 51c 60c 63 64b 68 71 73 77f 78 101 103 115 120g 124b"
 
-SANITYLOG=${TESTSUITELOG:-$TMP/$(basename $0 .sh).log}
 FAIL_ON_ERROR=false
 
 cleanup() {
@@ -103,8 +100,6 @@ if [ "$ONLY" == "cleanup" ]; then
        exit 0
 fi
 
-[ "$SANITYLOG" ] && rm -f $SANITYLOG || true
-
 check_and_setup_lustre
 
 DIR=${DIR:-$MOUNT}
@@ -1334,6 +1329,8 @@ check_seq_oid()
                 local group=${lmm[$((j+3))]}
                 local dev=$(ostdevname $devnum)
                 local dir=${MOUNT%/*}/ost$devnum
+
+                stop ost$devnum
                 do_facet ost$devnum mount -t $FSTYPE $dev $dir $OST_MOUNT_OPTS ||
                         { error "mounting $dev as $FSTYPE failed"; return 3; }
 
@@ -1352,6 +1349,7 @@ check_seq_oid()
 
                 echo -e "\t\tost $obdidx, objid $objid, group $group"
                 do_facet ost$devnum umount -d $dev
+                start ost$devnum $dev $OST_MOUNT_OPTS
         done
 }
 
@@ -1444,12 +1442,30 @@ test_29() {
 }
 run_test 29 "IT_GETATTR regression  ============================"
 
-test_30() {
+test_30a() { # was test_30
+       cp `which ls` $DIR || cp /bin/ls $DIR
+       $DIR/ls / || error
+       rm $DIR/ls
+}
+run_test 30a "execute binary from Lustre (execve) =============="
+
+test_30b() {
        cp `which ls` $DIR || cp /bin/ls $DIR
-       $DIR/ls /
+       chmod go+rx $DIR/ls
+       $RUNAS $DIR/ls / || error
        rm $DIR/ls
 }
-run_test 30 "run binary from Lustre (execve) ==================="
+run_test 30b "execute binary from Lustre as non-root ==========="
+
+test_30c() { # b=22376
+       cp `which ls` $DIR || cp /bin/ls $DIR
+       chmod a-rw $DIR/ls
+       cancel_lru_locks mdc
+       cancel_lru_locks osc
+       $RUNAS $DIR/ls / || error
+       rm -f $DIR/ls
+}
+run_test 30c "execute binary from Lustre without read perms ===="
 
 test_31a() {
        $OPENUNLINK $DIR/f31 $DIR/f31 || error
@@ -2055,15 +2071,26 @@ run_test 36f "utime on file racing with OST BRW write =========="
 
 test_36g() {
        remote_ost_nodsh && skip "remote OST with nodsh" && return
+       local fmd_max_age
+       local fmd_before
+       local fmd_after
 
        mkdir -p $DIR/$tdir
-       export FMD_MAX_AGE=`do_facet ost1 lctl get_param -n obdfilter.*.client_cache_seconds 2> /dev/null | head -n 1`
-       FMD_BEFORE="`awk '/ll_fmd_cache/ { print $2 }' /proc/slabinfo`"
+       fmd_max_age=$(do_facet ost1 \
+               "lctl get_param -n obdfilter.*.client_cache_seconds 2> /dev/null | \
+               head -n 1")
+
+       fmd_before=$(do_facet ost1 \
+               "awk '/ll_fmd_cache/ {print \\\$2}' /proc/slabinfo")
        touch $DIR/$tdir/$tfile
-       sleep $((FMD_MAX_AGE + 12))
-       FMD_AFTER="`awk '/ll_fmd_cache/ { print $2 }' /proc/slabinfo`"
-       [ "$FMD_AFTER" -gt "$FMD_BEFORE" ] && \
-               echo "AFTER : $FMD_AFTER > BEFORE $FMD_BEFORE" && \
+       sleep $((fmd_max_age + 12))
+       fmd_after=$(do_facet ost1 \
+               "awk '/ll_fmd_cache/ {print \\\$2}' /proc/slabinfo")
+
+       echo "fmd_before: $fmd_before"
+       echo "fmd_after: $fmd_after"
+       [ "$fmd_after" -gt "$fmd_before" ] && \
+               echo "AFTER: $fmd_after > BEFORE: $fmd_before" && \
                error "fmd didn't expire after ping" || true
 }
 run_test 36g "filter mod data cache expiry ====================="
@@ -2213,7 +2240,7 @@ test_39e() {
        local mtime1=`stat -c %Y $DIR1/$tfile`
 
        touch -m -d @$TEST_39_MTIME $DIR1/$tfile
-       
+
        for (( i=0; i < 2; i++ )) ; do
                local mtime2=`stat -c %Y $DIR1/$tfile`
                [ $mtime2 = $TEST_39_MTIME ] || \
@@ -2251,7 +2278,7 @@ test_39g() {
 
        sleep 2
        chmod o+r $DIR1/$tfile
+
        for (( i=0; i < 2; i++ )) ; do
                local mtime2=`stat -c %Y $DIR1/$tfile`
                [ "$mtime1" = "$mtime2" ] || \
@@ -2346,7 +2373,7 @@ test_39k() {
 
        kill -USR1 $multipid
        wait $multipid || error "multiop close failed"
-               
+
        for (( i=0; i < 2; i++ )) ; do
                local mtime2=`stat -c %Y $DIR1/$tfile`
 
@@ -2409,6 +2436,26 @@ test_39l() {
 }
 run_test 39l "directory atime update ==========================="
 
+test_39m() {
+       touch $DIR1/$tfile
+       sleep 2
+       local far_past_mtime=$(date -d "May 29 1953" +%s)
+       local far_past_atime=$(date -d "Dec 17 1903" +%s)
+
+       touch -m -d @$far_past_mtime $DIR1/$tfile
+       touch -a -d @$far_past_atime $DIR1/$tfile
+
+       for (( i=0; i < 2; i++ )) ; do
+               local timestamps=$(stat -c "%X %Y" $DIR1/$tfile)
+               [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \
+                       error "atime or mtime set incorrectly"
+
+               cancel_lru_locks osc
+               if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
+       done
+}
+run_test 39m "test atime and mtime before 1970"
+
 test_40() {
        dd if=/dev/zero of=$DIR/f40 bs=4096 count=1
        $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/f40 && error
@@ -3150,19 +3197,8 @@ test_54e() {
 }
 run_test 54e "console/tty device works in lustre ======================"
 
-test_55() {
-        rm -rf $DIR/d55
-        mkdir $DIR/d55
-        client_only && skip "Not a server" && return
-        mount -t $FSTYPE -o loop,iopen $EXT2_DEV $DIR/d55 || error "mounting"
-        touch $DIR/d55/foo
-        $IOPENTEST1 $DIR/d55/foo $DIR/d55 || error "running $IOPENTEST1"
-        $IOPENTEST2 $DIR/d55 || error "running $IOPENTEST2"
-        echo "check for $EXT2_DEV. Please wait..."
-        rm -rf $DIR/d55/*
-        $UMOUNT $DIR/d55 || error "unmounting"
-}
-run_test 55 "check iopen_connect_dentry() ======================"
+#The test_55 used to be iopen test and it was removed by bz#24037.
+#run_test 55 "check iopen_connect_dentry() ======================"
 
 test_56a() {   # was test_56
         rm -rf $DIR/d56
@@ -3413,7 +3449,7 @@ run_test 56q "check lfs find -gid and ! -gid ==============================="
 test_56r() {
        setup_56 $NUMFILES $NUMDIRS
        TDIR=$DIR/${tdir}g
-       
+
        EXPECTED=12
        NUMS=`$LFIND -size 0 -t f $TDIR | wc -l`
        [ $NUMS -eq $EXPECTED ] || \
@@ -3481,7 +3517,8 @@ test_57b() {
        sync
        sleep 1
        df $dir  #make sure we get new statfs data
-       local MDSFREE=$(do_facet $mymds lctl get_param -n osd.*MDT000$((num -1)).kbytesfree)
+       local MDSFREE=$(do_facet $mymds \
+               lctl get_param -n osd*.*MDT000$((num -1)).kbytesfree)
        local MDCFREE=$(lctl get_param -n mdc.*MDT000$((num -1))-mdc-*.kbytesfree)
        echo "opening files to create objects/EAs"
        local FILE
@@ -3495,7 +3532,8 @@ test_57b() {
 
        sleep 1  #make sure we get new statfs data
        df $dir
-       local MDSFREE2=$(do_facet $mymds lctl get_param -n osd.*MDT000$((num -1)).kbytesfree)
+       local MDSFREE2=$(do_facet $mymds \
+               lctl get_param -n osd*.*MDT000$((num -1)).kbytesfree)
        local MDCFREE2=$(lctl get_param -n mdc.*MDT000$((num -1))-mdc-*.kbytesfree)
        if [ "$MDCFREE2" -lt "$((MDCFREE - 8))" ]; then
                if [ "$MDSFREE" != "$MDSFREE2" ]; then
@@ -3825,7 +3863,7 @@ cleanup_68() {
        if [ ! -z "$LLITELOOPLOAD" ]; then
                rmmod llite_lloop
                unset LLITELOOPLOAD
-       fi 
+       fi
        rm -f $DIR/f68*
 }
 
@@ -3935,7 +3973,7 @@ test_71() {
 }
 run_test 71 "Running dbench on lustre (don't segment fault) ===="
 
-test_72() { # bug 5695 - Test that on 2.6 remove_suid works properly
+test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
        check_kernel_version 43 || return 0
        [ "$RUNAS_ID" = "$UID" ] && skip_env "RUNAS_ID = UID = $UID -- skipping" && return
 
@@ -3958,7 +3996,35 @@ test_72() { # bug 5695 - Test that on 2.6 remove_suid works properly
        true
        rm -f $DIR/f72
 }
-run_test 72 "Test that remove suid works properly (bug5695) ===="
+run_test 72a "Test that remove suid works properly (bug5695) ===="
+
+test_72b() { # bug 24226 -- keep mode setting when size is not changing
+       local perm
+
+       [ "$RUNAS_ID" = "$UID" ] && \
+               skip_env "RUNAS_ID = UID = $UID -- skipping" && return
+       [ "$RUNAS_ID" -eq 0 ] && \
+               skip_env "RUNAS_ID = 0 -- skipping" && return
+
+       # Check that testing environment is properly set up. Skip if not
+       FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS || {
+               skip_env "User $RUNAS_ID does not exist - skipping"
+               return 0
+       }
+       touch $DIR/${tfile}-f{g,u}
+       mkdir $DIR/${tfile}-d{g,u}
+       chmod 770 $DIR/${tfile}-{f,d}{g,u}
+       chmod g+s $DIR/${tfile}-{f,d}g
+       chmod u+s $DIR/${tfile}-{f,d}u
+       for perm in 777 2777 4777; do
+               $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
+               $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
+               $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
+               $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
+       done
+       true
+}
+run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
 
 # bug 3462 - multiple simultaneous MDC requests
 test_73() {
@@ -4029,7 +4095,20 @@ num_inodes() {
        awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
 }
 
+get_inode_slab_tunables() {
+       awk '/lustre_inode_cache/ {print $9," ",$10," ",$11; exit}' /proc/slabinfo
+}
+
+set_inode_slab_tunables() {
+       echo "lustre_inode_cache $1" > /proc/slabinfo
+}
+
 test_76() { # Now for bug 20433, added originally in bug 1443
+       local SLAB_SETTINGS=`get_inode_slab_tunables`
+       local CPUS=`getconf _NPROCESSORS_ONLN`
+       # we cannot set limit below 1 which means 1 inode in each
+       # per-cpu cache is still allowed
+       set_inode_slab_tunables "1 1 0"
        cancel_lru_locks osc
        BEFORE_INODES=`num_inodes`
        echo "before inodes: $BEFORE_INODES"
@@ -4043,7 +4122,7 @@ test_76() { # Now for bug 20433, added originally in bug 1443
        AFTER_INODES=`num_inodes`
        echo "after inodes: $AFTER_INODES"
        local wait=0
-       while [ $AFTER_INODES -gt $BEFORE_INODES ]; do
+       while [ $((AFTER_INODES-1*CPUS)) -gt $BEFORE_INODES ]; do
                sleep 2
                AFTER_INODES=`num_inodes`
                wait=$((wait+2))
@@ -4052,6 +4131,7 @@ test_76() { # Now for bug 20433, added originally in bug 1443
                        error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
                fi
        done
+       set_inode_slab_tunables "$SLAB_SETTINGS"
 }
 run_test 76 "confirm clients recycle inodes properly ===="
 
@@ -5022,6 +5102,14 @@ test_105d() { # bug 15924
 }
 run_test 105d "flock race (should not freeze) ========"
 
+test_105e() { # bug 22660 && 22040
+       [ -z "`mount | grep \"$DIR.*flock\" | grep -v noflock`" ] && \
+               skip "mount w/o flock enabled" && return
+       touch $DIR/$tfile
+       flocks_test 3 $DIR/$tfile
+}
+run_test 105e "Two conflicting flocks from same process ======="
+
 test_106() { #bug 10921
        mkdir -p $DIR/$tdir
        $DIR/$tdir && error "exec $DIR/$tdir succeeded"
@@ -6168,50 +6256,48 @@ test_128() { # bug 15212
 run_test 128 "interactive lfs for 2 consecutive find's"
 
 set_dir_limits () {
-        local mntdev
-        local node
+       local mntdev
+       local canondev
+       local node
 
        local LDPROC=/proc/fs/ldiskfs
 
-        for node in $(mdts_nodes); do
-                devs=$(do_node $node "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }')
-               for dev in $devs; do
-                       mntdev=$(do_node $node "lctl get_param -n osd*.$dev.mntdev")
-                       do_node $node "test -e $LDPROC/\\\$(basename $mntdev)/max_dir_size" || LDPROC=/sys/fs/ldiskfs
-                       do_node $node "echo $1 >$LDPROC/\\\$(basename $mntdev)/max_dir_size"
-               done
+       for facet in $(get_facets MDS); do
+               canondev=$(ldiskfs_canon *.$(convert_facet2label $facet).mntdev $facet)
+               do_facet $facet "test -e $LDPROC/$canondev/max_dir_size" || LDPROC=/sys/fs/ldiskfs
+               do_facet $facet "echo $1 >$LDPROC/$canondev/max_dir_size"
        done
 }
 test_129() {
-        [ "$FSTYPE" != "ldiskfs" ] && skip "not needed for FSTYPE=$FSTYPE" && return 0
-        remote_mds_nodsh && skip "remote MDS with nodsh" && return
+       [ "$FSTYPE" != "ldiskfs" ] && skip "not needed for FSTYPE=$FSTYPE" && return 0
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
 
-        EFBIG=27
-        MAX=16384
+       EFBIG=27
+       MAX=16384
 
-        set_dir_limits $MAX
+       set_dir_limits $MAX
 
-        mkdir -p $DIR/$tdir
+       mkdir -p $DIR/$tdir
 
-        I=0
-        J=0
-        while [ ! $I -gt $((MAX * MDSCOUNT)) ]; do
-                multiop $DIR/$tdir/$J Oc
-                rc=$?
-                if [ $rc -eq $EFBIG ]; then
-                        set_dir_limits 0
-                        echo "return code $rc received as expected"
-                        return 0
-                elif [ $rc -ne 0 ]; then
-                        set_dir_limits 0
-                        error_exit "return code $rc received instead of expected $EFBIG"
-                fi
-                J=$((J+1))
-                I=$(stat -c%s "$DIR/$tdir")
-        done
+       I=0
+       J=0
+       while [ ! $I -gt $((MAX * MDSCOUNT)) ]; do
+               multiop $DIR/$tdir/$J Oc
+               rc=$?
+               if [ $rc -eq $EFBIG ]; then
+                       set_dir_limits 0
+                       echo "return code $rc received as expected"
+                       return 0
+               elif [ $rc -ne 0 ]; then
+                       set_dir_limits 0
+                       error_exit "return code $rc received instead of expected $EFBIG"
+               fi
+               J=$((J+1))
+               I=$(stat -c%s "$DIR/$tdir")
+       done
 
-        error "exceeded dir size limit $MAX x $MDSCOUNT $((MAX * MDSCOUNT)) : $I bytes"
-        do_facet $SINGLEMDS "echo 0 >$LDPROC"
+       set_dir_limits 0
+       error "exceeded dir size limit $MAX x $MDSCOUNT $((MAX * MDSCOUNT)) : $I bytes"
 }
 run_test 129 "test directory size limit ========================"
 
@@ -7232,9 +7318,12 @@ test_171() { # bug20592
 #define OBD_FAIL_PTLRPC_DUMP_LOG         0x50e
         $LCTL set_param fail_loc=0x50e
         $LCTL set_param fail_val=3000
-        multiop_bg_pause $DIR/$tfile Os || true
+        multiop_bg_pause $DIR/$tfile O_s || true
+        local MULTIPID=$!
+        kill -USR1 $MULTIPID
         # cause log dump
         sleep 3
+        wait $MULTIPID
         if dmesg | grep "recursive fault"; then
                 error "caught a recursive fault"
         fi
@@ -7291,15 +7380,15 @@ test_180a() {
         local rmmod_local=0
 
         if ! module_loaded obdecho; then
-            load_module obdecho/obdecho 
-            rmmod_local=1           
+            load_module obdecho/obdecho
+            rmmod_local=1
         fi
 
         local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
         local host=$(awk '/current_connection:/ {print $2}' /proc/fs/lustre/osc/$osc/import)
         local target=$(awk '/target:/ {print $2}' /proc/fs/lustre/osc/$osc/import)
         target=${target%_UUID}
-        
+
         [[ -n $target ]]  && { setup_obdecho_osc $host $target || rc=1; } || rc=1
         [ $rc -eq 0 ] && { obdecho_create_test ${target}_osc client || rc=2; }
         [[ -n $target ]] && cleanup_obdecho_osc $target
@@ -7446,6 +7535,18 @@ test_200g() {
 }
 run_test 200g "lfs df a pool ============================================"
 
+test_200h() { # b=24039
+       mkdir -p $POOL_DIR || error "unable to create $POOL_DIR"
+
+       local file="/..$POOL_DIR/$tfile-1"
+       $SETSTRIPE -p $POOL $file || error "unable to create $file"
+
+       cd $POOL_DIR
+       $SETSTRIPE -p $POOL $tfile-2 || \
+               error "unable to create $tfile-2 in $POOL_DIR"
+}
+run_test 200h "Create files in a pool with relative pathname ============"
+
 test_201a() {
        remote_mgs_nodsh && skip "remote MGS with nodsh" && return
        TGT=$($LCTL get_param -n lov.$FSNAME-*.pools.$POOL | head -1)
@@ -7475,8 +7576,8 @@ run_test 201b "Remove all targets from a pool =========================="
 test_201c() {
        remote_mgs_nodsh && skip "remote MGS with nodsh" && return
        do_facet mgs $LCTL pool_destroy $FSNAME.$POOL
-       
-       sleep 2                        
+
+       sleep 2
     # striping on an empty/nonexistant pool should fall back to "pool of everything"
        touch ${POOL_DIR}/$tfile || error "failed to use fallback striping for missing pool"
        # setstripe on an empty pool should fail
@@ -7618,12 +7719,12 @@ test_215() { # for bugs 18102, 21079, 21517
        remove_lnet_proc_files "routers"
 
        # /proc/sys/lnet/peers should look like this:
-       # nid refs state max rtr min tx min queue
+       # nid refs state last max rtr min tx min queue
        # where nid is a string like 192.168.1.1@tcp2, refs > 0,
-       # state is up/down/NA, max >= 0. rtr, min, tx, min are 
+       # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
        # numeric (0 or >0 or <0), queue >= 0.
-       L1="^nid +refs +state +max +rtr +min +tx +min +queue$"
-       BR="^$NID +$P +(up|down|NA) +$N +$I +$I +$I +$I +$N$"
+       L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
+       BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
        create_lnet_proc_files "peers"
        check_lnet_proc_entry "peers.out" "/proc/sys/lnet/peers" "$BR" "$L1"
        check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
@@ -7740,12 +7841,9 @@ test_900() {
 }
 run_test 900 "umount should not race with any mgc requeue thread"
 
-log "cleanup: ======================================================"
+complete $(basename $0) $SECONDS
 check_and_cleanup_lustre
 if [ "$I_MOUNTED" != "yes" ]; then
        lctl set_param debug="$OLDDEBUG" 2> /dev/null || true
 fi
-
-echo '=========================== finished ==============================='
-[ -f "$SANITYLOG" ] && cat $SANITYLOG && grep -q FAIL $SANITYLOG && exit 1 || true
-echo "$0: completed"
+exit_status