[ARVADOS] created: 51641ba5579cb9ebe14234e0888a162b46d1627d

git at public.curoverse.com git at public.curoverse.com
Fri Jul 24 14:09:35 EDT 2015


        at  51641ba5579cb9ebe14234e0888a162b46d1627d (commit)


commit 51641ba5579cb9ebe14234e0888a162b46d1627d
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date:   Fri Jul 24 14:08:18 2015 -0400

    6706: Bonus websockets bugfix, close connection immediately instead of waiting
    for server shutdown response that might never come, then block until websocket
    thread is in terminate state.

diff --git a/sdk/python/arvados/events.py b/sdk/python/arvados/events.py
index e319be3..15bcf2c 100644
--- a/sdk/python/arvados/events.py
+++ b/sdk/python/arvados/events.py
@@ -28,6 +28,7 @@ class EventClient(WebSocketClient):
         super(EventClient, self).__init__(url, ssl_options=ssl_options)
         self.filters = filters
         self.on_event = on_event
+        self.stop = threading.Event()
         self.last_log_id = last_log_id
 
     def opened(self):
@@ -36,12 +37,14 @@ class EventClient(WebSocketClient):
     def received_message(self, m):
         self.on_event(json.loads(str(m)))
 
-    def close_connection(self):
-        try:
-            self.sock.shutdown(socket.SHUT_RDWR)
-            self.sock.close()
-        except:
-            pass
+    def closed(self, code, reason=None):
+        self.stop.set()
+
+    def close(self, code=1000, reason=''):
+        super(EventClient, self).close(code, reason)
+        self.close_connection()
+        while not self.stop.is_set():
+            self.stop.wait(1)
 
     def subscribe(self, filters, last_log_id=None):
         m = {"method": "subscribe", "filters": filters}
diff --git a/services/fuse/arvados_fuse/__init__.py b/services/fuse/arvados_fuse/__init__.py
index de0bf72..c4b9f7e 100644
--- a/services/fuse/arvados_fuse/__init__.py
+++ b/services/fuse/arvados_fuse/__init__.py
@@ -327,7 +327,7 @@ class Operations(llfuse.Operations):
     @catch_exceptions
     def destroy(self):
         if self.events:
-            self.events.terminate()
+            self.events.close()
             self.events = None
 
         self.inodes.clear()

commit 0ae899078093ac04cfdf416940f4faa821400641
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date:   Fri Jul 24 11:42:58 2015 -0400

    6706: Fixup websocket tests of PollClient

diff --git a/sdk/python/tests/test_websockets.py b/sdk/python/tests/test_websockets.py
index fc246ac..ffa310b 100644
--- a/sdk/python/tests/test_websockets.py
+++ b/sdk/python/tests/test_websockets.py
@@ -74,7 +74,8 @@ class WebsocketTest(run_test_server.TestCaseWithServers):
                 additional_filters=[['created_at', '>=', lastHour.strftime('%Y-%m-%d')]])
 
     @mock.patch('arvados.events.EventClient.__init__')
-    def test_poll_websocket_with_start_time_date_only(self, event_client_constr):
+    def test_poll_with_start_time_date_only(self, event_client_constr):
+        event_client_constr.side_effect = Exception('All is well')
         lastHour = datetime.today() - timedelta(hours = 1)
         self._test_subscribe(
             poll_fallback=1, expect_type=arvados.events.PollClient, last_log_id=1,
@@ -88,6 +89,7 @@ class WebsocketTest(run_test_server.TestCaseWithServers):
 
     @mock.patch('arvados.events.EventClient.__init__')
     def test_subscribe_poll_with_start_time_last_hour(self, event_client_constr):
+        event_client_constr.side_effect = Exception('All is well')
         lastHour = datetime.today() - timedelta(hours = 1)
         self._test_subscribe(
             poll_fallback=1, expect_type=arvados.events.PollClient, last_log_id=1,
@@ -102,6 +104,7 @@ class WebsocketTest(run_test_server.TestCaseWithServers):
 
     @mock.patch('arvados.events.EventClient.__init__')
     def test_subscribe_poll_with_start_time_next_hour(self, event_client_constr):
+        event_client_constr.side_effect = Exception('All is well')
         nextHour = datetime.today() + timedelta(hours = 1)
         with self.assertRaises(Queue.Empty):
             self._test_subscribe(
@@ -117,6 +120,7 @@ class WebsocketTest(run_test_server.TestCaseWithServers):
 
     @mock.patch('arvados.events.EventClient.__init__')
     def test_subscribe_poll_with_start_time_tomorrow(self, event_client_constr):
+        event_client_constr.side_effect = Exception('All is well')
         tomorrow = datetime.today() + timedelta(hours = 24)
         with self.assertRaises(Queue.Empty):
             self._test_subscribe(

commit a467cb24c0a2db71c39ce1bf86507bff6f3cea05
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date:   Fri Jul 24 11:31:29 2015 -0400

    6706: Clear inode/inode cache dicts on destroy() instead of setting inodes to None.

diff --git a/services/fuse/arvados_fuse/__init__.py b/services/fuse/arvados_fuse/__init__.py
index b24aaa6..de0bf72 100644
--- a/services/fuse/arvados_fuse/__init__.py
+++ b/services/fuse/arvados_fuse/__init__.py
@@ -188,6 +188,11 @@ class InodeCache(object):
     def find(self, uuid):
         return self._by_uuid.get(uuid)
 
+    def clear(self):
+        self._entries.clear()
+        self._by_uuid.clear()
+        self._total = 0
+
 class Inodes(object):
     """Manage the set of inodes.  This is the mapping from a numeric id
     to a concrete File or Directory object"""
@@ -244,6 +249,17 @@ class Inodes(object):
     def invalidate_entry(self, inode, name):
         llfuse.invalidate_entry(inode, name)
 
+    def clear(self):
+        self.inode_cache.clear()
+
+        for k,v in self._entries.items():
+            try:
+                v.finalize()
+            except Exception as e:
+                _logger.exception("Error during finalize of inode %i", k)
+
+        self._entries.clear()
+
 
 def catch_exceptions(orig_func):
     """Catch uncaught exceptions and log them consistently."""
@@ -311,15 +327,10 @@ class Operations(llfuse.Operations):
     @catch_exceptions
     def destroy(self):
         if self.events:
-            self.events.close()
+            self.events.terminate()
             self.events = None
 
-        for k,v in self.inodes.items():
-            try:
-                v.finalize()
-            except Exception as e:
-                _logger.exception("Error during finalize of inode %i", k)
-        self.inodes = None
+        self.inodes.clear()
 
     def access(self, inode, mode, ctx):
         return True

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list