Hi Adrian, Thanks for filing this. I can't be certain, but I have a strong suspicion that this is caused by a bug that we fixed upstream with dumb-init 1.2.2 which was causing flakiness in the test suite on certain environments and architectures.
The bug was: https://github.com/Yelp/dumb-init/issues/136 The patch was: https://github.com/Yelp/dumb-init/pull/174 If possible, I would suggest packaging the latest version of dumb-init (currently 1.2.2) as the easiest way to fix this. Please let me know if there's any way we can help from the upstream side. On Sun, Dec 2, 2018 at 9:39 AM Adrian Bunk <b...@debian.org> wrote: > > Source: dumb-init > Version: 1.2.0-1 > Severity: serious > Tags: ftbfs > > https://buildd.debian.org/status/package.php?p=dumb-init > > ... > =================================== FAILURES > =================================== > _____________ test_all_processes_receive_term_on_exit_if_setsid[1] > _____________ > > @pytest.mark.usefixtures('both_debug_modes', 'setsid_enabled') > def test_all_processes_receive_term_on_exit_if_setsid(): > """If the child exits for some reason, dumb-init should send TERM to > all > processes in its session if setsid mode is enabled.""" > > child_pid, child_stdout = spawn_process_which_dies_with_children() > > tests/child_processes_test.py:109: > _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > _ > > def spawn_process_which_dies_with_children(): > """Spawn a process which spawns some children and then dies without > signaling them, wrapped in dumb-init. > > Returns a tuple (child pid, child stdout pipe), where the child is > print_signals. This is useful because you can signal the PID and see > if > anything gets printed onto the stdout pipe. > """ > proc = Popen( > ( > 'dumb-init', > 'sh', '-c', > > # we need to sleep before the shell exits, or dumb-init might > send > # TERM to print_signals before it has had time to register > custom > # signal handlers > '{python} -m testing.print_signals & sleep 0.1'.format( > python=sys.executable, > ), > ), > stdout=PIPE, > ) > proc.wait() > assert proc.returncode == 0 > > # read a line from print_signals, figure out its pid > line = proc.stdout.readline() > match = re.match(b'ready \(pid: ([0-9]+)\)\n', line) > > assert match, line > E AssertionError: > E assert None > > tests/child_processes_test.py:95: AssertionError > ----------------------------- Captured stderr call > ----------------------------- > [dumb-init] Running in debug mode. > [dumb-init] Unable to detach from controlling tty (errno=25 Inappropriate > ioctl for device). > [dumb-init] Child spawned with PID 7035. > [dumb-init] Unable to attach to controlling tty (errno=25 Inappropriate ioctl > for device). > [dumb-init] setsid complete. > [dumb-init] Received signal 18. > [dumb-init] A child with PID 7035 exited with exit status 0. > [dumb-init] Forwarded signal 15 to children. > [dumb-init] Child exited with status 0. Goodbye. > _____________ test_all_processes_receive_term_on_exit_if_setsid[0] > _____________ > > @pytest.mark.usefixtures('both_debug_modes', 'setsid_enabled') > def test_all_processes_receive_term_on_exit_if_setsid(): > """If the child exits for some reason, dumb-init should send TERM to > all > processes in its session if setsid mode is enabled.""" > > child_pid, child_stdout = spawn_process_which_dies_with_children() > > tests/child_processes_test.py:109: > _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > _ > > def spawn_process_which_dies_with_children(): > """Spawn a process which spawns some children and then dies without > signaling them, wrapped in dumb-init. > > Returns a tuple (child pid, child stdout pipe), where the child is > print_signals. This is useful because you can signal the PID and see > if > anything gets printed onto the stdout pipe. > """ > proc = Popen( > ( > 'dumb-init', > 'sh', '-c', > > # we need to sleep before the shell exits, or dumb-init might > send > # TERM to print_signals before it has had time to register > custom > # signal handlers > '{python} -m testing.print_signals & sleep 0.1'.format( > python=sys.executable, > ), > ), > stdout=PIPE, > ) > proc.wait() > assert proc.returncode == 0 > > # read a line from print_signals, figure out its pid > line = proc.stdout.readline() > match = re.match(b'ready \(pid: ([0-9]+)\)\n', line) > > assert match, line > E AssertionError: > E assert None > > tests/child_processes_test.py:95: AssertionError > ==================== 2 failed, 170 passed in 27.83 seconds > ===================== > debian/rules:31: recipe for target 'override_dh_auto_test' failed > make[1]: *** [override_dh_auto_test] Error 1 >