Skip to content

Multiple leak check errors with CPython 3.14.0rc1 built with --enable-experimental-jit #455

@mgorny

Description

@mgorny

When CPython 3.14.0rc1 is built with experimental JIT enabled (--enable-experimental-jit), multiple tests are failing due to leak checks failing:

$ tox run -e py314 -x testenv.base_python=$HOME/git/cpython/python 
.pkg: _optional_hooks> python /usr/lib/python3.14/site-packages/pyproject_api/_backend.py True setuptools.build_meta
.pkg: get_requires_for_build_sdist> python /usr/lib/python3.14/site-packages/pyproject_api/_backend.py True setuptools.build_meta
.pkg: get_requires_for_build_wheel> python /usr/lib/python3.14/site-packages/pyproject_api/_backend.py True setuptools.build_meta
.pkg: get_requires_for_build_editable> python /usr/lib/python3.14/site-packages/pyproject_api/_backend.py True setuptools.build_meta
.pkg: build_wheel> python /usr/lib/python3.14/site-packages/pyproject_api/_backend.py True setuptools.build_meta
.pkg: build_sdist> python /usr/lib/python3.14/site-packages/pyproject_api/_backend.py True setuptools.build_meta
py314: install_package> python -I -m pip install --force-reinstall --no-deps /tmp/greenlet/.tox/.tmp/package/2/greenlet-3.2.4.dev0.tar.gz
py314: commands[0]> python -c 'import greenlet._greenlet as G; assert G.GREENLET_USE_STANDARD_THREADING'
py314: commands[1]> python -m unittest discover -v greenlet.tests
test_break_ctxvars (greenlet.tests.test_contextvars.ContextVarsTests.test_break_ctxvars) ... FAIL
test_context_assignment_different_thread (greenlet.tests.test_contextvars.ContextVarsTests.test_context_assignment_different_thread) ... FAIL
test_context_assignment_while_running (greenlet.tests.test_contextvars.ContextVarsTests.test_context_assignment_while_running) ... FAIL
test_context_assignment_wrong_type (greenlet.tests.test_contextvars.ContextVarsTests.test_context_assignment_wrong_type) ... FAIL
test_context_not_propagated (greenlet.tests.test_contextvars.ContextVarsTests.test_context_not_propagated) ... ok
test_context_propagated_by_context_run (greenlet.tests.test_contextvars.ContextVarsTests.test_context_propagated_by_context_run) ... FAIL
test_context_propagated_by_setting_attribute (greenlet.tests.test_contextvars.ContextVarsTests.test_context_propagated_by_setting_attribute) ... FAIL
test_context_shared (greenlet.tests.test_contextvars.ContextVarsTests.test_context_shared) ... ok
test_not_broken_if_using_attribute_instead_of_context_run (greenlet.tests.test_contextvars.ContextVarsTests.test_not_broken_if_using_attribute_instead_of_context_run) ... ok
test_contextvars_errors (greenlet.tests.test_contextvars.NoContextVarsTests.test_contextvars_errors) ... skipped 'ContextVar supported'
test_exception_switch (greenlet.tests.test_cpp.CPPTests.test_exception_switch) ... FAIL
test_unhandled_exception_in_greenlet_aborts (greenlet.tests.test_cpp.CPPTests.test_unhandled_exception_in_greenlet_aborts) ... FAIL
test_unhandled_nonstd_exception_aborts (greenlet.tests.test_cpp.CPPTests.test_unhandled_nonstd_exception_aborts) ... ok
test_unhandled_std_exception_aborts (greenlet.tests.test_cpp.CPPTests.test_unhandled_std_exception_aborts) ... FAIL
test_unhandled_std_exception_as_greenlet_function_aborts (greenlet.tests.test_cpp.CPPTests.test_unhandled_std_exception_as_greenlet_function_aborts) ... FAIL
test_getcurrent (greenlet.tests.test_extension_interface.CAPITests.test_getcurrent) ... FAIL
test_instance_of_wrong_type (greenlet.tests.test_extension_interface.CAPITests.test_instance_of_wrong_type) ... ok
test_new_greenlet (greenlet.tests.test_extension_interface.CAPITests.test_new_greenlet) ... FAIL
test_non_traceback_param (greenlet.tests.test_extension_interface.CAPITests.test_non_traceback_param) ... FAIL
test_not_throwable (greenlet.tests.test_extension_interface.CAPITests.test_not_throwable) ... ok
test_raise_greenlet_dead (greenlet.tests.test_extension_interface.CAPITests.test_raise_greenlet_dead) ... ok
test_raise_greenlet_error (greenlet.tests.test_extension_interface.CAPITests.test_raise_greenlet_error) ... FAIL
test_setparent (greenlet.tests.test_extension_interface.CAPITests.test_setparent) ... FAIL
test_switch (greenlet.tests.test_extension_interface.CAPITests.test_switch) ... FAIL
test_switch_kwargs (greenlet.tests.test_extension_interface.CAPITests.test_switch_kwargs) ... ok
test_throw (greenlet.tests.test_extension_interface.CAPITests.test_throw) ... FAIL
test_circular_greenlet (greenlet.tests.test_gc.GCTests.test_circular_greenlet) ... FAIL
test_dead_circular_ref (greenlet.tests.test_gc.GCTests.test_dead_circular_ref) ... FAIL
test_finalizer_crash (greenlet.tests.test_gc.GCTests.test_finalizer_crash) ... ok
test_inactive_ref (greenlet.tests.test_gc.GCTests.test_inactive_ref) ... ok
test_generator (greenlet.tests.test_generator.GeneratorTests.test_generator) ... ok
test_genlet_bad (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_genlet_bad) ... ok
test_genlet_simple (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_genlet_simple) ... ok
test_layered_genlets (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_layered_genlets) ... ok
test_nested_genlets (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_nested_genlets) ... ok
test_permutations (greenlet.tests.test_generator_nested.NestedGeneratorTests.test_permutations) ... ok
test_failed_to_initialstub (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_failed_to_initialstub) ... FAIL
test_failed_to_slp_switch_into_running (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_failed_to_slp_switch_into_running) ... FAIL
test_failed_to_switch_into_running (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_failed_to_switch_into_running) ... ok
test_reentrant_switch_GreenletAlreadyStartedInPython (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_GreenletAlreadyStartedInPython) ... FAIL
test_reentrant_switch_run_callable_has_del (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_run_callable_has_del) ... ok
test_reentrant_switch_three_greenlets (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_three_greenlets) ... FAIL
test_reentrant_switch_three_greenlets2 (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_three_greenlets2) ... FAIL
test_reentrant_switch_two_greenlets (greenlet.tests.test_greenlet.TestBrokenGreenlets.test_reentrant_switch_two_greenlets) ... ok
test_abstract_subclasses (greenlet.tests.test_greenlet.TestGreenlet.test_abstract_subclasses) ... FAIL
test_can_access_f_back_of_suspended_greenlet (greenlet.tests.test_greenlet.TestGreenlet.test_can_access_f_back_of_suspended_greenlet) ... FAIL
test_dealloc (greenlet.tests.test_greenlet.TestGreenlet.test_dealloc) ... ok
test_dealloc_catches_GreenletExit_throws_other (greenlet.tests.test_greenlet.TestGreenlet.test_dealloc_catches_GreenletExit_throws_other) ... FAIL
test_dealloc_other_thread (greenlet.tests.test_greenlet.TestGreenlet.test_dealloc_other_thread) ... FAIL
test_dealloc_switch_args_not_lost (greenlet.tests.test_greenlet.TestGreenlet.test_dealloc_switch_args_not_lost) ... ok
test_deepcopy (greenlet.tests.test_greenlet.TestGreenlet.test_deepcopy) ... FAIL
test_exc_state (greenlet.tests.test_greenlet.TestGreenlet.test_exc_state) ... FAIL
test_exception (greenlet.tests.test_greenlet.TestGreenlet.test_exception) ... FAIL
test_falling_off_end_switches_to_unstarted_parent_raises_error (greenlet.tests.test_greenlet.TestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error) ... ok
test_falling_off_end_switches_to_unstarted_parent_works (greenlet.tests.test_greenlet.TestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works) ... FAIL
test_frame (greenlet.tests.test_greenlet.TestGreenlet.test_frame) ... ok
test_frames_always_exposed (greenlet.tests.test_greenlet.TestGreenlet.test_frames_always_exposed) ... FAIL
test_get_stack_with_nested_c_calls (greenlet.tests.test_greenlet.TestGreenlet.test_get_stack_with_nested_c_calls) ... ok
test_implicit_parent_with_threads (greenlet.tests.test_greenlet.TestGreenlet.test_implicit_parent_with_threads) ... FAIL
test_instance_dict (greenlet.tests.test_greenlet.TestGreenlet.test_instance_dict) ... ok
test_issue_245_reference_counting_subclass_no_threads (greenlet.tests.test_greenlet.TestGreenlet.test_issue_245_reference_counting_subclass_no_threads) ... FAIL
test_issue_245_reference_counting_subclass_threads (greenlet.tests.test_greenlet.TestGreenlet.test_issue_245_reference_counting_subclass_threads) ... FAIL
test_parent_equals_None (greenlet.tests.test_greenlet.TestGreenlet.test_parent_equals_None) ... ok
test_parent_restored_on_kill (greenlet.tests.test_greenlet.TestGreenlet.test_parent_restored_on_kill) ... FAIL
test_parent_return_failure (greenlet.tests.test_greenlet.TestGreenlet.test_parent_return_failure) ... FAIL
test_recursive_startup (greenlet.tests.test_greenlet.TestGreenlet.test_recursive_startup) ... ok
test_run_equals_None (greenlet.tests.test_greenlet.TestGreenlet.test_run_equals_None) ... FAIL
test_running_greenlet_has_no_run (greenlet.tests.test_greenlet.TestGreenlet.test_running_greenlet_has_no_run) ... ok
test_send_exception (greenlet.tests.test_greenlet.TestGreenlet.test_send_exception) ... FAIL
test_simple (greenlet.tests.test_greenlet.TestGreenlet.test_simple) ... FAIL
test_switch_kwargs (greenlet.tests.test_greenlet.TestGreenlet.test_switch_kwargs) ... FAIL
test_switch_kwargs_to_parent (greenlet.tests.test_greenlet.TestGreenlet.test_switch_kwargs_to_parent) ... ok
test_switch_no_run_raises_AttributeError (greenlet.tests.test_greenlet.TestGreenlet.test_switch_no_run_raises_AttributeError) ... ok
test_switch_to_another_thread (greenlet.tests.test_greenlet.TestGreenlet.test_switch_to_another_thread) ... ok
test_switch_to_dead_greenlet_reparent (greenlet.tests.test_greenlet.TestGreenlet.test_switch_to_dead_greenlet_reparent) ... ok
test_switch_to_dead_greenlet_with_unstarted_perverse_parent (greenlet.tests.test_greenlet.TestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent) ... ok
test_thread_bug (greenlet.tests.test_greenlet.TestGreenlet.test_thread_bug) ... ok
test_threaded_updatecurrent (greenlet.tests.test_greenlet.TestGreenlet.test_threaded_updatecurrent) ... ok
test_threads (greenlet.tests.test_greenlet.TestGreenlet.test_threads) ... ok
test_throw_exception_not_lost (greenlet.tests.test_greenlet.TestGreenlet.test_throw_exception_not_lost) ... ok
test_throw_no_run_raises_AttributeError (greenlet.tests.test_greenlet.TestGreenlet.test_throw_no_run_raises_AttributeError) ... ok
test_throw_to_dead_thread_doesnt_crash (greenlet.tests.test_greenlet.TestGreenlet.test_throw_to_dead_thread_doesnt_crash) ... ok
test_throw_to_dead_thread_doesnt_crash_wait (greenlet.tests.test_greenlet.TestGreenlet.test_throw_to_dead_thread_doesnt_crash_wait) ... Time limit exceeded.
Threads: Waiting for only 1 --> 1
MGlets : Waiting for only 5 --> 6
ok
test_tuple_subclass (greenlet.tests.test_greenlet.TestGreenlet.test_tuple_subclass) ... ok
test_two_children (greenlet.tests.test_greenlet.TestGreenlet.test_two_children) ... ok
test_two_recursive_children (greenlet.tests.test_greenlet.TestGreenlet.test_two_recursive_children) ... ok
test_cannot_delete_parent (greenlet.tests.test_greenlet.TestGreenletSetParentErrors.test_cannot_delete_parent) ... ok
test_cannot_delete_parent_of_main (greenlet.tests.test_greenlet.TestGreenletSetParentErrors.test_cannot_delete_parent_of_main) ... ok
test_deeper_cycle (greenlet.tests.test_greenlet.TestGreenletSetParentErrors.test_deeper_cycle) ... ok
test_main_greenlet_parent_is_none (greenlet.tests.test_greenlet.TestGreenletSetParentErrors.test_main_greenlet_parent_is_none) ... ok
test_set_parent_wrong_types (greenlet.tests.test_greenlet.TestGreenletSetParentErrors.test_set_parent_wrong_types) ... ok
test_threaded_reparent (greenlet.tests.test_greenlet.TestGreenletSetParentErrors.test_threaded_reparent) ... ok
test_trivial_cycle (greenlet.tests.test_greenlet.TestGreenletSetParentErrors.test_trivial_cycle) ... ok
test_trivial_cycle_main (greenlet.tests.test_greenlet.TestGreenletSetParentErrors.test_trivial_cycle_main) ... ok
test_unexpected_reparenting (greenlet.tests.test_greenlet.TestGreenletSetParentErrors.test_unexpected_reparenting) ... ok
test_unexpected_reparenting_thread_running (greenlet.tests.test_greenlet.TestGreenletSetParentErrors.test_unexpected_reparenting_thread_running) ... ok
test_main_greenlet_is_greenlet (greenlet.tests.test_greenlet.TestMainGreenlet.test_main_greenlet_is_greenlet) ... ok
test_main_greenlet_type_can_be_subclassed (greenlet.tests.test_greenlet.TestMainGreenlet.test_main_greenlet_type_can_be_subclassed) ... ok
test_dead (greenlet.tests.test_greenlet.TestRepr.test_dead) ... ok
test_formatting_produces_native_str (greenlet.tests.test_greenlet.TestRepr.test_formatting_produces_native_str) ... ok
test_initial (greenlet.tests.test_greenlet.TestRepr.test_initial) ... ok
test_main_from_other_thread (greenlet.tests.test_greenlet.TestRepr.test_main_from_other_thread) ... ok
test_main_in_background (greenlet.tests.test_greenlet.TestRepr.test_main_in_background) ... ok
test_main_while_running (greenlet.tests.test_greenlet.TestRepr.test_main_while_running) ... ok
test_it (greenlet.tests.test_greenlet_trash.TestTrashCanReEnter.test_it) ... skipped 'get_tstate_trash_delete_nesting is not available.'
test_arg_refs (greenlet.tests.test_leaks.TestLeaks.test_arg_refs) ... ok
test_issue251_issue252_explicit_reference_not_collectable (greenlet.tests.test_leaks.TestLeaks.test_issue251_issue252_explicit_reference_not_collectable) ... ok
test_issue251_issue252_need_to_collect_in_background (greenlet.tests.test_leaks.TestLeaks.test_issue251_issue252_need_to_collect_in_background) ... ok
test_issue251_issue252_need_to_collect_in_background_cleanup_disabled (greenlet.tests.test_leaks.TestLeaks.test_issue251_issue252_need_to_collect_in_background_cleanup_disabled) ... ok
test_issue251_killing_cross_thread_leaks_list (greenlet.tests.test_leaks.TestLeaks.test_issue251_killing_cross_thread_leaks_list) ... ok
test_issue251_with_cleanup_disabled (greenlet.tests.test_leaks.TestLeaks.test_issue251_with_cleanup_disabled) ... ok
test_kwarg_refs (greenlet.tests.test_leaks.TestLeaks.test_kwarg_refs) ... ok
test_threaded_adv_leak (greenlet.tests.test_leaks.TestLeaks.test_threaded_adv_leak) ... ok
test_threaded_leak (greenlet.tests.test_leaks.TestLeaks.test_threaded_leak) ... ok
test_untracked_memory_doesnt_increase (greenlet.tests.test_leaks.TestLeaks.test_untracked_memory_doesnt_increase) ... ok
test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_main (greenlet.tests.test_leaks.TestLeaks.test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_main) ... Time limit exceeded.
Threads: Waiting for only 1 --> 1
MGlets : Waiting for only 10 --> 13
Time limit exceeded.
Threads: Waiting for only 1 --> 1
MGlets : Waiting for only 10 --> 13
ok
test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_thread (greenlet.tests.test_leaks.TestLeaks.test_untracked_memory_doesnt_increase_unfinished_thread_dealloc_in_thread) ... ok
test_stack_saved (greenlet.tests.test_stack_saved.Test.test_stack_saved) ... ok
test_class (greenlet.tests.test_throw.ThrowTests.test_class) ... ok
test_instance_of_wrong_type (greenlet.tests.test_throw.ThrowTests.test_instance_of_wrong_type) ... ok
test_kill (greenlet.tests.test_throw.ThrowTests.test_kill) ... ok
test_non_traceback_param (greenlet.tests.test_throw.ThrowTests.test_non_traceback_param) ... ok
test_not_throwable (greenlet.tests.test_throw.ThrowTests.test_not_throwable) ... ok
test_throw_goes_to_original_parent (greenlet.tests.test_throw.ThrowTests.test_throw_goes_to_original_parent) ... ok
test_val (greenlet.tests.test_throw.ThrowTests.test_val) ... ok
test_a_greenlet_tracing (greenlet.tests.test_tracing.TestGreenletTracing.test_a_greenlet_tracing) ... ok
test_b_exception_disables_tracing (greenlet.tests.test_tracing.TestGreenletTracing.test_b_exception_disables_tracing) ... ok
test_set_same_tracer_twice (greenlet.tests.test_tracing.TestGreenletTracing.test_set_same_tracer_twice) ... ok
test_trace_events_from_greenlet_func_sets_profiler (greenlet.tests.test_tracing.TestPythonTracing.test_trace_events_from_greenlet_func_sets_profiler) ... FAIL
test_trace_events_from_greenlet_subclass_sets_profiler (greenlet.tests.test_tracing.TestPythonTracing.test_trace_events_from_greenlet_subclass_sets_profiler) ... FAIL
test_trace_events_into_greenlet_func_already_set (greenlet.tests.test_tracing.TestPythonTracing.test_trace_events_into_greenlet_func_already_set) ... FAIL
test_trace_events_into_greenlet_subclass_already_set (greenlet.tests.test_tracing.TestPythonTracing.test_trace_events_into_greenlet_subclass_already_set) ... FAIL
test_trace_events_multiple_greenlets_switching (greenlet.tests.test_tracing.TestPythonTracing.test_trace_events_multiple_greenlets_switching) ... FAIL
test_trace_events_multiple_greenlets_switching_siblings (greenlet.tests.test_tracing.TestPythonTracing.test_trace_events_multiple_greenlets_switching_siblings) ... FAIL
test_trace_events_trivial (greenlet.tests.test_tracing.TestPythonTracing.test_trace_events_trivial) ... FAIL
test_version (greenlet.tests.test_version.VersionTests.test_version) ... Traceback (most recent call last):
  File "/tmp/greenlet/setup.py", line 10, in <module>
    from setuptools import setup
