On Wed, Aug 8, 2012 at 4:14 PM, Ben Pfaff <b...@nicira.com> wrote: > Until now, the jsonrpc module has used messages received from the > remote peer as the sole means to determine that the JSON-RPC > connection is up. This could in theory interact badly with a > remote peer that stops reading and processing messages from the > receive queue when there is a backlog in the send queue for a > given connection (ovsdb-server is an example of a program that > behaves this way). This commit fixes the problem by expanding > the definition of "activity" to include successfully sending > JSON-RPC data that was previously queued. > > The above change is exactly analogous to the similar change > made to the rconn library in commit 133f2dc95454 (rconn: Treat > draining a message from the send queue as activity.). > > Bug #12789. > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > lib/jsonrpc.c | 13 +++++++++++++ > python/ovs/jsonrpc.py | 11 ++++++++++- > 2 files changed, 23 insertions(+), 1 deletions(-) > > diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c > index c4d7dd2..9c0aaa9 100644 > --- a/lib/jsonrpc.c > +++ b/lib/jsonrpc.c > @@ -880,9 +880,22 @@ jsonrpc_session_run(struct jsonrpc_session *s) > } > > if (s->rpc) { > + size_t backlog; > int error; > > + backlog = jsonrpc_get_backlog(s->rpc); > jsonrpc_run(s->rpc); > + if (jsonrpc_get_backlog(s->rpc) < backlog) { > + /* Data previously caught in a queue was successfully sent. Is this comment accurate that "data was sent successfully"? I suppose that, if jsonrpc_get_backlog(s->rpc) returned 0, then that might mean an error in jsonrpc_run(s->rpc) too?
> + * > + * We don't count data that is successfully sent immediately as > + * activity, because there's a lot of queuing downstream from us, > + * which means that we can push a lot of data into a connection > + * that has stalled and won't ever recover. > + */ > + reconnect_activity(s->reconnect, time_msec()); > + } > + > error = jsonrpc_get_status(s->rpc); > if (error) { > reconnect_disconnected(s->reconnect, time_msec(), error); > diff --git a/python/ovs/jsonrpc.py b/python/ovs/jsonrpc.py > index cb471cb..4496bba 100644 > --- a/python/ovs/jsonrpc.py > +++ b/python/ovs/jsonrpc.py > @@ -502,9 +502,18 @@ class Session(object): > > def recv(self): > if self.rpc is not None: > + backlog = self.rpc.get_backlog() > error, msg = self.rpc.recv() > - if not error: > + if self.rpc.get_backlog() < backlog: > + # Data previously caught in a queue was successfully sent. > + # > + # We don't count data that is successfully sent immediately > as > + # activity, because there's a lot of queuing downstream from > + # us, which means that we can push a lot of data into a > + # connection that has stalled and won't ever recover. > self.reconnect.activity(ovs.timeval.msec()) > + > + if not error: > if msg.type == Message.T_REQUEST and msg.method == "echo": > # Echo request. Send reply. > self.send(Message.create_reply(msg.params, msg.id)) > -- > 1.7.2.5 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev