]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: accept socket error 0 31014/head
authorKefu Chai <kchai@redhat.com>
Sun, 27 Oct 2019 03:10:22 +0000 (11:10 +0800)
committerKefu Chai <kchai@redhat.com>
Sun, 27 Oct 2019 06:34:48 +0000 (14:34 +0800)
see
https://github.com/cherrypy/cheroot/commit/9d73226ab28a07a38cbb6816edf9ff46be4f9de3

Fixes: https://tracker.ceph.com/issues/38378
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/pybind/mgr/dashboard/cherrypy_backports.py

index 83c15e1464ef1abed962dc9a5af7e5cdc0a419f9..db994b9a7f3568bbd47da060d433bfa80fb772a9 100644 (file)
@@ -77,7 +77,49 @@ def accept_exceptions_from_builtin_ssl(v):
         patch_builtin_ssl_wrap(v, accept_ssl_errors)
 
 
+def accept_socket_error_0(v):
+    # see https://github.com/cherrypy/cherrypy/issues/1618
+    try:
+        import cheroot
+        cheroot_version = cheroot.__version__
+    except ImportError:
+        pass
+
+    if v < StrictVersion("9.0.0") or cheroot_version < StrictVersion("6.5.5"):
+        import six
+        if six.PY3:
+            generic_socket_error = OSError
+        else:
+            import socket
+            generic_socket_error = socket.error
+
+        def accept_socket_error_0(func):
+            def wrapper(self, sock):
+                try:
+                    return func(self, sock)
+                except generic_socket_error as e:
+                    """It is unclear why exactly this happens.
+
+                    It's reproducible only with openssl>1.0 and stdlib ``ssl`` wrapper.
+                    In CherryPy it's triggered by Checker plugin, which connects
+                    to the app listening to the socket port in TLS mode via plain
+                    HTTP during startup (from the same process).
+
+                    Ref: https://github.com/cherrypy/cherrypy/issues/1618
+                    """
+                    import ssl
+                    is_error0 = e.args == (0, 'Error')
+                    IS_ABOVE_OPENSSL10 = ssl.OPENSSL_VERSION_INFO >= (1, 1)
+                    del ssl
+                    if is_error0 and IS_ABOVE_OPENSSL10:
+                        return None, {}
+                    raise
+            return wrapper
+        patch_builtin_ssl_wrap(v, accept_socket_error_0)
+
+
 def patch_cherrypy(v):
     patch_http_connection_init(v)
     skip_wait_for_occupied_port(v)
     accept_exceptions_from_builtin_ssl(v)
+    accept_socket_error_0(v)