Skip to content

Commit

Permalink
jsonrpc: Fix Python implementation of inactivity logic.
Browse files Browse the repository at this point in the history
When a JSON-RPC session receives bytes, or when it successfully sends
queued bytes, then it should count that as activity.  However, the code
here was reversed, in that it used the wrong check in each place.  That is,
when it tried to receive data, it would check whether data had just been
sent, and when it tried to send data, it would check whether data had just
been received.  Neither one makes sense and doesn't work.

Bug #13214.
Reported-by: Luca Giraudo <[email protected]>
CC: James Schmidt <[email protected]>
Signed-off-by: Ben Pfaff <[email protected]>
  • Loading branch information
blp committed Sep 18, 2012
1 parent af1ac4b commit ab67821
Showing 1 changed file with 14 additions and 14 deletions.
28 changes: 14 additions & 14 deletions python/ovs/jsonrpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -449,14 +449,16 @@ def run(self):
self.pstream = None

if self.rpc:
received_bytes = self.rpc.get_received_bytes()
backlog = self.rpc.get_backlog()
self.rpc.run()
if received_bytes != self.rpc.get_received_bytes():
# Data was successfully received.
if self.rpc.get_backlog() < backlog:
# Data previously caught in a queue was successfully sent (or
# there's an error, which we'll catch below).
#
# Previously we only counted receiving a full message as
# activity, but with large messages or a slow connection that
# policy could time out the session mid-message.
# 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())

error = self.rpc.get_status()
Expand Down Expand Up @@ -516,16 +518,14 @@ def send(self, msg):

def recv(self):
if self.rpc is not None:
backlog = self.rpc.get_backlog()
received_bytes = self.rpc.get_received_bytes()
error, msg = self.rpc.recv()
if self.rpc.get_backlog() < backlog:
# Data previously caught in a queue was successfully sent (or
# there's an error, which we'll catch below).
if received_bytes != self.rpc.get_received_bytes():
# Data was successfully received.
#
# 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.
# Previously we only counted receiving a full message as
# activity, but with large messages or a slow connection that
# policy could time out the session mid-message.
self.reconnect.activity(ovs.timeval.msec())

if not error:
Expand Down

0 comments on commit ab67821

Please sign in to comment.