static void core_timeout(struct context *ctx) { for (;;) { struct msg *msg; struct conn *conn; int64_t now, then; msg = msg_tmo_min(); if (msg == NULL) { ctx->timeout = ctx->max_timeout; return; } /* skip over req that are in-error or done */ if (msg->error || msg->done) { msg_tmo_delete(msg); continue; } /* * timeout expired req and all the outstanding req on the timing * out server */ conn = msg->tmo_rbe.data; then = msg->tmo_rbe.key; now = dn_msec_now(); if (now < then) { int delta = (int)(then - now); ctx->timeout = MIN(delta, ctx->max_timeout); return; } log_warn("req %"PRIu64" on %s %d timedout, timeout was %d", msg->id, conn_get_type_string(conn), conn->sd, msg->tmo_rbe.timeout); msg_tmo_delete(msg); if (conn->dyn_mode) { if (conn->type == CONN_DNODE_PEER_SERVER) { //outgoing peer requests struct server *server = conn->owner; if (conn->same_dc) stats_pool_incr(ctx, server->owner, peer_timedout_requests); else stats_pool_incr(ctx, server->owner, remote_peer_timedout_requests); } } else { if (conn->type == CONN_SERVER) { //storage server requests stats_server_incr(ctx, conn->owner, server_dropped_requests); } } conn->err = ETIMEDOUT; core_close(ctx, conn); } }
static void core_timeout(struct context *ctx) { for (;;) { struct msg *msg; struct conn *conn; int64_t now, then; msg = msg_tmo_min(); if (msg == NULL) { ctx->timeout = ctx->max_timeout; return; } /* skip over req that are in-error or done */ if (msg->error || msg->done) { msg_tmo_delete(msg); continue; } /* * timeout expired req and all the outstanding req on the timing * out server */ conn = msg->tmo_rbe.data; then = msg->tmo_rbe.key; now = dn_msec_now(); if (now < then) { int delta = (int)(then - now); ctx->timeout = MIN(delta, ctx->max_timeout); return; } log_debug(LOG_INFO, "req %"PRIu64" on s %d timedout", msg->id, conn->sd); msg_tmo_delete(msg); if (conn->dyn_mode) return; //don't close dyn connection in this case conn->err = ETIMEDOUT; core_close(ctx, conn); } }