#define OBD_FAIL_PTLRPC_IDLE_RACE 0x533
#define OBD_FAIL_PTLRPC_ENQ_RESEND 0x534
#define OBD_FAIL_PTLRPC_DELAY_SEND_FAIL 0x535
+#define OBD_FAIL_PTLRPC_REPLAY_PAUSE 0x536
#define OBD_FAIL_OBD_PING_NET 0x600
/* OBD_FAIL_OBD_LOG_CANCEL_NET 0x601 obsolete since 1.5 */
LASSERT(exp);
class_export_get(exp);
- if (!(exp->exp_flags & OBD_OPT_FORCE))
- tgt_grant_sanity_check(exp->exp_obd, __func__);
-
if (OCD_HAS_FLAG(data, MDS_MDS) && !OCD_HAS_FLAG(data, LIGHTWEIGHT) &&
atomic_dec_and_test(&mdt->mdt_mds_mds_conns))
mdt_disable_slc(mdt);
tgt_grant_discard(exp);
+ if (!(exp->exp_flags & OBD_OPT_FORCE))
+ tgt_grant_sanity_check(exp->exp_obd, __func__);
+
rc = mdt_export_cleanup(exp);
nodemap_del_member(exp);
class_export_put(exp);
LASSERT(exp);
class_export_get(exp);
- if (!(exp->exp_flags & OBD_OPT_FORCE))
- tgt_grant_sanity_check(ofd_obd(ofd), __func__);
-
rc = server_disconnect_export(exp);
tgt_grant_discard(exp);
+ if (!(exp->exp_flags & OBD_OPT_FORCE))
+ tgt_grant_sanity_check(ofd_obd(ofd), __func__);
+
/* Do not erase record for recoverable client. */
if (exp->exp_obd->obd_replayable &&
(!exp->exp_obd->obd_fail || exp->exp_failed)) {
LASSERT(req->rq_import->imp_state == LUSTRE_IMP_REPLAY);
+ CFS_FAIL_TIMEOUT(OBD_FAIL_PTLRPC_REPLAY_PAUSE, cfs_fail_val);
+
aa = ptlrpc_req_async_args(aa, req);
memset(aa, 0, sizeof(*aa));
}
run_test 155 "failover after client remount"
+test_156()
+{
+ # on failover recovery time hard will be 9 * 5
+ local saved_timeout=$(do_facet ost1 $LCTL get_param -n timeout)
+
+ do_facet mgs $LCTL set_param -P timeout=5 ||
+ error "failed to set obd_timeout"
+ stack_trap "do_facet mgs $LCTL set_param -P timeout=$saved_timeout" \
+ EXIT
+
+ $LFS setstripe -c 1 -i 0 $DIR/$tfile || error "setstripe failed"
+
+ # this is to sync last_rcvd, so that the client will have to
+ # send replay on recovery
+ $LFS df $MOUNT
+ do_facet ost1 sync
+
+ replay_barrier ost1
+
+ $MULTIOP $DIR/$tfile oO_RDWR:O_SYNC:w1048576c || error "multiop failed"
+
+ # delay write replay for 45 sec (OBD_RECOVERY_TIME_HARD) to
+ # get the client evicted as not sending replays
+
+#define OBD_FAIL_PTLRPC_REPLAY_PAUSE 0x536
+ $LCTL set_param fail_loc=0x80000536 fail_val=45
+
+ fail ost1
+
+ # check that ost1 evicted the client in recovery
+ local clients
+ clients=($(do_facet ost1 \
+ $LCTL get_param -n obdfilter.$FSNAME-OST0000.recovery_status |
+ awk '/completed_clients/ { print $2 }' | tr '/' '\n'))
+ [[ $((${clients[0]} + 1)) == ${clients[1]} ]] ||
+ error "client not evicted by ost1"
+
+ local testid=$(echo $TESTNAME | tr '_' ' ')
+ do_facet ost1 dmesg | tac | sed "/$testid/,$ d" |
+ grep "ofd_obd_disconnect: tot_granted" &&
+ error "grant miscount" || true
+}
+run_test 156 "tot_granted miscount after client eviction"
+
complete_test $SECONDS
check_and_cleanup_lustre
exit_status