SAVE_PWD=$PWD
LUSTRE=${LUSTRE:-`dirname $0`/..}
RLUSTRE=${RLUSTRE:-$LUSTRE}
-LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
export MULTIOP=${MULTIOP:-multiop}
. $LUSTRE/tests/test-framework.sh
fi
[ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
-# bug number for skipped test: LU-2778 LU-2059 LU-4444
- ALWAYS_EXCEPT="$ALWAYS_EXCEPT 57b 50h 69"
+# bug number for skipped test: LU-2778 LU-4444
+ ALWAYS_EXCEPT="$ALWAYS_EXCEPT 57b 69"
init_logging
}
remount_client() {
- local mountopt="-o remount,$1"
+ local mountopt="remount,$1"
local MOUNTPATH=$2
echo "remount '$1' lustre on ${MOUNTPATH}....."
zconf_mount `hostname` $MOUNTPATH "$mountopt" || return 96
wait $UMOUNT_PID
if grep " $MOUNT " /proc/mounts; then
echo "test 5: /proc/mounts after failed umount"
- umount $MOUNT &
+ umount -f $MOUNT &
UMOUNT_PID=$!
sleep 2
echo "killing umount"
grep " $MOUNT " /etc/mtab && \
error false "unexpected entry in mtab before mount" && return 10
- [ "$(facet_fstype ost1)" = "zfs" ] &&
- skip "LU-2059: no local config for ZFS OSTs" && return
-
local rc=0
start_ost
start_mds
run_test 19a "start/stop MDS without OSTs"
test_19b() {
- [ "$(facet_fstype ost1)" = "zfs" ] &&
- skip "LU-2059: no local config for ZFS OSTs" && return
-
start_ost || return 1
stop_ost -f || return 2
}
run_test 21a "start mds before ost, stop ost first"
test_21b() {
- [ "$(facet_fstype ost1)" = "zfs" ] &&
- skip "LU-2059: no local config for ZFS OSTs" && return
-
start_ost
start_mds
wait_osc_import_state mds ost FULL
--reformat $fs2mdsdev $fs2mdsvdev || exit 10
setup
start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && return 2
+ stop fs2mds -f
cleanup || return 6
}
run_test 24b "Multiple MGSs on a single node (should return err)"
run_test 26 "MDT startup failure cleans LOV (should return errs)"
test_27a() {
- [ "$(facet_fstype ost1)" = "zfs" ] &&
- skip "LU-2059: no local config for ZFS OSTs" && return
-
start_ost || return 1
start_mds || return 2
echo "Requeue thread should have started: "
NEW=$(echo $OSTNID | sed "s/$ORIGVAL/$NEWVAL@/")
echo "Using fake nid $NEW"
- TEST="$LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import | grep failover_nids | sed -n 's/.*\($NEW\).*/\1/p'"
+ TEST="$LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import |
+ grep failover_nids | sed -n 's/.*\($NEW\).*/\1/p'"
set_conf_param_and_check client "$TEST" \
"$FSNAME-OST0000.failover.node" $NEW ||
error "didn't add failover nid $NEW"
- NIDS=$($LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import | grep failover_nids)
+ NIDS=$($LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import |
+ grep failover_nids)
echo $NIDS
- NIDCOUNT=$(($(echo "$NIDS" | wc -w) - 1))
+ # The NIDS value is the failover nid strings and "[" and "]". So
+ # we need to subtract the space taken by the delimiters. This has
+ # changed from earlier version of Lustre but this test is run only
+ # locally so this change will not break interop. See LU-3386
+ NIDCOUNT=$(($(echo "$NIDS" | wc -w) - 3))
echo "should have 2 failover nids: $NIDCOUNT"
[ $NIDCOUNT -eq 2 ] || error "Failover nid not added"
- do_facet mgs "$LCTL conf_param -d $FSNAME-OST0000.failover.node" || error "conf_param delete failed"
+ do_facet mgs "$LCTL conf_param -d $FSNAME-OST0000.failover.node" ||
+ error "conf_param delete failed"
umount_client $MOUNT
mount_client $MOUNT || return 3
- NIDS=$($LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import | grep failover_nids)
+ NIDS=$($LCTL get_param -n osc.$FSNAME-OST0000-osc-[^M]*.import |
+ grep failover_nids)
echo $NIDS
- NIDCOUNT=$(($(echo "$NIDS" | wc -w) - 1))
+ NIDCOUNT=$(($(echo "$NIDS" | wc -w) - 3))
echo "only 1 final nid should remain: $NIDCOUNT"
[ $NIDCOUNT -eq 1 ] || error "Failover nids not removed"
error_noexit "mount mdt1 failed"
return 1
}
+
+ $r $LCTL set_param -n mdt.${fsname}*.enable_remote_dir=1 ||
+ error_noexit "enable remote dir create failed"
+
shall_cleanup_mdt1=true
fi
# different one than the default value here.
add fs2ost $(mkfs_opts ost1 ${fs2ostdev}) --mgsnode=$MGSNID \
--fsname=${FSNAME2} --reformat $fs2ostdev $fs2ostvdev || exit 10
- add fs3ost $(mkfs_opts ost1 ${fs3ostdev}) --mgsnode=$MGSNID \
+ add fs3ost $(mkfs_opts ost2 ${fs3ostdev}) --mgsnode=$MGSNID \
--fsname=${FSNAME2} --reformat $fs3ostdev $fs3ostvdev || exit 10
start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS
}
run_test 41b "mount mds with --nosvc and --nomgs on first mount"
+test_41c() {
+ cleanup
+ # MDT concurent start
+ #define OBD_FAIL_TGT_DELAY_CONNECT 0x703
+ do_facet $SINGLEMDS "lctl set_param fail_loc=0x703"
+ start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS &
+ local pid=$!
+ sleep 2
+ do_facet $SINGLEMDS "lctl set_param fail_loc=0x0"
+ start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS &
+ local pid2=$!
+ wait $pid2
+ local rc2=$?
+ wait $pid
+ local rc=$?
+ if [ $rc == 0 ] && [ $rc2 == 114 ]; then
+ echo "1st MDT start succeed"
+ echo "2nd MDT start failed with EALREADY"
+ elif [ $rc2 == 0 ] && [ $rc == 114 ]; then
+ echo "1st MDT start failed with EALREADY"
+ echo "2nd MDT start succeed"
+ else
+ stop mds1 -f
+ error "unexpected concurent MDT mounts result, rc=$rc rc2=$rc2"
+ fi
+
+ # OST concurent start
+ #define OBD_FAIL_TGT_DELAY_CONNECT 0x703
+ do_facet ost1 "lctl set_param fail_loc=0x703"
+ start ost1 $(ostdevname 1) $OST_MOUNT_OPTS &
+ pid=$!
+ sleep 2
+ do_facet ost1 "lctl set_param fail_loc=0x0"
+ start ost1 $(ostdevname 1) $OST_MOUNT_OPTS &
+ pid2=$!
+ wait $pid2
+ rc2=$?
+ wait $pid
+ rc=$?
+ if [ $rc == 0 ] && [ $rc2 == 114 ]; then
+ echo "1st OST start succeed"
+ echo "2nd OST start failed with EALREADY"
+ elif [ $rc2 == 0 ] && [ $rc == 114 ]; then
+ echo "1st OST start failed with EALREADY"
+ echo "2nd OST start succeed"
+ else
+ stop mds1 -f
+ stop ost1 -f
+ error "unexpected concurent OST mounts result, rc=$rc rc2=$rc2"
+ fi
+ # cleanup
+ stop mds1 -f
+ stop ost1 -f
+
+ # verify everything ok
+ start_mds
+ if [ $? != 0 ]
+ then
+ stop mds1 -f
+ error "MDT(s) start failed"
+ fi
+
+ start_ost
+ if [ $? != 0 ]
+ then
+ stop mds1 -f
+ stop ost1 -f
+ error "OST(s) start failed"
+ fi
+
+ mount_client $MOUNT
+ if [ $? != 0 ]
+ then
+ stop mds1 -f
+ stop ost1 -f
+ error "client start failed"
+ fi
+ check_mount
+ if [ $? != 0 ]
+ then
+ stop mds1 -f
+ stop ost1 -f
+ error "client mount failed"
+ fi
+ cleanup
+}
+run_test 41c "concurent mounts of MDT/OST should all fail but one"
+
test_42() { #bug 14693
setup
check_mount || error "client was not mounted"
run_test 42 "allow client/server mount/unmount with invalid config param"
test_43() {
+ [[ $(lustre_version_code mgs) -ge $(version_code 2.5.58) ]] ||
+ { skip "Need MDS version at least 2.5.58" && return 0; }
[ $UID -ne 0 -o $RUNAS_ID -eq 0 ] && skip_env "run as root"
+
+ ID1=${ID1:-501}
+ USER1=$(cat /etc/passwd | grep :$ID1:$ID1: | cut -d: -f1)
+ [ -z "$USER1" ] && skip_env "missing user with uid=$ID1 gid=$ID1" &&
+ return
+
setup
chmod ugo+x $DIR || error "chmod 0 failed"
set_conf_param_and_check mds \
"lctl get_param -n mdt.$FSNAME-MDT0000.root_squash" \
"$FSNAME.mdt.root_squash" \
"0:0"
+ wait_update $HOSTNAME \
+ "lctl get_param -n llite.${FSNAME}*.root_squash" \
+ "0:0" ||
+ error "check llite root_squash failed!"
set_conf_param_and_check mds \
"lctl get_param -n mdt.$FSNAME-MDT0000.nosquash_nids" \
"$FSNAME.mdt.nosquash_nids" \
"NONE"
+ wait_update $HOSTNAME \
+ "lctl get_param -n llite.${FSNAME}*.nosquash_nids" \
+ "NONE" ||
+ error "check llite nosquash_nids failed!"
#
# create set of test files
chmod go-rwx $DIR/$tdir-rootdir || error "chmod 3 failed"
touch $DIR/$tdir-rootdir/tfile-1 || error "touch failed"
+ echo "777" > $DIR/$tfile-user1file || error "write 7 failed"
+ chmod go-rw $DIR/$tfile-user1file || error "chmod 7 failed"
+ chown $ID1.$ID1 $DIR/$tfile-user1file || error "chown failed"
+
#
# check root_squash:
# set root squash UID:GID to RUNAS_ID
"lctl get_param -n mdt.$FSNAME-MDT0000.root_squash" \
"$FSNAME.mdt.root_squash" \
"$RUNAS_ID:$RUNAS_ID"
+ wait_update $HOSTNAME \
+ "lctl get_param -n llite.${FSNAME}*.root_squash" \
+ "$RUNAS_ID:$RUNAS_ID" ||
+ error "check llite root_squash failed!"
ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tfile-userfile)
dd if=$DIR/$tfile-userfile 1>/dev/null 2>/dev/null || \
echo "$ST: root read permission is granted - ok"
echo "444" | \
- dd conv=notrunc if=$DIR/$tfile-userfile 1>/dev/null 2>/dev/null || \
+ dd conv=notrunc of=$DIR/$tfile-userfile 1>/dev/null 2>/dev/null || \
error "$ST: root write permission is denied"
echo "$ST: root write permission is granted - ok"
error "$ST: root create permission is granted"
echo "$ST: root create permission is denied - ok"
+
+ # LU-1778
+ # check root_squash is enforced independently
+ # of client cache content
+ #
+ # access file by USER1, keep access open
+ # root should be denied access to user file
+
+ runas -u $ID1 tail -f $DIR/$tfile-user1file 1>/dev/null 2>&1 &
+ pid=$!
+ sleep 1
+
+ ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tfile-user1file)
+ dd if=$DIR/$tfile-user1file 1>/dev/null 2>&1 &&
+ { kill $pid; error "$ST: root read permission is granted"; }
+ echo "$ST: root read permission is denied - ok"
+
+ echo "777" | \
+ dd conv=notrunc of=$DIR/$tfile-user1file 1>/dev/null 2>&1 &&
+ { kill $pid; error "$ST: root write permission is granted"; }
+ echo "$ST: root write permission is denied - ok"
+
+ kill $pid
+ wait $pid
+
#
# check nosquash_nids:
# put client's NID into nosquash_nids list,
"lctl get_param -n mdt.$FSNAME-MDT0000.nosquash_nids" \
"$FSNAME-MDTall.mdt.nosquash_nids" \
"$NIDLIST"
+ wait_update $HOSTNAME \
+ "lctl get_param -n llite.${FSNAME}*.nosquash_nids" \
+ "$NIDLIST" ||
+ error "check llite nosquash_nids failed!"
ST=$(stat -c "%n: owner uid %u (%A)" $DIR/$tfile-rootfile)
dd if=$DIR/$tfile-rootfile 1>/dev/null 2>/dev/null || \
test_50h() {
# prepare MDT/OST, make OSC inactive for OST1
[ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2, skipping" && return
+
+ [ $(facet_fstype ost1) == zfs ] && import_zpool ost1
do_facet ost1 "$TUNEFS --param osc.active=0 `ostdevname 1`" ||
error "tunefs OST1 failed"
start_mds || error "Unable to start MDT"
}
run_test 73 "failnode to update from mountdata properly"
-test_74() { # LU-1606
- for TESTPROG in $LUSTRE_TESTS_API_DIR/*.c; do
- gcc -Wall -Werror $LUSTRE_TESTS_API_DIR/simple_test.c \
- -I$LUSTRE/include \
- -L$LUSTRE/utils -llustreapi ||
- error "client api broken"
- done
- cleanup || return $?
-}
-run_test 74 "Lustre client api program can compile and link"
-
test_75() { # LU-2374
[[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.1) ]] &&
skip "Need MDS version at least 2.4.1" && return
}
run_test 75 "The order of --index should be irrelevant"
-test_76() {
+test_76a() {
[[ $(lustre_version_code mgs) -ge $(version_code 2.4.52) ]] ||
{ skip "Need MDS version at least 2.4.52" && return 0; }
setup
error "client_cache_count is not saved after remount"
stopall
}
-run_test 76 "set permanent params set_param -P"
+run_test 76a "set permanent params set_param -P"
+
+test_76b() { # LU-4783
+ [[ $(lustre_version_code mgs) -ge $(version_code 2.5.57) ]] ||
+ { skip "Need MGS version at least 2.5.57" && return 0; }
+ stopall
+ setupall
+ do_facet mgs $LCTL get_param mgs.MGS.live.params ||
+ error "start params log failed"
+ stopall
+}
+run_test 76b "verify params log setup correctly"
test_77() { # LU-3445
local server_version=$(lustre_version_code $SINGLEMDS)
}
run_test 78 "run resize2fs on MDT and OST filesystems"
+test_79() { # LU-4227
+ [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.5.59) ]] ||
+ { skip "Need MDS version at least 2.5.59"; return 0; }
+
+ local mdsdev1=$(mdsdevname 1)
+ local mdsvdev1=$(mdsvdevname 1)
+ local mdsdev2=$(mdsdevname 2)
+ local mdsvdev2=$(mdsvdevname 2)
+ local ostdev1=$(ostdevname 1)
+ local ostvdev1=$(ostvdevname 1)
+ local opts_mds1="$(mkfs_opts mds1 $mdsdev1) --reformat"
+ local opts_mds2="$(mkfs_opts mds2 $mdsdev2) --reformat"
+ local opts_ost1="$(mkfs_opts ost1 $ostdev1) --reformat"
+ local mgsnode_opt
+
+ # remove --mgs/--mgsnode from mkfs.lustre options
+ opts_mds1=$(echo $opts_mds1 | sed -e "s/--mgs//")
+
+ mgsnode_opt=$(echo $opts_mds2 |
+ awk '{ for ( i = 1; i < NF; i++ )
+ if ( $i ~ "--mgsnode" ) { print $i; break } }')
+ [ -n $mgsnode_opt ] &&
+ opts_mds2=$(echo $opts_mds2 | sed -e "s/$mgsnode_opt//")
+
+ mgsnode_opt=$(echo $opts_ost1 |
+ awk '{ for ( i = 1; i < NF; i++ )
+ if ( $i ~ "--mgsnode" ) { print $i; break } }')
+ [ -n $mgsnode_opt ] &&
+ opts_ost1=$(echo $opts_ost1 | sed -e "s/$mgsnode_opt//")
+
+ # -MGS, format a mdt without --mgs option
+ add mds1 $opts_mds1 $mdsdev1 $mdsvdev1 &&
+ error "Must specify --mgs when formatting mdt combined with mgs"
+
+ # +MGS, format a mdt/ost without --mgsnode option
+ add mds1 $(mkfs_opts mds1 $mdsdev1) --reformat $mdsdev1 $mdsvdev1 \
+ > /dev/null || error "start mds1 failed"
+ add mds2 $opts_mds2 $mdsdev2 $mdsvdev2 &&
+ error "Must specify --mgsnode when formatting a mdt"
+ add ost1 $opts_ost1 $ostdev1 $ostvdev2 &&
+ error "Must specify --mgsnode when formatting an ost"
+
+ return 0
+}
+run_test 79 "format MDT/OST without mgs option (should return errors)"
+
+test_80() {
+ start_mds
+ start_ost
+ uuid=$(do_facet ost1 lctl get_param -n mgc.*.uuid)
+#define OBD_FAIL_MGS_PAUSE_TARGET_CON 0x906
+ do_facet ost1 "lctl set_param fail_val=10 fail_loc=0x906"
+ do_facet mgs "lctl set_param fail_val=10 fail_loc=0x906"
+ do_facet mgs "lctl set_param -n mgs/MGS/evict_client $uuid"
+ sleep 30
+ start_ost2
+
+ do_facet ost1 "lctl set_param fail_loc=0"
+ stopall
+}
+run_test 80 "mgc import reconnect race"
+
if ! combined_mgs_mds ; then
stop mgs
fi