Piotr Kliczewski has uploaded a new change for review.

Change subject: rpc: keep listening on socket
......................................................................

rpc: keep listening on socket

Some users are using Nessus scanner which seems to close vdsm socket.
Users are not willing to configure it not to break vdsm.
Due to this issue vdsm needs to be restarted to make it fully
operational again. We can intercept socket closure and to reopen it.

This fix was tested by using gdb to close the socket and observing that
the socket is still open.


Bug-Url: https://bugzilla.redhat.com/1326940
Change-Id: I811786795ca15548da19de0f6a31cd9df6fc8c4e
Signed-off-by: Piotr Kliczewski <piotr.kliczew...@gmail.com>
---
M lib/vdsm/protocoldetector.py
1 file changed, 22 insertions(+), 8 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/86/65686/1

diff --git a/lib/vdsm/protocoldetector.py b/lib/vdsm/protocoldetector.py
index 196a2ab..f1450d7 100644
--- a/lib/vdsm/protocoldetector.py
+++ b/lib/vdsm/protocoldetector.py
@@ -51,8 +51,10 @@
 class _AcceptorImpl(object):
     log = logging.getLogger("ProtocolDetector.AcceptorImpl")
 
-    def __init__(self, dispatcher_factory):
+    def __init__(self, dispatcher_factory, listener):
         self._dispatcher_factory = dispatcher_factory
+        self.listener = listener
+        self._keep_open = True
 
     def readable(self, dispatcher):
         return True
@@ -73,6 +75,11 @@
 
     def handle_close(self, dispatcher):
         dispatcher.close()
+        if self._keep_open:
+            self.listener.listen()
+
+    def prepare_for_shutdown(self):
+        self._keep_open = False
 
 
 class _ProtocolDetector(object):
@@ -172,15 +179,20 @@
     ):
         self._sslctx = sslctx
         self._reactor = reactor
-        sock = _create_socket(host, port)
-        # TODO: Clean _host & _port, use sockaddr instead.
-        self._host, self._port = sock.getsockname()[0:2]
-        self.log.info("Listening at %s:%d", self._host, self._port)
-        self._acceptor = self._reactor.create_dispatcher(
-            sock, _AcceptorImpl(self.handle_accept))
-        self._acceptor.listen(5)
+        self.port = port
+        self.host = host
+        self.listen()
         self._handlers = []
         self.TIMEOUT = ssl_hanshake_timeout
+
+    def listen(self):
+        sock = _create_socket(self.host, self.port)
+        # TODO: Clean _host & _port, use sockaddr instead.
+        self._host, self._port = sock.getsockname()[0:2]
+        self._acceptor = self._reactor.create_dispatcher(
+            sock, _AcceptorImpl(self.handle_accept, self))
+        self._acceptor.listen(5)
+        self.log.info("Listening at %s:%d", self._host, self._port)
 
     def handle_accept(self, client):
         if self._sslctx is None:
@@ -208,6 +220,8 @@
     def stop(self):
         self.log.debug("Stopping Acceptor")
         self._reactor.stop()
+
+        self._acceptor.prepare_for_shutdown()
         self._acceptor.close()
 
 


-- 
To view, visit https://gerrit.ovirt.org/65686
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I811786795ca15548da19de0f6a31cd9df6fc8c4e
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Piotr Kliczewski <piotr.kliczew...@gmail.com>
_______________________________________________
vdsm-patches mailing list -- vdsm-patches@lists.fedorahosted.org
To unsubscribe send an email to vdsm-patches-le...@lists.fedorahosted.org

Reply via email to