+ [[ $pre -ne $post ]]
+}
+
+test_215() {
+ cleanup_netns || error "Failed to cleanup netns before test execution"
+ cleanup_lnet || error "Failed to unload modules before test execution"
+
+ reinit_dlc || return $?
+
+ add_net "${NETTYPE}1" "${INTERFACES[0]}" || return $?
+ add_net "${NETTYPE}2" "${INTERFACES[0]}" || return $?
+
+ local nid1=$($LCTL list_nids | head -n 1)
+ local nid2=$($LCTL list_nids | tail --lines 1)
+
+ do_lnetctl peer add --prim $nid1 --nid $nid2 ||
+ error "Failed to add peer"
+
+ local npings=25
+
+ for nidvarA in nid1 nid2; do
+ src=${!nidvarA}
+ dst=${!nidvarA}
+ for nidvarB in nid1 nid2; do
+ [[ $nidvarA == $nidvarB ]] && continue
+
+ ni_stats_pre
+
+ echo "$LNETCTL ping $dst x $npings"
+ for i in $(seq 1 $npings); do
+ $LNETCTL ping $dst &>/dev/null ||
+ error "$LNETCTL ping $dst failed"
+ done
+
+ ni_stats_post
+
+ # No source specified, sends to either NID should cause
+ # counts to increase across both NIs
+ for nidvar in nid1 nid2; do
+ for stat in send_count recv_count; do
+ ni_stat_changed $nidvar $stat ||
+ error "$stat unchanged for ${!nidvar}"
+ done
+ done
+
+ ni_stats_pre
+
+ echo "$LNETCTL ping --source $src $dst x $npings"
+ for i in $(seq 1 $npings); do
+ $LNETCTL ping --source $src $dst &>/dev/null ||
+ error "$LNETCTL ping --source $src $dst failed"
+ done
+
+ ni_stats_post
+
+ # src nid == dest nid means stats for the _other_ NI
+ # should be unchanged
+ for nidvar in nid1 nid2; do
+ for stat in send_count recv_count; do
+ if [[ ${!nidvar} == $src ]]; then
+ ni_stat_changed $nidvar $stat ||
+ error "$stat unchanged for ${!nidvar}"
+ else
+ ni_stat_changed $nidvar $stat &&
+ error "$stat changed for ${!nidvar}"
+ fi
+ done
+ done
+ done
+ # Double number of pings for next iteration because the net
+ # sequence numbers will have diverged
+ npings=$(($npings * 2))
+ done
+
+ # Ping from nid1 to nid2 should fail
+ do_lnetctl ping --source $nid1 $nid2 &&
+ error "ping from $nid1 to $nid2 should fail"
+
+ # Ping from nid2 to nid1 should fail
+ do_lnetctl ping --source $nid2 $nid1 &&
+ error "ping from $nid2 to $nid1 should fail"
+
+ return 0
+}
+run_test 215 "Test lnetctl ping --source option"
+
+test_216() {
+ [[ ${NETTYPE} == kfi* ]] && skip "kfi doesn't support drop rules"
+
+ local rc=0
+
+ reinit_dlc || return $?
+
+ add_net "${NETTYPE}" "${INTERFACES[0]}" || return $?
+ add_net "${NETTYPE}1" "${INTERFACES[0]}" || return $?
+
+ local nids=( $($LCTL list_nids | xargs echo) )
+
+ do_lnetctl discover ${nids[0]} ||
+ error "Initial discovery failed"
+
+ do_lnetctl ping --source ${nids[0]} ${nids[0]} ||
+ error "Initial ping failed $?"
+
+ do_lnetctl ping --source ${nids[1]} ${nids[1]} ||
+ error "Initial ping failed $?"
+
+ local src dst
+ for src in "${nids[@]}"; do
+ for dst in "${nids[@]}"; do
+ $LCTL net_drop_add -r 1 -s $src -d $dst \
+ -e network_timeout ||
+ error "Failed to add drop rule"
+ done
+ done
+
+ do_lnetctl ping ${nids[0]} || rc=$?
+
+ $LCTL net_drop_del -a
+
+ [[ $rc -eq 0 ]] &&
+ error "expected ping to fail"
+
+ check_nid_in_recovq "-p" "${nids[0]}" "0"
+ check_nid_in_recovq "-l" "${nids[0]}" "1"
+
+ return 0
+}
+run_test 216 "Failed send to peer NI owned by local host should not trigger peer NI recovery"
+
+test_217() {
+ reinit_dlc || return $?
+
+ [[ $($LNETCTL net show | grep -c nid) -ne 1 ]] &&
+ error "Unexpected number of NIs after initalizing DLC"
+
+ do_lnetctl discover 0@lo ||
+ error "Failed to discover 0@lo"
+
+ unload_modules
+}
+run_test 217 "Don't leak memory when discovering peer with nnis <= 1"
+
+test_218() {
+ [[ ${NETTYPE} == kfi* ]] && skip "kfi doesn't support drop rules"
+
+ reinit_dlc || return $?
+
+ [[ ${#INTERFACES[@]} -lt 2 ]] &&
+ skip "Need two LNet interfaces"
+
+ add_net "${NETTYPE}" "${INTERFACES[0]}" || return $?
+
+ local nid1=$($LCTL list_nids | head -n 1)
+
+ do_lnetctl ping $nid1 ||
+ error "ping failed"
+
+ add_net "${NETTYPE}" "${INTERFACES[1]}" || return $?
+
+ local nid2=$($LCTL list_nids | tail --lines 1)
+
+ do_lnetctl ping $nid2 ||
+ error "ping failed"
+
+ $LCTL net_drop_add -s $nid1 -d $nid1 -e local_error -r 1 ||
+ error "Failed to add drop rule"
+
+ do_lnetctl ping --source $nid1 $nid1 &&
+ error "ping should have failed"
+
+ local health_recovered
+ local i
+
+ for i in $(seq 1 5); do
+ health_recovered=$($LNETCTL net show -v 2 |
+ grep -c 'health value: 1000')
+
+ if [[ $health_recovered -ne 2 ]]; then
+ echo "Wait 1 second for health to recover"
+ sleep 1
+ else
+ break
+ fi
+ done
+
+ health_recovered=$($LNETCTL net show -v 2 |
+ grep -c 'health value: 1000')
+
+ $LCTL net_drop_del -a
+
+ [[ $health_recovered -ne 2 ]] &&
+ do_lnetctl net show -v 2 | egrep -e nid -e health &&
+ error "Health hasn't recovered"
+
+ return 0
+}
+run_test 218 "Local recovery pings should exercise all available paths"
+
+test_219() {
+ reinit_dlc || return $?
+ add_net "${NETTYPE}" "${INTERFACES[0]}" || return $?
+ add_net "${NETTYPE}1" "${INTERFACES[0]}" || return $?
+
+ local nid1=$(lctl list_nids | head -n 1)
+ local nid2=$(lctl list_nids | tail --lines 1)
+
+ do_lnetctl ping $nid1 ||
+ error "Ping failed $?"
+ do_lnetctl ping $nid2 ||
+ error "Ping failed $?"
+
+ do_lnetctl discover $nid2 ||
+ error "Discovery failed"
+
+ $LNETCTL peer show --nid $nid1 | grep -q $nid2 ||
+ error "$nid2 is not listed under $nid1"
+}
+run_test 219 "Consolidate peer entries"
+
+do_net_add() {
+ local node=$1
+ local net=$2
+ local if=$3
+
+ do_rpc_nodes $node "$LNETCTL net add --net $net --if $if" ||
+ error "add $net on interface $if on node $node failed rc=$?"
+}
+
+do_route_add() {
+ local node=$1
+ local net=$2
+ local gw=$3
+
+ do_node $node "$LNETCTL route add --net $net --gateway $gw" ||
+ error "route add to $net via $gw failed rc=$?"
+}
+
+ROUTER=""
+ROUTER_INTERFACES=()
+RPEER=""
+RPEER_INTERFACES=()
+init_router_test_vars() {
+ local rnodes=$(remote_nodes_list)
+ [[ -z $rnodes || $(wc -w <<<$rnodes) -lt 2 ]] &&
+ skip "Need at least 2 remote nodes found \"$rnodes\""
+
+ ROUTER=$(awk '{print $1}' <<<$rnodes)
+ RPEER=$(awk '{print $2}' <<<$rnodes)
+
+ rnodes=$(comma_list $ROUTER $RPEER)
+ local all_nodes=$(comma_list $rnodes $HOSTNAME)
+
+ do_nodes $rnodes $LUSTRE_RMMOD ||
+ error "failed to unload modules"
+
+ do_rpc_nodes $rnodes "load_lnet config_on_load=1" ||
+ error "Failed to load and configure LNet"
+
+ ROUTER_INTERFACES=( $(do_rpc_nodes --quiet $ROUTER lnet_if_list) )
+
+ RPEER_INTERFACES=( $(do_rpc_nodes --quiet $RPEER lnet_if_list) )
+
+ do_nodes $all_nodes $LUSTRE_RMMOD ||
+ error "Failed to unload modules"
+
+ [[ ${#INTERFACES[@]} -eq 0 ]] &&
+ error "No interfaces configured for local host $HOSTNAME"
+ [[ ${#ROUTER_INTERFACES[@]} -eq 0 ]] &&
+ error "No interfaces configured for router $ROUTER"
+ [[ ${#RPEER_INTERFACES[@]} -eq 0 ]] &&
+ error "No interfaces configured for remote peer $RPEER"
+
+ return 0
+}
+
+ROUTER_NIDS=()
+RPEER_NIDS=()
+LNIDS=()
+LOCAL_NET=${NETTYPE}1
+REMOTE_NET=${NETTYPE}2
+setup_router_test() {
+ local mod_opts="$@"
+
+ (( $MDS1_VERSION >= $(version_code 2.15.0) )) ||
+ skip "need at least 2.15.0 for load_lnet"
+
+ if [[ ${#RPEER_INTERFACES[@]} -eq 0 ]]; then
+ init_router_test_vars ||
+ return $?
+ fi
+
+ local all_nodes=$(comma_list $ROUTER $RPEER $HOSTNAME)
+
+ do_nodes $all_nodes $LUSTRE_RMMOD ||
+ error "failed to unload modules"
+
+ mod_opts+=" alive_router_check_interval=5"
+ mod_opts+=" router_ping_timeout=5"
+ mod_opts+=" large_router_buffers=4"
+ mod_opts+=" small_router_buffers=8"
+ mod_opts+=" tiny_router_buffers=16"
+ do_rpc_nodes $all_nodes load_lnet "${mod_opts}" ||
+ error "Failed to load lnet"
+
+ do_nodes $all_nodes "$LNETCTL lnet configure" ||
+ error "Failed to initialize DLC"
+
+ do_net_add $ROUTER $LOCAL_NET ${ROUTER_INTERFACES[0]} ||
+ return $?
+
+ do_net_add $ROUTER $REMOTE_NET ${ROUTER_INTERFACES[0]} ||
+ return $?
+
+ do_net_add $RPEER $REMOTE_NET ${RPEER_INTERFACES[0]} ||
+ return $?
+
+ add_net $LOCAL_NET ${INTERFACES[0]} ||
+ return $?
+
+ ROUTER_NIDS=( $(do_node $ROUTER $LCTL list_nids 2>/dev/null |
+ xargs echo) )
+ RPEER_NIDS=( $(do_node $RPEER $LCTL list_nids 2>/dev/null |
+ xargs echo) )
+ LNIDS=( $($LCTL list_nids 2>/dev/null | xargs echo) )
+}
+
+do_route_del() {
+ local node=$1
+ local net=$2
+ local gw=$3
+
+ do_nodesv $node "if $LNETCTL route show --net $net --gateway $gw; then \
+ $LNETCTL route del --net $net --gateway $gw; \
+ else \
+ exit 0; \
+ fi"
+}
+
+cleanup_router_test() {
+ local all_nodes=$(comma_list $HOSTNAME $ROUTER $RPEER)
+
+ do_route_del $HOSTNAME $REMOTE_NET ${ROUTER_NIDS[0]} ||
+ error "Failed to delete $REMOTE_NET route"
+
+ do_route_del $RPEER $LOCAL_NET ${ROUTER_NIDS[1]} ||
+ error "Failed to delete $LOCAL_NET route"
+
+ do_nodes $all_nodes $LUSTRE_RMMOD ||
+ error "failed to unload modules"
+
+ return 0
+}
+
+check_route_aliveness() {
+ local node="$1"
+ local expected="$2"
+
+ local lctl_actual
+ local lnetctl_actual
+ local chk_intvl
+ local i
+
+ chk_intvl=$(cat /sys/module/lnet/parameters/alive_router_check_interval)
+
+ lctl_actual=$(do_node $node $LCTL show_route | awk '{print $7}')
+ lnetctl_actual=$(do_node $node $LNETCTL route show -v |
+ awk '/state/{print $NF}')
+
+ for ((i = 0; i < $chk_intvl; i++)); do
+ if [[ $lctl_actual == $expected ]] &&
+ [[ $lnetctl_actual == $expected ]]; then
+ break
+ fi
+
+ echo "wait 1s for route state change"
+ sleep 1
+
+ lctl_actual=$(do_node $node $LCTL show_route | awk '{print $7}')
+ lnetctl_actual=$(do_node $node $LNETCTL route show -v |
+ awk '/state/{print $NF}')
+ done
+
+ [[ $lctl_actual != $expected ]] &&
+ error "Wanted \"$expected\" lctl found \"$lctl_actual\""
+
+ [[ $lnetctl_actual != $expected ]] &&
+ error "Wanted \"$expected\" lnetctl found \"$lnetctl_actual\""
+
+ return 0
+}
+
+check_router_ni_status() {
+ local expected_local="$1"
+ local expected_remote="$2"
+
+ local actual_local
+ local actual_remote
+ local chk_intvl
+ local timeout
+ local i
+
+ chk_intvl=$(cat /sys/module/lnet/parameters/alive_router_check_interval)
+ timeout=$(cat /sys/module/lnet/parameters/router_ping_timeout)
+
+ actual_local=$(do_node $ROUTER "$LNETCTL net show --net $LOCAL_NET" |
+ awk '/status/{print $NF}')
+ actual_remote=$(do_node $ROUTER "$LNETCTL net show --net $REMOTE_NET" |
+ awk '/status/{print $NF}')
+
+ for ((i = 0; i < $((chk_intvl + timeout)); i++)); do
+ if [[ $actual_local == $expected_local ]] &&
+ [[ $actual_remote == $expected_remote ]]; then
+ break
+ fi
+
+ echo "wait 1s for NI state change"
+ sleep 1
+
+ actual_local=$(do_node $ROUTER \
+ "$LNETCTL net show --net $LOCAL_NET" |
+ awk '/status/{print $NF}')
+ actual_remote=$(do_node $ROUTER \
+ "$LNETCTL net show --net $REMOTE_NET" |
+ awk '/status/{print $NF}')
+ done
+
+ [[ $actual_local == $expected_local ]] ||
+ error "$LOCAL_NET should be $expected_local"
+
+ [[ $actual_remote == $expected_remote ]] ||
+ error "$REMOTE_NET should be $expected_remote"
+
+ return 0
+}
+
+do_basic_rtr_test() {
+ do_node $ROUTER "$LNETCTL set routing 1" ||
+ error "Unable to enable routing on $ROUTER"
+
+ do_route_add $HOSTNAME $REMOTE_NET ${ROUTER_NIDS[0]} ||
+ return $?
+
+ do_route_add $RPEER $LOCAL_NET ${ROUTER_NIDS[1]} ||
+ return $?
+
+ check_route_aliveness "$HOSTNAME" "up" ||
+ return $?
+
+ check_route_aliveness "$RPEER" "up" ||
+ return $?
+
+ do_lnetctl ping ${RPEER_NIDS[0]} ||
+ error "Failed to ping ${RPEER_NIDS[0]}"
+
+ do_node $RPEER "$LNETCTL ping ${LNIDS[0]}" ||
+ error "$RPEER failed to ping ${LNIDS[0]}"
+
+ return 0
+}
+
+test_220() {
+ setup_router_test || return $?
+
+ do_basic_rtr_test || return $?
+
+ do_rpc_nodes $HOSTNAME,$RPEER load_module ../lnet/selftest/lnet_selftest ||
+ error "Failed to load lnet-selftest module"
+
+ $LSTSH -H -t $HOSTNAME -f $RPEER -m rw -s 4k ||
+ error "lst failed"
+
+ $LSTSH -H -t $HOSTNAME -f $RPEER -m rw ||
+ error "lst failed"
+
+ cleanup_router_test || return $?
+}
+run_test 220 "Add routes w/default options - check aliveness"
+
+test_221() {
+ setup_router_test lnet_peer_discovery_disabled=1 || return $?
+
+ do_basic_rtr_test || return $?
+
+ cleanup_router_test || return $?
+}
+run_test 221 "Add routes w/DD disabled - check aliveness"
+
+do_aarf_enabled_test() {
+ do_node $ROUTER "$LNETCTL set routing 1" ||
+ error "Unable to enable routing on $ROUTER"
+
+ check_router_ni_status "down" "down"
+
+ do_lnetctl ping ${RPEER_NIDS[0]} &&
+ error "Ping should fail"
+
+ do_node $RPEER "$LNETCTL ping ${LNIDS[0]}" &&
+ error "$RPEER ping should fail"
+
+ # Adding a route should cause the router's NI on LOCAL_NET to get up
+ do_route_add $HOSTNAME $REMOTE_NET ${ROUTER_NIDS[0]} ||
+ return $?
+
+ check_router_ni_status "up" "down" ||
+ return $?
+
+ # But route should still be down because of avoid_asym_router_failure
+ check_route_aliveness "$HOSTNAME" "down" ||
+ return $?
+
+ do_lnetctl ping ${RPEER_NIDS[0]} &&
+ error "Ping should fail"
+
+ do_node $RPEER "$LNETCTL ping ${LNIDS[0]}" &&
+ error "$RPEER ping should fail"
+
+ # Adding the symmetric route should cause the remote NI to go up and
+ # routes to go up
+ do_route_add $RPEER $LOCAL_NET ${ROUTER_NIDS[1]} ||
+ return $?
+
+ check_router_ni_status "up" "up" ||
+ return $?
+
+ check_route_aliveness "$HOSTNAME" "up" ||
+ return $?
+
+ check_route_aliveness "$RPEER" "up" ||
+ return $?
+
+ do_lnetctl ping ${RPEER_NIDS[0]} ||
+ error "Failed to ping ${RPEER_NIDS[0]}"
+
+ do_node $RPEER "$LNETCTL ping ${LNIDS[0]}" ||
+ error "$RPEER failed to ping ${LNIDS[0]}"
+
+ # Stop LNet on local host
+ do_lnetctl lnet unconfigure ||
+ error "Failed to stop LNet rc=$?"
+
+ check_router_ni_status "down" "up" ||
+ return $?
+
+ check_route_aliveness "$RPEER" "down" ||
+ return $?
+
+ do_lnetctl ping ${RPEER_NIDS[0]} &&
+ error "Ping should fail"
+
+ do_node $RPEER "$LNETCTL ping ${LNIDS[0]}" &&
+ error "$RPEER ping should fail"
+
+ return 0
+}
+
+test_222() {
+ setup_router_test avoid_asym_router_failure=1 || return $?
+
+ do_aarf_enabled_test || return $?
+
+ cleanup_router_test || return $?
+}
+run_test 222 "Check avoid_asym_router_failure=1"
+
+test_223() {
+ local opts="avoid_asym_router_failure=1 lnet_peer_discovery_disabled=1"
+
+ setup_router_test $opts || return $?
+
+ do_aarf_enabled_test || return $?
+
+ cleanup_router_test || return $?
+}
+run_test 223 "Check avoid_asym_router_failure=1 w/DD disabled"
+
+do_aarf_disabled_test() {
+ do_node $ROUTER "$LNETCTL set routing 1" ||
+ error "Unable to enable routing on $ROUTER"
+
+ check_router_ni_status "down" "down"
+
+ do_route_add $HOSTNAME $REMOTE_NET ${ROUTER_NIDS[0]} ||
+ return $?
+
+ check_router_ni_status "up" "down" ||
+ return $?
+
+ check_route_aliveness "$HOSTNAME" "up" ||
+ return $?
+
+ do_route_add $RPEER $LOCAL_NET ${ROUTER_NIDS[1]} ||
+ return $?
+
+ check_router_ni_status "up" "up" ||
+ return $?
+
+ check_route_aliveness "$HOSTNAME" "up" ||
+ return $?
+
+ check_route_aliveness "$RPEER" "up" ||
+ return $?
+
+ do_lnetctl ping ${RPEER_NIDS[0]} ||
+ error "Failed to ping ${RPEER_NIDS[0]}"
+
+ do_node $RPEER "$LNETCTL ping ${LNIDS[0]}" ||
+ error "$RPEER failed to ping ${LNIDS[0]}"
+
+ # Stop LNet on local host
+ do_lnetctl lnet unconfigure ||
+ error "Failed to stop LNet rc=$?"
+
+ check_router_ni_status "down" "up" ||
+ return $?
+
+ check_route_aliveness "$RPEER" "up" ||
+ return $?
+
+ return 0
+}
+
+test_224() {
+ setup_router_test avoid_asym_router_failure=0 ||
+ return $?
+
+ do_aarf_disabled_test ||
+ return $?
+
+ cleanup_router_test ||
+ return $?
+}
+run_test 224 "Check avoid_asym_router_failure=0"
+
+test_225() {
+ local opts="avoid_asym_router_failure=0 lnet_peer_discovery_disabled=1"
+
+ setup_router_test $opts || return $?
+
+ do_aarf_disabled_test || return $?
+
+ cleanup_router_test ||
+ return $?
+}
+run_test 225 "Check avoid_asym_router_failure=0 w/DD disabled"
+
+test_230() {
+ [[ ${NETTYPE} == tcp* ]] || skip "Need tcp NETTYPE"
+
+ # LU-12815
+ echo "Check valid values; Should succeed"
+ local i
+ local lnid
+ local cmd
+ for ((i = 4; i < 16; i+=1)); do
+ reinit_dlc || return $?
+ add_net "tcp" "${INTERFACES[0]}" || return $?
+ do_lnetctl net set --all --conns-per-peer $i ||
+ error "should have succeeded $?"
+ $LNETCTL net show -v 1 | grep -q "conns_per_peer: $i" ||
+ error "failed to set conns-per-peer to $i"
+ lnid="$(lctl list_nids | head -n 1)"
+ do_lnetctl ping "$lnid" ||
+ error "failed to ping myself"
+
+ # "lctl --net tcp conn_list" prints the list of active
+ # connections. Since we're pinging ourselves, there should be
+ # 2 Control connections plus 2*conns_per_peer connections
+ # created (one Bulk Input, one Bulk Output in each pair).
+ # Here's the sample output for conns_per_peer set to 1:
+ # 12345-1.1.1.1@tcp I[0]host01->host01:988 2626560/1061296 nonagle
+ # 12345-1.1.1.1@tcp O[0]host01->host01:1022 2626560/1061488 nonagle
+ # 12345-1.1.1.1@tcp C[0]host01->host01:988 2626560/1061296 nonagle
+ # 12345-1.1.1.1@tcp C[0]host01->host01:1023 2626560/1061488 nonagle
+ cmd="printf 'network tcp\nconn_list\n' | lctl | grep -c '$lnid'"
+
+ # Expect 2+conns_per_peer*2 connections. Wait no longer
+ # than 2 seconds.
+ wait_update $HOSTNAME "$cmd" "$((2+i*2))" 2 ||
+ error "expected number of tcp connections $((2+i*2))"
+ done
+
+ reinit_dlc || return $?
+ add_net "tcp" "${INTERFACES[0]}" || return $?
+ echo "Set > 127; Should fail"
+ do_lnetctl net set --all --conns-per-peer 128 &&
+ error "should have failed $?"
+
+ reinit_dlc || return $?
+ add_net "tcp" "${INTERFACES[0]}" || return $?
+
+ local default=$($LNETCTL net show -v 1 |
+ awk '/conns_per_peer/{print $NF}')
+
+ echo "Set < 0; Should be ignored"
+ do_lnetctl net set --all --conns-per-peer -1 ||
+ error "should have succeeded $?"
+ $LNETCTL net show -v 1 | grep -q "conns_per_peer: ${default}" ||
+ error "Did not stay at default"
+}
+run_test 230 "Test setting conns-per-peer"
+
+test_231() {
+ reinit_dlc || return $?
+
+ local net=${NETTYPE}231
+
+ do_lnetctl net add --net $net --if ${INTERFACES[0]} ||
+ error "Failed to add net"
+
+ $LNETCTL export --backup > $TMP/sanity-lnet-$testnum-expected.yaml
+ sed -i 's/peer_timeout: .*$/peer_timeout: 0/' \
+ $TMP/sanity-lnet-$testnum-expected.yaml
+
+ reinit_dlc || return $?
+
+ do_lnetctl import $TMP/sanity-lnet-$testnum-expected.yaml ||
+ error "Failed to import configuration"
+
+ $LNETCTL export --backup > $TMP/sanity-lnet-$testnum-actual.yaml
+
+ compare_yaml_files || error "Wrong config after import"
+
+ do_lnetctl net del --net $net --if ${INTERFACES[0]} ||
+ error "Failed to delete net $net"
+
+ do_lnetctl net add --net $net --if ${INTERFACES[0]} --peer-timeout=0 ||
+ error "Failed to add net with peer-timeout=0"
+
+ $LNETCTL export --backup > $TMP/sanity-lnet-$testnum-actual.yaml
+
+ compare_yaml_files || error "Wrong config after lnetctl net add"
+
+ reinit_dlc || return $?
+
+ # lnet/include/lnet/lib-lnet.h defines DEFAULT_PEER_TIMEOUT 180
+ sed -i 's/peer_timeout: .*$/peer_timeout: 180/' \
+ $TMP/sanity-lnet-$testnum-expected.yaml
+
+ sed -i '/^.*peer_timeout:.*$/d' $TMP/sanity-lnet-$testnum-actual.yaml
+
+ do_lnetctl import $TMP/sanity-lnet-$testnum-actual.yaml ||
+ error "Failed to import config without peer_timeout"
+
+ $LNETCTL export --backup > $TMP/sanity-lnet-$testnum-actual.yaml
+
+ compare_yaml_files
+}
+run_test 231 "Check DLC handling of peer_timeout parameter"
+
+### Test that linux route is added for each ni
+test_250() {
+ local skip_param
+
+ [[ ${NETTYPE} == tcp* ]] || skip "Need tcp NETTYPE"
+
+ reinit_dlc || return $?
+ add_net "tcp" "${INTERFACES[0]}" || return $?
+
+ skip_param=$(cat /sys/module/ksocklnd/parameters/skip_mr_route_setup)
+ [[ ${skip_param:-0} -ne 0 ]] &&
+ skip "Need skip_mr_route_setup=0 found $skip_param"
+
+ ip route show table ${INTERFACES[0]} | grep -q "${INTERFACES[0]}"
+}
+run_test 250 "test that linux routes are added"
+
+test_251() {
+ [[ ${NETTYPE} =~ kfi* ]] ||
+ skip "Need kfi NETTYPE"
+
+ reinit_dlc || return $?
+ add_net "kfi" "${INTERFACES[0]}" || return $?
+ add_net "kfi1" "${INTERFACES[0]}" || return $?
+ add_net "kfi10" "${INTERFACES[0]}" || return $?
+ return 0
+}
+run_test 251 "Define multiple kfi networks on single interface"
+
+test_252() {
+ setup_health_test false || return $?
+
+ local rc=0
+
+ do_rpc_nodes $RNODE unload_modules_local || rc=$?
+
+ if [[ $rc -ne 0 ]]; then
+ cleanup_health_test || return $?
+
+ error "Failed to unload modules on $RNODE rc=$rc"
+ else
+ RLOADED=false
+ fi
+
+ local ts1=$(date +%s)
+
+ do_lnetctl ping --timeout 15 ${RNIDS[0]} &&
+ error "Expected ping ${RNIDS[0]} to fail"
+
+ local ts2=$(date +%s)
+
+ local delta=$(echo "$ts2 - $ts1" | bc)
+
+ [[ $delta -lt 15 ]] ||
+ error "Ping took longer than expected to fail: $delta"
+
+ cleanup_health_test
+}
+run_test 252 "Ping to down peer should unlink quickly"
+
+do_expired_message_drop_test() {
+ local rnid lnid old_tto
+
+ old_tto=$($LNETCTL global show |
+ awk '/transaction_timeout:/{print $NF}')
+
+ [[ -z $old_tto ]] &&
+ error "Cannot determine LNet transaction timeout"
+
+ local tto=10
+
+ do_lnetctl set transaction_timeout "${tto}" ||
+ error "Failed to set transaction_timeout"
+
+ # We want to consume all peer credits for at least transaction_timeout
+ # seconds
+ local delay
+
+ delay=$((tto + 1))
+
+ for lnid in "${LNIDS[@]}"; do
+ for rnid in "${RNIDS[@]}"; do
+ $LCTL net_delay_add -s "${lnid}" -d "${rnid}" \
+ -l "${delay}" -r 1 -m GET ||
+ error "Failed to add delay rule"
+ done
+ done
+
+ declare -a pcs
+
+ pcs=( $($LNETCTL peer show -v --nid "${RNIDS[0]}" |
+ awk '/max_ni_tx_credits:/{print $NF}' |
+ xargs echo) )
+
+ [[ ${#RNIDS[@]} -ne ${#pcs[@]} ]] &&
+ error "Expect ${#RNIDS[@]} peer credit values found ${#pcs[@]}"
+
+ local rnet lnid lnet i j
+
+ # Need to use --source for multi-rail configs to ensure we consume
+ # all available peer credits
+ for ((i = 0; i < ${#RNIDS[@]}; i++)); do
+ local ping_args="--timeout $((delay+2))"
+
+ rnet=${RNIDS[i]##*@}
+ for lnid in ${LNIDS[@]}; do
+ lnet=${lnid##*@}
+ [[ $rnet == $lnet ]] && break
+ done
+
+ ping_args+=" --source ${lnid} ${RNIDS[i]}"
+ for j in $(seq 1 "${pcs[i]}"); do
+ $LNETCTL ping ${ping_args} 1>/dev/null &
+ done
+
+ echo "Issued ${pcs[i]} pings to ${RNIDS[i]} from $lnid"
+ done
+
+ # This ping should be queued on peer NI tx credit
+ $LNETCTL ping --timeout $((delay+2)) "${RNIDS[0]}" &
+
+ sleep ${delay}
+
+ $LCTL net_delay_del -a
+
+ wait
+
+ # Messages sent from the delay list do not go through
+ # lnet_post_send_locked(), thus we should only have a single drop
+ local dropped
+
+ dropped=$($LNETCTL peer show -v 2 --nid "${RNIDS[0]}" |
+ grep -A 2 dropped_stats |
+ awk '/get:/{print $2}' |
+ xargs echo |
+ sed 's/ /\+/g' | bc)
+
+ [[ $dropped -ne 1 ]] &&
+ error "Expect 1 dropped GET but found $dropped"
+
+ do_lnetctl set transaction_timeout "${old_tto}"
+
+ return 0
+}
+
+test_253() {
+ setup_health_test false || return $?
+
+ do_expired_message_drop_test || return $?
+
+ cleanup_health_test
+}
+run_test 253 "Message delayed beyond deadline should be dropped (single-rail)"
+
+test_254() {
+ setup_health_test true || return $?
+
+ do_expired_message_drop_test || return $?
+
+ cleanup_health_test
+}
+run_test 254 "Message delayed beyond deadline should be dropped (multi-rail)"
+
+test_255() {
+ [[ ${NETTYPE} == tcp* ]] || skip "Need tcp NETTYPE"
+
+ reinit_dlc || return $?
+
+ cleanup_lnet || return $?
+
+ local routes_str="o2ib ${IF0_NET}.[$GW_HOSTNUM-$((GW_HOSTNUM+4))]"
+ local network_str="${NETTYPE}(${INTERFACES[0]})"
+
+ load_lnet "networks=\"${network_str}\" routes=\"${routes_str}\"" ||
+ error "Failed to load LNet"
+
+ $LCTL net up ||
+ error "Failed to load LNet with networks=\"${network_str}\" routes=\"${routes_str}\""
+
+ cat <<EOF > $TMP/sanity-lnet-$testnum-expected.yaml
+net:
+ - net type: ${NETTYPE}
+ local NI(s):
+ - interfaces:
+ 0: ${INTERFACES[0]}
+EOF
+ append_net_tunables tcp
+
+ echo "route:" >> $TMP/sanity-lnet-$testnum-expected.yaml
+ for i in $(seq $GW_HOSTNUM $((GW_HOSTNUM + 4))); do
+ cat <<EOF >> $TMP/sanity-lnet-$testnum-expected.yaml
+ - net: o2ib
+ gateway: ${IF0_NET}.${i}@${NETTYPE}
+ hop: -1
+ priority: 0
+ health_sensitivity: 1
+EOF
+ done
+
+ echo "peer:" >> $TMP/sanity-lnet-$testnum-expected.yaml
+ for i in $(seq $GW_HOSTNUM $((GW_HOSTNUM + 4))); do
+ cat <<EOF >> $TMP/sanity-lnet-$testnum-expected.yaml
+ - primary nid: ${IF0_NET}.${i}@${NETTYPE}
+ Multi-Rail: False
+ peer ni:
+ - nid: ${IF0_NET}.${i}@${NETTYPE}
+EOF
+ done
+
+ append_global_yaml
+
+ $LNETCTL export --backup > $TMP/sanity-lnet-$testnum-actual.yaml ||
+ error "export failed $?"
+
+ validate_gateway_nids
+
+ # Since we have an complex YAML config file we can test import
+ do_lnetctl lnet unconfigure ||
+ error "Failed to stop LNet rc=$?"
+ do_lnetctl import < ${GLOBAL_YAML_FILE} || error "Import failed $?"
+}
+run_test 255 "Use lnet routes param with pdsh syntax"
+
+test_300() {
+ # LU-13274
+ local header
+ local out=$TMP/$tfile
+ local prefix=/usr/include/linux/lnet
+
+ # We use a hard coded prefix so that this test will not fail
+ # when run in tree.
+ CC=${CC:-cc}
+ if ! which $CC > /dev/null 2>&1; then
+ skip_env "$CC is not installed"
+ fi
+
+ cleanup_lnet || exit 1
+ load_lnet
+
+ local cc_args="-Wall -Werror -std=c99 -c -x c /dev/null -o $out"
+ if ! [[ -d $prefix ]]; then
+ # Assume we're running in tree and fixup the include path.
+ prefix=$LUSTRE/../lnet/include/uapi/linux/lnet
+ cc_args+=" -I $LUSTRE/../lnet/include/uapi"
+ fi
+
+ for header in $prefix/*.h; do
+ if ! [[ -f "$header" ]]; then
+ continue
+ fi
+
+ echo "$CC $cc_args -include $header"
+ $CC $cc_args -include $header ||
+ error "cannot compile '$header'"
+ done
+ rm -f $out
+}
+run_test 300 "packaged LNet UAPI headers can be compiled"
+
+# LU-16081 lnet: Memory leak on adding existing interface
+
+test_301() {
+ reinit_dlc || return $?
+ do_lnetctl net add --net ${NETTYPE} --if ${INTERFACES[0]} ||
+ error "Failed to add net"
+ do_lnetctl net add --net ${NETTYPE} --if ${INTERFACES[0]} &&
+ error "add net should have failed"
+ do_lnetctl net del --net ${NETTYPE} --if ${INTERFACES[0]} ||
+ error "Failed to del net"
+ unload_modules
+}
+run_test 301 "Check for dynamic adds of same/wrong interface (memory leak)"
+
+test_302() {
+ ! [[ $NETTYPE =~ (tcp|o2ib) ]] && skip "Need tcp or o2ib NETTYPE"
+
+ reinit_dlc || return $?
+
+ add_net "${NETTYPE}" "${INTERFACES[0]}" || return $?
+
+ local nid=$($LCTL list_nids)
+
+ do_lnetctl ping ${nid} ||
+ error "pinging self failed $?"
+ do_lnetctl debug peer --nid ${nid} ||
+ error "failed to dump peer debug info $?"
+}
+run_test 302 "Check that peer debug info can be dumped"
+
+test_303() {
+ [[ ${NETTYPE} == tcp* ]] || skip "Need tcp NETTYPE"
+
+ setup_health_test true || return $?
+
+ cleanup_netns || error "Failed to cleanup netns before test execution"
+ setup_fakeif || error "Failed to add fake IF"
+ have_interface "$FAKE_IF" ||
+ error "Expect $FAKE_IF configured but not found"
+
+ add_net "${NETTYPE}99" "$FAKE_IF" || return $?
+
+ local nid=$($LCTL list_nids | tail --lines 1)
+
+ # Our updated config should be pushed to RNODE
+ local found=$(do_node $RNODE "$LNETCTL peer show --nid $nid")
+
+ [[ -z $found ]] && error "Peer not updated on $RNODE"
+
+ local prim=$($LCTL list_nids | head -n 1)
+
+ if ! grep -q -- " primary nid: $prim"<<<"${found}"; then
+ echo "$found"
+ error "Wrong primary nid"
+ fi
+
+ echo "Set $FAKE_IF down"
+ echo "ip link set dev $FAKE_IF down"
+ ip link set dev $FAKE_IF down
+ check_ni_status "$nid" down
+
+ local hval=$(do_node $RNODE "$LNETCTL peer show --nid $nid -v 2 | \
+ grep -e '- nid:' -e 'health value:'")
+
+ hval=$(grep -A 1 $nid<<<"$hval" | tail -n 1 | awk '{print $NF}')
+ (( hval < 1000 )) ||
+ error "Expect $hval < 1000"
+
+ return 0
+}
+run_test 303 "Check peer NI health after link down"
+
+test_304() {
+ [[ ${NETTYPE} == tcp* ]] || skip "Need tcp NETTYPE"
+
+ cleanup_netns || error "Failed to cleanup netns before test execution"
+ cleanup_lnet || error "Failed to unload modules before test execution"
+
+ setup_fakeif || error "Failed to add fake IF"
+ have_interface "$FAKE_IF" ||
+ error "Expect $FAKE_IF configured but not found"
+
+ reinit_dlc || return $?
+
+ add_net "tcp" "${INTERFACES[0]}" || return $?
+ add_net "tcp" "$FAKE_IF" || return $?
+
+ local nid1=$(lctl list_nids | head -n 1)
+ local nid2=$(lctl list_nids | tail --lines 1)
+
+ check_ni_status "$nid1" up
+ check_ni_status "$nid2" up
+
+ do_lnetctl peer add --prim_nid ${nid2} --lock_prim ||
+ error "peer add failed $?"
+ local locked_peer_state=($(do_lnetctl peer show -v 4 --nid ${nid2} |
+ awk '/peer state/{print $NF}'))
+
+ # Expect peer state bits:
+ # LNET_PEER_MULTI_RAIL(0) | LNET_PEER_CONFIGURED(3) |
+ # LNET_PEER_LOCK_PRIMARY(20)
+ (( $locked_peer_state != "1048585")) &&
+ error "Wrong peer state \"$locked_peer_state\" expected 1048585"
+
+ # Clear LNET_PEER_CONFIGURED bit and verify
+ do_lnetctl peer set --nid ${nid2} --state 1048577 ||
+ error "peer add failed $?"
+ locked_peer_state=($(do_lnetctl peer show -v 4 --nid ${nid2} |
+ awk '/peer state/{print $NF}'))
+ (( $locked_peer_state != "1048577")) &&
+ error "Wrong peer state \"$locked_peer_state\" expected 1048577"
+ do_lnetctl discover ${nid1} ||
+ error "Failed to discover peer"
+
+ # Expect nid2 and nid1 peer entries to be consolidated,
+ # nid2 to stay primary
+ cat <<EOF >> $TMP/sanity-lnet-$testnum-expected.yaml
+peer:
+ - primary nid: ${nid2}
+ Multi-Rail: True
+ peer ni:
+ - nid: ${nid1}
+ state: NA
+ - nid: ${nid2}
+ state: NA
+EOF
+ $LNETCTL peer show > $TMP/sanity-lnet-$testnum-actual.yaml
+ compare_yaml_files ||
+ error "Unexpected peer configuration"
+
+ locked_peer_state=($(do_lnetctl peer show -v 4 --nid ${nid2} |
+ awk '/peer state/{print $NF}'))
+ # Expect peer state bits to be added:
+ # LNET_PEER_DISCOVERED(4) | LNET_PEER_NIDS_UPTODATE(8)
+ (( $locked_peer_state != "1048849")) &&
+ error "Wrong peer state \"$locked_peer_state\" expected 1048849"
+ return 0
+}
+run_test 304 "Check locked primary peer nid consolidation"
+
+check_parameter() {
+ local para=$1
+ local value=$2
+
+ echo "check parameter ${para} value ${value}"
+
+ return $(( $(do_lnetctl net show -v | \
+ tee /dev/stderr | \
+ grep -c "^ \+${para}: ${value}$") != ${#INTERFACES[@]} ))
+}
+
+static_config() {
+ local module=$1
+ local setting=$2
+
+ cleanup_lnet || error "Failed to cleanup LNet"
+
+ load_module ../libcfs/libcfs/libcfs ||
+ error "Failed to load module libcfs rc = $?"
+
+ load_module ../lnet/lnet/lnet ||
+ error "Failed to load module lnet rc = $?"
+
+ echo "loading ${module} ${setting} type ${NETTYPE}"
+ load_module "${module}" "${setting}" ||
+ error "Failed to load module ${module} rc = $?"
+
+ do_lnetctl lnet configure --all || error "lnet configure failed rc = $?"
+
+ return 0
+}
+
+test_310() {
+ local value=65
+
+ if [[ ${NETTYPE} == tcp* ]];then
+ static_config "../lnet/klnds/socklnd/ksocklnd" \
+ "sock_timeout=${value}"
+ elif [[ ${NETTYPE} == o2ib* ]]; then
+ static_config "../lnet/klnds/o2iblnd/ko2iblnd" \
+ "timeout=${value}"
+ elif [[ ${NETTYPE} == gni* ]]; then
+ static_config "../lnet/klnds/gnilnd/kgnilnd" \
+ "timeout=${value}"
+ else
+ skip "NETTYPE ${NETTYPE} not supported"
+ fi
+
+ check_parameter "timeout" $value
+
+ return $?
+}
+run_test 310 "Set timeout and verify"
+
+test_311() {
+ [[ $NETTYPE == kfi* ]] ||
+ skip "Need kfi network type"
+
+ setupall || error "setupall failed"
+
+ mkdir -p $DIR/$tdir || error "mkdir failed"
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 oflag=direct ||
+ error "dd write failed"
+
+ local list=$(comma_list $(osts_nodes))
+
+#define CFS_KFI_FAIL_WAIT_SEND_COMP1 0xF115
+ do_nodes $list $LCTL set_param fail_loc=0x8000F115
+ dd if=$DIR/$tdir/$tfile of=/dev/null bs=1M count=1 ||
+ error "dd read failed"
+
+ rm -f $DIR/$tdir/$tfile
+ rmdir $DIR/$tdir
+
+ cleanupall || error "Failed cleanup"
+}
+run_test 311 "Fail bulk put in send wait completion"
+
+test_312() {
+ [[ $NETTYPE == kfi* ]] ||
+ skip "Need kfi network type"
+
+ setupall || error "setupall failed"
+
+ mkdir -p $DIR/$tdir || error "mkdir failed"
+
+ local list=$(comma_list $(osts_nodes))
+
+#define CFS_KFI_FAIL_WAIT_SEND_COMP3 0xF117
+ do_nodes $list $LCTL set_param fail_loc=0x8000F117
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 oflag=direct ||
+ error "dd write failed"
+
+ local tfile2="$DIR/$tdir/testfile2"
+
+ do_nodes $list $LCTL set_param fail_loc=0x8000F117
+ dd if=$DIR/$tdir/$tfile of=$tfile2 bs=1M count=1 oflag=direct ||
+ error "dd read failed"
+
+ rm -f $DIR/$tdir/$tfile
+ rm -f $tfile2
+ rmdir $DIR/$tdir
+
+ cleanupall || error "Failed cleanup"
+}
+run_test 312 "TAG_RX_OK is possible after TX_FAIL"
+
+check_udsp_prio() {
+ local target_net="${1}"
+ local target_nid="${2}"
+ local expect_net="${3}"
+ local expect_nid="${4}"
+ local type="${5}"
+
+ declare -a nids
+ declare -a net_prios
+ declare -a nid_prios
+
+ nids=( $($LNETCTL ${type} show -v 5 | awk '/-\s+nid:/{print $NF}' |
+ xargs echo) )
+
+ net_prios=( $($LNETCTL ${type} show -v 5 |
+ awk '/net priority:/{print $NF}' | xargs echo) )
+
+ nid_prios=( $($LNETCTL ${type} show -v 5 |
+ awk '/nid priority:/{print $NF}' | xargs echo) )
+
+ (( ${#nids[@]} != ${#net_prios[@]} )) &&
+ error "Wrong # net prios ${#nids[@]} != ${#net_prios[@]}"
+
+ (( ${#nids[@]} != ${#nid_prios[@]} )) &&
+ error "Wrong # nid prios ${#nids[@]} != ${#nid_prios[@]}"
+
+ local i
+
+ for ((i = 0; i < ${#nids[@]}; i++)); do
+ [[ -n ${target_net} ]] &&
+ [[ ${nids[i]##*@} != "${target_net}" ]] &&
+ continue
+ [[ -n ${target_nid} ]] &&
+ [[ ${nids[i]} != "${target_nid}" ]] &&
+ continue
+
+ echo "${nids[i]}: net_prio ${net_prios[i]} expect ${expect_net}"
+ (( net_prios[i] != expect_net )) &&
+ error "Wrong net priority \"${net_prios[i]}\" expect ${expect_net}"
+
+ echo "${nids[i]}: nid_prio ${nid_prios[i]} expect ${expect_nid}"
+ (( nid_prios[i] != expect_nid )) &&
+ error "Wrong nid priority \"${nid_prios[i]}\" expect ${expect_nid}"
+ done
+
+ return 0
+}
+
+check_peer_udsp_prio() {
+ check_udsp_prio "${1}" "${2}" "${3}" "${4}" "peer"
+}
+
+check_net_udsp_prio() {
+ check_udsp_prio "${1}" "${2}" "${3}" "${4}" "net"
+}
+
+test_400() {
+ reinit_dlc || return $?
+
+ do_lnetctl udsp add --src tcp --priority 0 ||
+ error "Failed to add udsp rule"
+ do_lnetctl udsp del --idx 0 ||
+ error "Failed to del udsp rule"
+ unload_modules
+}
+run_test 400 "Check for udsp add/delete net rule without net num"
+
+test_401() {
+ reinit_dlc || return $?
+
+ do_lnetctl net add --net ${NETTYPE} --if ${INTERFACES[0]} ||
+ error "Failed to add net"
+
+ do_lnetctl udsp add --dst ${NETTYPE} --prio 1 ||
+ error "Failed to add peer net priority rule"
+
+ do_lnetctl discover $($LCTL list_nids | head -n 1) ||
+ error "Failed to discover peer"
+
+ check_peer_udsp_prio "${NETTYPE}" "" "1" "-1"
+
+ return 0
+}
+run_test 401 "Discover peer after adding peer net UDSP rule"
+
+test_402() {
+ reinit_dlc || return $?
+
+ do_lnetctl udsp add --dst kfi --priority 0 ||
+ error "Failed to add UDSP rule"
+
+ do_lnetctl peer add --prim 402@kfi ||
+ error "Failed to add peer"
+
+ return 0
+}
+run_test 402 "Destination net rule should not panic"
+
+test_500() {
+ reinit_dlc || return $?
+
+ cleanup_netns || error "Failed to cleanup netns before test execution"
+ setup_fakeif || error "Failed to add fake IF"
+ have_interface "$FAKE_IF" ||
+ error "Expect $FAKE_IF configured but not found"
+
+ add_net "tcp" "${INTERFACES[0]}"
+ add_net "tcp" "${FAKE_IF}"
+
+ do_lnetctl discover $($LCTL list_nids | head -n 1) ||
+ error "Failed to discover self"
+
+ $LCTL net_delay_add -s *@tcp -d *@tcp -r 1 -l 1 -m PUT ||
+ error "Failed to add delay rule"
+
+ $LCTL net_drop_add -s *@tcp -d $($LCTL list_nids | head -n 1) -m PUT \
+ -e local_timeout -r 1 ||
+ error "Failed to add drop rule"
+ $LCTL net_drop_add -s *@tcp -d $($LCTL list_nids | tail -n 1) -m PUT \
+ -e local_timeout -r 1 ||
+ error "Failed to add drop rule"
+
+ ip link set $FAKE_IF down ||
+ error "Failed to set link down"
+ ip link set $FAKE_IF up ||
+ error "Failed to set link up"
+
+ unload_modules
+}
+run_test 500 "Check deadlock on ping target update"
+
+do_peer_set_health_test() {
+ local test_val="$1"
+ shift
+ local nid_arg="$@"
+
+ local max_hval
+
+ if [[ ${nid_arg} == --all ]]; then
+ max_hval=$($LNETCTL peer show -v 2 2>/dev/null |
+ awk '/health value/{print $NF}' | xargs echo |
+ sed 's/ /+/g' | bc -l)
+ else
+ max_hval=$($LNETCTL peer show ${nid_arg} -v 2 2>/dev/null |
+ awk '/health value/{print $NF}' | xargs echo |
+ sed 's/ /+/g' | bc -l)
+ fi
+
+ (( max_hval >= 1000 )) && (( max_hval % 1000 == 0)) ||
+ error "Unexpected max health value $max_hval"
+
+ lnet_health_pre || return $?
+
+ do_lnetctl peer set --health $test_val ${nid_arg} ||
+ error "failed to set health value"
+
+ lnet_health_post || return $?
+
+ local hval
+
+ if [[ ${nid_arg} == --all ]]; then
+ hval=$($LNETCTL peer show -v 2 2>/dev/null |
+ awk '/health value/{print $NF}' | xargs echo |
+ sed 's/ /+/g' | bc -l)
+ else
+ hval=$($LNETCTL peer show ${nid_arg} -v 2 2>/dev/null |
+ awk '/health value/{print $NF}' | xargs echo |
+ sed 's/ /+/g' | bc -l)
+ fi
+
+ check_remote_health || return $?
+
+ echo "hval: $hval max_hval: $max_hval"
+ (( hval == max_hval )) || error "Failed to reset health to max"
+
+ return 0
+}
+
+test_501() {
+ reinit_dlc || return $?
+
+ setup_health_test false || return $?
+
+ $LCTL set_param debug=-1
+
+ $LCTL net_drop_add -s *@tcp -d *@tcp -r 1 ||
+ error "Failed to add drop rule"
+
+ local test_val
+
+ for test_val in 0 500; do
+ do_peer_set_health_test $test_val --nid ${RNIDS[0]} || return $?
+ do_peer_set_health_test $test_val --all || return $?
+ done
+
+ cleanup_health_test
+}
+run_test 501 "Verify lnetctl peer set --health (SR)"
+
+test_502() {
+ reinit_dlc || return $?
+
+ setup_health_test true || return $?
+
+ $LCTL set_param debug=-1
+
+ $LCTL net_drop_add -s *@tcp -d *@tcp -r 1 ||
+ error "Failed to add drop rule"
+
+ local test_val
+
+ for test_val in 0 500; do
+ do_peer_set_health_test $test_val --nid ${RNIDS[0]} || return $?
+ do_peer_set_health_test $test_val --all || return $?
+ done
+
+ cleanup_health_test
+}
+run_test 502 "Verify lnetctl peer set --health (MR)"