| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
…r not and added tests for that
|
Most changes to Python require a NEWS entry. Please add it using the blurb_it web app or the blurb command-line tool. |
Sorry, something went wrong.
|
|
||
| # Reset exit code value | ||
| _resource_tracker._exitcode = None | ||
| exit_code_assert = self.assertNotEqual |
There was a problem hiding this comment.
This is a bit confusing. Also, it will match any non-zero exit code which might not be desired (other problems may return some code not in {0, 1}). How about simply expected_exit_code = 0 if delete_queue else 1?
Sorry, something went wrong.
There was a problem hiding this comment.
Hey,
I fixed the test and fixed the code too.
Since I saved the exit status (which was 256 when the exit code was 1),
so now the code saves the exit code and verifies it to 0/1
Thanks
Sorry, something went wrong.
| runner = unittest.TextTestRunner() | ||
| result = runner.run(test_class('test_initializer')) | ||
|
|
||
| self.assertEqual(result.testsRun, 1) | ||
| self.assertEqual(result.failures, []) | ||
| self.assertEqual(result.errors, []) |
There was a problem hiding this comment.
Uhm, why not do the simple thing and add these checks somewhere in FailingInitializerMixin?
It should also avoid running those tests twice (which I assume this does).
Sorry, something went wrong.
There was a problem hiding this comment.
The result object exists when we run the test using Test Runner, which is not the case on FailingInitializerMixin.
This is used for safety, ensuring the inner test passed before we check the resource tracker
Sorry, something went wrong.
There was a problem hiding this comment.
Yes, but this is needlessly complex (and might interfere with other test options/customizations). Let's do the check at the end of said tests.
Sorry, something went wrong.
There was a problem hiding this comment.
@pitrou I don't understand how you want those checks to be since we can check it only after a test run with the returned result, which is not the case in regular tests. Anyway, I'm removing those checks since it's not mandatory and just for safety
Sorry, something went wrong.
There was a problem hiding this comment.
I honestly don't understand what the difficulty would be. You can make the resource tracker stop at the end of the test, or at the end of the testcase (in a teardown method for example).
Sorry, something went wrong.
… to convert from status code to exit code
…_concurrent_futures-v2
| Test the exit code of the resource tracker based on if there were left leaked resources when we stop the process. | ||
| If not leaked resources were found, exit code should be 0, otherwise 1 |
There was a problem hiding this comment.
Thanks for the comment. Nit, but can you please ensure the line length remains reasonable (say < 80 characters) ? This can otherwise be annoying when reading/reviewing code.
Sorry, something went wrong.
There was a problem hiding this comment.
Yes, I'll fix it. I'm used to 120 chars line length...
Sorry, something went wrong.
…_concurrent_futures-v2
|
We should get #106795 merged first to pass the test. |
Sorry, something went wrong.
| runner = unittest.TextTestRunner() | ||
| runner.run(test_class('test_initializer')) |
There was a problem hiding this comment.
Again, can you please instead put these checks directly in FailingInitializerMixin?
For example, add a tearDown method:
def tearDown(self):
super().tearDown() # shutdown executor
if self.mp_context and self.mp_context.get_start_method() in ("spawn", "forkserver"):
# Stop resource tracker manually now, so we can verify there are
# not leaked resources by checking the process exit code
from multiprocessing.resource_tracker import _resource_tracker
_resource_tracker._stop()
self.assertEqual(_resource_tracker._exitcode, 0)
Sorry, something went wrong.
There was a problem hiding this comment.
@pitrou Checking
Sorry, something went wrong.
There was a problem hiding this comment.
Doesn't work
$ ./python -m unittest test.test_concurrent_futures.ProcessPoolForkserverFailingInitializerTest -v
test_initializer (test.test_concurrent_futures.ProcessPoolForkserverFailingInitializerTest.test_initializer) ... /home/user/cpython/Lib/multiprocessing/resource_tracker.py:236: UserWarning: resource_tracker: There appear to be 3 leaked semaphore objects to clean up at shutdown
warnings.warn('resource_tracker: There appear to be %d '
FAIL
Traceback (most recent call last):
File "/home/user/cpython/Lib/multiprocessing/util.py", line 300, in _run_finalizers
finalizer()
File "/home/user/cpython/Lib/multiprocessing/util.py", line 224, in __call__
res = self._callback(*self._args, **self._kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/cpython/Lib/multiprocessing/synchronize.py", line 87, in _cleanup
sem_unlink(name)
FileNotFoundError: [Errno 2] No such file or directory
Traceback (most recent call last):
File "/home/user/cpython/Lib/multiprocessing/util.py", line 300, in _run_finalizers
finalizer()
File "/home/user/cpython/Lib/multiprocessing/util.py", line 224, in __call__
res = self._callback(*self._args, **self._kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/cpython/Lib/multiprocessing/synchronize.py", line 87, in _cleanup
sem_unlink(name)
FileNotFoundError: [Errno 2] No such file or directory
Traceback (most recent call last):
File "/home/user/cpython/Lib/multiprocessing/util.py", line 300, in _run_finalizers
finalizer()
File "/home/user/cpython/Lib/multiprocessing/util.py", line 224, in __call__
res = self._callback(*self._args, **self._kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/cpython/Lib/multiprocessing/synchronize.py", line 87, in _cleanup
sem_unlink(name)
FileNotFoundError: [Errno 2] No such file or directory
======================================================================
FAIL: test_initializer (test.test_concurrent_futures.ProcessPoolForkserverFailingInitializerTest.test_initializer)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/user/cpython/Lib/test/test_concurrent_futures.py", line 298, in tearDown
self.assertEqual(_resource_tracker._exitcode, 0)
AssertionError: 1 != 0
----------------------------------------------------------------------
Ran 1 test in 0.269s
FAILED (failures=1)
Sorry, something went wrong.
There was a problem hiding this comment.
Hmm, too bad :-(
Sorry, something went wrong.
…_concurrent_futures-v2
…_concurrent_futures-v2
|
@pitrou |
Sorry, something went wrong.
|
@bityob Sorry for the delay. There were some recent changes in git main that are causing conflicts. Could you merge from main and fix the conflicts? Thank you! |
Sorry, something went wrong.
…est_concurrent_futures.py) to new location (Lib/test/test_concurrent_futures/test_init.py)
…_futures-v2' of github.com:bityob/cpython into pythongh-104090-fix-leaked-semaphors-on-test_concurrent_futures-v2
Hey @pitrou, Thank you! I merged the main branch and resolved all conflicts. Please review again |
Sorry, something went wrong.
…_concurrent_futures-v2
|
Unfortunately there are CI failures which look related. Can you take a look? |
Sorry, something went wrong.
Yes, thanks. I'll check |
Sorry, something went wrong.
…_concurrent_futures-v2
|
I'd love to be able to tell whether ResourceTracker was successful, but testing it on the “live” global _resource_tracker interferes with other tests (or regrtest). |
Sorry, something went wrong.
…urceTracker instance Add a new 'dummy' resource, which has no side-effects when cleaned up. The ResourceTracker test then registers this 'dummy', and either unregisters it or not.
|
My continuation of this PR is here: #115410 |
Sorry, something went wrong.
This builds on #106807, which adds a return code to ResourceTracker, to make future debugging easier. Testing this “in situ” proved difficult, since the global ResourceTracker is involved in test infrastructure. So, the tests here create a new instance and feed it fake data. --------- Co-authored-by: Yonatan Bitton <yonatan.bitton@perception-point.io> Co-authored-by: Yonatan Bitton <bityob@gmail.com> Co-authored-by: Antoine Pitrou <antoine@python.org>
|
I've merged the continuation PR. |
Sorry, something went wrong.
Pull request was closed
…thonGH-115410) This builds on python#106807, which adds a return code to ResourceTracker, to make future debugging easier. Testing this “in situ” proved difficult, since the global ResourceTracker is involved in test infrastructure. So, the tests here create a new instance and feed it fake data. --------- Co-authored-by: Yonatan Bitton <yonatan.bitton@perception-point.io> Co-authored-by: Yonatan Bitton <bityob@gmail.com> Co-authored-by: Antoine Pitrou <antoine@python.org>
…thonGH-115410) This builds on python#106807, which adds a return code to ResourceTracker, to make future debugging easier. Testing this “in situ” proved difficult, since the global ResourceTracker is involved in test infrastructure. So, the tests here create a new instance and feed it fake data. --------- Co-authored-by: Yonatan Bitton <yonatan.bitton@perception-point.io> Co-authored-by: Yonatan Bitton <bityob@gmail.com> Co-authored-by: Antoine Pitrou <antoine@python.org>
…thonGH-115410) This builds on python#106807, which adds a return code to ResourceTracker, to make future debugging easier. Testing this “in situ” proved difficult, since the global ResourceTracker is involved in test infrastructure. So, the tests here create a new instance and feed it fake data. --------- Co-authored-by: Yonatan Bitton <yonatan.bitton@perception-point.io> Co-authored-by: Yonatan Bitton <bityob@gmail.com> Co-authored-by: Antoine Pitrou <antoine@python.org>
| Back | FazBrowse Home | New Git URL |
- Add tests to catch the resource leak bug in collectedDurations and verified that it fails without the fix
Show output