Whamcloud - gitweb
b=17747
[fs/lustre-release.git] / lustre / tests / sanity-gss.sh
index 56370ce..9024134 100644 (file)
@@ -12,8 +12,6 @@ ONLY=${ONLY:-"$*"}
 ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"$SANITY_GSS_EXCEPT"}
 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
 
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="100 101"
-
 # Tests that fail on uml
 CPU=`awk '/model/ {print $4}' /proc/cpuinfo`
 [ "$CPU" = "UML" ] && EXCEPT="$EXCEPT"
@@ -36,17 +34,12 @@ LUSTRE=${LUSTRE:-`dirname $0`/..}
 init_test_env $@
 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
 
-if [ $UID -ne 0 ]; then
-    echo "Warning: running as non-root uid $UID"
-    RUNAS_ID="$UID"
-    RUNAS=""
-else
-    RUNAS_ID=${RUNAS_ID:-500}
-    RUNAS=${RUNAS:-"runas -u $RUNAS_ID"}
+remote_mds_nodsh && skip "remote MDS with nodsh" && exit 0
 
-    # $RUNAS_ID may get set incorrectly somewhere else
-    [ $RUNAS_ID -eq 0 ] && error "\$RUNAS_ID set to 0, but \$UID is also 0!"
-fi
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="100 101"
+
+# $RUNAS_ID may get set incorrectly somewhere else
+[ $UID -eq 0 -a $RUNAS_ID -eq 0 ] && error "\$RUNAS_ID set to 0, but \$UID is also 0!"
 
 # remove $SEC, we'd like to control everything by ourselves
 unset SEC
@@ -67,29 +60,35 @@ cnt_all2mdt=0
 cnt_all2all=0
 DBENCH_PID=0
 PROC_CLI="srpc.info"