ModuleNotFoundError: No module named 'setuptools'
FAIL
test_dead_weakref (greenlet.tests.test_weakref.WeakRefTests.test_dead_weakref) ... ok
test_dealloc_weakref (greenlet.tests.test_weakref.WeakRefTests.test_dealloc_weakref) ... ok
test_inactive_weakref (greenlet.tests.test_weakref.WeakRefTests.test_inactive_weakref) ... ok

======================================================================
FAIL: test_break_ctxvars (greenlet.tests.test_contextvars.ContextVarsTests.test_break_ctxvars)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/greenlet/.tox/py314/lib/python3.14/site-packages/greenlet/tests/leakcheck.py", line 317, in wrapper
    return _RefCountChecker(self, method)(args, kwargs)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/tmp/greenlet/.tox/py314/lib/python3.14/site-packages/greenlet/tests/leakcheck.py", line 294, in __call__
    while self._check_deltas(growth):
          ~~~~~~~~~~~~~~~~~~^^^^^^^^
  File "/tmp/greenlet/.tox/py314/lib/python3.14/site-packages/greenlet/tests/leakcheck.py", line 273, in _check_deltas
    raise LeakCheckError('refcount increased by %r\n%s'
                         % (deltas,
                            self._report_diff(growth)))
greenlet.tests.leakcheck.LeakCheckError: refcount increased by [5, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1]
uop_executor        9        +1

