Saggi Mizrahi has uploaded a new change for review. Change subject: asyncore: Move ssl buffer handling to dispatcher ......................................................................
asyncore: Move ssl buffer handling to dispatcher This is boilerplate code that all dispatcher implementations must do to prevent a deadlock in the loop. Putting it in the dispatcher makes the problem transparent to the implementation. Change-Id: Id5b75c8cdcaf1ddb63b499619153c4df4772af4d Signed-off-by: Saggi Mizrahi <smizr...@redhat.com> --- M lib/yajsonrpc/betterAsyncore.py M lib/yajsonrpc/stomp.py M lib/yajsonrpc/stompReactor.py 3 files changed, 24 insertions(+), 18 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/97/37097/1 diff --git a/lib/yajsonrpc/betterAsyncore.py b/lib/yajsonrpc/betterAsyncore.py index e3d064e..b898bba 100644 --- a/lib/yajsonrpc/betterAsyncore.py +++ b/lib/yajsonrpc/betterAsyncore.py @@ -84,6 +84,21 @@ lambda d: None )(self) + def handle_read_event(self): + if self.accepting: + self.handle_accept() + return + + if not self.connected: + if self.connecting: + self.handle_connect_event() + + self.handle_read() + + if hasattr(self.socket, "pending"): + while self.socket.pending() > 0: + self.handle_read() + def recv(self, buffer_size): try: data = self.socket.recv(buffer_size) diff --git a/lib/yajsonrpc/stomp.py b/lib/yajsonrpc/stomp.py index 1ee5bf7..574b639 100644 --- a/lib/yajsonrpc/stomp.py +++ b/lib/yajsonrpc/stomp.py @@ -411,24 +411,16 @@ self._frameHandler.handle_connect(self) def handle_read(self, dispatcher): - pending = self._bufferSize - while pending: - try: - data = dispatcher.recv(pending) - except socket.error: - dispatcher.handle_error() - return + try: + data = dispatcher.recv(self._bufferSize) + except socket.error: + dispatcher.handle_error() + return - try: - pending = dispatcher.socket.pending() - except AttributeError: - pending = 0 - pass + parser = self._parser - parser = self._parser - - if data is not None: - parser.parse(data) + if data is not None: + parser.parse(data) frameHandler = self._frameHandler if hasattr(frameHandler, "handle_frame"): diff --git a/lib/yajsonrpc/stompReactor.py b/lib/yajsonrpc/stompReactor.py index 70c1bd1..b279ade 100644 --- a/lib/yajsonrpc/stompReactor.py +++ b/lib/yajsonrpc/stompReactor.py @@ -152,8 +152,7 @@ self.check_read() def check_read(self): - if hasattr(self._socket, 'pending') and self._socket.pending() > 0: - self._stompConn._dispatcher.handle_read() + self._stompConn._dispatcher.handle_read_event() def send(self, message): self.log.debug("Sending response") -- To view, visit http://gerrit.ovirt.org/37097 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id5b75c8cdcaf1ddb63b499619153c4df4772af4d Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Saggi Mizrahi <smizr...@redhat.com> _______________________________________________ vdsm-patches mailing list vdsm-patches@lists.fedorahosted.org https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches