Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Race in `inner_timout_checker`: iterating over `m.start_time_by_pid.items()` can crash with "dictionary changed size during iteration" and leave `mutmut run` hanging

Abierto
#490 1 comentario 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 2 días

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
52/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Tranquilo
Stack tecnológico
python

Línea de trabajo

Comienza en el punto de entrada inner_timout_checker de main.py, alrededor de la iteración indicada, y sigue las actualizaciones de start_time_by_pid durante mutmut run. Reproduce el problema con Python 3.10 usando python3.10 -m mutmut run y, después, inspecciona la orquestación de los workers y la cobertura existente de pytest. Se considera completado cuando la condición de carrera ya no provoca que el checker falle y el comando no se queda bloqueado con workers restantes.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Command

python3.10 -m mutmut run

Observed behavior

During mutation testing, mutmut prints this exception from the timeout-checker background thread:

Exception in thread Thread-1061 (inner_timout_checker):
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/pomponchik/Desktop/Projects/suby/.venv/lib/python3.8/site-packages/mutmut/__main__.py", line 1201, in inner_timout_checker
    for pid, start_time in m.start_time_by_pid.items():
RuntimeError: dictionary changed size during iteration

After that, mutmut run appears to hang indefinitely.

I checked the process tree, and the parent python -m mutmut run process plus multiple worker python -m mutmut run children were still alive, but all of them were sleeping at 0.0% CPU. So it looks like once inner_timout_checker crashes, the main orchestration can get stuck forever instead of failing and cleaning up workers.

Expected behavior

inner_timout_checker should not iterate over a dict that can be concurrently mutated without synchronization/copying. And if a background orchestration thread crashes anyway, mutmut run should fail loudly and terminate workers instead of hanging.

Why this looks like a race

The failing line iterates directly over:

for pid, start_time in m.start_time_by_pid.items():

The exception strongly suggests that some other thread mutates m.start_time_by_pid at the same time.

So a minimal fix might be to iterate over a snapshot, e.g. list(m.start_time_by_pid.items()), or guard access with a lock, depending on the intended synchronization model.

Extra note

I first tried running mutmut from a Python 3.8 venv and hit a separate issue:

AttributeError: module 'os' has no attribute 'waitstatus_to_exitcode'

So the hang above was reproduced by running mutmut itself with Python 3.10.8.

Environment

  • mutmut: 3.2.3
  • OS: macOS 15.3.1 (24D70)
  • Python used to run mutmut: 3.10.8
  • Test runner: pytest
  • Project size: ~245 mutants
Lenguaje dominante
Python
Estrellas
1.5k
Forks
185
Merge medio
1 d 14 h
PR fusionados (30 d)
5

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de boxed/mutmut

Todos los issues de boxed/mutmut

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.