GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — gh-104090: Update Resource Tracker to return exit code based on resource leaked found or not by bityob · Pull Request #106807 · python/cpython

Conversation

@bityob

@bityob bityob commented Jul 16, 2023 •
edited by pitrou
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor
  1. Add tests to catch the resource leak bug in collectedDurations and verified that it fails without the fix
Show output
$ ./python -m unittest test.test_concurrent_futures.FailingInitializerResourcesTest
.
/home/user/cpython/Lib/multiprocessing/resource_tracker.py:228: 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 '
FTraceback (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_forkserver (test.test_concurrent_futures.FailingInitializerResourcesTest.test_forkserver)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/user/cpython/Lib/test/test_concurrent_futures.py", line 318, in test_forkserver
    self._test(ProcessPoolForkserverFailingInitializerTest)
  File "/home/user/cpython/Lib/test/test_concurrent_futures.py", line 312, in _test
    self.assertEqual(_resource_tracker._exitcode, 0)
AssertionError: 256 != 0

======================================================================
FAIL: test_spawn (test.test_concurrent_futures.FailingInitializerResourcesTest.test_spawn)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/user/cpython/Lib/test/test_concurrent_futures.py", line 315, in test_spawn
    self._test(ProcessPoolSpawnFailingInitializerTest)
  File "/home/user/cpython/Lib/test/test_concurrent_futures.py", line 312, in _test
    self.assertEqual(_resource_tracker._exitcode, 0)
AssertionError: 256 != 0

----------------------------------------------------------------------
Ran 2 tests in 0.727s

FAILED (failures=2)
0.33s
  1. Add returning exit code from resource_tracker.py based on the cleanup result, so we can check what was the result
  2. Add tests for Resource Tracker exit code based on leaked/no leaked resources
  • Issue: Leaked semaphore objects in test_concurrent_futures #104090

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@bityob
Updated Resource Tracker to return exit code based on leaking found o…
70a35a2
…r not and added tests for that
@bedevere-bot bedevere-bot added the awaiting review label Jul 16, 2023
@bedevere-bot

bedevere-bot commented Jul 16, 2023

Copy link
Copy Markdown

Most changes to Python require a NEWS entry.

Please add it using the blurb_it web app or the blurb command-line tool.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-bot bedevere-bot mentioned this pull request Jul 16, 2023
Leaked semaphore objects in test_concurrent_futures #104090
Open
@bityob
Add NEWS file
da7e245
@bityob bityob mentioned this pull request Jul 16, 2023
gh-104090: Fix unittest collectedDurations resources leak #106795
Merged
iritkatriel
iritkatriel reviewed Jul 16, 2023
View reviewed changes
Comment thread Lib/multiprocessing/resource_tracker.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

iritkatriel
iritkatriel reviewed Jul 17, 2023
View reviewed changes
Comment thread Lib/test/_test_multiprocessing.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

bityob added 2 commits July 17, 2023 18:48
@bityob
Use subTest for the parametrize the same tests with different values
1de022d
@bityob
Merge branch 'main' into pythongh-104090-fix-leaked-semaphors-on-test…
48bea84
…_concurrent_futures-v2
@iritkatriel
iritkatriel requested a review from pitrou July 17, 2023 15:59
pitrou
pitrou reviewed Jul 17, 2023
View reviewed changes
Comment thread Lib/test/_test_multiprocessing.py Outdated

# Reset exit code value
_resource_tracker._exitcode = None
exit_code_assert = self.assertNotEqual

@pitrou pitrou Jul 17, 2023

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@bityob bityob Jul 18, 2023

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
pitrou
pitrou reviewed Jul 17, 2023
View reviewed changes
Comment thread Lib/test/_test_multiprocessing.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

pitrou
pitrou reviewed Jul 17, 2023
View reviewed changes
Comment thread Lib/test/test_concurrent_futures.py Outdated
Comment on lines +300 to +305
runner = unittest.TextTestRunner()
result = runner.run(test_class('test_initializer'))

self.assertEqual(result.testsRun, 1)
self.assertEqual(result.failures, [])
self.assertEqual(result.errors, [])

@pitrou pitrou Jul 17, 2023

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@bityob bityob Jul 18, 2023

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@pitrou pitrou Jul 18, 2023

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@bityob bityob Jul 18, 2023

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@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.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@pitrou pitrou Jul 18, 2023

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
bityob added 4 commits July 18, 2023 12:03
@bityob
Updated tests based on PR comments, and fix the resource_tracker code…
31bc4af
… to convert from status code to exit code
@bityob
Clean test
47551a3
@bityob
Added comment for test and simplified the logic
a02fdbe
@bityob
Merge branch 'main' into pythongh-104090-fix-leaked-semaphors-on-test…
9d0369e
…_concurrent_futures-v2
pitrou
pitrou reviewed Jul 18, 2023
View reviewed changes
Comment thread Lib/test/_test_multiprocessing.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

pitrou
pitrou reviewed Jul 18, 2023
View reviewed changes
Comment thread Lib/test/_test_multiprocessing.py Outdated
Comment on lines +5564 to +5565
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

@pitrou pitrou Jul 18, 2023

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@bityob bityob Jul 18, 2023

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I'll fix it. I'm used to 120 chars line length...

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
pitrou
pitrou reviewed Jul 18, 2023
View reviewed changes
Comment thread Misc/NEWS.d/next/Core and Builtins/2023-07-16-15-02-47.gh-issue-104090.oMjNa9.rst Resolved

Uh oh!

There was an error while loading. Please reload this page.

pitrou
pitrou reviewed Jul 18, 2023
View reviewed changes
Comment thread Lib/multiprocessing/resource_tracker.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

pitrou
pitrou reviewed Jul 18, 2023
View reviewed changes
Comment thread Lib/test/_test_multiprocessing.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

bityob and others added 4 commits July 18, 2023 13:38
@bityob
Fix tests and News based on PR comments
4dbb777
@bityob
Added reseting the exit code when the process should run again
bfd1e8e
@bityob
Added more clearing queue methods beside del (closing and calling gc.…
043ae90
…collect
@bityob
Merge branch 'main' into pythongh-104090-fix-leaked-semaphors-on-test…
850b5bb
…_concurrent_futures-v2
@sunmy2019

sunmy2019 commented Jul 19, 2023

Copy link
Copy Markdown
Member

We should get #106795 merged first to pass the test.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

pitrou
pitrou reviewed Jul 19, 2023
View reviewed changes
Comment thread Lib/test/test_concurrent_futures.py Outdated
Comment on lines +300 to +301
runner = unittest.TextTestRunner()
runner.run(test_class('test_initializer'))

@pitrou pitrou Jul 19, 2023

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@bityob bityob Jul 19, 2023

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pitrou Checking

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@bityob bityob Jul 19, 2023

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@pitrou pitrou Jul 19, 2023

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, too bad :-(

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@bityob
Merge branch 'main' into pythongh-104090-fix-leaked-semaphors-on-test…
6e82940
…_concurrent_futures-v2
@bityob
Merge branch 'main' into pythongh-104090-fix-leaked-semaphors-on-test…
3b21d5c
…_concurrent_futures-v2
@bityob
bityob requested a review from pitrou July 23, 2023 14:47
@bityob

bityob commented Aug 3, 2023

Copy link
Copy Markdown
Contributor Author

@pitrou
Hey,
Can you review again?
Thanks

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@pitrou

pitrou commented Aug 31, 2023

Copy link
Copy Markdown
Member

@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!

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

bityob added 3 commits August 31, 2023 20:32
@bityob
Merge main
fbd18ec
@bityob
Moved FailingInitializerResourcesTest class from old path (Lib/test/t…
e258cb3
…est_concurrent_futures.py) to new location (Lib/test/test_concurrent_futures/test_init.py)
@bityob
Merge branch 'pythongh-104090-fix-leaked-semaphors-on-test_concurrent…
5b886bf
…_futures-v2' of github.com:bityob/cpython into pythongh-104090-fix-leaked-semaphors-on-test_concurrent_futures-v2
@bityob

bityob commented Aug 31, 2023

Copy link
Copy Markdown
Contributor Author

@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!

Hey @pitrou, Thank you!

I merged the main branch and resolved all conflicts.

Please review again

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

bityob and others added 2 commits August 31, 2023 20:46
@bityob
Added missing import
915c8a3
@pitrou
Merge branch 'main' into pythongh-104090-fix-leaked-semaphors-on-test…
cd377e6
…_concurrent_futures-v2
@pitrou pitrou changed the title gh-104090: Updated Resource Tracker to return exit code based on resource leaked found or not gh-104090: Update Resource Tracker to return exit code based on resource leaked found or not Sep 19, 2023
pitrou
pitrou approved these changes Sep 19, 2023
View reviewed changes

@pitrou pitrou left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @bityob for the update. LGTM now, let's wait for CI.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@bedevere-app bedevere-app Bot added awaiting core review and removed awaiting review labels Sep 19, 2023
@pitrou
pitrou enabled auto-merge (squash) September 19, 2023 08:14
@pitrou

pitrou commented Sep 19, 2023

Copy link
Copy Markdown
Member

Unfortunately there are CI failures which look related. Can you take a look?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bityob

bityob commented Sep 21, 2023

Copy link
Copy Markdown
Contributor Author

Unfortunately there are CI failures which look related. Can you take a look?

Yes, thanks. I'll check

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@encukou
Merge branch 'main' into pythongh-104090-fix-leaked-semaphors-on-test…
27245ec
…_concurrent_futures-v2
@bityob
bityob requested a review from gpshead as a code owner February 5, 2024 14:24
@encukou

encukou commented Feb 5, 2024

Copy link
Copy Markdown
Member

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).
I'm planning to send a PR based on this one, which will test a fresh ResourceTracker instance.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

encukou added a commit to encukou/cpython that referenced this pull request Feb 13, 2024
@encukou
pythongh-106807: test_resource_tracker_exit_code: Use a separate Reso…
8aef868
…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.
@encukou encukou mentioned this pull request Feb 13, 2024
gh-104090: Add exit code to multiprocessing ResourceTracker #115410
Merged
@encukou

encukou commented Feb 13, 2024

Copy link
Copy Markdown
Member

My continuation of this PR is here: #115410

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

encukou added a commit that referenced this pull request Feb 21, 2024
@encukou @bityob @pitrou
gh-104090: Add exit code to multiprocessing ResourceTracker (GH-115410)
4a9e649
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 <[email protected]>
Co-authored-by: Yonatan Bitton <[email protected]>
Co-authored-by: Antoine Pitrou <[email protected]>
@encukou

encukou commented Feb 21, 2024

Copy link
Copy Markdown
Member

I've merged the continuation PR.
Thanks for doing the hard part!

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@encukou encukou closed this Feb 21, 2024
auto-merge was automatically disabled February 21, 2024 12:56

Pull request was closed

woodruffw pushed a commit to woodruffw-forks/cpython that referenced this pull request Mar 4, 2024
@encukou @bityob
@pitrou @woodruffw
pythongh-104090: Add exit code to multiprocessing ResourceTracker (py…
3104ddc
…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 <[email protected]>
Co-authored-by: Yonatan Bitton <[email protected]>
Co-authored-by: Antoine Pitrou <[email protected]>
diegorusso pushed a commit to diegorusso/cpython that referenced this pull request Apr 17, 2024
@encukou @bityob
@pitrou @diegorusso
pythongh-104090: Add exit code to multiprocessing ResourceTracker (py…
8d82be7
…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 <[email protected]>
Co-authored-by: Yonatan Bitton <[email protected]>
Co-authored-by: Antoine Pitrou <[email protected]>
LukasWoodtli pushed a commit to LukasWoodtli/cpython that referenced this pull request Jan 22, 2025
@encukou @bityob
@pitrou @LukasWoodtli
pythongh-104090: Add exit code to multiprocessing ResourceTracker (py…
8a9c5ec
…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 <[email protected]>
Co-authored-by: Yonatan Bitton <[email protected]>
Co-authored-by: Antoine Pitrou <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@iritkatriel iritkatriel iritkatriel left review comments
@pitrou pitrou pitrou approved these changes
@gpshead gpshead Awaiting requested review from gpshead gpshead is a code owner

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

awaiting core review

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

6 participants

@bityob @bedevere-bot @sunmy2019 @pitrou @encukou @iritkatriel
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.