RPC/RDMA: correct the reconnect timer backoff
The RPC/RDMA code had a constant 5-second reconnect backoff, and always performed it, even when re-establishing a connection to a server after the RPC layer closed it due to being idle. Make it an geometric backoff (up to 30 seconds), and don't delay idle reconnect. Signed-off-by: Tom Talpey <talpey@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Родитель
b3cd8d45a7
Коммит
08ca0dce1e
|
@ -463,6 +463,8 @@ xprt_rdma_close(struct rpc_xprt *xprt)
|
||||||
struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt);
|
struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt);
|
||||||
|
|
||||||
dprintk("RPC: %s: closing\n", __func__);
|
dprintk("RPC: %s: closing\n", __func__);
|
||||||
|
if (r_xprt->rx_ep.rep_connected > 0)
|
||||||
|
xprt->reestablish_timeout = 0;
|
||||||
xprt_disconnect_done(xprt);
|
xprt_disconnect_done(xprt);
|
||||||
(void) rpcrdma_ep_disconnect(&r_xprt->rx_ep, &r_xprt->rx_ia);
|
(void) rpcrdma_ep_disconnect(&r_xprt->rx_ep, &r_xprt->rx_ia);
|
||||||
}
|
}
|
||||||
|
@ -490,6 +492,11 @@ xprt_rdma_connect(struct rpc_task *task)
|
||||||
/* Reconnect */
|
/* Reconnect */
|
||||||
schedule_delayed_work(&r_xprt->rdma_connect,
|
schedule_delayed_work(&r_xprt->rdma_connect,
|
||||||
xprt->reestablish_timeout);
|
xprt->reestablish_timeout);
|
||||||
|
xprt->reestablish_timeout <<= 1;
|
||||||
|
if (xprt->reestablish_timeout > (30 * HZ))
|
||||||
|
xprt->reestablish_timeout = (30 * HZ);
|
||||||
|
else if (xprt->reestablish_timeout < (5 * HZ))
|
||||||
|
xprt->reestablish_timeout = (5 * HZ);
|
||||||
} else {
|
} else {
|
||||||
schedule_delayed_work(&r_xprt->rdma_connect, 0);
|
schedule_delayed_work(&r_xprt->rdma_connect, 0);
|
||||||
if (!RPC_IS_ASYNC(task))
|
if (!RPC_IS_ASYNC(task))
|
||||||
|
|
Загрузка…
Ссылка в новой задаче