◐ Shell
clean mode source ↗

Issue 47205: posix.sched_{get|set}affinity(-1) no longer returns ProcessLookup causing test failures on FreeBSD

Two test cases have been failing on FreeBSD buildbot for a while. Let's skip the error check on FreeBSD for now.

0:27:24 load avg: 1.97 Re-running test_posix in verbose mode (matching: test_sched_getaffinity, test_sched_setaffinity)
test_sched_getaffinity (test.test_posix.PosixTester.test_sched_getaffinity) ... FAIL
test_sched_setaffinity (test.test_posix.PosixTester.test_sched_setaffinity) ... FAIL
======================================================================
FAIL: test_sched_getaffinity (test.test_posix.PosixTester.test_sched_getaffinity)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/home/buildbot/python/pull_request.koobs-freebsd-564d/build/Lib/test/test_posix.py", line 1197, in test_sched_getaffinity
    self.assertRaises(OSError, posix.sched_getaffinity, -1)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: OSError not raised by sched_getaffinity
======================================================================
FAIL: test_sched_setaffinity (test.test_posix.PosixTester.test_sched_setaffinity)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/home/buildbot/python/pull_request.koobs-freebsd-564d/build/Lib/test/test_posix.py", line 1215, in test_sched_setaffinity
    self.assertRaises(OSError, posix.sched_setaffinity, -1, mask)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: OSError not raised by sched_setaffinity
----------------------------------------------------------------------
Ran 2 tests in 0.015s
From one of our base/kernel developers:

--------------------------------------------------------------

> koobs wrote:
>
> I don't grok the system call semantics, but it appears the issue is calls
> with the '-1' argument:
>
> mask = posix.sched_getaffinity(0)
> ...
> self.assertRaises(OSError, posix.sched_getaffinity, -1)
> ...
> self.assertRaises(OSError, posix.sched_setaffinity, -1, mask)
>
> This line was added 10 years ago in:
>
> https://github.com/python/cpython/commit/848698727fcbb633246b56ab57080b4d5493c186
>
> It wants an OSError [1] and presumably was getting it before recent
> failures, but isn't anymore:
>
> [1] https://docs.python.org/3/library/exceptions.html#OSError

So this is the difference:

Python 3.11.0a6+ (heads/main:38ae5b8c0c, Apr  5 2022, 03:27:23) [GCC 11.2.0] on freebsd13
Type "help", "copyright", "credits" or "license" for more information.
>>> import posix
>>> mask = posix.sched_getaffinity(-1)
>>> mask
{0, 1, 2, 3, 4, 5, 6, 7}

Python 3.10.4 (main, Mar 25 2022, 00:00:00) [GCC 11.2.1 20220127 (Red Hat 11.2.1-9)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import posix
>>> mask = posix.sched_getaffinity(-1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ProcessLookupError: [Errno 3] No such process

FreeBSD always accepted -1 as denoting the current process, while Linux
does not.  In fact, Linux uses 0 as current process pid alias.

For FreeBSD, both -1 and 0 works as getpid(), and I do not see it right
to break our traditional API conventions.  I believe the test should be
fixed.

--------------------------------------------------------------

I am not sure what changed between 3.10 and main that changed/removed
ProcessLookupError as the return for posix.sched_{get|set}affinity
with -1 as the argument, but that appears to be the cause of the current test failure