From 67945c5ea4eb96216332dc09add06915148c92cb Mon Sep 17 00:00:00 2001 From: Jason Mobarak Date: Fri, 11 Sep 2020 21:14:13 -0700 Subject: [PATCH 1/3] python: add reconnect logic to network write --- python/sbp/client/drivers/network_drivers.py | 46 ++++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/python/sbp/client/drivers/network_drivers.py b/python/sbp/client/drivers/network_drivers.py index ade5f0fbb4..5cdfe78238 100644 --- a/python/sbp/client/drivers/network_drivers.py +++ b/python/sbp/client/drivers/network_drivers.py @@ -84,6 +84,23 @@ def _reconnect(self, exc): continue break + def _perform_io(self, io_func, validate_data=lambda _data: True): + data = None + while True: + try: + data = io_func() + except socket.timeout as socket_error: + self._reconnect(socket_error) + except socket.error as socket_error: + # this is fine, just retry + if socket_error.errno == errno.EINTR: + continue + self._reconnect(socket_error) + if not validate_data(data): + continue + break + return data + def _read(self, size): """ Read wrapper. @@ -93,21 +110,16 @@ def _read(self, size): size : int Number of bytes to read """ - data = '' - while True: - try: - data = self.handle.recv(size) - except socket.timeout as socket_error: - self._reconnect(socket_error) - except socket.error as socket_error: - # this is fine, just retry - if socket_error.errno == errno.EINTR: - continue - self._reconnect(IOError) + + def read(): + self.handle.recv(size) + + def validate_data(data): if not data: self._reconnect(IOError) - break - return data + return bool(data) + + return self._perform_io(read, validate_data) def flush(self): pass @@ -121,12 +133,10 @@ def _write(self, s): s : bytes Bytes to write """ + def write(): + return self.handle.sendall(s) try: self._write_lock.acquire() - self.handle.sendall(s) - except socket.timeout: - self._connect() - except socket.error: - raise IOError + return self._perform_io(write) finally: self._write_lock.release() From 3a2217935450ec8361afa726bfd4bf6dc5e8b4ee Mon Sep 17 00:00:00 2001 From: Jason Mobarak Date: Fri, 11 Sep 2020 23:25:55 -0700 Subject: [PATCH 2/3] fix bug --- python/sbp/client/drivers/network_drivers.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/python/sbp/client/drivers/network_drivers.py b/python/sbp/client/drivers/network_drivers.py index 5cdfe78238..10b80e3d10 100644 --- a/python/sbp/client/drivers/network_drivers.py +++ b/python/sbp/client/drivers/network_drivers.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015 Swift Navigation Inc. +#https://github.com/swift-nav/libsbp/pull/845/commits/e0686bc2bef4792e788a9a5d89704a8e7198a8f9 Copyright (C) 2015 Swift Navigation Inc. # Contact: Bhaskar Mookerji # # This source is subject to the license found in the file 'LICENSE' which must @@ -112,7 +112,7 @@ def _read(self, size): """ def read(): - self.handle.recv(size) + return self.handle.recv(size) def validate_data(data): if not data: @@ -137,6 +137,7 @@ def write(): return self.handle.sendall(s) try: self._write_lock.acquire() - return self._perform_io(write) + count = self._perform_io(write) finally: self._write_lock.release() + return count From ebaf503a5f6cc8b80c285e26e0276764aa85f064 Mon Sep 17 00:00:00 2001 From: Jason Mobarak Date: Sat, 12 Sep 2020 17:47:04 -0700 Subject: [PATCH 3/3] Update network_drivers.py --- python/sbp/client/drivers/network_drivers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/sbp/client/drivers/network_drivers.py b/python/sbp/client/drivers/network_drivers.py index 10b80e3d10..6e451272d3 100644 --- a/python/sbp/client/drivers/network_drivers.py +++ b/python/sbp/client/drivers/network_drivers.py @@ -1,4 +1,4 @@ -#https://github.com/swift-nav/libsbp/pull/845/commits/e0686bc2bef4792e788a9a5d89704a8e7198a8f9 Copyright (C) 2015 Swift Navigation Inc. +# Copyright (C) 2015 Swift Navigation Inc. # Contact: Bhaskar Mookerji # # This source is subject to the license found in the file 'LICENSE' which must