+# Escape "." to use lctl
+PROC_CLI=${PROC_CLI//\./\*} 
 
 # set manually
 GSS=true
 GSS_KRB5=true
 
+prepare_krb5_creds() {
+    echo prepare krb5 cred
+    rm -f $KRB5_CRED_SAVE
+    echo RUNAS=$RUNAS
+    $RUNAS krb5_login.sh || exit 1
+    [ -f $KRB5_CRED ] || exit 2
+    echo CRED=$KRB5_CRED
+    cp $KRB5_CRED $KRB5_CRED_SAVE
+}
+
+prepare_krb5_creds
+
 # we want double mount
 MOUNT_2=${MOUNT_2:-"yes"}
-cleanup_and_setup_lustre
+check_and_setup_lustre
 
-rm -rf $DIR/${TESTSUITE}/[df][0-9]*
 rm -rf $DIR/[df][0-9]*
 
 check_runas_id $RUNAS_ID $RUNAS
 
 build_test_filter
 
-prepare_krb5_creds() {
-    rm -f $KRB5_CRED_SAVE
-    $RUNAS krb5_login.sh || exit 1
-    [ -f $KRB5_CRED ] || exit 2
-    cp $KRB5_CRED $KRB5_CRED_SAVE
-}
-
 combination()
 {
     local M=$1
@@ -150,17 +149,45 @@ set_rule()
 
 count_flvr()
 {
-    output=$1
-    flavor=$2
+    local output=$1
+    local flavor=$2
+    local count=0
+
+    rpc_flvr=`echo $flavor | awk -F - '{ print $1 }'`
+    bulkspec=`echo $flavor | awk -F - '{ print $2 }'`
+
+    count=`echo "$output" | grep "rpc flavor" | grep $rpc_flvr | wc -l`
+
+    if [ "x$bulkspec" != "x" ]; then
+        algs=`echo $bulkspec | awk -F : '{ print $2 }'`
+
+        if [ "x$algs" != "x" ]; then
+            bulk_count=`echo "$output" | grep "bulk flavor" | grep $algs | wc -l`
+        else
+            bulk=`echo $bulkspec | awk -F : '{ print $1 }'`
+            if [ $bulk == "bulkn" ]; then
+                bulk_count=`echo "$output" | grep "bulk flavor" \
+                            | grep "null/null" | wc -l`
+            elif [ $bulk == "bulki" ]; then
+                bulk_count=`echo "$output" | grep "bulk flavor" \
+                            | grep "/null" | grep -v "null/" | wc -l`
+            else
+                bulk_count=`echo "$output" | grep "bulk flavor" \
+                            | grep -v "/null" | grep -v "null/" | wc -l`
+            fi
+        fi
 
-    echo "$output" | grep rpc | grep $flavor | wc -l
+        [ $bulk_count -lt $count ] && count=$bulk_count
+    fi
+
+    echo $count
 }
 
 flvr_cnt_cli2mdt()
 {
     local flavor=$1
 
-    output=`do_facet client cat $LPROC/mdc/*-MDT*-mdc-*/$PROC_CLI 2>/dev/null`
+    output=`do_facet client lctl get_param -n mdc.*-MDT*-mdc-*.$PROC_CLI 2>/dev/null`
     count_flvr "$output" $flavor
 }
 
@@ -168,7 +195,7 @@ flvr_cnt_cli2ost()
 {
     local flavor=$1
 
-    output=`do_facet client cat $LPROC/osc/*OST*-osc-[^M][^D][^T]*/$PROC_CLI 2>/dev/null`
+    output=`do_facet client lctl get_param -n osc.*OST*-osc-[^M][^D][^T]*.$PROC_CLI 2>/dev/null`
     count_flvr "$output" $flavor
 }
 
@@ -183,7 +210,7 @@ flvr_cnt_mdt2mdt()
     fi
 
     for num in `seq $MDSCOUNT`; do
-        output=`do_facet mds$num cat $LPROC/mdc/*-MDT*-mdc[0-9]*/$PROC_CLI 2>/dev/null`
+        output=`do_facet mds$num lctl get_param -n mdc.*-MDT*-mdc[0-9]*.$PROC_CLI 2>/dev/null`
         tmpcnt=`count_flvr "$output" $flavor`
         cnt=$((cnt + tmpcnt))
     done
@@ -196,7 +223,7 @@ flvr_cnt_mdt2ost()
     local cnt=0
 
     for num in `seq $MDSCOUNT`; do
-        output=`do_facet mds$num cat $LPROC/osc/*OST*-osc-MDT*/$PROC_CLI 2>/dev/null`
+        output=`do_facet mds$num lctl get_param -n osc.*OST*-osc-MDT*.$PROC_CLI 2>/dev/null`
         tmpcnt=`count_flvr "$output" $flavor`
         cnt=$((cnt + tmpcnt))
     done
@@ -261,16 +288,16 @@ wait_flavor()
 
 restore_to_default_flavor()
 {
-    local proc=$LPROC/mgs/MGS/live/$FSNAME
+    local proc="mgs.MGS.live.$FSNAME"
 
     echo "restoring to default flavor..."
 
-    nrule=`do_facet mgs cat $proc 2>/dev/null | grep ".srpc.flavor." | wc -l`
+    nrule=`do_facet mgs lctl get_param -n $proc 2>/dev/null | grep ".srpc.flavor." | wc -l`
 
     # remove all existing rules if any
     if [ $nrule -ne 0 ]; then
         echo "$nrule existing rules"
-        for rule in `do_facet mgs cat $proc 2>/dev/null | grep ".srpc.flavor."`; do
+        for rule in `do_facet mgs lctl get_param -n $proc 2>/dev/null | grep ".srpc.flavor."`; do
             echo "remove rule: $rule"
             spec=`echo $rule | awk -F = '{print $1}'`
             do_facet mgs "$LCTL conf_param $spec="
@@ -278,7 +305,7 @@ restore_to_default_flavor()
     fi
 
     # verify no rules left
-    nrule=`do_facet mgs cat $proc 2>/dev/null | grep ".srpc.flavor." | wc -l`
+    nrule=`do_facet mgs lctl get_param -n $proc 2>/dev/null | grep ".srpc.flavor." | wc -l`
     [ $nrule -ne 0 ] && error "still $nrule rules left"
 
     # wait for default flavor to be applied
@@ -309,7 +336,7 @@ set_flavor_all()
 start_dbench()
 {
     NPROC=`cat /proc/cpuinfo 2>/dev/null | grep ^processor | wc -l`
-    [ $NPROC -lt 2 ] && NPROC=2
+    [ $NPROC -gt 2 ] && NPROC=2
     sh rundbench $NPROC 1>/dev/null &
     DBENCH_PID=$!
     sleep 2
@@ -382,7 +409,6 @@ check_multiple_gss_daemons() {
     fi
 }
 
-prepare_krb5_creds
 calc_connection_cnt
 umask 077
 
@@ -567,10 +593,15 @@ test_5() {
 run_test 5 "lsvcgssd dead, operations lead to recovery"
 
 test_6() {
+    local nfile=10
+
     mkdir $DIR/d6 || error "mkdir $DIR/d6 failed"
-    cp -a /etc/* $DIR/d6/ || error "cp failed"
+    for ((i=0; i<$nfile; i++)); do
+        dd if=/dev/zero of=$DIR/d6/file$i bs=8k count=1 || error "dd file$i failed"
+    done
     ls -l $DIR/d6/* > /dev/null || error "ls failed"
     rm -rf $DIR2/d6/* || error "rm failed"
+    rmdir $DIR2/d6/ || error "rmdir failed"
 }
 run_test 6 "test basic DLM callback works"
 
@@ -607,6 +638,128 @@ test_7() {
 }
 run_test 7 "exercise enlarge_reqbuf()"
 
+test_8()
+{
+    debugsave
+    sysctl -w lnet.debug="other"
+    $LCTL dk > /dev/null
+
+    # sleep sometime in ctx handle
+    do_facet mds sysctl -w lustre.fail_val=60
+#define OBD_FAIL_SEC_CTX_HDL_PAUSE       0x1204
+    do_facet mds sysctl -w lustre.fail_loc=0x1204
+
+    $RUNAS $LFS flushctx || error "can't flush ctx"
+
+    $RUNAS df $DIR &
+    DFPID=$!
+    echo "waiting df (pid $TOUCHPID) to finish..."
+    sleep 2 # give df a chance to really trigger context init rpc
+    do_facet mds sysctl -w lustre.fail_loc=0
+    wait $DFPID || error "df should have succeeded"
+
+    $LCTL dk | grep "Early reply #" || error "No early reply"
+    debugrestore
+}
+run_test 8 "Early reply sent for slow gss context negotiation"
+
+#
+# following tests will manipulate flavors and may end with any flavor set,
+# so each test should not assume any start flavor.
+#
+
+test_50() {
+    local sample=$TMP/sanity-gss-8
+    local tdir=$MOUNT/dir8
+    local iosize="256K"
+    local hash_algs="adler32 crc32 md5 sha1 sha256 sha384 sha512 wp256 wp384 wp512"
+
+    # create sample file with aligned size for direct i/o
+    dd if=/dev/zero of=$sample bs=$iosize count=1 || error
+    dd conv=notrunc if=/etc/termcap of=$sample bs=$iosize count=1 || error
+
+    rm -rf $tdir
+    mkdir $tdir || error "create dir $tdir"
+
+    restore_to_default_flavor
+
+    for alg in $hash_algs; do
+        echo "Testing $alg..."
+        flavor=krb5i-bulki:$alg/null
+        set_rule $FSNAME any cli2ost $flavor
+        wait_flavor cli2ost $flavor $cnt_cli2ost
+
+        dd if=$sample of=$tdir/$alg oflag=direct,dsync bs=$iosize || error "$alg write"
+        diff $sample $tdir/$alg || error "$alg read"
+    done
+
+    rm -rf $tdir
+    rm -f $sample
+}
+run_test 50 "verify bulk hash algorithms works"
+
+test_51() {
+    local s1=$TMP/sanity-gss-9.1
+    local s2=$TMP/sanity-gss-9.2
+    local s3=$TMP/sanity-gss-9.3
+    local s4=$TMP/sanity-gss-9.4
+    local tdir=$MOUNT/dir9
+    local s1_size=4194304   # n * pagesize (4M)
+    local s2_size=512       # n * blksize
+    local s3_size=111       # n * blksize + m
+    local s4_size=5         # m
+    local cipher_algs="arc4 aes128 aes192 aes256 cast128 cast256 twofish128 twofish256"
+
+    # create sample files for each situation
+    rm -f $s1 $s2 $s2 $s4
+    dd if=/dev/urandom of=$s1 bs=1M count=4 || error
+    dd if=/dev/urandom of=$s2 bs=$s2_size count=1 || error
+    dd if=/dev/urandom of=$s3 bs=$s3_size count=1 || error
+    dd if=/dev/urandom of=$s4 bs=$s4_size count=1 || error
+
+    rm -rf $tdir
+    mkdir $tdir || error "create dir $tdir"
+
+    restore_to_default_flavor
+
+    #
+    # different bulk data alignment will lead to different behavior of
+    # the implementation: (n > 0; 0 < m < encryption_block_size)
+    #  - full page i/o
+    #  - partial page, size = n * encryption_block_size
+    #  - partial page, size = n * encryption_block_size + m
+    #  - partial page, size = m
+    #
+    for alg in $cipher_algs; do
+        echo "Testing $alg..."
+        flavor=krb5p-bulkp:sha1/$alg
+        set_rule $FSNAME any cli2ost $flavor
+        wait_flavor cli2ost $flavor $cnt_cli2ost
+
+        # sync write
+        dd if=$s1 of=$tdir/$alg.1 oflag=dsync bs=1M || error "write $alg.1"
+        dd if=$s2 of=$tdir/$alg.2 oflag=dsync || error "write $alg.2"
+        dd if=$s3 of=$tdir/$alg.3 oflag=dsync || error "write $alg.3"
+        dd if=$s4 of=$tdir/$alg.4 oflag=dsync || error "write $alg.4"
+
+        # remount client
+        umount_client $MOUNT
+        umount_client $MOUNT2
+        mount_client $MOUNT
+        mount_client $MOUNT2
+
+        # read & compare
+        diff $tdir/$alg.1 $s1 || error "read $alg.1"
+        diff $tdir/$alg.2 $s2 || error "read $alg.2"
+        diff $tdir/$alg.3 $s3 || error "read $alg.3"
+        diff $tdir/$alg.4 $s4 || error "read $alg.4"
+    done
+
+    rm -rf $tdir
+    rm -f $sample
+}
+run_test 51 "bulk data alignment test under encryption mode"
+
 test_90() {
     if [ "$SLOW" = "no" ]; then
         total=10
@@ -614,6 +767,10 @@ test_90() {
         total=60
     fi
 
+    restore_to_default_flavor
+    set_rule $FSNAME any any krb5p
+    wait_flavor all2all krb5p $cnt_all2all
+
     start_dbench
 
     for ((n=0;n<$total;n++)); do
@@ -635,7 +792,7 @@ test_99() {
     #
     # general rules
     #
-    nrule_old=`do_facet mgs cat $LPROC/mgs/MGS/live/$FSNAME 2>/dev/null \
+    nrule_old=`do_facet mgs lctl get_param -n mgs.MGS.live.$FSNAME 2>/dev/null \
                | grep "$FSNAME.srpc.flavor." | wc -l`
     echo "original general rules: $nrule_old"
 
@@ -647,7 +804,7 @@ test_99() {
         set_rule $FSNAME elan$i any || error "remove rule $i"
     done
 
-    nrule_new=`do_facet mgs cat $LPROC/mgs/MGS/live/$FSNAME 2>/dev/null \
+    nrule_new=`do_facet mgs lctl get_param -n mgs.MGS.live.$FSNAME 2>/dev/null \
                | grep "$FSNAME.srpc.flavor." | wc -l`
     if [ $nrule_new != $nrule_old ]; then
         error "general rule: $nrule_new != $nrule_old"
@@ -656,7 +813,7 @@ test_99() {
     #
     # target-specific rules
     #
-    nrule_old=`do_facet mgs cat $LPROC/mgs/MGS/live/$FSNAME 2>/dev/null \
+    nrule_old=`do_facet mgs lctl get_param -n mgs.MGS.live.$FSNAME 2>/dev/null \
                | grep "$FSNAME-MDT0000.srpc.flavor." | wc -l`
     echo "original target rules: $nrule_old"
 
@@ -668,7 +825,7 @@ test_99() {
         set_rule $FSNAME-MDT0000 elan$i any || error "remove rule $i"
     done
 
-    nrule_new=`do_facet mgs cat $LPROC/mgs/MGS/live/$FSNAME 2>/dev/null \
+    nrule_new=`do_facet mgs lctl get_param -n mgs.MGS.live.$FSNAME 2>/dev/null \
                | grep "$FSNAME-MDT0000.srpc.flavor." | wc -l`
     if [ $nrule_new != $nrule_old ]; then
         error "general rule: $nrule_new != $nrule_old"
@@ -901,4 +1058,4 @@ run_test 102 "survive from insanely fast flavor switch"
 
 equals_msg `basename $0`: test complete, cleaning up
 check_and_cleanup_lustre
-[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG || true
+[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true