You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by da...@apache.org on 2016/12/07 21:37:54 UTC

[9/9] tinkerpop git commit: raise error if side effect method called while loop is running

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/2cb737ef
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/2cb737ef
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/2cb737ef

Branch: refs/heads/TINKERPOP-1490
Commit: 2cb737ef8f467390d9fb01443963852e3973e0dc
Parents: 522960c
Author: davebshow <da...@gmail.com>
Authored: Wed Dec 7 16:37:05 2016 -0500
Committer: davebshow <da...@gmail.com>
Committed: Wed Dec 7 16:37:05 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/2cb737ef/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 bcf6d15..4d8d7e2 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/2cb737ef/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/2cb737ef/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__':