. $LUSTRE/tests/test-framework.sh
init_test_env $@
+. ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
# use small MDS + OST size to speed formatting time
# do not use too small MDSSIZE/OSTSIZE, which affect the default jouranl size
+# STORED_MDSSIZE is used in test_18
+STORED_MDSSIZE=$MDSSIZE
+STORED_OSTSIZE=$OSTSIZE
MDSSIZE=200000
OSTSIZE=200000
-. ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
if ! combined_mgs_mds; then
# bug number for skipped test: 23954
ALWAYS_EXCEPT="$ALWAYS_EXCEPT 24b"
fi
-# STORED_MDSSIZE is used in test_18
-if [ -n "$MDSSIZE" ]; then
- STORED_MDSSIZE=$MDSSIZE
-fi
-
# pass "-E lazy_itable_init" to mke2fs to speed up the formatting time
if [[ "$LDISKFS_MKFS_OPTS" != *lazy_itable_init* ]]; then
LDISKFS_MKFS_OPTS=$(csa_add "$LDISKFS_MKFS_OPTS" -E lazy_itable_init)
require_dsh_mds || exit 0
require_dsh_ost || exit 0
#
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="30a 31 45"
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="30a 31 45 69"
assert_DIR
start_mgs () {
echo "start mgs"
- start mgs $MGSDEV $MGS_MOUNT_OPTS
+ start mgs $(mgsdevname) $MGS_MOUNT_OPTS
}
start_mdt() {
OSTDEV1_2=$fs2ost_DEV
OSTDEV2_2=$fs3ost_DEV
-cleanup_24a() {
+cleanup_fs2() {
trap 0
echo "umount $MOUNT2 ..."
umount $MOUNT2 || true
--reformat $fs2ostdev $fs2ostvdev || exit 10
setup
- start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && trap cleanup_24a EXIT INT
+ start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && trap cleanup_fs2 EXIT INT
start fs2ost $fs2ostdev $OST_MOUNT_OPTS
mkdir -p $MOUNT2
mount -t lustre $MGSNID:/${FSNAME2} $MOUNT2 || return 1
stop_mds
MDS=$(do_facet $SINGLEMDS "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }' | head -1)
[ -z "$MDS" ] && error "No MDT" && return 8
- cleanup_24a
+ cleanup_fs2
cleanup_nocli || return 6
}
run_test 24a "Multiple MDTs on a single node"
$r mount -t lustre -o loop,nosvc $tmp/mdt $tmp/mnt/mdt
$r lctl replace_nids $fsname-OST0000 $ostnid
$r lctl replace_nids $fsname-MDT0000 $nid
- $r umount $tmp/mnt/mdt
+ $r umount -d $tmp/mnt/mdt
fi
mopts=loop,exclude=$fsname-OST0000
--fsname=${FSNAME2} --index=8191 --reformat $fs2ostdev \
$fs2ostvdev || exit 10
- start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && trap cleanup_24a EXIT INT
+ start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && trap cleanup_fs2 EXIT INT
start fs2ost $fs2ostdev $OST_MOUNT_OPTS
do_facet $SINGLEMDS "$LCTL conf_param $FSNAME2.sys.timeout=200" || rc=1
mkdir -p $MOUNT2
# remove all files from the OBJECTS dir
do_facet $SINGLEMDS "mount -t ldiskfs $opts $devname $MNTDIR"
do_facet $SINGLEMDS "find $MNTDIR/O/1/d* -type f -delete"
- do_facet $SINGLEMDS "umount $MNTDIR"
+ do_facet $SINGLEMDS "umount -d $MNTDIR"
# restart MDS with missing llog files
start_mds
do_facet mds "lctl set_param fail_loc=0"
do_facet $SINGLEMDS \
"mount -t $(facet_fstype $SINGLEMDS) $opts $devname $brpt"
do_facet $SINGLEMDS "rm -f ${brpt}/last_rcvd"
- do_facet $SINGLEMDS "umount $brpt"
+ do_facet $SINGLEMDS "umount -d $brpt"
# restart MDS, the "last_rcvd" file should be recreated.
start_mds || error "fail to restart the MDS"
}
run_test 67 "test routes conversion and configuration"
+test_68() {
+ local fid
+ local seq
+ local START
+ local END
+
+ [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.4.53) ] ||
+ { skip "Need MDS version at least 2.4.53"; return 0; }
+
+ umount_client $MOUNT || error "umount client failed"
+
+ start_mdt 1 || error "MDT start failed"
+ start_ost
+
+ # START-END - the sequences we'll be reserving
+ START=$(do_facet $SINGLEMDS \
+ lctl get_param -n seq.ctl*.space | awk -F'[[ ]' '{print $2}')
+ END=$((START + (1 << 30)))
+ do_facet $SINGLEMDS \
+ lctl set_param seq.ctl*.fldb="[$START-$END\):0:mdt"
+
+ # reset the sequences MDT0000 has already assigned
+ do_facet $SINGLEMDS \
+ lctl set_param seq.srv*MDT0000.space=clear
+
+ # remount to let the client allocate new sequence
+ mount_client $MOUNT || error "mount client failed"
+
+ touch $DIR/$tfile
+ do_facet $SINGLEMDS \
+ lctl get_param seq.srv*MDT0000.space
+ $LFS path2fid $DIR/$tfile
+
+ local old_ifs="$IFS"
+ IFS='[:]'
+ fid=($($LFS path2fid $DIR/$tfile))
+ IFS="$old_ifs"
+ let seq=${fid[1]}
+
+ if [[ $seq < $END ]]; then
+ error "used reserved sequence $seq?"
+ fi
+ cleanup || return $?
+}
+run_test 68 "be able to reserve specific sequences in FLDB"
+
+test_69() {
+ setup
+
+ # use OST0000 since it probably has the most creations
+ local OSTNAME=$(ostname_from_index 0)
+ local mdtosc_proc1=$(get_mdtosc_proc_path mds1 $OSTNAME)
+ local last_id=$(do_facet mds1 lctl get_param -n \
+ osc.$mdtosc_proc1.prealloc_last_id)
+
+ # Want to have OST LAST_ID over 1.5 * OST_MAX_PRECREATE to
+ # verify that the LAST_ID recovery is working properly. If
+ # not, then the OST will refuse to allow the MDS connect
+ # because the LAST_ID value is too different from the MDS
+ #define OST_MAX_PRECREATE=20000
+ local num_create=$((20000 * 5))
+
+ mkdir -p $DIR/$tdir
+ $LFS setstripe -i 0 $DIR/$tdir
+ createmany -o $DIR/$tdir/$tfile- $num_create
+ # delete all of the files with objects on OST0 so the
+ # filesystem is not inconsistent later on
+ $LFS find $MOUNT --ost 0 | xargs rm
+
+ stop_ost || error "OST0 stop failure"
+ add ost1 $(mkfs_opts ost1 $(ostdevname 1)) --reformat --replace \
+ $(ostdevname 1) $(ostvdevname 1) ||
+ error "reformat and replace $ostdev failed"
+ start_ost || error "OST0 restart failure"
+ wait_osc_import_state mds ost FULL
+
+ touch $DIR/$tdir/$tfile-last || error "create file after reformat"
+ local idx=$($LFS getstripe -i $DIR/$tdir/$tfile-last)
+ [ $idx -ne 0 ] && error "$DIR/$tdir/$tfile-last on $idx not 0" || true
+
+ cleanup
+}
+run_test 69 "replace an OST with the same index"
+
test_70a() {
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
local MDTIDX=1
+ cleanup
+
start_mdt 1 || error "MDT0 start fail"
start_ost || error "OST0 start fail"
}
run_test 76 "set permanent params set_param -P"
+test_77() { # LU-3445
+ local server_version=$(lustre_version_code $SINGLEMDS)
+
+ [[ $server_version -ge $(version_code 2.2.60) ]] &&
+ [[ $server_version -le $(version_code 2.4.0) ]] &&
+ skip "Need MDS version < 2.2.60 or > 2.4.0" && return
+
+ if [[ -z "$fs2ost_DEV" || -z "$fs2mds_DEV" ]]; then
+ is_blkdev $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) &&
+ skip_env "mixed loopback and real device not working" && return
+ fi
+
+ local fs2mdsdev=$(mdsdevname 1_2)
+ local fs2ostdev=$(ostdevname 1_2)
+ local fs2mdsvdev=$(mdsvdevname 1_2)
+ local fs2ostvdev=$(ostvdevname 1_2)
+ local fsname=test1234
+ local mgsnid
+ local failnid="$(h2$NETTYPE 1.2.3.4),$(h2$NETTYPE 4.3.2.1)"
+
+ add fs2mds $(mkfs_opts mds1 $fs2mdsdev) --mgs --fsname=$fsname \
+ --reformat $fs2mdsdev $fs2mdsvdev || error "add fs2mds failed"
+ start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && trap cleanup_fs2 EXIT INT ||
+ error "start fs2mds failed"
+
+ mgsnid=$(do_facet fs2mds $LCTL list_nids | xargs | tr ' ' ,)
+ [[ $mgsnid = *,* ]] || mgsnid+=",$mgsnid"
+
+ add fs2ost $(mkfs_opts ost1 $fs2ostdev) --mgsnode=$mgsnid \
+ --failnode=$failnid --fsname=$fsname \
+ --reformat $fs2ostdev $fs2ostvdev ||
+ error "add fs2ost failed"
+ start fs2ost $fs2ostdev $OST_MOUNT_OPTS || error "start fs2ost failed"
+
+ mkdir -p $MOUNT2
+ mount -t lustre $mgsnid:/$fsname $MOUNT2 || error "mount $MOUNT2 failed"
+ DIR=$MOUNT2 MOUNT=$MOUNT2 check_mount || error "check $MOUNT2 failed"
+ cleanup_fs2
+}
+run_test 77 "comma-separated MGS NIDs and failover node NIDs"
+
+test_78() {
+ [[ $(facet_fstype $SINGLEMDS) != ldiskfs ||
+ $(facet_fstype ost1) != ldiskfs ]] &&
+ skip "only applicable to ldiskfs-based MDTs and OSTs" && return
+
+ # reformat the Lustre filesystem with a smaller size
+ local saved_MDSSIZE=$MDSSIZE
+ local saved_OSTSIZE=$OSTSIZE
+ MDSSIZE=$((MDSSIZE - 20000))
+ OSTSIZE=$((OSTSIZE - 20000))
+ reformat || error "(1) reformat Lustre filesystem failed"
+ MDSSIZE=$saved_MDSSIZE
+ OSTSIZE=$saved_OSTSIZE
+
+ # mount the Lustre filesystem
+ setup_noconfig || error "(2) setup Lustre filesystem failed"
+
+ # create some files
+ log "create test files"
+ local i
+ local file
+ local num_files=100
+ mkdir -p $MOUNT/$tdir || error "(3) mkdir $MOUNT/$tdir failed"
+ for i in $(seq $num_files); do
+ file=$MOUNT/$tdir/$tfile-$i
+ dd if=/dev/urandom of=$file count=1 bs=1M ||
+ error "(4) create $file failed"
+ done
+
+ # unmount the Lustre filesystem
+ cleanup || error "(5) cleanup Lustre filesystem failed"
+
+ # run e2fsck on the MDT and OST devices
+ local mds_host=$(facet_active_host $SINGLEMDS)
+ local ost_host=$(facet_active_host ost1)
+ local mds_dev=$(mdsdevname ${SINGLEMDS//mds/})
+ local ost_dev=$(ostdevname 1)
+
+ run_e2fsck $mds_host $mds_dev "-y"
+ run_e2fsck $ost_host $ost_dev "-y"
+
+ # get the original block count of the MDT and OST filesystems
+ local mds_orig_blks=$(get_block_count $SINGLEMDS $mds_dev)
+ local ost_orig_blks=$(get_block_count ost1 $ost_dev)
+
+ # expand the MDT and OST filesystems to the device size
+ run_resize2fs $SINGLEMDS $mds_dev "" || error "expand $SINGLEMDS failed"
+ run_resize2fs ost1 $ost_dev "" || error "expand ost1 failed"
+
+ # run e2fsck on the MDT and OST devices again
+ run_e2fsck $mds_host $mds_dev "-y"
+ run_e2fsck $ost_host $ost_dev "-y"
+
+ # mount the Lustre filesystem
+ setup
+
+ # check the files
+ log "check files after expanding the MDT and OST filesystems"
+ for i in $(seq $num_files); do
+ file=$MOUNT/$tdir/$tfile-$i
+ $CHECKSTAT -t file -s 1048576 $file ||
+ error "(6) checkstat $file failed"
+ done
+
+ # create more files
+ log "create more files after expanding the MDT and OST filesystems"
+ for i in $(seq $((num_files + 1)) $((num_files + 10))); do
+ file=$MOUNT/$tdir/$tfile-$i
+ dd if=/dev/urandom of=$file count=1 bs=1M ||
+ error "(7) create $file failed"
+ done
+
+ # unmount the Lustre filesystem
+ cleanup || error "(8) cleanup Lustre filesystem failed"
+
+ # run e2fsck on the MDT and OST devices
+ run_e2fsck $mds_host $mds_dev "-y"
+ run_e2fsck $ost_host $ost_dev "-y"
+
+ # get the maximum block count of the MDT and OST filesystems
+ local mds_max_blks=$(get_block_count $SINGLEMDS $mds_dev)
+ local ost_max_blks=$(get_block_count ost1 $ost_dev)
+
+ # get the minimum block count of the MDT and OST filesystems
+ local mds_min_blks=$(run_resize2fs $SINGLEMDS $mds_dev "" "-P" 2>&1 |
+ grep minimum | sed -e 's/^.*filesystem: //g')
+ local ost_min_blks=$(run_resize2fs ost1 $ost_dev "" "-P" 2>&1 |
+ grep minimum | sed -e 's/^.*filesystem: //g')
+
+ # shrink the MDT and OST filesystems to a smaller size
+ local shrunk=false
+ local new_blks
+ local base_blks
+ if [[ $mds_max_blks -gt $mds_min_blks &&
+ $mds_max_blks -gt $mds_orig_blks ]]; then
+ [[ $mds_orig_blks -gt $mds_min_blks ]] &&
+ base_blks=$mds_orig_blks || base_blks=$mds_min_blks
+ new_blks=$(( (mds_max_blks - base_blks) / 2 + base_blks ))
+ run_resize2fs $SINGLEMDS $mds_dev $new_blks ||
+ error "shrink $SINGLEMDS to $new_blks failed"
+ shrunk=true
+ fi
+
+ if [[ $ost_max_blks -gt $ost_min_blks &&
+ $ost_max_blks -gt $ost_orig_blks ]]; then
+ [[ $ost_orig_blks -gt $ost_min_blks ]] &&
+ base_blks=$ost_orig_blks || base_blks=$ost_min_blks
+ new_blks=$(( (ost_max_blks - base_blks) / 2 + base_blks ))
+ run_resize2fs ost1 $ost_dev $new_blks ||
+ error "shrink ost1 to $new_blks failed"
+ shrunk=true
+ fi
+
+ # check whether the MDT or OST filesystem was shrunk or not
+ if ! $shrunk; then
+ combined_mgs_mds || stop_mgs || error "(9) stop mgs failed"
+ reformat || error "(10) reformat Lustre filesystem failed"
+ return 0
+ fi
+
+ # run e2fsck on the MDT and OST devices again
+ run_e2fsck $mds_host $mds_dev "-y"
+ run_e2fsck $ost_host $ost_dev "-y"
+
+ # mount the Lustre filesystem again
+ setup
+
+ # check the files
+ log "check files after shrinking the MDT and OST filesystems"
+ for i in $(seq $((num_files + 10))); do
+ file=$MOUNT/$tdir/$tfile-$i
+ $CHECKSTAT -t file -s 1048576 $file ||
+ error "(11) checkstat $file failed"
+ done
+
+ # unmount and reformat the Lustre filesystem
+ cleanup || error "(12) cleanup Lustre filesystem failed"
+ combined_mgs_mds || stop_mgs || error "(13) stop mgs failed"
+ reformat || error "(14) reformat Lustre filesystem failed"
+}
+run_test 78 "run resize2fs on MDT and OST filesystems"
+
if ! combined_mgs_mds ; then
stop mgs
fi
cleanup_gss
+# restore the values of MDSSIZE and OSTSIZE
+MDSSIZE=$STORED_MDSSIZE
+OSTSIZE=$STORED_OSTSIZE
+reformat
+
complete $SECONDS
exit_status