[Bug 2143758] Re: apport 2.33.1-0ubuntu4 FTBFS - PicklingIssue in Tests

Alessandro Astone 2143758 at bugs.launchpad.net
Mon Mar 9 18:42:52 UTC 2026


I've been dealing with this on my other python projects. The most
immediate fix is to call:

  multiprocessing.set_start_method('fork')

which reverts back the behaviour to python 3.13. This is totally
acceptable, and maybe also the best solution here.

The alternative would be to move all subprocesses to always target
global-scope functions and never local functions, and avoid passing
parameters that cannot be serialized (or implement custom
serializations?). Given the complexity, urgency (FTBFS), and impact
(tests only, afaics), I would not pursue this approach.

** Changed in: apport (Ubuntu)
       Status: New => Triaged

-- 
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to apport in Ubuntu.
https://bugs.launchpad.net/bugs/2143758

Title:
  apport 2.33.1-0ubuntu4 FTBFS - PicklingIssue in Tests

Status in apport package in Ubuntu:
  Triaged

Bug description:
  During the global rebuild of Apport (2.33.1-0ubuntu4) for
  https://launchpad.net/bugs/2132257, it FTBFS with the following
  errors:

  =================================== FAILURES ===================================
  __________ TestUnkillableShutdown.test_omit_all_processes_except_one ___________

  self =
  <tests.integration.test_unkillable_shutdown.TestUnkillableShutdown
  testMethod=test_omit_all_processes_except_one>

      def test_omit_all_processes_except_one(self) -> None:
          """unkillable_shutdown will write exactly one report."""
          existing_pids = self._get_all_pids()
  >       with self._launch_process_with_different_session_id() as runner:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  tests/integration/test_unkillable_shutdown.py:98: 
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
  /usr/lib/python3.14/contextlib.py:141: in __enter__
      return next(self.gen)
             ^^^^^^^^^^^^^^
  tests/integration/test_unkillable_shutdown.py:79: in _launch_process_with_different_session_id
      runner.start()
  /usr/lib/python3.14/multiprocessing/process.py:121: in start
      self._popen = self._Popen(self)
                    ^^^^^^^^^^^^^^^^^
  /usr/lib/python3.14/multiprocessing/context.py:224: in _Popen
      return _default_context.get_context().Process._Popen(process_obj)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  /usr/lib/python3.14/multiprocessing/context.py:300: in _Popen
      return Popen(process_obj)
             ^^^^^^^^^^^^^^^^^^
  /usr/lib/python3.14/multiprocessing/popen_forkserver.py:35: in __init__
      super().__init__(process_obj)
  /usr/lib/python3.14/multiprocessing/popen_fork.py:20: in __init__
      self._launch(process_obj)
  /usr/lib/python3.14/multiprocessing/popen_forkserver.py:47: in _launch
      reduction.dump(process_obj, buf)
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

  obj = <Process name='Process-1' parent=16049 initial>
  file = <_io.BytesIO object at 0x762709abffb0>, protocol = None

      def dump(obj, file, protocol=None):
          '''Replacement for pickle.dump() using ForkingPickler.'''
  >       ForkingPickler(file, protocol).dump(obj)
  E       _pickle.PicklingError: Can't pickle local object <function TestUnkillableShutdown._launch_process_with_different_session_id.<locals>._run_test_executable at 0x76270951ce00>
  E       when serializing dict item '_target'
  E       when serializing multiprocessing.context.Process state
  E       when serializing multiprocessing.context.Process object

  /usr/lib/python3.14/multiprocessing/reduction.py:60: PicklingError
  __________________ TestUnkillableShutdown.test_write_reports ___________________

  self =
  <tests.integration.test_unkillable_shutdown.TestUnkillableShutdown
  testMethod=test_write_reports>

      def test_write_reports(self) -> None:
          """unkillable_shutdown will write reports."""
          # Ensure that at least one process is honoured by unkillable_shutdown.
  >       with self._launch_process_with_different_session_id():
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  tests/integration/test_unkillable_shutdown.py:108: 
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
  /usr/lib/python3.14/contextlib.py:141: in __enter__
      return next(self.gen)
             ^^^^^^^^^^^^^^
  tests/integration/test_unkillable_shutdown.py:79: in _launch_process_with_different_session_id
      runner.start()
  /usr/lib/python3.14/multiprocessing/process.py:121: in start
      self._popen = self._Popen(self)
                    ^^^^^^^^^^^^^^^^^
  /usr/lib/python3.14/multiprocessing/context.py:224: in _Popen
      return _default_context.get_context().Process._Popen(process_obj)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  /usr/lib/python3.14/multiprocessing/context.py:300: in _Popen
      return Popen(process_obj)
             ^^^^^^^^^^^^^^^^^^
  /usr/lib/python3.14/multiprocessing/popen_forkserver.py:35: in __init__
      super().__init__(process_obj)
  /usr/lib/python3.14/multiprocessing/popen_fork.py:20: in __init__
      self._launch(process_obj)
  /usr/lib/python3.14/multiprocessing/popen_forkserver.py:47: in _launch
      reduction.dump(process_obj, buf)
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

  obj = <Process name='Process-2' parent=16049 initial>
  file = <_io.BytesIO object at 0x76270a723100>, protocol = None

      def dump(obj, file, protocol=None):
          '''Replacement for pickle.dump() using ForkingPickler.'''
  >       ForkingPickler(file, protocol).dump(obj)
  E       _pickle.PicklingError: Can't pickle local object <function TestUnkillableShutdown._launch_process_with_different_session_id.<locals>._run_test_executable at 0x762709aae1f0>
  E       when serializing dict item '_target'
  E       when serializing multiprocessing.context.Process state
  E       when serializing multiprocessing.context.Process object

  /usr/lib/python3.14/multiprocessing/reduction.py:60: PicklingError

  ---

  The core problem is a Pickling Error on these two tests.  This results
  in an FTBFS case.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/apport/+bug/2143758/+subscriptions




More information about the foundations-bugs mailing list