Browse Source

[1429] Catch an exception

Michal 'vorner' Vaner 13 years ago
parent
commit
6583a47dde
2 changed files with 23 additions and 1 deletions
  1. 8 1
      src/bin/bind10/bind10_src.py.in
  2. 15 0
      src/bin/bind10/tests/bind10_test.py.in

+ 8 - 1
src/bin/bind10/bind10_src.py.in

@@ -886,7 +886,14 @@ class BoB:
         so to the _socket_cache.
         """
         logger.error(BIND10_LOST_SOCKET_CONSUMER, unix_socket.fileno())
-        self._socket_cache.drop_application(unix_socket.fileno())
+        try:
+            self._socket_cache.drop_application(unix_socket.fileno())
+        except ValueError:
+            # This means the application holds no sockets. It's harmless, as it
+            # can happen in real life - for example, it requests a socket, but
+            # get_socket doesn't find it, so the application dies. It should be
+            # rare, though.
+            pass
 
     def insert_creator(self, creator):
         """

+ 15 - 0
src/bin/bind10/tests/bind10_test.py.in

@@ -159,7 +159,12 @@ class TestCacheCommands(unittest.TestCase):
         """
         Part of pretending to be the cache. Logs the parameter to
         self.__drop_app_called.
+
+        In the case self.__raise_exception is set, the exception there
+        is raised instead.
         """
+        if self.__raise_exception is not None:
+            raise self.__raise_exception
         self.__drop_app_called = application
 
     def test_consumer_dead(self):
@@ -169,6 +174,16 @@ class TestCacheCommands(unittest.TestCase):
         self.__boss.socket_consumer_dead(self.FalseSocket())
         self.assertEqual(42, self.__drop_app_called)
 
+    def test_consumer_dead_invalid(self):
+        """
+        Test that it doesn't crash in case the application is not known to
+        the cache, the boss doesn't crash, as this actually can happen in
+        practice.
+        """
+        self.__raise_exception = ValueError("This application is unknown")
+        # This doesn't crash
+        self.__boss.socket_consumer_dead(self.FalseSocket())
+
     def get_socket(self, token, application):
         """
         Part of pretending to be the cache. If there's anything in