Hello Saggi Mizrahi,

I'd like you to do a code review.  Please visit

    https://gerrit.ovirt.org/38666

to review the following change.

Change subject: stomp: parsing buffer refactoring
......................................................................

stomp: parsing buffer refactoring

Refactored how we manage buffer and parser state in Parser class. Fixing
spelling in Subscription class name and extending default buffer size in
AsyncDispatcher.


Change-Id: I1b835e0d8a5ca20e67f0562955255ba1ad6ae9a1
Signed-off-by: pkliczewski <piotr.kliczew...@gmail.com>
Signed-off-by: Saggi Mizrahi <smizr...@redhat.com>
---
M lib/yajsonrpc/stomp.py
1 file changed, 27 insertions(+), 21 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/66/38666/1

diff --git a/lib/yajsonrpc/stomp.py b/lib/yajsonrpc/stomp.py
index ee6b64e..0199a66 100644
--- a/lib/yajsonrpc/stomp.py
+++ b/lib/yajsonrpc/stomp.py
@@ -15,7 +15,6 @@
 
 import logging
 import socket
-import cStringIO
 from threading import Timer, Event
 from uuid import uuid4
 from collections import deque
@@ -155,21 +154,29 @@
             self._STATE_HEADER: self._parse_header,
             self._STATE_BODY: self._parse_body}
         self._frames = deque()
-        self._state = self._STATE_CMD
+        self._change_state(self._STATE_CMD)
         self._contentLength = -1
         self._flush()
 
+    def _change_state(self, new_state):
+        self._state = new_state
+        self._state_cb = self._states[new_state]
+
     def _flush(self):
-        self._buffer = cStringIO.StringIO()
+        self._buffer = ""
+
+    def _write_buffer(self, buff):
+        self._buffer += buff
+
+    def _get_buffer(self):
+        return self._buffer
 
     def _handle_terminator(self, term):
-        if term not in self._buffer.getvalue():
+        res, _, rest = self._buffer.partition(term)
+        if not _:
             return None
 
-        data = self._buffer.getvalue()
-        res, rest = data.split(term, 1)
-        self._flush()
-        self._buffer.write(rest)
+        self._buffer = rest
 
         return res
 
@@ -187,7 +194,7 @@
         cmd = decodeValue(cmd)
         self._tmpFrame = Frame(cmd)
 
-        self._state = self._STATE_HEADER
+        self._change_state(self._STATE_HEADER)
         return True
 
     def _parse_header(self):
@@ -201,7 +208,7 @@
         headers = self._tmpFrame.headers
         if header == "":
             self._contentLength = int(headers.get('content-length', -1))
-            self._state = self._STATE_BODY
+            self._change_state(self._STATE_BODY)
             return True
 
         key, value = header.split(":", 1)
@@ -219,7 +226,7 @@
 
     def _pushFrame(self):
         self._frames.append(self._tmpFrame)
-        self._state = self._STATE_CMD
+        self._change_state(self._STATE_CMD)
         self._tmpFrame = None
         self._contentLength = -1
 
@@ -239,16 +246,16 @@
         return True
 
     def _parse_body_length(self):
-        buf = self._buffer
+        buf = self._get_buffer()
         cl = self._contentLength
-        ndata = buf.tell()
+        ndata = len(buf)
         if ndata < (cl + 1):
             return False
 
         remainingBytes = 0
         self._flush()
-        body = buf.getvalue()
-        self._buffer.write(body[cl + 1:])
+        body = buf
+        self._write_buffer(body[cl + 1:])
         body = body[:cl]
 
         if remainingBytes == 0:
@@ -262,9 +269,8 @@
         return len(self._frames)
 
     def parse(self, data):
-        states = self._states
-        self._buffer.write(data)
-        while states[self._state]():
+        self._write_buffer(data)
+        while self._state_cb():
             pass
 
     def popFrame(self):
@@ -360,7 +366,7 @@
 
     def put_subscribe(self, destination, ack=None):
         subid = self._aclient.subscribe(self._adisp, destination, ack)
-        sub = Subsciption(self, subid, ack)
+        sub = Subscription(self, subid, ack)
         self._registerSubscription(sub)
         return sub
 
@@ -391,7 +397,7 @@
 class AsyncDispatcher(object):
     log = logging.getLogger("stomp.AsyncDispatcher")
 
-    def __init__(self, frameHandler, bufferSize=1024):
+    def __init__(self, frameHandler, bufferSize=4096):
         self._frameHandler = frameHandler
         self._bufferSize = bufferSize
         self._parser = Parser()
@@ -568,7 +574,7 @@
         return subscriptionID
 
 
-class Subsciption(object):
+class Subscription(object):
     def __init__(self, client, subid, ack):
         self._ack = ack
         self._subid = subid


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1b835e0d8a5ca20e67f0562955255ba1ad6ae9a1
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Piotr Kliczewski <piotr.kliczew...@gmail.com>
Gerrit-Reviewer: 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