Rev 4740: Implement a new -Ethreads to better track the leaks. in file:///home/vila/src/bzr/bugs/392127-thread-leak/

Vincent Ladeuil v.ladeuil+lp at free.fr
Thu Oct 8 18:19:38 BST 2009


At file:///home/vila/src/bzr/bugs/392127-thread-leak/

------------------------------------------------------------
revno: 4740
revision-id: v.ladeuil+lp at free.fr-20091008171938-e72q9ipz1h3l5thd
parent: v.ladeuil+lp at free.fr-20091008143402-b4uivhhkykn95u8v
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: 392127-thread-leak
timestamp: Thu 2009-10-08 19:19:38 +0200
message:
  Implement a new -Ethreads to better track the leaks.
  * bzrlib/tests/test_http.py:
  (RecordingServer.setUp, RecordingServer.tearDown): Implement -Ethreads.
  
  * bzrlib/tests/http_server.py:
  (HttpServer.setUp, HttpServer.tearDown): Implement -Ethreads.
  
  * bzrlib/tests/ftp_server/pyftpdlib_based.py:
  (FTPTestServer.setUp, FTPTestServer.tearDown): Implement -Ethreads.
  
  * bzrlib/tests/ftp_server/medusa_based.py:
  (FTPTestServer.setUp, FTPTestServer.tearDown): Implement -Ethreads.
  
  * bzrlib/tests/__init__.py:
  (TestCase._check_leaked_threads): Implement -Ethreads.
  (ChrootedTestCase.setUp): Fix some imports.
  
  * bzrlib/builtins.py:
  (cmd_selftest.run): Fix some imports.
-------------- next part --------------
=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py	2009-10-06 19:42:23 +0000
+++ b/bzrlib/builtins.py	2009-10-08 17:19:38 +0000
@@ -3432,15 +3432,17 @@
             randomize=None, exclude=None, strict=False,
             load_list=None, debugflag=None, starting_with=None, subunit=False,
             parallel=None, lsprof_tests=False):
-        from bzrlib.tests import selftest
-        import bzrlib.benchmarks as benchmarks
-        from bzrlib.benchmarks import tree_creator
+        from bzrlib import (
+            benchmarks,
+            tests,
+            )
 
         # Make deprecation warnings visible, unless -Werror is set
         symbol_versioning.activate_deprecation_warnings(override=False)
 
         if cache_dir is not None:
-            tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(cache_dir)
+            benchmarks.tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(
+                cache_dir)
         if testspecs_list is not None:
             pattern = '|'.join(testspecs_list)
         else:
@@ -3483,7 +3485,7 @@
                               "starting_with": starting_with
                               }
             selftest_kwargs.update(self.additional_selftest_args)
-            result = selftest(**selftest_kwargs)
+            result = tests.selftest(**selftest_kwargs)
         finally:
             if benchfile is not None:
                 benchfile.close()

=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py	2009-10-08 14:34:02 +0000
+++ b/bzrlib/tests/__init__.py	2009-10-08 17:19:38 +0000
@@ -98,7 +98,6 @@
 from bzrlib.transport.readonly import ReadonlyServer
 from bzrlib.trace import mutter, note
 from bzrlib.tests import TestUtil
