raise error if side effect method called while loop is running
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/79dac23b Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/79dac23b Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/79dac23b Branch: refs/heads/TINKERPOP-1545-tp32 Commit: 79dac23b2f305911e651648c5b43fb3fe59d94c8 Parents: a8c8b65 Author: davebshow <davebs...@gmail.com> Authored: Wed Dec 7 16:37:05 2016 -0500 Committer: Stephen Mallette <sp...@genoprime.com> Committed: Fri Dec 16 10:14:20 2016 -0500 ---------------------------------------------------------------------- .../driver/driver_remote_connection.py | 4 ++-- .../gremlin_python/driver/remote_connection.py | 12 +++++++++- .../driver/test_driver_remote_connection.py | 24 +++++++++++--------- 3 files changed, 26 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/79dac23b/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py b/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py index babb113..b951cdf 100644 --- a/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py +++ b/gremlin-python/src/main/jython/gremlin_python/driver/driver_remote_connection.py @@ -54,13 +54,13 @@ class DriverRemoteConnection(RemoteConnection): request_id = str(uuid.uuid4()) traversers = self._loop.run_sync(lambda: self.submit_traversal_bytecode(request_id, bytecode)) keys, value, close = self._get_side_effect_lambdas(request_id) - return RemoteTraversal(iter(traversers), RemoteTraversalSideEffects(keys, value, close)) + return RemoteTraversal(iter(traversers), RemoteTraversalSideEffects(keys, value, close, self._loop)) def submit_async(self, bytecode): request_id = str(uuid.uuid4()) future_traversers = self.submit_traversal_bytecode(request_id, bytecode) keys, value, close = self._get_side_effect_lambdas(request_id) - side_effects = RemoteTraversalSideEffects(keys, value, close) + side_effects = RemoteTraversalSideEffects(keys, value, close, self._loop) return RemoteTraversal(future_traversers, side_effects) @gen.coroutine http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/79dac23b/gremlin-python/src/main/jython/gremlin_python/driver/remote_connection.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/gremlin_python/driver/remote_connection.py b/gremlin-python/src/main/jython/gremlin_python/driver/remote_connection.py index 93c92b7..f7ed48e 100644 --- a/gremlin-python/src/main/jython/gremlin_python/driver/remote_connection.py +++ b/gremlin-python/src/main/jython/gremlin_python/driver/remote_connection.py @@ -57,20 +57,27 @@ class RemoteTraversal(Traversal): class RemoteTraversalSideEffects(TraversalSideEffects): - def __init__(self, keys_lambda, value_lambda, close_lambda): + def __init__(self, keys_lambda, value_lambda, close_lambda, loop): self._keys_lambda = keys_lambda self._value_lambda = value_lambda self._close_lambda = close_lambda + self._loop = loop self._keys = set() self._side_effects = {} self._closed = False def keys(self): + if self._loop._running: + raise RuntimeError("Cannot call side effect methods" + "while event loop is running") if not self._closed: self._keys = self._keys_lambda() return self._keys def get(self, key): + if self._loop._running: + raise RuntimeError("Cannot call side effect methods" + "while event loop is running") if not self._side_effects.get(key): if not self._closed: results = self._value_lambda(key) @@ -81,6 +88,9 @@ class RemoteTraversalSideEffects(TraversalSideEffects): return self._side_effects[key] def close(self): + if self._loop._running: + raise RuntimeError("Cannot call side effect methods" + "while event loop is running") results = self._close_lambda() self._closed = True return results http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/79dac23b/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py ---------------------------------------------------------------------- diff --git a/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py b/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py index c9e64c5..783cf7e 100644 --- a/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py +++ b/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py @@ -211,6 +211,7 @@ class TestDriverRemoteConnection(TestCase): assert count == 6 loop.run_sync(go) + connection.close() def test_promise_side_effects(self): loop = ioloop.IOLoop.current() @@ -224,22 +225,17 @@ class TestDriverRemoteConnection(TestCase): @gen.coroutine def go(): traversal = yield g.V().aggregate('a').promise() - # Trying to get side effect keys throws error - BAD + # Calling synchronous side effect methods from coroutine raises. with pytest.raises(RuntimeError): keys = traversal.side_effects.keys() - # IOLoop is now hosed. - loop.run_sync(go) + with pytest.raises(RuntimeError): + keys = traversal.side_effects.get('a') - # Get a new IOLoop - this should happen for each test case. - connection.close() - ioloop.IOLoop.clear_instance() - loop.close() - loop = ioloop.IOLoop() - loop.make_current() + with pytest.raises(RuntimeError): + keys = traversal.side_effects.close() - connection = DriverRemoteConnection('ws://localhost:45940/gremlin', 'g') - g = Graph().traversal().withRemote(connection) + loop.run_sync(go) # If we return the traversal though, we can use side effects per usual. @gen.coroutine @@ -251,6 +247,12 @@ class TestDriverRemoteConnection(TestCase): traversal = loop.run_sync(go) a, = traversal.side_effects.keys() assert a == 'a' + results = traversal.side_effects.get('a') + assert results + results = traversal.side_effects.close() + assert not results + + connection.close() if __name__ == '__main__':