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>,
"jsstraus@amazon.com" <jsstraus@amazon.com>,
"linux-nfs@vger.kernel.org" <linux-nfs@vger.kernel.org>,
"jlayton@kernel.org" <jlayton@kernel.org>
Subject: Re: [PATCH 2/2] SUNRPC: Reconnect with new port on server initiated connection termination
Date: Thu, 10 May 2018 21:12:50 +0000 [thread overview]
Message-ID: <20180510211250.GA50901@amazon.com> (raw)
In-Reply-To: <08366f6b15fd26aa2523dc9375bffd0cb3955940.camel@hammerspace.com>
On Thu, May 10, 2018 at 05:26:12PM +0000, Trond Myklebust wrote:
> On Thu, 2018-05-10 at 16:22 +0000, Vallish Vaidyeshwara wrote:
> > 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?
> >
>
> The DRC does not exist for the benefit of the server, but for the
> benefit of the client. It is there to ensure that if the client replays
> the request, then it gets the exact same reply as it should have
> received when the first request was sent. Bearing that in mind:
>
> 1. What guarantees that all servers behave correctly w.r.t. ensuring
> that they have sent all replies to any outstanding RPC call before
> shutting down the connection. I'm not sure that even the Linux
> server does that.
> 2. How would a server even know whether or not the client may need to
> replay a request?
>
> --
> Trond Myklebust
> Linux NFS client maintainer, Hammerspace
> trond.myklebust@hammerspace.com
Hello Trond,
Thanks for the explanation, I was kind of misled by code comments in
xs_close.I will probably submit a different patch to clean up these code
comments which can mislead others as well.
Regards,
-Vallish
next prev parent reply other threads:[~2018-05-10 21:12 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
2018-05-10 17:26 ` Trond Myklebust
2018-05-10 21:12 ` Vallish Vaidyeshwara [this message]
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=20180510211250.GA50901@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.