-from bzrlib.tests.http_server import HttpServer
 from bzrlib.tests.TestUtil import (
                           TestSuite,
                           TestLoader,
@@ -856,7 +855,8 @@
         # going away but leak one) but it seems less likely than the actual
         # false positives (the test see threads going away and does not leak).
         if leaked_threads > 0:
-            print '%s is leaking, active is now %d' % (self.id(), active)
+            if 'threads' in selftest_debug_flags:
+                print '%s is leaking, active is now %d' % (self.id(), active)
             TestCase._leaking_threads_tests += 1
             if TestCase._first_thread_leaker_id is None:
                 TestCase._first_thread_leaker_id = self.id()
@@ -2734,9 +2734,10 @@
     """
 
     def setUp(self):
+        from bzrlib.tests import http_server
         super(ChrootedTestCase, self).setUp()
         if not self.vfs_transport_factory == MemoryServer:
-            self.transport_readonly_server = HttpServer
+            self.transport_readonly_server = http_server.HttpServer
 
 
 def condition_id_re(pattern):
@@ -3420,6 +3421,8 @@
 #                           rather than failing tests. And no longer raise
 #                           LockContention when fctnl locks are not being used
 #                           with proper exclusion rules.
+#   -Ethreads               Will display thread indent at creation/join time to
+#                           help track thread leaks
 selftest_debug_flags = set()
 
 

=== modified file 'bzrlib/tests/ftp_server/medusa_based.py'
--- a/bzrlib/tests/ftp_server/medusa_based.py	2009-03-23 14:59:43 +0000
+++ b/bzrlib/tests/ftp_server/medusa_based.py	2009-10-08 17:19:38 +0000
@@ -252,6 +252,8 @@
         self._async_thread = threading.Thread(
                 target=FTPTestServer._asyncore_loop_ignore_EBADF,
                 kwargs={'timeout':0.1, 'count':10000})
+        if 'threads' in tests.selftest_debug_flags:
+            print 'Thread started: %s' % (self._async_thread.ident,)
         self._async_thread.setDaemon(True)
         self._async_thread.start()
 
@@ -260,6 +262,8 @@
         self._ftp_server.close()
         asyncore.close_all()
         self._async_thread.join()
+        if 'threads' in tests.selftest_debug_flags:
+            print 'Thread  joined: %s' % (self._async_thread.ident,)
 
     @staticmethod
     def _asyncore_loop_ignore_EBADF(*args, **kwargs):

=== modified file 'bzrlib/tests/ftp_server/pyftpdlib_based.py'
--- a/bzrlib/tests/ftp_server/pyftpdlib_based.py	2009-10-06 08:24:14 +0000
+++ b/bzrlib/tests/ftp_server/pyftpdlib_based.py	2009-10-08 17:19:38 +0000
@@ -28,6 +28,7 @@
 
 from bzrlib import (
     osutils,
+    tests,
     trace,
     transport,
     )
@@ -182,6 +183,8 @@
         self._ftpd_starting.acquire() # So it can be released by the server
         self._ftpd_thread = threading.Thread(target=self._run_server,)
         self._ftpd_thread.start()
+        if 'threads' in tests.selftest_debug_flags:
+            print 'Thread started: %s' % (self._ftpd_thread.ident,)
         # Wait for the server thread to start (i.e release the lock)
         self._ftpd_starting.acquire()
         self._ftpd_starting.release()
@@ -194,6 +197,8 @@
         self._ftp_server.close()
         self._ftpd_running = False
         self._ftpd_thread.join()
+        if 'threads' in tests.selftest_debug_flags:
+            print 'Thread  joined: %s' % (self._ftpd_thread.ident,)
 
     def _run_server(self):
         """Run the server until tearDown is called, shut it down properly then.

=== modified file 'bzrlib/tests/http_server.py'
--- a/bzrlib/tests/http_server.py	2009-10-08 14:34:02 +0000
+++ b/bzrlib/tests/http_server.py	2009-10-08 17:19:38 +0000
@@ -30,7 +30,10 @@
 import urllib
 import urlparse
 
-from bzrlib import transport
+from bzrlib import (
+    tests,
+    transport,
+    )
 from bzrlib.transport import local
 
 
@@ -601,6 +604,8 @@
         self._http_thread.setDaemon(True)
         self._http_exception = None
         self._http_thread.start()
+        if 'threads' in tests.selftest_debug_flags:
+            print 'Thread started: %s' % (self._http_thread.ident,)
 
         # Wait for the server thread to start (i.e release the lock)
         self._http_starting.acquire()
@@ -617,6 +622,8 @@
         self._http_running = False
         self._httpd.shutdown()
         self._http_thread.join()
+        if 'threads' in tests.selftest_debug_flags:
+            print 'Thread  joined: %s' % (self._http_thread.ident,)
         del self._http_thread
         self._http_thread = None
 

=== modified file 'bzrlib/tests/test_http.py'
--- a/bzrlib/tests/test_http.py	2009-10-08 08:55:17 +0000
+++ b/bzrlib/tests/test_http.py	2009-10-08 17:19:38 +0000
@@ -228,6 +228,8 @@
         self._thread = threading.Thread(target=self._accept_read_and_reply)
         self._thread.setDaemon(True)
         self._thread.start()
+        if 'threads' in tests.selftest_debug_flags:
+            print 'Thread started: %s' % (self._thread.ident,)
         self._ready.wait()
 
     def _accept_read_and_reply(self):
@@ -279,6 +281,8 @@
         self.host = None
         self.port = None
         self._thread.join()
+        if 'threads' in tests.selftest_debug_flags:
+            print 'Thread  joined: %s' % (self._thread.ident,)
         del self._thread
         self.thread = None
 



More information about the bazaar-commits mailing list