Piotr Kliczewski has uploaded a new change for review. Change subject: stomp: make sure that we are connected before sending data ......................................................................
stomp: make sure that we are connected before sending data There could be a situation that we send data before we receive CONNECTED frame. When the frame arrives it is assumed be a response and the test fails due to lack of data. To fix this issue we would retry to send message waiting on confirmation that we are connected. Change-Id: I08c914170d2dfa6f8d74c5e712a97b5e34b0fd77 Signed-off-by: pkliczewski <[email protected]> --- M lib/yajsonrpc/__init__.py M lib/yajsonrpc/stomp.py M tests/stompAsyncClientTests.py 3 files changed, 18 insertions(+), 4 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/78/54578/1 diff --git a/lib/yajsonrpc/__init__.py b/lib/yajsonrpc/__init__.py index a5e42b8..4b36d5e 100644 --- a/lib/yajsonrpc/__init__.py +++ b/lib/yajsonrpc/__init__.py @@ -22,7 +22,8 @@ from vdsm.compat import json from vdsm.password import protect_passwords, unprotect_passwords -from vdsm.utils import monotonic_time, traceback +from vdsm.utils import monotonic_time, retry, traceback +from yajsonrpc.stomp import NotConnected __all__ = ["betterAsyncore", "stompreactor", "stomp"] @@ -352,7 +353,8 @@ def call_async(self, *reqs): call = JsonRpcCall() - self.call_cb(call.callback, *reqs) + func = partial(self.call_cb, call.callback, *reqs) + retry(func, NotConnected, tries=5) return call def call_cb(self, cb, *reqs): @@ -367,8 +369,12 @@ raise ValueError("Request id already in use %s", rid) self._runningRequests[rid] = ctx - - self._transport.send(ctx.encode()) + try: + self._transport.send(ctx.encode()) + except: + with self._lock: + del self._runningRequests[rid] + raise # All notifications if ctx.isDone(): diff --git a/lib/yajsonrpc/stomp.py b/lib/yajsonrpc/stomp.py index cd1ca06..da914cf 100644 --- a/lib/yajsonrpc/stomp.py +++ b/lib/yajsonrpc/stomp.py @@ -428,6 +428,10 @@ self.connection.close() +class NotConnected(Exception): + pass + + class AsyncClient(object): log = logging.getLogger("yajsonrpc.protocols.stomp.AsyncClient") @@ -506,6 +510,9 @@ raise StompError(frame) def send(self, destination, data="", headers=None): + if not self._connected: + raise NotConnected() + final_headers = {"destination": destination} if headers is not None: final_headers.update(headers) diff --git a/tests/stompAsyncClientTests.py b/tests/stompAsyncClientTests.py index 4ffc327..a3fc76e 100644 --- a/tests/stompAsyncClientTests.py +++ b/tests/stompAsyncClientTests.py @@ -76,6 +76,7 @@ def test_send(self): client = AsyncClient() + client._connected = True data = ('{"jsonrpc":"2.0","method":"Host.getAllVmStats","params":{},' '"id":"e8a936a6-d886-4cfa-97b9-2d54209053ff"}') headers = {Headers.REPLY_TO: 'jms.topic.vdsm_responses', -- To view, visit https://gerrit.ovirt.org/54578 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I08c914170d2dfa6f8d74c5e712a97b5e34b0fd77 Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Piotr Kliczewski <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
