#include "ptlrpc_internal.h"
struct semaphore pinger_sem;
-static struct list_head pinger_imports = CFS_LIST_HEAD_INIT(pinger_imports);
+static CFS_LIST_HEAD(pinger_imports);
int ptlrpc_ping(struct obd_import *imp)
{
struct ptlrpc_request *req;
- int rc = 0;
ENTRY;
- req = ptlrpc_prep_req(imp, LUSTRE_OBD_VERSION, OBD_PING, 1, NULL, NULL);
- if (req) {
- DEBUG_REQ(D_INFO, req, "pinging %s->%s",
- imp->imp_obd->obd_uuid.uuid,
- obd2cli_tgt(imp->imp_obd));
- req->rq_no_resend = req->rq_no_delay = 1;
- ptlrpc_req_set_repsize(req, 1, NULL);
- req->rq_timeout = PING_INTERVAL;
- ptlrpcd_add_req(req);
- } else {
+ req = ptlrpc_request_alloc_pack(imp, &RQF_OBD_PING, LUSTRE_OBD_VERSION,
+ OBD_PING);
+ if (req == NULL) {
CERROR("OOM trying to ping %s->%s\n",
imp->imp_obd->obd_uuid.uuid,
obd2cli_tgt(imp->imp_obd));
- rc = -ENOMEM;
+ RETURN(-ENOMEM);
}
- RETURN(rc);
+ DEBUG_REQ(D_INFO, req, "pinging %s->%s",
+ imp->imp_obd->obd_uuid.uuid, obd2cli_tgt(imp->imp_obd));
+ req->rq_no_resend = req->rq_no_delay = 1;
+ ptlrpc_request_set_replen(req);
+ req->rq_timeout = PING_INTERVAL;
+ ptlrpcd_add_req(req);
+
+ RETURN(0);
}
void ptlrpc_update_next_ping(struct obd_import *imp)
/* wait at least a timeout before trying recovery again */
imp->imp_next_ping = ptlrpc_next_reconnect(imp);
ptlrpc_initiate_recovery(imp);
- } else if (level != LUSTRE_IMP_FULL ||
+ } else if (level != LUSTRE_IMP_FULL ||
imp->imp_obd->obd_no_recov ||
imp->imp_deactive) {
CDEBUG(D_HA, "not pinging %s (in recovery "
ptlrpc_pinger_process_import(imp, this_ping);
/* obd_timeout might have changed */
if (imp->imp_pingable && imp->imp_next_ping &&
- cfs_time_after(imp->imp_next_ping,
- cfs_time_add(this_ping,
+ cfs_time_after(imp->imp_next_ping,
+ cfs_time_add(this_ping,
cfs_time_seconds(PING_INTERVAL))))
ptlrpc_update_next_ping(imp);
}
mutex_up(&pinger_sem);
+ /* update memory usage info */
+ obd_update_maxusage();
/* Wait until the next ping time, or until we're stopped. */
- time_to_next_ping = cfs_time_sub(cfs_time_add(this_ping,
- cfs_time_seconds(PING_INTERVAL)),
- cfs_time_current());
+ time_to_next_ping = cfs_time_sub(cfs_time_add(this_ping,
+ cfs_time_seconds(PING_INTERVAL)),
+ cfs_time_current());
/* The ping sent by ptlrpc_send_rpc may get sent out
say .01 second after this.
- ptlrpc_pinger_eending_on_import will then set the
+ ptlrpc_pinger_sending_on_import will then set the
next ping time to next_ping + .01 sec, which means
we will SKIP the next ping at next_ping, and the
ping will get sent 2 timeouts from now! Beware. */
- CDEBUG(D_INFO, "next ping in "CFS_DURATION_T" ("CFS_TIME_T")\n",
- time_to_next_ping,
- cfs_time_add(this_ping, cfs_time_seconds(PING_INTERVAL)));
+ CDEBUG(D_INFO, "next ping in "CFS_DURATION_T" ("CFS_TIME_T")\n",
+ time_to_next_ping,
+ cfs_time_add(this_ping,
+ cfs_time_seconds(PING_INTERVAL)));
if (time_to_next_ping > 0) {
- lwi = LWI_TIMEOUT(max_t(cfs_duration_t, time_to_next_ping, cfs_time_seconds(1)),
+ lwi = LWI_TIMEOUT(max_t(cfs_duration_t,
+ time_to_next_ping,
+ cfs_time_seconds(1)),
NULL, NULL);
l_wait_event(thread->t_ctl_waitq,
thread->t_flags & (SVC_STOPPING|SVC_EVENT),
RETURN(-ENOMEM);
cfs_waitq_init(&pinger_thread->t_ctl_waitq);
cfs_waitq_init(&suspend_timeouts_waitq);
-
+
d.name = "ll_ping";
d.thread = pinger_thread;
int ping_evictor_wake(struct obd_export *exp)
{
spin_lock(&pet_lock);
- if (pet_exp) {
+ if (pet_exp || (pet_state != PET_READY)) {
/* eventually the new obd will call here again. */
spin_unlock(&pet_lock);
return 1;
obd = pet_exp->exp_obd;
spin_unlock(&pet_lock);
- expire_time = CURRENT_SECONDS - (3 * obd_timeout / 2);
+ expire_time = cfs_time_current_sec() - (3 * obd_timeout / 2);
CDEBUG(D_HA, "evicting all exports of obd %s older than %ld\n",
obd->obd_name, expire_time);
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),
- exp, (long)CURRENT_SECONDS,
+ exp, (long)cfs_time_current_sec(),
(long)expire_time,
(long)exp->exp_last_request_time);
CDEBUG(D_HA, "Last request was at %ld\n",
list_entry(iter, struct obd_import, imp_pinger_chain);
int generation, level;
- if (cfs_time_aftereq(pd->pd_this_ping,
+ if (cfs_time_aftereq(pd->pd_this_ping,
imp->imp_next_ping - 5 * CFS_TICK)) {
/* Add a ping. */
spin_lock(&imp->imp_lock);
continue;
}
- req = ptlrpc_prep_req(imp, LUSTRE_OBD_VERSION, OBD_PING,
- 1, NULL, NULL);
- if (!req) {
- CERROR("out of memory\n");
+ req = ptlrpc_request_alloc_pack(imp, &RQF_OBD_PING,
+ LUSTRE_OBD_VERSION,
+ OBD_PING);
+ if (req == NULL) {
+ CERROR("OOM trying to ping %s->%s\n",
+ imp->imp_obd->obd_uuid.uuid,
+ obd2cli_tgt(imp->imp_obd));
break;
}
+
req->rq_no_resend = 1;
- ptlrpc_req_set_repsize(req, 1, NULL);
+ ptlrpc_request_set_replen(req);
req->rq_send_state = LUSTRE_IMP_FULL;
req->rq_phase = RQ_PHASE_RPC;
req->rq_import_generation = generation;