======================================================================
FAIL: test_context_assignment_different_thread (greenlet.tests.test_contextvars.ContextVarsTests.test_context_assignment_different_thread)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/greenlet/.tox/py314/lib/python3.14/site-packages/greenlet/tests/leakcheck.py", line 317, in wrapper
    return _RefCountChecker(self, method)(args, kwargs)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/tmp/greenlet/.tox/py314/lib/python3.14/site-packages/greenlet/tests/leakcheck.py", line 294, in __call__
    while self._check_deltas(growth):
          ~~~~~~~~~~~~~~~~~~^^^^^^^^
  File "/tmp/greenlet/.tox/py314/lib/python3.14/site-packages/greenlet/tests/leakcheck.py", line 273, in _check_deltas
    raise LeakCheckError('refcount increased by %r\n%s'
                         % (deltas,
                            self._report_diff(growth)))
greenlet.tests.leakcheck.LeakCheckError: refcount increased by [5, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1]
uop_executor       14        +1

[…]
----------------------------------------------------------------------
Ran 139 tests in 71.744s

FAILED (failures=50, skipped=2)
py314: exit 1 (71.98 seconds) /tmp/greenlet> python -m unittest discover -v greenlet.tests pid=205714
  py314: FAIL code 1 (84.68=setup[12.67]+cmd[0.03,71.98] seconds)
  evaluation failed :( (85.04 seconds)

(actually, it's 49 failures — the 50th is failing due to setuptools not being installed to venv, which seems to a problem with tox.ini)

This is with b24e39c, and confirmed with python/cpython@38a42fe (but also 3.14.0rc1).

Full log: py314.txt

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions