Piotr Kliczewski has uploaded a new change for review. Change subject: protocoldetecor: SSLError handled not correctly ......................................................................
protocoldetecor: SSLError handled not correctly Whenever there was ssl issue during protocol detection the code entered infinite loop because we haven't remove fd from pending_connections. It is fixed by caching SSLError in processing_events loop and clean up fd correctly. Change-Id: I8ea5c305b19c0a7421ea74e069c3ad02d9ffd141 Signed-off-by: pkliczewski <[email protected]> Bug-Url: https://bugzilla.redhat.com/1229859 --- M vdsm/protocoldetector.py 1 file changed, 21 insertions(+), 15 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/06/42206/1 diff --git a/vdsm/protocoldetector.py b/vdsm/protocoldetector.py index c53f41d..6768f9c 100644 --- a/vdsm/protocoldetector.py +++ b/vdsm/protocoldetector.py @@ -96,15 +96,20 @@ events = self._poller.poll(seconds * 1000) for fd, event in events: - if event & (select.POLLIN | select.POLLPRI): - if fd is self._read_fd: - self._maybe_stop() - elif fd is self._socket.fileno(): - self._accept_connection() - else: - self._handle_connection_read(fd) - if event & (select.POLLOUT): - self._handle_connection_write(fd) + try: + if event & (select.POLLIN | select.POLLPRI): + if fd is self._read_fd: + self._maybe_stop() + elif fd is self._socket.fileno(): + self._accept_connection() + else: + self._handle_connection_read(fd) + if event & (select.POLLOUT): + self._handle_connection_write(fd) + except SSL.SSLError as e: + self.log.error("SSL error: %s", e) + _, client_socket = self._pending_connections[fd] + self._handle_socket_cleanup(client_socket) now = time.time() if now > self._next_cleanup: @@ -115,8 +120,7 @@ self.log.debug("Cleaning Acceptor") for _, (_, client_socket) in self._pending_connections.items(): - self._remove_connection(client_socket) - client_socket.close() + self._handle_socket_cleanup(client_socket) self._poller.unregister(self._socket) self._poller.unregister(self._read_fd) @@ -127,8 +131,7 @@ def _cleanup_pending_connections(self): for _, (accepted, client_socket) in self._pending_connections.items(): if time.time() - accepted > self.CLEANUP_INTERVAL: - self._remove_connection(client_socket) - client_socket.close() + self._handle_socket_cleanup(client_socket) def detect_protocol(self, data): for handler in self._handlers: @@ -226,8 +229,7 @@ except socket.error as e: if e.errno not in (errno.EAGAIN, errno.EWOULDBLOCK): self.log.warning("Unable to read data: %s", e) - self._remove_connection(client_socket) - client_socket.close() + self._handle_socket_cleanup(client_socket) return if data is None: @@ -246,6 +248,10 @@ handler.NAME, host, port) handler.handleSocket(client_socket, (host, port)) + def _handle_socket_cleanup(self, socket): + self._remove_connection(socket) + socket.close() + def _create_socket(self, host, port): addr = socket.getaddrinfo(host, port, socket.AF_INET, socket.SOCK_STREAM) -- To view, visit https://gerrit.ovirt.org/42206 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I8ea5c305b19c0a7421ea74e069c3ad02d9ffd141 Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: ovirt-3.5 Gerrit-Owner: Piotr Kliczewski <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
