Skip to content

Supporting Python 3.13#966

Closed
4383 wants to merge 10 commits intoeventlet:masterfrom
4383:python3.13
Closed

Supporting Python 3.13#966
4383 wants to merge 10 commits intoeventlet:masterfrom
4383:python3.13

Conversation

@4383
Copy link
Copy Markdown
Member

@4383 4383 commented Jun 10, 2024

@codecov
Copy link
Copy Markdown

codecov bot commented Jun 10, 2024

Codecov Report

Attention: Patch coverage is 0% with 6 lines in your changes missing coverage. Please review.

Project coverage is 56%. Comparing base (8637820) to head (7731bb4).
Report is 6 commits behind head on master.

Files with missing lines Patch % Lines
eventlet/green/thread.py 0% 5 Missing and 1 partial ⚠️
Additional details and impacted files
@@          Coverage Diff          @@
##           master   #966   +/-   ##
=====================================
- Coverage      56%    56%   -1%     
=====================================
  Files          89     89           
  Lines        9791   9797    +6     
  Branches     1826   1827    +1     
=====================================
- Hits         5497   5495    -2     
- Misses       3923   3930    +7     
- Partials      371    372    +1     
Flag Coverage Δ
ipv6 23% <0%> (-1%) ⬇️
py310asyncio 52% <0%> (-1%) ⬇️
py310epolls 53% <0%> (-1%) ⬇️
py310poll 53% <0%> (-1%) ⬇️
py310selects 53% <0%> (-1%) ⬇️
py311asyncio 52% <0%> (-1%) ⬇️
py311epolls 53% <0%> (-1%) ⬇️
py312asyncio 50% <0%> (-1%) ⬇️
py312epolls 51% <0%> (-1%) ⬇️
py37asyncio 50% <0%> (-1%) ⬇️
py37epolls 51% <0%> (-1%) ⬇️
py38asyncio 51% <0%> (-1%) ⬇️
py38epolls 53% <0%> (-1%) ⬇️
py38openssl 51% <0%> (-1%) ⬇️
py38poll 53% <0%> (-1%) ⬇️
py38selects 52% <0%> (-1%) ⬇️
py39asyncio 51% <0%> (-1%) ⬇️
py39dnspython1 51% <0%> (-1%) ⬇️
py39epolls 53% <0%> (-1%) ⬇️
py39poll 53% <0%> (-1%) ⬇️
py39selects 52% <0%> (-1%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@4383 4383 force-pushed the python3.13 branch 6 times, most recently from 4586340 to eee5cee Compare June 11, 2024 09:46
@itamarst
Copy link
Copy Markdown
Contributor

Note that for prereleases you need to be more specific in GitHub Actions, you can't just say "3.13" until 3.13 is actually out.

@4383
Copy link
Copy Markdown
Member Author

4383 commented Jun 11, 2024

Thanks @itamarst for the syntax fix.
I've no idea how to find the correspondance between the os and the python version in the workflow context... the github doc is not clear and the version manifest is a bit surprising...

  Version 3.13 was not found in the local cache
  Error: The version '3.13' with architecture 'x64' was not found for Ubuntu 24.04.
  The list of all available versions can be found here: https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json

@4383
Copy link
Copy Markdown
Member Author

4383 commented Jun 11, 2024

Indeed the beta suffix seems the right way to do that, kudos

@itamarst
Copy link
Copy Markdown
Contributor

It looks like 3.13 beta2 has only partially made it through the GitHub Actions support process; they did first part yesterday, so might become available today. So at minimum need to wait for that and rerun tests.

It's unclear to me why macOS is failing with a different kind of error.

Copy link
Copy Markdown
Contributor

@itamarst itamarst left a comment

Choose a reason for hiding this comment

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

Need to reach state where tests can actually run, blocked on GitHub Actions (no point in running on old beta).

@4383
Copy link
Copy Markdown
Member Author

4383 commented Jun 11, 2024

version": "3.13.0-beta.1" seems the last version available for Python 3.13

@4383
Copy link
Copy Markdown
Member Author

4383 commented Jun 11, 2024

@4383
Copy link
Copy Markdown
Member Author

4383 commented Jun 11, 2024

It looks like 3.13 beta2 has only partially made it through the GitHub Actions support process; they did first part yesterday, so might become available today. So at minimum need to wait for that and rerun tests.

No rush we can pause it during a couple of day. Python 3.13 will be officially released in October.

@4383
Copy link
Copy Markdown
Member Author

4383 commented Jun 11, 2024

Concerning macOS, I think we have to use darwin rather than macOS-latest.

@itamarst
Copy link
Copy Markdown
Contributor

Progress, of sorts. greenlet package doesn't work on 3.13, so that's a blocker.

@itamarst
Copy link
Copy Markdown
Contributor

We can track progress here: python-greenlet/greenlet#396

@4383
Copy link
Copy Markdown
Member Author

4383 commented Jun 17, 2024

Progress, of sorts. greenlet package doesn't work on 3.13, so that's a blocker.

That's a concerning problem, and far from our responsibility though...

@itamarst
Copy link
Copy Markdown
Contributor

It's being worked on, at least, so seems OK.

@itamarst
Copy link
Copy Markdown
Contributor

Looks like greenlet now supports 3.13.

@itamarst
Copy link
Copy Markdown
Contributor

itamarst commented Sep 11, 2024

Some 3.13 tests are now timing out, here's why:

$ .tox/py313/bin/python tests/isolated/patcher_threading_condition.py 
Traceback (most recent call last):
  File "/home/itamarst/devel/eventlet/eventlet/hubs/hub.py", line 471, in fire_timers
    timer()
    ~~~~~^^
  File "/home/itamarst/devel/eventlet/eventlet/hubs/timer.py", line 59, in __call__
    cb(*args, **kw)
    ~~^^^^^^^^^^^^^
  File "/home/itamarst/devel/eventlet/eventlet/semaphore.py", line 147, in _do_acquire
    waiter.switch()
    ~~~~~~~~~~~~~^^
greenlet.error: cannot switch to a different thread

@itamarst
Copy link
Copy Markdown
Contributor

itamarst commented Sep 11, 2024

As per python-greenlet/greenlet#425, the current approach to just reusing _thread.start_joinable_thread from stdlib is completely wrong. Instead, we need to either:

  1. Emulate (i.e. reimplement using greenlets) Python 3.13's new _ThreadHandle and start_joinable_thread APIs, since that's what stdlib threading.py is using in 3.13.
  2. Copy threading.py implementation from 3.12 and reuse it in 3.13.
  3. Not bother supporting 3.13; this depends on whether OpenStack wants this or not.

Just another example of the ways this project is unsustainable, then.

@4383
Copy link
Copy Markdown
Member Author

4383 commented Sep 11, 2024

Thanks for your feedback.

Unfortunatelly, from an openstack point of view, I don't think we will be able to ignore 3.13... I need to discuss that point with the infra team to see when they plan to introduce this python version in our supported runtimes.

Will back soon with details from our agenda.

@itamarst
Copy link
Copy Markdown
Contributor

That's fine, solving this is totally doable, just wanted to make sure it's worth someone spending time on.

@4383
Copy link
Copy Markdown
Member Author

4383 commented Sep 12, 2024

@itamarst Does this PR looks ok for review/merge, or do you plan to add something more into this branch?

@itamarst
Copy link
Copy Markdown
Contributor

Given 3.13 is unusable in this branch, the PR should not be merged yet.

@4383
Copy link
Copy Markdown
Member Author

4383 commented Sep 12, 2024

ack, thanks

@MeggyCal
Copy link
Copy Markdown

Hi, I tried your change on the stable Python 3.13 and the tests still throw an error. Hope that helps.

[  166s] =================================== FAILURES ===================================
[  166s] ___________________________ test_threading_condition ___________________________
[  166s] 
[  166s] path = '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threading_condition.py'
[  166s] env = None, args = None, timeout = 10, pythonpath_extend = None
[  166s] expect_pass = True
[  166s] 
[  166s]     def run_python(path, env=None, args=None, timeout=None, pythonpath_extend=None, expect_pass=False):
[  166s]         new_argv = [sys.executable]
[  166s]         new_env = os.environ.copy()
[  166s]         new_env.setdefault('eventlet_test_in_progress', 'yes')
[  166s]         src_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
[  166s]         if path:
[  166s]             path = os.path.abspath(path)
[  166s]             new_argv.append(path)
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(sys.path + [src_dir])
[  166s]         if env:
[  166s]             new_env.update(env)
[  166s]         if pythonpath_extend:
[  166s]             new_path = [p for p in new_env.get('PYTHONPATH', '').split(os.pathsep) if p]
[  166s]             new_path.extend(
[  166s]                 p if os.path.isabs(p) else os.path.join(src_dir, p) for p in pythonpath_extend
[  166s]             )
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(new_path)
[  166s]         if args:
[  166s]             new_argv.extend(args)
[  166s]         p = subprocess.Popen(
[  166s]             new_argv,
[  166s]             env=new_env,
[  166s]             stderr=subprocess.STDOUT,
[  166s]             stdin=subprocess.PIPE,
[  166s]             stdout=subprocess.PIPE,
[  166s]         )
[  166s]         if timeout is None:
[  166s]             timeout = 10
[  166s]         try:
[  166s] >           output, _ = p.communicate(timeout=timeout)
[  166s] 
[  166s] tests/__init__.py:338: 
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] /usr/lib64/python3.13/subprocess.py:1219: in communicate
[  166s]     stdout, stderr = self._communicate(input, endtime, timeout)
[  166s] /usr/lib64/python3.13/subprocess.py:2123: in _communicate
[  166s]     self._check_timeout(endtime, orig_timeout, stdout, stderr)
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] 
[  166s] self = <Popen: returncode: -9 args: ['/usr/bin/python3.13', '/home/abuild/rpmbuild/...>
[  166s] endtime = 105.174206268, orig_timeout = 10
[  166s] stdout_seq = [b'Traceback (most recent call last):\n', b'  File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/hubs/hub.py",...\n\tExpected: <greenlet.greenlet object at 0x7fb808ffec80 (otid=0x7fb809020630) suspended active started main>\n', b'']
[  166s] stderr_seq = None, skip_check_and_raise = False
[  166s] 
[  166s]     def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq,
[  166s]                        skip_check_and_raise=False):
[  166s]         """Convenience for checking if a timeout has expired."""
[  166s]         if endtime is None:
[  166s]             return
[  166s]         if skip_check_and_raise or _time() > endtime:
[  166s] >           raise TimeoutExpired(
[  166s]                     self.args, orig_timeout,
[  166s]                     output=b''.join(stdout_seq) if stdout_seq else None,
[  166s]                     stderr=b''.join(stderr_seq) if stderr_seq else None)
[  166s] E           subprocess.TimeoutExpired: Command '['/usr/bin/python3.13', '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threading_condition.py']' timed out after 10 seconds
[  166s] 
[  166s] /usr/lib64/python3.13/subprocess.py:1263: TimeoutExpired
[  166s] 
[  166s] During handling of the above exception, another exception occurred:
[  166s] 
[  166s]     def test_threading_condition():
[  166s] >       tests.run_isolated('patcher_threading_condition.py')
[  166s] 
[  166s] tests/patcher_test.py:490: 
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] tests/__init__.py:365: in run_isolated
[  166s]     run_python(prefix + path, **kwargs)
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] 
[  166s] path = '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threading_condition.py'
[  166s] env = None, args = None, timeout = 10, pythonpath_extend = None
[  166s] expect_pass = True
[  166s] 
[  166s]     def run_python(path, env=None, args=None, timeout=None, pythonpath_extend=None, expect_pass=False):
[  166s]         new_argv = [sys.executable]
[  166s]         new_env = os.environ.copy()
[  166s]         new_env.setdefault('eventlet_test_in_progress', 'yes')
[  166s]         src_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
[  166s]         if path:
[  166s]             path = os.path.abspath(path)
[  166s]             new_argv.append(path)
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(sys.path + [src_dir])
[  166s]         if env:
[  166s]             new_env.update(env)
[  166s]         if pythonpath_extend:
[  166s]             new_path = [p for p in new_env.get('PYTHONPATH', '').split(os.pathsep) if p]
[  166s]             new_path.extend(
[  166s]                 p if os.path.isabs(p) else os.path.join(src_dir, p) for p in pythonpath_extend
[  166s]             )
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(new_path)
[  166s]         if args:
[  166s]             new_argv.extend(args)
[  166s]         p = subprocess.Popen(
[  166s]             new_argv,
[  166s]             env=new_env,
[  166s]             stderr=subprocess.STDOUT,
[  166s]             stdin=subprocess.PIPE,
[  166s]             stdout=subprocess.PIPE,
[  166s]         )
[  166s]         if timeout is None:
[  166s]             timeout = 10
[  166s]         try:
[  166s]             output, _ = p.communicate(timeout=timeout)
[  166s]         except subprocess.TimeoutExpired:
[  166s]             p.kill()
[  166s]             output, _ = p.communicate(timeout=timeout)
[  166s]             if expect_pass:
[  166s]                 sys.stderr.write('Program {} output:\n---\n{}\n---\n'.format(path, output.decode()))
[  166s] >               assert False, 'timed out'
[  166s] E               AssertionError: timed out
[  166s] 
[  166s] tests/__init__.py:344: AssertionError
[  166s] ----------------------------- Captured stderr call -----------------------------
[  166s] Program /home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threading_condition.py output:
[  166s] ---
[  166s] Traceback (most recent call last):
[  166s]   File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/hubs/hub.py", line 471, in fire_timers
[  166s]     timer()
[  166s]     ~~~~~^^
[  166s]   File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/hubs/timer.py", line 59, in __call__
[  166s]     cb(*args, **kw)
[  166s]     ~~^^^^^^^^^^^^^
[  166s]   File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/semaphore.py", line 147, in _do_acquire
[  166s]     waiter.switch()
[  166s]     ~~~~~~~~~~~~~^^
[  166s] greenlet.error: Cannot switch to a different thread
[  166s] 	Current:  <greenlet.greenlet object at 0x7fb8073e4b80 (otid=0x7fb807710ba0) suspended active started main>
[  166s] 	Expected: <greenlet.greenlet object at 0x7fb808ffec80 (otid=0x7fb809020630) suspended active started main>
[  166s] 
[  166s] ---
[  166s] _____________________________ test_threading_join ______________________________
[  166s] 
[  166s] path = '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threading_join.py'
[  166s] env = None, args = None, timeout = 10, pythonpath_extend = None
[  166s] expect_pass = True
[  166s] 
[  166s]     def run_python(path, env=None, args=None, timeout=None, pythonpath_extend=None, expect_pass=False):
[  166s]         new_argv = [sys.executable]
[  166s]         new_env = os.environ.copy()
[  166s]         new_env.setdefault('eventlet_test_in_progress', 'yes')
[  166s]         src_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
[  166s]         if path:
[  166s]             path = os.path.abspath(path)
[  166s]             new_argv.append(path)
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(sys.path + [src_dir])
[  166s]         if env:
[  166s]             new_env.update(env)
[  166s]         if pythonpath_extend:
[  166s]             new_path = [p for p in new_env.get('PYTHONPATH', '').split(os.pathsep) if p]
[  166s]             new_path.extend(
[  166s]                 p if os.path.isabs(p) else os.path.join(src_dir, p) for p in pythonpath_extend
[  166s]             )
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(new_path)
[  166s]         if args:
[  166s]             new_argv.extend(args)
[  166s]         p = subprocess.Popen(
[  166s]             new_argv,
[  166s]             env=new_env,
[  166s]             stderr=subprocess.STDOUT,
[  166s]             stdin=subprocess.PIPE,
[  166s]             stdout=subprocess.PIPE,
[  166s]         )
[  166s]         if timeout is None:
[  166s]             timeout = 10
[  166s]         try:
[  166s] >           output, _ = p.communicate(timeout=timeout)
[  166s] 
[  166s] tests/__init__.py:338: 
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] /usr/lib64/python3.13/subprocess.py:1219: in communicate
[  166s]     stdout, stderr = self._communicate(input, endtime, timeout)
[  166s] /usr/lib64/python3.13/subprocess.py:2123: in _communicate
[  166s]     self._check_timeout(endtime, orig_timeout, stdout, stderr)
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] 
[  166s] self = <Popen: returncode: -9 args: ['/usr/bin/python3.13', '/home/abuild/rpmbuild/...>
[  166s] endtime = 115.243494156, orig_timeout = 10
[  166s] stdout_seq = [b'Traceback (most recent call last):\n', b'  File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/hubs/hub.py",...\n\tExpected: <greenlet.greenlet object at 0x7f5c2b9fab40 (otid=0x7f5c2b944540) suspended active started main>\n', b'']
[  166s] stderr_seq = None, skip_check_and_raise = False
[  166s] 
[  166s]     def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq,
[  166s]                        skip_check_and_raise=False):
[  166s]         """Convenience for checking if a timeout has expired."""
[  166s]         if endtime is None:
[  166s]             return
[  166s]         if skip_check_and_raise or _time() > endtime:
[  166s] >           raise TimeoutExpired(
[  166s]                     self.args, orig_timeout,
[  166s]                     output=b''.join(stdout_seq) if stdout_seq else None,
[  166s]                     stderr=b''.join(stderr_seq) if stderr_seq else None)
[  166s] E           subprocess.TimeoutExpired: Command '['/usr/bin/python3.13', '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threading_join.py']' timed out after 10 seconds
[  166s] 
[  166s] /usr/lib64/python3.13/subprocess.py:1263: TimeoutExpired
[  166s] 
[  166s] During handling of the above exception, another exception occurred:
[  166s] 
[  166s]     def test_threading_join():
[  166s] >       tests.run_isolated('patcher_threading_join.py')
[  166s] 
[  166s] tests/patcher_test.py:494: 
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] tests/__init__.py:365: in run_isolated
[  166s]     run_python(prefix + path, **kwargs)
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] 
[  166s] path = '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threading_join.py'
[  166s] env = None, args = None, timeout = 10, pythonpath_extend = None
[  166s] expect_pass = True
[  166s] 
[  166s]     def run_python(path, env=None, args=None, timeout=None, pythonpath_extend=None, expect_pass=False):
[  166s]         new_argv = [sys.executable]
[  166s]         new_env = os.environ.copy()
[  166s]         new_env.setdefault('eventlet_test_in_progress', 'yes')
[  166s]         src_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
[  166s]         if path:
[  166s]             path = os.path.abspath(path)
[  166s]             new_argv.append(path)
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(sys.path + [src_dir])
[  166s]         if env:
[  166s]             new_env.update(env)
[  166s]         if pythonpath_extend:
[  166s]             new_path = [p for p in new_env.get('PYTHONPATH', '').split(os.pathsep) if p]
[  166s]             new_path.extend(
[  166s]                 p if os.path.isabs(p) else os.path.join(src_dir, p) for p in pythonpath_extend
[  166s]             )
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(new_path)
[  166s]         if args:
[  166s]             new_argv.extend(args)
[  166s]         p = subprocess.Popen(
[  166s]             new_argv,
[  166s]             env=new_env,
[  166s]             stderr=subprocess.STDOUT,
[  166s]             stdin=subprocess.PIPE,
[  166s]             stdout=subprocess.PIPE,
[  166s]         )
[  166s]         if timeout is None:
[  166s]             timeout = 10
[  166s]         try:
[  166s]             output, _ = p.communicate(timeout=timeout)
[  166s]         except subprocess.TimeoutExpired:
[  166s]             p.kill()
[  166s]             output, _ = p.communicate(timeout=timeout)
[  166s]             if expect_pass:
[  166s]                 sys.stderr.write('Program {} output:\n---\n{}\n---\n'.format(path, output.decode()))
[  166s] >               assert False, 'timed out'
[  166s] E               AssertionError: timed out
[  166s] 
[  166s] tests/__init__.py:344: AssertionError
[  166s] ----------------------------- Captured stderr call -----------------------------
[  166s] Program /home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threading_join.py output:
[  166s] ---
[  166s] Traceback (most recent call last):
[  166s]   File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/hubs/hub.py", line 471, in fire_timers
[  166s]     timer()
[  166s]     ~~~~~^^
[  166s]   File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/hubs/timer.py", line 59, in __call__
[  166s]     cb(*args, **kw)
[  166s]     ~~^^^^^^^^^^^^^
[  166s]   File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/semaphore.py", line 147, in _do_acquire
[  166s]     waiter.switch()
[  166s]     ~~~~~~~~~~~~~^^
[  166s] greenlet.error: Cannot switch to a different thread
[  166s] 	Current:  <greenlet.greenlet object at 0x7f5c29e37c80 (otid=0x7f5c2a197f90) suspended active started main>
[  166s] 	Expected: <greenlet.greenlet object at 0x7f5c2b9fab40 (otid=0x7f5c2b944540) suspended active started main>
[  166s] 
[  166s] ---
[  166s] _________________________ test_socketserver_selectors __________________________
[  166s] 
[  166s] path = '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_socketserver_selectors.py'
[  166s] env = None, args = None, timeout = 10, pythonpath_extend = None
[  166s] expect_pass = True
[  166s] 
[  166s]     def run_python(path, env=None, args=None, timeout=None, pythonpath_extend=None, expect_pass=False):
[  166s]         new_argv = [sys.executable]
[  166s]         new_env = os.environ.copy()
[  166s]         new_env.setdefault('eventlet_test_in_progress', 'yes')
[  166s]         src_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
[  166s]         if path:
[  166s]             path = os.path.abspath(path)
[  166s]             new_argv.append(path)
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(sys.path + [src_dir])
[  166s]         if env:
[  166s]             new_env.update(env)
[  166s]         if pythonpath_extend:
[  166s]             new_path = [p for p in new_env.get('PYTHONPATH', '').split(os.pathsep) if p]
[  166s]             new_path.extend(
[  166s]                 p if os.path.isabs(p) else os.path.join(src_dir, p) for p in pythonpath_extend
[  166s]             )
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(new_path)
[  166s]         if args:
[  166s]             new_argv.extend(args)
[  166s]         p = subprocess.Popen(
[  166s]             new_argv,
[  166s]             env=new_env,
[  166s]             stderr=subprocess.STDOUT,
[  166s]             stdin=subprocess.PIPE,
[  166s]             stdout=subprocess.PIPE,
[  166s]         )
[  166s]         if timeout is None:
[  166s]             timeout = 10
[  166s]         try:
[  166s] >           output, _ = p.communicate(timeout=timeout)
[  166s] 
[  166s] tests/__init__.py:338: 
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] /usr/lib64/python3.13/subprocess.py:1219: in communicate
[  166s]     stdout, stderr = self._communicate(input, endtime, timeout)
[  166s] /usr/lib64/python3.13/subprocess.py:2123: in _communicate
[  166s]     self._check_timeout(endtime, orig_timeout, stdout, stderr)
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] 
[  166s] self = <Popen: returncode: -9 args: ['/usr/bin/python3.13', '/home/abuild/rpmbuild/...>
[  166s] endtime = 125.333407656, orig_timeout = 10
[  166s] stdout_seq = [b'Traceback (most recent call last):\n', b'  File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/hubs/hub.py",...\n\tExpected: <greenlet.greenlet object at 0x7fe48c302d80 (otid=0x7fe48c893ae0) suspended active started main>\n', b'']
[  166s] stderr_seq = None, skip_check_and_raise = False
[  166s] 
[  166s]     def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq,
[  166s]                        skip_check_and_raise=False):
[  166s]         """Convenience for checking if a timeout has expired."""
[  166s]         if endtime is None:
[  166s]             return
[  166s]         if skip_check_and_raise or _time() > endtime:
[  166s] >           raise TimeoutExpired(
[  166s]                     self.args, orig_timeout,
[  166s]                     output=b''.join(stdout_seq) if stdout_seq else None,
[  166s]                     stderr=b''.join(stderr_seq) if stderr_seq else None)
[  166s] E           subprocess.TimeoutExpired: Command '['/usr/bin/python3.13', '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_socketserver_selectors.py']' timed out after 10 seconds
[  166s] 
[  166s] /usr/lib64/python3.13/subprocess.py:1263: TimeoutExpired
[  166s] 
[  166s] During handling of the above exception, another exception occurred:
[  166s] 
[  166s]     def test_socketserver_selectors():
[  166s] >       tests.run_isolated('patcher_socketserver_selectors.py')
[  166s] 
[  166s] tests/patcher_test.py:498: 
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] tests/__init__.py:365: in run_isolated
[  166s]     run_python(prefix + path, **kwargs)
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] 
[  166s] path = '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_socketserver_selectors.py'
[  166s] env = None, args = None, timeout = 10, pythonpath_extend = None
[  166s] expect_pass = True
[  166s] 
[  166s]     def run_python(path, env=None, args=None, timeout=None, pythonpath_extend=None, expect_pass=False):
[  166s]         new_argv = [sys.executable]
[  166s]         new_env = os.environ.copy()
[  166s]         new_env.setdefault('eventlet_test_in_progress', 'yes')
[  166s]         src_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
[  166s]         if path:
[  166s]             path = os.path.abspath(path)
[  166s]             new_argv.append(path)
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(sys.path + [src_dir])
[  166s]         if env:
[  166s]             new_env.update(env)
[  166s]         if pythonpath_extend:
[  166s]             new_path = [p for p in new_env.get('PYTHONPATH', '').split(os.pathsep) if p]
[  166s]             new_path.extend(
[  166s]                 p if os.path.isabs(p) else os.path.join(src_dir, p) for p in pythonpath_extend
[  166s]             )
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(new_path)
[  166s]         if args:
[  166s]             new_argv.extend(args)
[  166s]         p = subprocess.Popen(
[  166s]             new_argv,
[  166s]             env=new_env,
[  166s]             stderr=subprocess.STDOUT,
[  166s]             stdin=subprocess.PIPE,
[  166s]             stdout=subprocess.PIPE,
[  166s]         )
[  166s]         if timeout is None:
[  166s]             timeout = 10
[  166s]         try:
[  166s]             output, _ = p.communicate(timeout=timeout)
[  166s]         except subprocess.TimeoutExpired:
[  166s]             p.kill()
[  166s]             output, _ = p.communicate(timeout=timeout)
[  166s]             if expect_pass:
[  166s]                 sys.stderr.write('Program {} output:\n---\n{}\n---\n'.format(path, output.decode()))
[  166s] >               assert False, 'timed out'
[  166s] E               AssertionError: timed out
[  166s] 
[  166s] tests/__init__.py:344: AssertionError
[  166s] ----------------------------- Captured stderr call -----------------------------
[  166s] Program /home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_socketserver_selectors.py output:
[  166s] ---
[  166s] Traceback (most recent call last):
[  166s]   File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/hubs/hub.py", line 471, in fire_timers
[  166s]     timer()
[  166s]     ~~~~~^^
[  166s]   File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/hubs/timer.py", line 59, in __call__
[  166s]     cb(*args, **kw)
[  166s]     ~~^^^^^^^^^^^^^
[  166s]   File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/semaphore.py", line 147, in _do_acquire
[  166s]     waiter.switch()
[  166s]     ~~~~~~~~~~~~~^^
[  166s] greenlet.error: Cannot switch to a different thread
[  166s] 	Current:  <greenlet.greenlet object at 0x7fe48ab8b3c0 (otid=0x7fe48ad96f40) suspended active started main>
[  166s] 	Expected: <greenlet.greenlet object at 0x7fe48c302d80 (otid=0x7fe48c893ae0) suspended active started main>
[  166s] 
[  166s] ---
[  166s] ____________________________ test_threading_current ____________________________
[  166s] 
[  166s] path = '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threading_current.py'
[  166s] env = None, args = None, timeout = 10, pythonpath_extend = None
[  166s] expect_pass = True
[  166s] 
[  166s]     def run_python(path, env=None, args=None, timeout=None, pythonpath_extend=None, expect_pass=False):
[  166s]         new_argv = [sys.executable]
[  166s]         new_env = os.environ.copy()
[  166s]         new_env.setdefault('eventlet_test_in_progress', 'yes')
[  166s]         src_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
[  166s]         if path:
[  166s]             path = os.path.abspath(path)
[  166s]             new_argv.append(path)
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(sys.path + [src_dir])
[  166s]         if env:
[  166s]             new_env.update(env)
[  166s]         if pythonpath_extend:
[  166s]             new_path = [p for p in new_env.get('PYTHONPATH', '').split(os.pathsep) if p]
[  166s]             new_path.extend(
[  166s]                 p if os.path.isabs(p) else os.path.join(src_dir, p) for p in pythonpath_extend
[  166s]             )
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(new_path)
[  166s]         if args:
[  166s]             new_argv.extend(args)
[  166s]         p = subprocess.Popen(
[  166s]             new_argv,
[  166s]             env=new_env,
[  166s]             stderr=subprocess.STDOUT,
[  166s]             stdin=subprocess.PIPE,
[  166s]             stdout=subprocess.PIPE,
[  166s]         )
[  166s]         if timeout is None:
[  166s]             timeout = 10
[  166s]         try:
[  166s] >           output, _ = p.communicate(timeout=timeout)
[  166s] 
[  166s] tests/__init__.py:338: 
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] /usr/lib64/python3.13/subprocess.py:1219: in communicate
[  166s]     stdout, stderr = self._communicate(input, endtime, timeout)
[  166s] /usr/lib64/python3.13/subprocess.py:2123: in _communicate
[  166s]     self._check_timeout(endtime, orig_timeout, stdout, stderr)
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] 
[  166s] self = <Popen: returncode: -9 args: ['/usr/bin/python3.13', '/home/abuild/rpmbuild/...>
[  166s] endtime = 135.99963593299998, orig_timeout = 10, stdout_seq = [b'']
[  166s] stderr_seq = None, skip_check_and_raise = False
[  166s] 
[  166s]     def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq,
[  166s]                        skip_check_and_raise=False):
[  166s]         """Convenience for checking if a timeout has expired."""
[  166s]         if endtime is None:
[  166s]             return
[  166s]         if skip_check_and_raise or _time() > endtime:
[  166s] >           raise TimeoutExpired(
[  166s]                     self.args, orig_timeout,
[  166s]                     output=b''.join(stdout_seq) if stdout_seq else None,
[  166s]                     stderr=b''.join(stderr_seq) if stderr_seq else None)
[  166s] E           subprocess.TimeoutExpired: Command '['/usr/bin/python3.13', '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threading_current.py']' timed out after 10 seconds
[  166s] 
[  166s] /usr/lib64/python3.13/subprocess.py:1263: TimeoutExpired
[  166s] 
[  166s] During handling of the above exception, another exception occurred:
[  166s] 
[  166s]     def test_threading_current():
[  166s] >       tests.run_isolated('patcher_threading_current.py')
[  166s] 
[  166s] tests/patcher_test.py:510: 
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] tests/__init__.py:365: in run_isolated
[  166s]     run_python(prefix + path, **kwargs)
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] 
[  166s] path = '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threading_current.py'
[  166s] env = None, args = None, timeout = 10, pythonpath_extend = None
[  166s] expect_pass = True
[  166s] 
[  166s]     def run_python(path, env=None, args=None, timeout=None, pythonpath_extend=None, expect_pass=False):
[  166s]         new_argv = [sys.executable]
[  166s]         new_env = os.environ.copy()
[  166s]         new_env.setdefault('eventlet_test_in_progress', 'yes')
[  166s]         src_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
[  166s]         if path:
[  166s]             path = os.path.abspath(path)
[  166s]             new_argv.append(path)
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(sys.path + [src_dir])
[  166s]         if env:
[  166s]             new_env.update(env)
[  166s]         if pythonpath_extend:
[  166s]             new_path = [p for p in new_env.get('PYTHONPATH', '').split(os.pathsep) if p]
[  166s]             new_path.extend(
[  166s]                 p if os.path.isabs(p) else os.path.join(src_dir, p) for p in pythonpath_extend
[  166s]             )
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(new_path)
[  166s]         if args:
[  166s]             new_argv.extend(args)
[  166s]         p = subprocess.Popen(
[  166s]             new_argv,
[  166s]             env=new_env,
[  166s]             stderr=subprocess.STDOUT,
[  166s]             stdin=subprocess.PIPE,
[  166s]             stdout=subprocess.PIPE,
[  166s]         )
[  166s]         if timeout is None:
[  166s]             timeout = 10
[  166s]         try:
[  166s]             output, _ = p.communicate(timeout=timeout)
[  166s]         except subprocess.TimeoutExpired:
[  166s]             p.kill()
[  166s]             output, _ = p.communicate(timeout=timeout)
[  166s]             if expect_pass:
[  166s]                 sys.stderr.write('Program {} output:\n---\n{}\n---\n'.format(path, output.decode()))
[  166s] >               assert False, 'timed out'
[  166s] E               AssertionError: timed out
[  166s] 
[  166s] tests/__init__.py:344: AssertionError
[  166s] ----------------------------- Captured stderr call -----------------------------
[  166s] Program /home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threading_current.py output:
[  166s] ---
[  166s] 
[  166s] ---
[  166s] ___________________________ test_threadpoolexecutor ____________________________
[  166s] 
[  166s] path = '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threadpoolexecutor.py'
[  166s] env = None, args = None, timeout = 10, pythonpath_extend = None
[  166s] expect_pass = True
[  166s] 
[  166s]     def run_python(path, env=None, args=None, timeout=None, pythonpath_extend=None, expect_pass=False):
[  166s]         new_argv = [sys.executable]
[  166s]         new_env = os.environ.copy()
[  166s]         new_env.setdefault('eventlet_test_in_progress', 'yes')
[  166s]         src_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
[  166s]         if path:
[  166s]             path = os.path.abspath(path)
[  166s]             new_argv.append(path)
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(sys.path + [src_dir])
[  166s]         if env:
[  166s]             new_env.update(env)
[  166s]         if pythonpath_extend:
[  166s]             new_path = [p for p in new_env.get('PYTHONPATH', '').split(os.pathsep) if p]
[  166s]             new_path.extend(
[  166s]                 p if os.path.isabs(p) else os.path.join(src_dir, p) for p in pythonpath_extend
[  166s]             )
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(new_path)
[  166s]         if args:
[  166s]             new_argv.extend(args)
[  166s]         p = subprocess.Popen(
[  166s]             new_argv,
[  166s]             env=new_env,
[  166s]             stderr=subprocess.STDOUT,
[  166s]             stdin=subprocess.PIPE,
[  166s]             stdout=subprocess.PIPE,
[  166s]         )
[  166s]         if timeout is None:
[  166s]             timeout = 10
[  166s]         try:
[  166s] >           output, _ = p.communicate(timeout=timeout)
[  166s] 
[  166s] tests/__init__.py:338: 
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] /usr/lib64/python3.13/subprocess.py:1219: in communicate
[  166s]     stdout, stderr = self._communicate(input, endtime, timeout)
[  166s] /usr/lib64/python3.13/subprocess.py:2123: in _communicate
[  166s]     self._check_timeout(endtime, orig_timeout, stdout, stderr)
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] 
[  166s] self = <Popen: returncode: -9 args: ['/usr/bin/python3.13', '/home/abuild/rpmbuild/...>
[  166s] endtime = 146.089211474, orig_timeout = 10
[  166s] stdout_seq = [b'Traceback (most recent call last):\n', b'  File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/hubs/hub.py",...\n\tExpected: <greenlet.greenlet object at 0x7f90c65feac0 (otid=0x7f90c6657990) suspended active started main>\n', b'']
[  166s] stderr_seq = None, skip_check_and_raise = False
[  166s] 
[  166s]     def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq,
[  166s]                        skip_check_and_raise=False):
[  166s]         """Convenience for checking if a timeout has expired."""
[  166s]         if endtime is None:
[  166s]             return
[  166s]         if skip_check_and_raise or _time() > endtime:
[  166s] >           raise TimeoutExpired(
[  166s]                     self.args, orig_timeout,
[  166s]                     output=b''.join(stdout_seq) if stdout_seq else None,
[  166s]                     stderr=b''.join(stderr_seq) if stderr_seq else None)
[  166s] E           subprocess.TimeoutExpired: Command '['/usr/bin/python3.13', '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threadpoolexecutor.py']' timed out after 10 seconds
[  166s] 
[  166s] /usr/lib64/python3.13/subprocess.py:1263: TimeoutExpired
[  166s] 
[  166s] During handling of the above exception, another exception occurred:
[  166s] 
[  166s]     def test_threadpoolexecutor():
[  166s] >       tests.run_isolated('patcher_threadpoolexecutor.py')
[  166s] 
[  166s] tests/patcher_test.py:514: 
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] tests/__init__.py:365: in run_isolated
[  166s]     run_python(prefix + path, **kwargs)
[  166s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[  166s] 
[  166s] path = '/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threadpoolexecutor.py'
[  166s] env = None, args = None, timeout = 10, pythonpath_extend = None
[  166s] expect_pass = True
[  166s] 
[  166s]     def run_python(path, env=None, args=None, timeout=None, pythonpath_extend=None, expect_pass=False):
[  166s]         new_argv = [sys.executable]
[  166s]         new_env = os.environ.copy()
[  166s]         new_env.setdefault('eventlet_test_in_progress', 'yes')
[  166s]         src_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
[  166s]         if path:
[  166s]             path = os.path.abspath(path)
[  166s]             new_argv.append(path)
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(sys.path + [src_dir])
[  166s]         if env:
[  166s]             new_env.update(env)
[  166s]         if pythonpath_extend:
[  166s]             new_path = [p for p in new_env.get('PYTHONPATH', '').split(os.pathsep) if p]
[  166s]             new_path.extend(
[  166s]                 p if os.path.isabs(p) else os.path.join(src_dir, p) for p in pythonpath_extend
[  166s]             )
[  166s]             new_env['PYTHONPATH'] = os.pathsep.join(new_path)
[  166s]         if args:
[  166s]             new_argv.extend(args)
[  166s]         p = subprocess.Popen(
[  166s]             new_argv,
[  166s]             env=new_env,
[  166s]             stderr=subprocess.STDOUT,
[  166s]             stdin=subprocess.PIPE,
[  166s]             stdout=subprocess.PIPE,
[  166s]         )
[  166s]         if timeout is None:
[  166s]             timeout = 10
[  166s]         try:
[  166s]             output, _ = p.communicate(timeout=timeout)
[  166s]         except subprocess.TimeoutExpired:
[  166s]             p.kill()
[  166s]             output, _ = p.communicate(timeout=timeout)
[  166s]             if expect_pass:
[  166s]                 sys.stderr.write('Program {} output:\n---\n{}\n---\n'.format(path, output.decode()))
[  166s] >               assert False, 'timed out'
[  166s] E               AssertionError: timed out
[  166s] 
[  166s] tests/__init__.py:344: AssertionError
[  166s] ----------------------------- Captured stderr call -----------------------------
[  166s] Program /home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/isolated/patcher_threadpoolexecutor.py output:
[  166s] ---
[  166s] Traceback (most recent call last):
[  166s]   File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/hubs/hub.py", line 471, in fire_timers
[  166s]     timer()
[  166s]     ~~~~~^^
[  166s]   File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/hubs/timer.py", line 59, in __call__
[  166s]     cb(*args, **kw)
[  166s]     ~~^^^^^^^^^^^^^
[  166s]   File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/semaphore.py", line 147, in _do_acquire
[  166s]     waiter.switch()
[  166s]     ~~~~~~~~~~~~~^^
[  166s] greenlet.error: Cannot switch to a different thread
[  166s] 	Current:  <greenlet.greenlet object at 0x7f90c53bb880 (otid=0x7f90c4f73180) suspended active started main>
[  166s] 	Expected: <greenlet.greenlet object at 0x7f90c65feac0 (otid=0x7f90c6657990) suspended active started main>
[  166s] 
[  166s] ---
[  166s] =============================== warnings summary ===============================
[  166s] tests/api_test.py: 2 warnings
[  166s] tests/convenience_test.py: 2 warnings
[  166s] tests/greenio_test.py: 1 warning
[  166s] tests/ssl_test.py: 26 warnings
[  166s] tests/websocket_test.py: 2 warnings
[  166s] tests/wsgi_test.py: 10 warnings
[  166s]   /home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/green/ssl.py:97: DeprecationWarning: ssl.PROTOCOL_TLS is deprecated
[  166s]     context = _original_sslcontext(protocol=ssl_version)
[  166s] 
[  166s] tests/backdoor_test.py::BackdoorTest::test_quick_client_disconnect
[  166s]   /usr/lib/python3.13/site-packages/_pytest/unraisableexception.py:85: PytestUnraisableExceptionWarning: Exception ignored in: <_io.TextIOWrapper mode='rw' encoding='UTF-8'>
[  166s]   
[  166s]   Traceback (most recent call last):
[  166s]     File "/usr/lib64/python3.13/socket.py", line 737, in write
[  166s]       return self._sock.send(b)
[  166s]              ~~~~~~~~~~~~~~~^^^
[  166s]     File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/greenio/base.py", line 383, in send
[  166s]       return self._send_loop(self.fd.send, data, flags)
[  166s]              ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
[  166s]     File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/greenio/base.py", line 370, in _send_loop
[  166s]       return send_method(data, *args)
[  166s]   BrokenPipeError: [Errno 32] Broken pipe
[  166s]   
[  166s]   During handling of the above exception, another exception occurred:
[  166s]   
[  166s]   Traceback (most recent call last):
[  166s]     File "/usr/lib64/python3.13/socket.py", line 737, in write
[  166s]       return self._sock.send(b)
[  166s]              ~~~~~~~~~~~~~~~^^^
[  166s]     File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/greenio/base.py", line 383, in send
[  166s]       return self._send_loop(self.fd.send, data, flags)
[  166s]              ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
[  166s]     File "/home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/greenio/base.py", line 370, in _send_loop
[  166s]       return send_method(data, *args)
[  166s]   BrokenPipeError: [Errno 32] Broken pipe
[  166s]   
[  166s]     warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))
[  166s] 
[  166s] tests/not_asyncio_test.py::test_spawn_from_coroutine_errors
[  166s]   /home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/not_asyncio_test.py:22: RuntimeWarning: coroutine 'test_spawn_from_coroutine_errors.<locals>.go' was never awaited
[  166s]     with pytest.raises(RuntimeError):
[  166s]   Enable tracemalloc to get traceback where the object was allocated.
[  166s]   See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.
[  166s] 
[  166s] tests/openssl_test.py::test_import
[  166s]   /home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/green/OpenSSL/crypto.py:1: DeprecationWarning: X509Extension support in pyOpenSSL is deprecated. You should use the APIs in cryptography.
[  166s]     from OpenSSL.crypto import *
[  166s] 
[  166s] tests/openssl_test.py::test_import
[  166s] tests/openssl_test.py::test_import
[  166s] tests/openssl_test.py::test_import
[  166s]   /home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/green/OpenSSL/crypto.py:1: DeprecationWarning: CSR support in pyOpenSSL is deprecated. You should use the APIs in cryptography.
[  166s]     from OpenSSL.crypto import *
[  166s] 
[  166s] tests/openssl_test.py::test_import
[  166s] tests/openssl_test.py::test_import
[  166s] tests/openssl_test.py::test_import
[  166s] tests/openssl_test.py::test_import
[  166s]   /home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/green/OpenSSL/crypto.py:1: DeprecationWarning: CRL support in pyOpenSSL is deprecated. You should use the APIs in cryptography.
[  166s]     from OpenSSL.crypto import *
[  166s] 
[  166s] tests/openssl_test.py::test_import
[  166s]   /home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/green/OpenSSL/crypto.py:1: DeprecationWarning: sign() is deprecated. Use the equivalent APIs in cryptography.
[  166s]     from OpenSSL.crypto import *
[  166s] 
[  166s] tests/openssl_test.py::test_import
[  166s]   /home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/green/OpenSSL/crypto.py:1: DeprecationWarning: verify() is deprecated. Use the equivalent APIs in cryptography.
[  166s]     from OpenSSL.crypto import *
[  166s] 
[  166s] tests/ssl_test.py::SSLTest::test_context_wrapped_accept
[  166s]   /home/abuild/rpmbuild/BUILD/eventlet-0.37.0/tests/ssl_test.py:332: DeprecationWarning: ssl.PROTOCOL_TLS is deprecated
[  166s]     context = ssl.SSLContext(ssl.PROTOCOL_TLS)
[  166s] 
[  166s] tests/wsgi_test.py::TestHttpd::test_disable_header_name_capitalization
[  166s]   /home/abuild/rpmbuild/BUILD/eventlet-0.37.0/eventlet/greenthread.py:265: DeprecationWarning: capitalize_response_headers is disabled.
[  166s]    Please, make sure you know what you are doing.
[  166s]    HTTP headers names are case-insensitive per RFC standard.
[  166s]    Most likely, you need to fix HTTP parsing in your client software.
[  166s]     result = function(*args, **kwargs)
[  166s] 
[  166s] -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
[  166s] =========================== short test summary info ============================
[  166s] FAILED tests/patcher_test.py::test_threading_condition - AssertionError: time...
[  166s] FAILED tests/patcher_test.py::test_threading_join - AssertionError: timed out
[  166s] FAILED tests/patcher_test.py::test_socketserver_selectors - AssertionError: t...
[  166s] FAILED tests/patcher_test.py::test_threading_current - AssertionError: timed out
[  166s] FAILED tests/patcher_test.py::test_threadpoolexecutor - AssertionError: timed...
[  166s] = 5 failed, 602 passed, 110 skipped, 20 deselected, 57 warnings in 100.04s (0:01:40) =

@4383
Copy link
Copy Markdown
Member Author

4383 commented Oct 17, 2024

Thanks @MeggyCal all contributions are welcome :)

@stefanor stefanor mentioned this pull request Nov 7, 2024
@itamarst
Copy link
Copy Markdown
Contributor

itamarst commented Dec 9, 2024

A newer version of this got merged. If you are seeing bugs in the released version on 3.13, please open new issues.

@itamarst itamarst closed this Dec 9, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Python 3.13: AttributeError: module 'eventlet.green.thread' has no attribute 'start_joinable_thread'

5 participants