Rev 5274: Wrap socket objects so we can get tracebacks. in http://bazaar.launchpad.net/~jameinel/bzr/leaking-test-experiment

John Arbash Meinel john at arbash-meinel.com
Thu Jun 17 14:56:59 BST 2010


At http://bazaar.launchpad.net/~jameinel/bzr/leaking-test-experiment

------------------------------------------------------------
revno: 5274
revision-id: john at arbash-meinel.com-20100617135644-yiz3g8alm1yc1xm1
parent: john at arbash-meinel.com-20100616220407-0wxbaelyq9yk0ky8
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: leaking-test-experiment
timestamp: Thu 2010-06-17 08:56:44 -0500
message:
  Wrap socket objects so we can get tracebacks.
-------------- next part --------------
=== modified file 'bzrlib/smart/medium.py'
--- a/bzrlib/smart/medium.py	2010-06-16 22:04:07 +0000
+++ b/bzrlib/smart/medium.py	2010-06-17 13:56:44 +0000
@@ -48,6 +48,30 @@
 """)
 from bzrlib import osutils
 
+import traceback
+
+class WrappedSocket(object):
+
+    def __init__(self, sock, stack):
+        self.__socket = sock
+        self.__stack = stack
+
+    def __getattr__(self, name):
+        return getattr(self.__socket, name)
+
+    def connect(self, *args, **kwargs):
+        val = self.__socket.connect(*args, **kwargs)
+        socket._created_tb[self.__socket.getsockname()] = self.__stack
+        return val
+
+socket._created_tb = {}
+_socket_create = socket.socket
+def _tb_socket(*args, **kwargs):
+    sock = _socket_create(*args, **kwargs)
+    stack = traceback.extract_stack()
+    return WrappedSocket(sock, stack)
+socket.socket = _tb_socket
+
 # Throughout this module buffer size parameters are either limited to be at
 # most _MAX_READ_SIZE, or are ignored and _MAX_READ_SIZE is used instead.
 # For this module's purposes, MAX_SOCKET_CHUNK is a reasonable size for reads
@@ -291,9 +315,11 @@
             return osutils.read_bytes_from_socket(
                 self.socket, self._report_activity)
         except socket.timeout:
+            peer = self.socket.getpeername()
             sys.stderr.write('timeout while wanting to read %d bytes on %s peer: %s\n'
                              % (desired_count, self.socket.getsockname(),
-                                self.socket.getpeername()))
+                                peer))
+            sys.stderr.writelines(traceback.format_list(socket._created_tb[peer]))
             raise
 
     def terminate_due_to_error(self):
@@ -901,6 +927,8 @@
                 err_msg = err.args[1]
             raise errors.ConnectionError("failed to connect to %s:%d: %s" %
                     (self._host, port, err_msg))
+        sys.stderr.write("_ensure_connection connected as %s peer %s\n" %
+            (self._socket.getsockname(), self._socket.getpeername()))
         self._connected = True
 
     def _flush(self):



More information about the bazaar-commits mailing list