diff mbox series

[ovs-dev] python-stream: handle SSL error in do_handshake

Message ID 6cac214bb33b1b03343b7caf81e77c261f403ea0.camel@cloudandheat.com
State Superseded
Headers show
Series [ovs-dev] python-stream: handle SSL error in do_handshake | expand

Checks

Context Check Description
ovsrobot/apply-robot warning apply and check: warning
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/intel-ovs-compilation success test: success

Commit Message

Stefan Hoffmann April 19, 2023, 4:30 p.m. UTC
In some cases ovsdb server or relay gets restarted, ovsdb python clients
may keep the local socket open. Instead of reconnecting a lot of failures
will be logged.
This can be reproduced with ssl connections to the server/relay and
restarting it, so it has the same IP after restart.

This patch catches the Exceptions at do_handshake to recreate the
connection on the client side.

This patch was tested with unittests and at our test cluster.

Tracebacks from the issue, this will be excluded from the
final patch:

2023-04-03 14:06:43.458 1 ERROR ovsdbapp.backend.ovs_idl.connection
2023-04-03 14:06:43.513 1 ERROR ovsdbapp.backend.ovs_idl.connection [-] TLS/SSL connection has been closed (EOF) (_ssl.c:997): ssl.SSLZeroReturnError: TLS/SSL connection has been closed (EOF) (_ssl.c:997)
2023-04-03 14:06:43.513 1 ERROR ovsdbapp.backend.ovs_idl.connection Traceback (most recent call last):
2023-04-03 14:06:43.513 1 ERROR ovsdbapp.backend.ovs_idl.connection   File "/usr/local/lib/python3.10/dist-packages/ovsdbapp/backend/ovs_idl/connection.py", line 107, in run
2023-04-03 14:06:43.513 1 ERROR ovsdbapp.backend.ovs_idl.connection     self.idl.run()
2023-04-03 14:06:43.513 1 ERROR ovsdbapp.backend.ovs_idl.connection   File "/usr/local/lib/python3.10/dist-packages/ovs/db/idl.py", line 433, in run
2023-04-03 14:06:43.513 1 ERROR ovsdbapp.backend.ovs_idl.connection     self._session.run()
2023-04-03 14:06:43.513 1 ERROR ovsdbapp.backend.ovs_idl.connection   File "/usr/local/lib/python3.10/dist-packages/ovs/jsonrpc.py", line 519, in run
2023-04-03 14:06:43.513 1 ERROR ovsdbapp.backend.ovs_idl.connection     error = self.stream.connect()
2023-04-03 14:06:43.513 1 ERROR ovsdbapp.backend.ovs_idl.connection   File "/usr/local/lib/python3.10/dist-packages/ovs/stream.py", line 824, in connect
2023-04-03 14:06:43.513 1 ERROR ovsdbapp.backend.ovs_idl.connection     self.socket.do_handshake()
2023-04-03 14:06:43.513 1 ERROR ovsdbapp.backend.ovs_idl.connection   File "/usr/lib/python3.10/ssl.py", line 1342, in do_handshake
2023-04-03 14:06:43.513 1 ERROR ovsdbapp.backend.ovs_idl.connection     self._sslobj.do_handshake()
2023-04-03 14:06:43.513 1 ERROR ovsdbapp.backend.ovs_idl.connection ssl.SSLZeroReturnError: TLS/SSL connection has been closed (EOF) (_ssl.c:997)
2023-04-03 14:06:43.513 1 ERROR ovsdbapp.backend.ovs_idl.connection
2023-04-03 14:06:43.567 1 ERROR ovsdbapp.backend.ovs_idl.connection [-] TLS/SSL connection has been closed (EOF) (_ssl.c:997): ssl.SSLZeroReturnError: TLS/SSL connection has been closed (EOF) (_ssl.c:997)

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/ovsdbapp/backend/ovs_idl/connection.py", line 107, in run
    self.idl.run()
 File "/usr/local/lib/python3.9/site-packages/ovs-3.1.0-py3.9.egg/ovs/db/idl.py", line 433, in run
    self._session.run()
  File "/usr/local/lib/python3.9/site-packages/ovs-3.1.0-py3.9.egg/ovs/jsonrpc.py", line 519, in run
    error = self.stream.connect()
  File "/usr/local/lib/python3.9/site-packages/ovs-3.1.0-py3.9.egg/ovs/stream.py", line 824, in connect
    self.socket.do_handshake()
  File "/usr/local/lib/python3.9/site-packages/eventlet/green/ssl.py", line 312, in do_handshake
    return self._call_trampolining(
  File "/usr/local/lib/python3.9/site-packages/eventlet/green/ssl.py", line 158, in _call_trampolining
    return func(*a, **kw)
  File "/usr/local/lib/python3.9/ssl.py", line 1305, in do_handshake
    self._check_connected()
  File "/usr/local/lib/python3.9/ssl.py", line 1089, in _check_connected
    self.getpeername()

OSError: [Errno 107] Transport endpoint is not connected

Signed-off-by: Stefan Hoffmann <stefan.hoffmann@cloudandheat.com>
Co-authored-by: Luca Czesla <luca.czesla@mail.schwarz>
Co-authored-by: Max Lamprecht <max.lamprecht@mail.schwarz>
---
 python/ovs/stream.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/python/ovs/stream.py b/python/ovs/stream.py
index ac5b0fd0c..b32341076 100644
--- a/python/ovs/stream.py
+++ b/python/ovs/stream.py
@@ -824,7 +824,8 @@  class SSLStream(Stream):
             self.socket.do_handshake()
         except ssl.SSLWantReadError:
             return errno.EAGAIN
-        except ssl.SSLSyscallError as e:
+        except (ssl.SSLSyscallError, ssl.SSLZeroReturnError,
+                ssl.SSLEOFError, OSError) as e:
             return ovs.socket_util.get_exception_errno(e)
 
         return 0