• NeilBrown's avatar
    sunrpc: Don't engage exponential backoff when connection attempt is rejected. · 2c2ee6d2
    NeilBrown authored
    xs_connect() contains an exponential backoff mechanism so the repeated
    connection attempts are delayed by longer and longer amounts.
    
    This is appropriate when the connection failed due to a timeout, but
    it not appropriate when a definitive "no" answer is received.  In such
    cases, call_connect_status() imposes a minimum 3-second back-off, so
    not having the exponetial back-off will never result in immediate
    retries.
    
    The current situation is a problem when the NFS server tries to
    register with rpcbind but rpcbind isn't running.  All connection
    attempts are made on the same "xprt" and as the connection is never
    "closed", the exponential back delays successive attempts to register,
    or de-register, different protocols.  This results in a multi-minute
    delay with no benefit.
    
    So, when call_connect_status() receives a definitive "no", use
    xprt_conditional_disconnect() to cancel the previous connection attempt.
    This will set XPRT_CLOSE_WAIT so that xprt->ops->close() calls xs_close()
    which resets the reestablish_timeout.
    
    To ensure xprt_conditional_disconnect() does the right thing, we
    ensure that rq_connect_cookie is set before a connection attempt, and
    allow xprt_conditional_disconnect() to complete even when the
    transport is not fully connected.
    Signed-off-by: default avatarNeilBrown <neilb@suse.com>
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
    2c2ee6d2
clnt.c 68.3 KB