linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Vallish Vaidyeshwara <vallish@amazon.com>
To: Trond Myklebust <trondmy@hammerspace.com>
Cc: "bfields@fieldses.org" <bfields@fieldses.org>,
	"anna.schumaker@netapp.com" <anna.schumaker@netapp.com>,
	"linux-nfs@vger.kernel.org" <linux-nfs@vger.kernel.org>,
	"jlayton@kernel.org" <jlayton@kernel.org>,
	"jsstraus@amazon.com" <jsstraus@amazon.com>
Subject: Re: [PATCH 2/2] SUNRPC: Reconnect with new port on server initiated connection termination
Date: Thu, 10 May 2018 16:22:02 +0000	[thread overview]
Message-ID: <20180510162202.GA24317@amazon.com> (raw)
In-Reply-To: <aa092f62079986ec164863f33873b278f69f79a9.camel@hammerspace.com>

On Thu, May 10, 2018 at 03:25:14PM +0000, Trond Myklebust wrote:
> On Thu, 2018-05-10 at 06:12 +0000, Vallish Vaidyeshwara wrote:
> > Server initiated socket close can corrupt connection state tracking
> > table in conjunction with other network middle boxes. In situations
> > like these, client connection hangs till connection state tracking
> > table entries age out and get purged. Client reconnection with a new
> > port in such a situation will avoid connection hang.
> > 
> > Reviewed-by: Jacob Strauss <jsstraus@amazon.com>
> > Reviewed-by: Alakesh Haloi <alakeshh@amazon.com>
> > Signed-off-by: Vallish Vaidyeshwara <vallish@amazon.com>
> > ---
> >  net/sunrpc/xprtsock.c | 5 +++++
> >  1 file changed, 5 insertions(+)
> > 
> > diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
> > index 5bf75b3..d293c8d 100644
> > --- a/net/sunrpc/xprtsock.c
> > +++ b/net/sunrpc/xprtsock.c
> > @@ -1629,6 +1629,8 @@ static void xs_tcp_state_change(struct sock
> > *sk)
> >  		/* The server initiated a shutdown of the socket */
> >  		xprt->connect_cookie++;
> >  		clear_bit(XPRT_CONNECTED, &xprt->state);
> > +		/* Server sent FIN, reconnect with a new port */
> > +		transport->srcport = 0;
> >  		xs_tcp_force_close(xprt);
> >  		/* fall through */
> >  	case TCP_CLOSING:
> > @@ -1650,6 +1652,9 @@ static void xs_tcp_state_change(struct sock
> > *sk)
> >  					&transport->sock_state))
> >  			xprt_clear_connecting(xprt);
> >  		clear_bit(XPRT_CLOSING, &xprt->state);
> > +		/* Server sent RST, reconnect with a new port */
> > +		if (sk->sk_err == ECONNRESET)
> > +			transport->srcport = 0;
> >  		if (sk->sk_err)
> >  			xprt_wake_pending_tasks(xprt, -sk->sk_err);
> >  		/* Trigger the socket release */
> 
> NACK. This will utterly break NFSv2, NFSv3 and NFSv4.0 duplicate replay
> cache semantics. 
> 
> Cheers
>   Trond
> -- 
> Trond Myklebust
> Linux NFS client maintainer, Hammerspace
> trond.myklebust@hammerspace.com

Hello Trond,

The first patch in this series is actually helping restore DRC behavior in
cases like network partition where packets are dropped:
[PATCH 1/2] SUNRPC: Need to reuse non-reserved port for reconnect
Patch 1 starts reusing port in all cases.

The second patch is still not breaking DRC semantics, to quote from source
code:

<code snip>
  /**
   * xs_close - close a socket
   * @xprt: transport
   *
   * This is used when all requests are complete; ie, no DRC state remains
   * on the server we want to save.
   *
   * The caller _must_ be holding XPRT_LOCKED in order to avoid issues with
   * xs_reset_transport() zeroing the socket from underneath a writer.
   */
  static void xs_close(struct rpc_xprt *xprt)
<code snip>

If the server has closed a connection, then no DRC state remains on the server
we want to use.

The second patch is exploiting this semantics and using a new port in following
2 cases:
a) RST from server implies the connection was torn down & no useful DRC exists
on server
b) FIN from server implies that server is shutting down the connection as part
of close and no DRC state remains

Please let me know if I have missed something obvious, I definitely do not want
to break DRC as that is not the intention of this patch series. Is there a
situation where server can close a connection and still keep DRC?

Thanks.
-Vallish

  reply	other threads:[~2018-05-10 16:22 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-10  6:12 [PATCH 0/2] SUNRPC: Clean up port reuse behavior on reconnects Vallish Vaidyeshwara
2018-05-10  6:12 ` [PATCH 1/2] SUNRPC: Need to reuse non-reserved port for reconnect Vallish Vaidyeshwara
2018-05-10 21:18   ` Vallish Vaidyeshwara
2018-05-10  6:12 ` [PATCH 2/2] SUNRPC: Reconnect with new port on server initiated connection termination Vallish Vaidyeshwara
2018-05-10 15:25   ` Trond Myklebust
2018-05-10 16:22     ` Vallish Vaidyeshwara [this message]
2018-05-10 17:26       ` Trond Myklebust
2018-05-10 21:12         ` Vallish Vaidyeshwara
2018-05-10 17:37       ` bfields
2018-05-10 21:15         ` Vallish Vaidyeshwara

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180510162202.GA24317@amazon.com \
    --to=vallish@amazon.com \
    --cc=anna.schumaker@netapp.com \
    --cc=bfields@fieldses.org \
    --cc=jlayton@kernel.org \
    --cc=jsstraus@amazon.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=trondmy@hammerspace.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).