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