Whamcloud - gitweb
b=23003 sanity test is added, checks how we work with timestamps before Jan 1 1970
[fs/lustre-release.git] / lustre / tests / sanity.sh
old mode 100755 (executable)
new mode 100644 (file)
index c036325..90b3d71
@@ -44,7 +44,6 @@ MCREATE=${MCREATE:-mcreate}
 OPENFILE=${OPENFILE:-openfile}
 OPENUNLINK=${OPENUNLINK:-openunlink}
 READS=${READS:-"reads"}
-TRUNCATE=${TRUNCATE:-truncate}
 MUNLINK=${MUNLINK:-munlink}
 SOCKETSERVER=${SOCKETSERVER:-socketserver}
 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
@@ -477,7 +476,7 @@ test_17h() { #bug 17378
         mkdir -p $DIR/$tdir
         $SETSTRIPE $DIR/$tdir -c -1
 #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
-        do_facet mds lctl set_param fail_loc=0x80000141
+        do_facet $SINGLEMDS lctl set_param fail_loc=0x80000141
         touch $DIR/$tdir/$tfile || true
 }
 run_test 17h "create objects: lov_free_memmd() doesn't lbug"
@@ -487,7 +486,7 @@ test_17i() { #bug 20018
        local foo=$DIR/$tdir/$tfile
        ln -s $foo $foo || error "create symlink failed"
 #define OBD_FAIL_MDS_READLINK_EPROTO     0x143
-       do_facet mds lctl set_param fail_loc=0x80000143
+       do_facet $SINGLEMDS lctl set_param fail_loc=0x80000143
        ls -l $foo && error "error not detected"
        return 0
 }
@@ -1004,7 +1003,7 @@ test_27m() {
 run_test 27m "create file while OST0 was full =================="
 
 sleep_maxage() {
-        local DELAY=$(do_facet mds lctl get_param -n lov.*.qos_maxage | head -n 1 | awk '{print $1 * 2}')
+        local DELAY=$(do_facet $SINGLEMDS lctl get_param -n lov.*.qos_maxage | head -n 1 | awk '{print $1 * 2}')
         sleep $DELAY
 }
 
@@ -1273,7 +1272,7 @@ test_27y() {
         [ $fcount -eq 0 ] && skip "not enough space on OST0" && return
         [ $fcount -gt $OSTCOUNT ] && fcount=$OSTCOUNT
 
-        MDS_OSCS=`do_facet mds lctl dl | awk '/[oO][sS][cC].*md[ts]/ { print $4 }'`
+        MDS_OSCS=`do_facet $SINGLEMDS lctl dl | awk '/[oO][sS][cC].*md[ts]/ { print $4 }'`
         OFFSET=$(($OSTCOUNT-1))
         OST=-1
         for OSC in $MDS_OSCS; do
@@ -1281,7 +1280,7 @@ test_27y() {
                         OST=`osc_to_ost $OSC`
                 } else {
                         echo $OSC "is Deactivate:"
-                        do_facet mds lctl --device  %$OSC deactivate
+                        do_facet $SINGLEMDS lctl --device  %$OSC deactivate
                 } fi
         done
 
@@ -1301,7 +1300,7 @@ test_27y() {
         for OSC in $MDS_OSCS; do
                 [ `osc_to_ost $OSC` != $OST  ] && {
                         echo $OSC "is activate"
-                        do_facet mds lctl --device %$OSC activate
+                        do_facet $SINGLEMDS lctl --device %$OSC activate
                 }
         done
 }
@@ -2106,11 +2105,11 @@ test_39() {
        $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
        if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
                echo "mtime"
-               ls -l  $DIR/$tfile $DIR/${tfile}2
+               ls -l --full-time $DIR/$tfile $DIR/${tfile}2
                echo "atime"
-               ls -lu  $DIR/$tfile $DIR/${tfile}2
+               ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
                echo "ctime"
-               ls -lc  $DIR/$tfile $DIR/${tfile}2
+               ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
                error "O_TRUNC didn't change timestamps"
        fi
 }
@@ -2410,6 +2409,28 @@ 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
@@ -2664,7 +2685,7 @@ test_43b() {
        cp -p `which multiop` $DIR/d43/multiop || cp -p multiop $DIR/d43/multiop
         MULTIOP_PROG=$DIR/d43/multiop multiop_bg_pause $TMP/test43.junk O_c || return 1
         MULTIOP_PID=$!
-        truncate $DIR/d43/multiop 0 && error "expected error, got success"
+        $TRUNCATE $DIR/d43/multiop 0 && error "expected error, got success"
         kill -USR1 $MULTIOP_PID || return 2
         wait $MULTIOP_PID || return 3
         rm $TMP/test43.junk
@@ -3151,19 +3172,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
@@ -3292,8 +3302,8 @@ run_test 56h "check lfs find ! -name ============================="
 test_56i() {
        tdir=${tdir}i
        mkdir -p $DIR/$tdir
-       UUID=`$LFS osts | awk '/0: / { print $2 }'`
-       OUT="`$LFIND -ost $UUID $DIR/$tdir`"
+       UUID=$(ostuuid_from_index 0 $DIR/$tdir)
+       OUT=$($LFIND -obd $UUID $DIR/$tdir)
        [ "$OUT" ] && error "$LFIND returned directory '$OUT'" || true
 }
 run_test 56i "check 'lfs find -ost UUID' skips directories ======="
@@ -3780,7 +3790,7 @@ test_65k() { # bug11679
                         STRIPE_INDEX=`do_facet $SINGLEMDS lctl get_param -n lov.*md*.target_obd |
                                       grep $STRIPE_OST | awk -F: '{print $1}' | head -n 1`
 
-                       [ -f $DIR/$tdir/${STRIPE_INDEX} ] && continue
+                [ -f $DIR/$tdir/${STRIPE_INDEX} ] && continue
                         echo "$SETSTRIPE $DIR/$tdir/${STRIPE_INDEX} -i ${STRIPE_INDEX} -c 1"
                         do_facet client $SETSTRIPE $DIR/$tdir/${STRIPE_INDEX} -i ${STRIPE_INDEX} -c 1
                         RC=$?
@@ -3913,7 +3923,7 @@ test_69() {
        $DIRECTIO write ${f}.2 0 1 || error "directio write error"
 
        do_facet ost1 lctl set_param fail_loc=0x217
-       truncate $f 1 # vmtruncate() will ignore truncate() error.
+       $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
        $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
 
        do_facet ost1 lctl set_param fail_loc=0
@@ -4030,7 +4040,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"
@@ -4044,7 +4067,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))
@@ -4053,6 +4076,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 ===="
 
@@ -6169,49 +6193,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 "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 ========================"
 
@@ -7101,42 +7124,47 @@ check_path() {
        err17935 "path looked up \"${path}\" instead of \"${expected}\""
        return 2
     fi
-    echo "fid $fid resolves to path $path"
+    echo "fid $fid resolves to path $path (expected $expected)"
 }
 
 test_162() {
-    # Make changes to filesystem
-    mkdir -p $DIR/$tdir/d2
-    touch $DIR/$tdir/d2/$tfile
-    touch $DIR/$tdir/d2/x1
-    touch $DIR/$tdir/d2/x2
-    mkdir -p $DIR/$tdir/d2/a/b/c
-    mkdir -p $DIR/$tdir/d2/p/q/r
+       # Make changes to filesystem
+       mkdir -p $DIR/$tdir/d2
+       touch $DIR/$tdir/d2/$tfile
+       touch $DIR/$tdir/d2/x1
+       touch $DIR/$tdir/d2/x2
+       mkdir -p $DIR/$tdir/d2/a/b/c
+       mkdir -p $DIR/$tdir/d2/p/q/r
        # regular file
-    FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[')
-    check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0
+       FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
+       check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0
 
        # softlink
-    ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
-    FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[')
-    check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0
+       ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
+       FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
+       check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0
+
+       # softlink to wrong file
+       ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
+       FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
+       check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME $FID --link 0
 
        # hardlink
-    ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
-    mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
-    FID=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[')
-    # fid2path dir/fsname should both work
-    check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1
-    check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0
-
-    # hardlink count: check that there are 2 links
-    # Doesnt work with CMD yet: 17935
+       ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
+       mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
+       FID=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
+       # fid2path dir/fsname should both work
+       check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1
+       check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0
+
+       # hardlink count: check that there are 2 links
+       # Doesnt work with CMD yet: 17935
        ${LFS} fid2path $DIR $FID | wc -l | grep -q 2 || \
                err17935 "expected 2 links"
 
        # hardlink indexing: remove the first link
-    rm $DIR/$tdir/d2/p/q/r/hlink
-    check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0
+       rm $DIR/$tdir/d2/p/q/r/hlink
+       check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0
 
        return 0
 }
@@ -7149,7 +7177,7 @@ test_163() {
        sleep 1
        local uuid=$($LCTL get_param -n mdc.${FSNAME}-MDT0000-mdc-*.uuid)
        # this proc file is temporary and linux-only
-       do_facet mds lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid ||\
+       do_facet $SINGLEMDS lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid ||\
          error "kernel->userspace send failed"
        kill -INT $!
 }
@@ -7393,8 +7421,8 @@ run_test 200c "Set pool on a directory ================================="
 
 test_200d() {
        remote_mgs_nodsh && skip "remote MGS with nodsh" && return
-       res=$($GETSTRIPE --pool $POOL_DIR | awk '/^pool:/ {print $2}')
-       [ "$res" = $POOL ] || error "Pool on $POOL_DIR is $res, not $POOL"
+       res=$($GETSTRIPE --pool $POOL_DIR)
+       [ $res = $POOL ] || error "Pool on $POOL_DIR is $res, not $POOL"
 }
 run_test 200d "Check pool on a directory ==============================="
 
@@ -7441,6 +7469,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)
@@ -7613,12 +7653,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"
@@ -7701,6 +7741,23 @@ test_217() { # bug 22430
 }
 run_test 217 "check lctl ping for hostnames with hiphen ('-')"
 
+test_218() {
+       # do directio so as not to populate the page cache
+       log "creating a 10 Mb file"
+       multiop $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
+       log "starting reads"
+       dd if=$DIR/$tfile of=/dev/null bs=4096 &
+       log "truncating the file"
+       multiop $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
+       log "killing dd"
+       kill %+ || true # reads might have finished
+       echo "wait until dd is finished"
+       wait
+       log "removing the temporary file"
+       rm -rf $DIR/$tfile || error "tmp file removal failed"
+}
+run_test 218 "parallel read and truncate should not deadlock ======================="
+
 #
 # tests that do cleanup/setup should be run at the end
 #