mirror of
https://github.com/python/cpython.git
synced 2025-09-14 20:56:06 +00:00
Add new utility function, reap_children(), to test_support. This should
be called at the end of each test that spawns children (perhaps it should be called from regrtest instead?). This will hopefully prevent some of the unexplained failures in the buildbots (hppa and alpha) during tests that spawn children. The problems were not reproducible. There were many zombies that remained at the end of several tests. In the worst case, this shouldn't cause any more problems, though it may not help either. Time will tell.
This commit is contained in:
parent
10497c83ec
commit
b15ac3169d
14 changed files with 58 additions and 8 deletions
|
@ -352,6 +352,7 @@ def test_main():
|
||||||
BZ2DecompressorTest,
|
BZ2DecompressorTest,
|
||||||
FuncTest
|
FuncTest
|
||||||
)
|
)
|
||||||
|
test_support.reap_children()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
test_main()
|
test_main()
|
||||||
|
|
|
@ -87,6 +87,7 @@ class CmdLineTest(unittest.TestCase):
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
test.test_support.run_unittest(CmdLineTest)
|
test.test_support.run_unittest(CmdLineTest)
|
||||||
|
test.test_support.reap_children()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
test_main()
|
test_main()
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
import unittest
|
import unittest
|
||||||
import os, tempfile, re
|
import os, tempfile, re
|
||||||
|
|
||||||
from test.test_support import TestSkipped, run_unittest
|
from test.test_support import TestSkipped, run_unittest, reap_children
|
||||||
from commands import *
|
from commands import *
|
||||||
|
|
||||||
# The module says:
|
# The module says:
|
||||||
|
@ -58,6 +58,7 @@ class CommandTests(unittest.TestCase):
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
run_unittest(CommandTests)
|
run_unittest(CommandTests)
|
||||||
|
reap_children()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
import os
|
import os
|
||||||
from test.fork_wait import ForkWait
|
from test.fork_wait import ForkWait
|
||||||
from test.test_support import TestSkipped, run_unittest
|
from test.test_support import TestSkipped, run_unittest, reap_children
|
||||||
|
|
||||||
try:
|
try:
|
||||||
os.fork
|
os.fork
|
||||||
|
@ -18,6 +18,7 @@ class ForkTest(ForkWait):
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
run_unittest(ForkTest)
|
run_unittest(ForkTest)
|
||||||
|
reap_children()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
test_main()
|
test_main()
|
||||||
|
|
|
@ -1785,6 +1785,7 @@ def test_main():
|
||||||
TestMessageConversion, TestProxyFile, TestPartialFile,
|
TestMessageConversion, TestProxyFile, TestPartialFile,
|
||||||
MaildirTestCase)
|
MaildirTestCase)
|
||||||
test_support.run_unittest(*tests)
|
test_support.run_unittest(*tests)
|
||||||
|
test_support.reap_children()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
from test.test_support import TestSkipped
|
from test.test_support import TestSkipped, reap_children
|
||||||
from os import popen
|
from os import popen
|
||||||
|
|
||||||
# Test that command-lines get down as we expect.
|
# Test that command-lines get down as we expect.
|
||||||
|
@ -35,5 +35,6 @@ def _test_commandline():
|
||||||
def main():
|
def main():
|
||||||
print "Test popen:"
|
print "Test popen:"
|
||||||
_test_commandline()
|
_test_commandline()
|
||||||
|
reap_children()
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
from test.test_support import TestSkipped
|
from test.test_support import TestSkipped, reap_children
|
||||||
|
|
||||||
# popen2 contains its own testing routine
|
# popen2 contains its own testing routine
|
||||||
# which is especially useful to see if open files
|
# which is especially useful to see if open files
|
||||||
|
@ -75,3 +75,4 @@ def _test():
|
||||||
|
|
||||||
main()
|
main()
|
||||||
_test()
|
_test()
|
||||||
|
reap_children()
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# Testing select module
|
# Testing select module
|
||||||
from test.test_support import verbose
|
from test.test_support import verbose, reap_children
|
||||||
import select
|
import select
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
@ -65,5 +65,6 @@ def test():
|
||||||
continue
|
continue
|
||||||
print 'Unexpected return values from select():', rfd, wfd, xfd
|
print 'Unexpected return values from select():', rfd, wfd, xfd
|
||||||
p.close()
|
p.close()
|
||||||
|
reap_children()
|
||||||
|
|
||||||
test()
|
test()
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
# Test suite for SocketServer.py
|
# Test suite for SocketServer.py
|
||||||
|
|
||||||
from test import test_support
|
from test import test_support
|
||||||
from test.test_support import verbose, verify, TESTFN, TestSkipped
|
from test.test_support import (verbose, verify, TESTFN, TestSkipped,
|
||||||
|
reap_children)
|
||||||
test_support.requires('network')
|
test_support.requires('network')
|
||||||
|
|
||||||
from SocketServer import *
|
from SocketServer import *
|
||||||
|
@ -199,6 +200,7 @@ def test_main():
|
||||||
testall()
|
testall()
|
||||||
finally:
|
finally:
|
||||||
cleanup()
|
cleanup()
|
||||||
|
reap_children()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
test_main()
|
test_main()
|
||||||
|
|
|
@ -27,6 +27,16 @@ def remove_stderr_debug_decorations(stderr):
|
||||||
return re.sub(r"\[\d+ refs\]\r?\n?$", "", stderr)
|
return re.sub(r"\[\d+ refs\]\r?\n?$", "", stderr)
|
||||||
|
|
||||||
class ProcessTestCase(unittest.TestCase):
|
class ProcessTestCase(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
# Try to minimize the number of children we have so this test
|
||||||
|
# doesn't crash on some buildbots (Alphas in particular).
|
||||||
|
test_support.reap_children()
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
# Try to minimize the number of children we have so this test
|
||||||
|
# doesn't crash on some buildbots (Alphas in particular).
|
||||||
|
test_support.reap_children()
|
||||||
|
|
||||||
def mkstemp(self):
|
def mkstemp(self):
|
||||||
"""wrapper for mkstemp, calling mktemp if mkstemp is not available"""
|
"""wrapper for mkstemp, calling mktemp if mkstemp is not available"""
|
||||||
if hasattr(tempfile, "mkstemp"):
|
if hasattr(tempfile, "mkstemp"):
|
||||||
|
@ -600,6 +610,7 @@ class ProcessTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
test_support.run_unittest(ProcessTestCase)
|
test_support.run_unittest(ProcessTestCase)
|
||||||
|
test_support.reap_children()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
test_main()
|
test_main()
|
||||||
|
|
|
@ -475,3 +475,24 @@ def threading_cleanup(num_active, num_limbo):
|
||||||
while len(threading._limbo) != num_limbo and count < _MAX_COUNT:
|
while len(threading._limbo) != num_limbo and count < _MAX_COUNT:
|
||||||
count += 1
|
count += 1
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
|
||||||
|
def reap_children():
|
||||||
|
"""Use this function at the end of test_main() whenever sub-processes
|
||||||
|
are started. This will help ensure that no extra children (zombies)
|
||||||
|
stick around to hog resources and create problems when looking
|
||||||
|
for refleaks.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Reap all our dead child processes so we don't leave zombies around.
|
||||||
|
# These hog resources and might be causing some of the buildbots to die.
|
||||||
|
import os
|
||||||
|
if hasattr(os, 'waitpid'):
|
||||||
|
any_process = -1
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
# This will raise an exception on Windows. That's ok.
|
||||||
|
pid, status = os.waitpid(any_process, os.WNOHANG)
|
||||||
|
if pid == 0:
|
||||||
|
break
|
||||||
|
except:
|
||||||
|
break
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
import os
|
import os
|
||||||
from test.fork_wait import ForkWait
|
from test.fork_wait import ForkWait
|
||||||
from test.test_support import TestSkipped, run_unittest
|
from test.test_support import TestSkipped, run_unittest, reap_children
|
||||||
|
|
||||||
try:
|
try:
|
||||||
os.fork
|
os.fork
|
||||||
|
@ -27,6 +27,7 @@ class Wait3Test(ForkWait):
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
run_unittest(Wait3Test)
|
run_unittest(Wait3Test)
|
||||||
|
reap_children()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
test_main()
|
test_main()
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
import os
|
import os
|
||||||
from test.fork_wait import ForkWait
|
from test.fork_wait import ForkWait
|
||||||
from test.test_support import TestSkipped, run_unittest
|
from test.test_support import TestSkipped, run_unittest, reap_children
|
||||||
|
|
||||||
try:
|
try:
|
||||||
os.fork
|
os.fork
|
||||||
|
@ -24,6 +24,7 @@ class Wait4Test(ForkWait):
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
run_unittest(Wait4Test)
|
run_unittest(Wait4Test)
|
||||||
|
reap_children()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
test_main()
|
test_main()
|
||||||
|
|
|
@ -48,6 +48,12 @@ Build
|
||||||
- Bug #1513032: 'make install' failed on FreeBSD 5.3 due to lib-old
|
- Bug #1513032: 'make install' failed on FreeBSD 5.3 due to lib-old
|
||||||
trying to be installed even though it's empty.
|
trying to be installed even though it's empty.
|
||||||
|
|
||||||
|
Tests
|
||||||
|
-----
|
||||||
|
|
||||||
|
- Call os.waitpid() at the end of tests that spawn child processes in order
|
||||||
|
to minimize resources (zombies).
|
||||||
|
|
||||||
|
|
||||||
What's New in Python 2.5 beta 1?
|
What's New in Python 2.5 beta 1?
|
||||||
================================
|
================================
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue