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

Reply via email to