X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=5225cd0a03dde7dbd2524899eea9a1e987f20b2d;hp=ae7e8e9ba04f99f6cc3c63078b80c2ec80f39798;hb=dc0317c7150f068cff7343051092236b5c9c29eb;hpb=326341889117faa5e7cbb05de66d759200405525 diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh old mode 100755 new mode 100644 index ae7e8e9..5225cd0 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -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 / + $DIR/ls / || error rm $DIR/ls } -run_test 30 "run binary from Lustre (execve) ===================" +run_test 30a "execute binary from Lustre (execve) ==============" + +test_30b() { + cp `which ls` $DIR || cp /bin/ls $DIR + chmod go+rx $DIR/ls + $RUNAS $DIR/ls / || error + rm $DIR/ls +} +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 ========================" @@ -6763,8 +6849,17 @@ test_155_load() { local list=$(comma_list $(osts_nodes)) local big=$(do_nodes $list grep "cache" /proc/cpuinfo | \ awk '{sum+=$4} END{print sum}') + local min_avail=$(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail | \ + sort -n | head -1) + local large_file_size=$((big * 2)) + + log "cache size on OSS is $big KB" + log "large file size is $large_file_size KB" + log "min available OST size is $min_avail KB" - log big is $big K + [ $min_avail -le $large_file_size ] && \ + skip "the minimum available OST size needs > $large_file_size KB" && \ + return 0 dd if=/dev/urandom of=$temp bs=6096 count=1 || \ error "dd of=$temp bs=6096 count=1 failed" @@ -6784,14 +6879,14 @@ test_155_load() { echo "12345" >>$file cmp $temp $file || error "$temp $file differ (append2)" - dd if=/dev/urandom of=$temp bs=$((big*2)) count=1k || \ - error "dd of=$temp bs=$((big*2)) count=1k failed" + dd if=/dev/urandom of=$temp bs=$large_file_size count=1k || \ + error "dd of=$temp bs=$large_file_size count=1k failed" cp $temp $file ls -lh $temp $file cancel_lru_locks osc cmp $temp $file || error "$temp $file differ" - rm -f $temp + rm -f $temp $file true } @@ -7232,9 +7327,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 +7389,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 +7544,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 +7585,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 +7728,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" @@ -7706,6 +7816,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 # @@ -7723,12 +7850,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