RETURN(rc);
}
-static void ptlrpc_update_next_ping(struct obd_import *imp)
+void ptlrpc_update_next_ping(struct obd_import *imp)
{
- imp->imp_next_ping = cfs_time_shift(
- (imp->imp_state == LUSTRE_IMP_DISCON ?
- RECONNECT_INTERVAL : PING_INTERVAL));
+#ifdef ENABLE_PINGER
+ int time = (imp->imp_state != LUSTRE_IMP_DISCON) ? PING_INTERVAL :
+ /* FIXME should this be limited to LND_TIMEOUT so we don't
+ build up pings in LND output queues? */
+ max_t(int, CONNECTION_SWITCH_MIN,
+ at_get(&imp->imp_at.iat_net_latency));
+ imp->imp_next_ping = cfs_time_shift(time);
+#endif /* ENABLE_PINGER */
}
void ptlrpc_ping_import_soon(struct obd_import *imp)
imp->imp_force_verify = 0;
spin_unlock(&imp->imp_lock);
- CDEBUG(level == LUSTRE_IMP_FULL ? D_INFO : D_HA,
+ CDEBUG(level == LUSTRE_IMP_FULL ? D_INFO : D_RPCTRACE,
"level %s/%u force %u deactive %u pingable %u\n",
ptlrpc_import_state_name(level), level,
force, imp->imp_deactive, imp->imp_pingable);
mutex_down(&pinger_sem);
CDEBUG(D_HA, "adding pingable import %s->%s\n",
imp->imp_obd->obd_uuid.uuid, obd2cli_tgt(imp->imp_obd));
+ /* if we add to pinger we want recovery on this import */
+ imp->imp_obd->obd_no_recov = 0;
+
ptlrpc_update_next_ping(imp);
/* XXX sort, blah blah */
list_add_tail(&imp->imp_pinger_chain, &pinger_imports);
list_del_init(&imp->imp_pinger_chain);
CDEBUG(D_HA, "removing pingable import %s->%s\n",
imp->imp_obd->obd_uuid.uuid, obd2cli_tgt(imp->imp_obd));
+ /* if we remove from pinger we don't want recovery on this import */
+ imp->imp_obd->obd_no_recov = 1;
class_import_put(imp);
mutex_up(&pinger_sem);
RETURN(0);
obd = pet_exp->exp_obd;
spin_unlock(&pet_lock);
- expire_time = CURRENT_SECONDS - (3 * obd_timeout / 2);
+ expire_time = cfs_time_current_sec() - PING_EVICT_TIMEOUT;
CDEBUG(D_HA, "evicting all exports of obd %s older than %ld\n",
obd->obd_name, expire_time);
" it.\n", obd->obd_name,
obd_uuid2str(&exp->exp_client_uuid),
obd_export_nid2str(exp),
- (long)(CURRENT_SECONDS -
+ (long)(cfs_time_current_sec() -
exp->exp_last_request_time));
CDEBUG(D_HA, "Last request was at %ld\n",
exp->exp_last_request_time);
req->rq_import_generation = generation;
ptlrpc_set_add_req(set, req);
} else {
- CDEBUG(D_HA, "don't need to ping %s ("CFS_TIME_T" > "
- CFS_TIME_T")\n", obd2cli_tgt(imp->imp_obd),
+ CDEBUG(D_INFO, "don't need to ping %s ("CFS_TIME_T
+ " > "CFS_TIME_T")\n", obd2cli_tgt(imp->imp_obd),
imp->imp_next_ping, pd->pd_this_ping);
}
}
/* Might be empty, that's OK. */
if (set->set_remaining == 0)
- CDEBUG(D_HA, "nothing to ping\n");
+ CDEBUG(D_RPCTRACE, "nothing to ping\n");
list_for_each(iter, &set->set_requests) {
struct ptlrpc_request *req =
list_entry(iter, struct ptlrpc_request,
rq_set_chain);
- DEBUG_REQ(D_HA, req, "pinging %s->%s",
+ DEBUG_REQ(D_RPCTRACE, req, "pinging %s->%s",
req->rq_import->imp_obd->obd_uuid.uuid,
obd2cli_tgt(req->rq_import->imp_obd));
(void)ptl_send_rpc(req, 0);
rc = ptlrpc_check_set(set);
/* not finished, and we are not expired, simply return */
- if (!rc && cfs_time_before(curtime,
- cfs_time_add(pd->pd_this_ping,
- cfs_time_seconds(PING_INTERVAL)))) {
- CDEBUG(D_HA, "not finished, but also not expired\n");
+ if (!rc && cfs_time_before(curtime, cfs_time_add(pd->pd_this_ping,
+ cfs_time_seconds(PING_INTERVAL)))) {
+ CDEBUG(D_RPCTRACE, "not finished, but also not expired\n");
pd->pd_recursion--;
return 0;
}
continue;
}
- CDEBUG(D_HA, "pinger initiate expire_one_request\n");
+ CDEBUG(D_RPCTRACE, "pinger initiate expire_one_request\n");
ptlrpc_expire_one_request(req);
}
mutex_up(&pinger_sem);
cfs_time_seconds(PING_INTERVAL));
pd->pd_this_ping = 0; /* XXX for debug */
- CDEBUG(D_HA, "finished a round ping\n");
+ CDEBUG(D_INFO, "finished a round ping\n");
pd->pd_recursion--;
return 0;
}
/* XXX force pinger to run, if needed */
struct obd_import *imp;
list_for_each_entry(imp, &pinger_imports, imp_pinger_chain) {
- CDEBUG(D_HA, "Checking that we need to do anything about import"
- " %s->%s\n", imp->imp_obd->obd_uuid.uuid,
- obd2cli_tgt(imp->imp_obd));
+ CDEBUG(D_RPCTRACE, "checking import %s->%s\n",
+ imp->imp_obd->obd_uuid.uuid, obd2cli_tgt(imp->imp_obd));
#ifdef ENABLE_LIBLUSTRE_RECOVERY
if (imp->imp_state == LUSTRE_IMP_DISCON && !imp->imp_deactive)
#else