Browse Source

[1428] Drop broken sockets

Michal 'vorner' Vaner 13 years ago
parent
commit
7ac2166466
2 changed files with 16 additions and 2 deletions
  1. 1 1
      src/bin/bind10/bind10_src.py.in
  2. 15 1
      src/bin/bind10/tests/bind10_test.py.in

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

@@ -892,7 +892,7 @@ class BoB:
                     self._unix_sockets[socket_fileno] = (sock, previous)
                     return
                 else:
-                    pass # TODO What now? Drop the socket?
+                    data = b'' # Pretend it got closed
             if len(data) == 0: # The socket got to it's end
                 del self._unix_sockets[socket_fileno]
                 self.socket_consumer_dead(sock)

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

@@ -971,7 +971,9 @@ class SocketSrvTest(unittest.TestCase):
         def recv(self, bufsize, flags=0):
             self.__owner.assertEqual(1, bufsize)
             self.__owner.assertEqual(socket.MSG_DONTWAIT, flags)
-            if self.data is not None:
+            if isinstance(self.data, socket.error):
+                raise self.data
+            elif self.data is not None:
                 if len(self.data):
                     result = self.data[0:1]
                     self.data = self.data[1:]
@@ -1111,6 +1113,18 @@ class SocketSrvTest(unittest.TestCase):
         self.assertEqual((b'token', socket),
                          self.__socket_request_handler_called)
 
+    def test_broken_socket(self):
+        """
+        If the socket raises an exception during the read other than EAGAIN,
+        it is broken and we remove it.
+        """
+        sock = self.__prepare_data(socket.error(errno.ENOMEM,
+            "There's more memory available, but not for you"))
+        self.__boss._socket_data(13)
+        self.assertEqual(sock, self.__consumer_dead_called)
+        self.assertEqual({}, self.__boss._unix_sockets)
+        self.assertTrue(sock.closed)
+
 if __name__ == '__main__':
     # store os.environ for test_unchanged_environment
     original_os_environ = copy.deepcopy(os.environ)