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

Reply via email to