data races in decimal module with global context
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
Reproducer:
import decimal
from threading import Thread, Barrier
context = decimal.Context()
context.prec = 28
barrier = Barrier(10)
def race():
barrier.wait()
decimal.Decimal('1.0', context=context)
if __name__ == "__main__":
while True:
threads = [Thread(target=race) for _ in range(10)]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
Data race:
==================
WARNING: ThreadSanitizer: data race (pid=58514)
Write of size 4 at 0x00010d315cbc by thread T5808:
#0 dec_addstatus _decimal.c:612 (_decimal.cpython-315t-darwin.so:arm64+0x9a88)
#1 PyDecType_FromCStringExact _decimal.c:2323 (_decimal.cpython-315t-darwin.so:arm64+0x1a4a4)
#2 dec_new _decimal.c.h:572 (_decimal.cpython-315t-darwin.so:arm64+0x506c)
#3 type_call typeobject.c:2432 (python.exe:arm64+0x10017e768)
#4 _PyObject_MakeTpCall call.c:242 (python.exe:arm64+0x10007eb64)
#5 PyObject_Vectorcall call.c:327 (python.exe:arm64+0x10007f750)
#6 _PyEval_EvalFrameDefault generated_cases.c.h:1620 (python.exe:arm64+0x100277dec)
#7 _PyEval_Vector ceval.c:1989 (python.exe:arm64+0x10026ad88)
#8 _PyFunction_Vectorcall call.c (python.exe:arm64+0x10007fcec)
#9 method_vectorcall classobject.c:65 (python.exe:arm64+0x100084190)
#10 _PyObject_Call call.c:348 (python.exe:arm64+0x10007f8b0)
#11 PyObject_Call call.c:373 (python.exe:arm64+0x10007f9d8)
#12 _PyEval_EvalFrameDefault generated_cases.c.h:2616 (python.exe:arm64+0x10027bf64)
#13 _PyEval_Vector ceval.c:1989 (python.exe:arm64+0x10026ad88)
#14 _PyFunction_Vectorcall call.c (python.exe:arm64+0x10007fcec)
#15 method_vectorcall classobject.c:73 (python.exe:arm64+0x10008422c)
#16 context_run context.c:728 (python.exe:arm64+0x1002b53dc)
#17 _PyEval_EvalFrameDefault generated_cases.c.h:3710 (python.exe:arm64+0x10027ffbc)
#18 _PyEval_Vector ceval.c:1989 (python.exe:arm64+0x10026ad88)
#19 _PyFunction_Vectorcall call.c (python.exe:arm64+0x10007fcec)
#20 method_vectorcall classobject.c:73 (python.exe:arm64+0x10008422c)
#21 _PyObject_Call call.c:348 (python.exe:arm64+0x10007f964)
#22 PyObject_Call call.c:373 (python.exe:arm64+0x10007f9d8)
#23 thread_run _threadmodule.c:387 (python.exe:arm64+0x10041b338)
#24 pythread_wrapper thread_pthread.h:234 (python.exe:arm64+0x100358824)
Previous write of size 4 at 0x00010d315cbc by thread T5806:
#0 dec_addstatus _decimal.c:612 (_decimal.cpython-315t-darwin.so:arm64+0x9a88)
#1 PyDecType_FromCStringExact _decimal.c:2323 (_decimal.cpython-315t-darwin.so:arm64+0x1a4a4)
#2 dec_new _decimal.c.h:572 (_decimal.cpython-315t-darwin.so:arm64+0x506c)
#3 type_call typeobject.c:2432 (python.exe:arm64+0x10017e768)
#4 _PyObject_MakeTpCall call.c:242 (python.exe:arm64+0x10007eb64)
#5 PyObject_Vectorcall call.c:327 (python.exe:arm64+0x10007f750)
#6 _PyEval_EvalFrameDefault generated_cases.c.h:1620 (python.exe:arm64+0x100277dec)
#7 _PyEval_Vector ceval.c:1989 (python.exe:arm64+0x10026ad88)
#8 _PyFunction_Vectorcall call.c (python.exe:arm64+0x10007fcec)
#9 method_vectorcall classobject.c:65 (python.exe:arm64+0x100084190)
#10 _PyObject_Call call.c:348 (python.exe:arm64+0x10007f8b0)
#11 PyObject_Call call.c:373 (python.exe:arm64+0x10007f9d8)
#12 _PyEval_EvalFrameDefault generated_cases.c.h:2616 (python.exe:arm64+0x10027bf64)
#13 _PyEval_Vector ceval.c:1989 (python.exe:arm64+0x10026ad88)
#14 _PyFunction_Vectorcall call.c (python.exe:arm64+0x10007fcec)
#15 method_vectorcall classobject.c:73 (python.exe:arm64+0x10008422c)
#16 context_run context.c:728 (python.exe:arm64+0x1002b53dc)
#17 _PyEval_EvalFrameDefault generated_cases.c.h:3710 (python.exe:arm64+0x10027ffbc)
#18 _PyEval_Vector ceval.c:1989 (python.exe:arm64+0x10026ad88)
#19 _PyFunction_Vectorcall call.c (python.exe:arm64+0x10007fcec)
#20 method_vectorcall classobject.c:73 (python.exe:arm64+0x10008422c)
#21 _PyObject_Call call.c:348 (python.exe:arm64+0x10007f964)
#22 PyObject_Call call.c:373 (python.exe:arm64+0x10007f9d8)
#23 thread_run _threadmodule.c:387 (python.exe:arm64+0x10041b338)
#24 pythread_wrapper thread_pthread.h:234 (python.exe:arm64+0x100358824)
SUMMARY: ThreadSanitizer: data race _decimal.c:615 in dec_addstatus
==================
I discovered this while adding thread safety support to msgspec. Running its test suite under pytest-run-parallel leads to similar data races as present above from the minimal reproducer.
See https://gist.github.com/kumaraditya303/3c26f31eaf0beea39d7eeb539b662846 for full tsan report
Linked PRs
- gh-146482
- gh-151953
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con las rutas de llamada notificadas en _decimal.c, _decimal.c.h y context.c, y luego ejecuta el reproductor mínimo bajo ThreadSanitizer. Compara el comportamiento con los PRs vinculados gh-146482 y gh-151953. Se considera terminado cuando el reproductor y las cargas de trabajo paralelas comparables ya no informen de esta condición de carrera de datos, y se haya añadido cobertura de regresión donde corresponda.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- c, python
- Área
- backend
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100