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