python / python/cpython

data races in decimal module with global context

Abierto
#141,148 16 comentarios 2 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

docs extension-modules topic-free-threading type-bug
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

Abrir la guía de contribución

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.

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

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.