fix(internal): detach threads if joinable before destroying [backport 4.6]#17335
Conversation
## Description We have a possible situation where we can end up with orphaned `ThreadRestartTimer` threads in fork-heavy applications. If a fork occurs while the current `ThreadRestartTimer` thread is in the stopping state (after `cls._instance = None` has already been called) then it will appear in `periodic_threads` and be added to `_threads_to_restart_after_fork` and then force restarted. ## Testing <!-- Describe your testing strategy or note what tests are included --> ## Risks <!-- Note any risks associated with this change, or "None" if no risks --> ## Additional Notes This bug is really really hard to reproduce and technically shouldn't be possible because the GIL should be held throughout the whole `os.fork()` call, but this is a code path which could cause some of the crashes we've seen in a fork-heavy application and is an easy defensive guard to add. Co-authored-by: juanjux <juanjo.alvarezmartinez@datadoghq.com> (cherry picked from commit 96352ec)
## Description This fixes a crash that can happen post-fork in fork-heavy workloads. ``` Error UnixSignal: Process terminated with SI_TKILL (SIGABRT) #0 0x00007ed5f6d869fc pthread_kill #1 0x00007ed5f6d32476 gsignal #2 0x00007ed5f6d187f3 abort #3 0x00007ed5f4fdf277 std::terminate #4 0x00007ed5c34737e6 PeriodicThread__after_fork #5 0x0000627d348a79b8 method_vectorcall_VARARGS_KEYWORDS (/usr/src/python/Objects/descrobject.c:365:14) #6 0x0000627d34847ea8 _PyObject_VectorcallTstate (/usr/src/python/./Include/internal/pycore_call.h:92:11) #7 0x0000627d34847ea8 PyObject_Vectorcall (/usr/src/python/Objects/call.c:325:12) #8 0x0000627d3486ec97 _PyEval_EvalFrameDefault (/usr/src/python/Python/bytecodes.c:2715:19) #9 0x0000627d34848e86 _PyObject_VectorcallTstate (/usr/src/python/./Include/internal/pycore_call.h:92:11) #10 0x0000627d34848e86 method_vectorcall (/usr/src/python/Objects/classobject.c:69:20) #11 0x0000627d34847a94 _PyObject_VectorcallTstate (/usr/src/python/./Include/internal/pycore_call.h:92:11) #12 0x00007ed5c3474631 std::thread::_State_impl<std::thread::_Invoker<std::tuple<_PeriodicThread_do_start(periodic_thread*, bool)::{lambda()#1}> > >::_M_run #13 0x00007ed5c3474e10 execute_native_thread_routine ``` _See IR-50207 for more details._ Co-authored-by: brettlangdon <brett.langdon@datadoghq.com> (cherry picked from commit 56acdf4)
Codeowners resolved as |
|
✨ Fix all issues with BitsAI or with Cursor
|
Performance SLOsComparing candidate juanjux/kowalski/fix-internal-detach-threads-if-joinable-before-destroying-backport-4.6 (3e655ab) with baseline 4.6 (906ceb5) 📈 Performance Regressions (2 suites)📈 iastaspects - 118/118✅ add_aspectTime: ✅ 108.294µs (SLO: <130.000µs 📉 -16.7%) vs baseline: +3.6% Memory: ✅ 43.315MB (SLO: <46.000MB -5.8%) vs baseline: +4.6% ✅ add_inplace_aspectTime: ✅ 105.027µs (SLO: <130.000µs 📉 -19.2%) vs baseline: -0.6% Memory: ✅ 43.334MB (SLO: <46.000MB -5.8%) vs baseline: +5.1% ✅ add_inplace_noaspectTime: ✅ 28.327µs (SLO: <40.000µs 📉 -29.2%) vs baseline: +0.7% Memory: ✅ 43.710MB (SLO: <46.000MB -5.0%) vs baseline: +5.1% ✅ add_noaspectTime: ✅ 48.876µs (SLO: <70.000µs 📉 -30.2%) vs baseline: ~same Memory: ✅ 43.638MB (SLO: <46.000MB -5.1%) vs baseline: +4.9% ✅ bytearray_aspectTime: ✅ 251.676µs (SLO: <400.000µs 📉 -37.1%) vs baseline: -0.5% Memory: ✅ 43.342MB (SLO: <46.000MB -5.8%) vs baseline: +4.2% ✅ bytearray_extend_aspectTime: ✅ 641.400µs (SLO: <800.000µs 📉 -19.8%) vs baseline: -1.1% Memory: ✅ 43.381MB (SLO: <46.000MB -5.7%) vs baseline: +4.5% ✅ bytearray_extend_noaspectTime: ✅ 263.625µs (SLO: <400.000µs 📉 -34.1%) vs baseline: -1.5% Memory: ✅ 43.707MB (SLO: <46.000MB -5.0%) vs baseline: +5.1% ✅ bytearray_noaspectTime: ✅ 134.986µs (SLO: <300.000µs 📉 -55.0%) vs baseline: +0.2% Memory: ✅ 43.657MB (SLO: <46.000MB -5.1%) vs baseline: +5.0% ✅ bytes_aspectTime: ✅ 218.323µs (SLO: <300.000µs 📉 -27.2%) vs baseline: +1.2% Memory: ✅ 43.359MB (SLO: <46.000MB -5.7%) vs baseline: +5.3% ✅ bytes_noaspectTime: ✅ 131.202µs (SLO: <200.000µs 📉 -34.4%) vs baseline: -0.8% Memory: ✅ 43.599MB (SLO: <46.000MB -5.2%) vs baseline: +4.7% ✅ bytesio_aspectTime: ✅ 3.753ms (SLO: <5.000ms 📉 -24.9%) vs baseline: -0.3% Memory: ✅ 43.334MB (SLO: <46.000MB -5.8%) vs baseline: +4.5% ✅ bytesio_noaspectTime: ✅ 311.998µs (SLO: <420.000µs 📉 -25.7%) vs baseline: +0.6% Memory: ✅ 43.587MB (SLO: <46.000MB -5.2%) vs baseline: +4.6% ✅ capitalize_aspectTime: ✅ 88.209µs (SLO: <300.000µs 📉 -70.6%) vs baseline: ~same Memory: ✅ 43.292MB (SLO: <46.000MB -5.9%) vs baseline: +4.7% ✅ capitalize_noaspectTime: ✅ 250.965µs (SLO: <300.000µs 📉 -16.3%) vs baseline: +0.4% Memory: ✅ 43.657MB (SLO: <46.000MB -5.1%) vs baseline: +4.7% ✅ casefold_aspectTime: ✅ 91.404µs (SLO: <500.000µs 📉 -81.7%) vs baseline: +3.7% Memory: ✅ 43.255MB (SLO: <46.000MB -6.0%) vs baseline: +4.1% ✅ casefold_noaspectTime: ✅ 303.514µs (SLO: <500.000µs 📉 -39.3%) vs baseline: +0.2% Memory: ✅ 43.595MB (SLO: <46.000MB -5.2%) vs baseline: +4.6% ✅ decode_aspectTime: ✅ 86.613µs (SLO: <100.000µs 📉 -13.4%) vs baseline: +0.4% Memory: ✅ 43.380MB (SLO: <46.000MB -5.7%) vs baseline: +4.8% ✅ decode_noaspectTime: ✅ 152.709µs (SLO: <210.000µs 📉 -27.3%) vs baseline: +1.3% Memory: ✅ 43.580MB (SLO: <46.000MB -5.3%) vs baseline: +4.6% ✅ encode_aspectTime: ✅ 84.054µs (SLO: <200.000µs 📉 -58.0%) vs baseline: -0.3% Memory: ✅ 43.361MB (SLO: <46.000MB -5.7%) vs baseline: +4.8% ✅ encode_noaspectTime: ✅ 136.972µs (SLO: <200.000µs 📉 -31.5%) vs baseline: -1.3% Memory: ✅ 43.581MB (SLO: <46.000MB -5.3%) vs baseline: +4.6% ✅ format_aspectTime: ✅ 14.548ms (SLO: <19.200ms 📉 -24.2%) vs baseline: -0.4% Memory: ✅ 43.620MB (SLO: <46.000MB -5.2%) vs baseline: +4.9% ✅ format_map_aspectTime: ✅ 16.471ms (SLO: <21.500ms 📉 -23.4%) vs baseline: +0.4% Memory: ✅ 43.502MB (SLO: <46.000MB -5.4%) vs baseline: +5.2% ✅ format_map_noaspectTime: ✅ 369.110µs (SLO: <500.000µs 📉 -26.2%) vs baseline: +1.2% Memory: ✅ 43.645MB (SLO: <46.000MB -5.1%) vs baseline: +4.9% ✅ format_noaspectTime: ✅ 306.354µs (SLO: <500.000µs 📉 -38.7%) vs baseline: +1.3% Memory: ✅ 43.535MB (SLO: <46.000MB -5.4%) vs baseline: +4.6% ✅ index_aspectTime: ✅ 122.290µs (SLO: <300.000µs 📉 -59.2%) vs baseline: +0.4% Memory: ✅ 43.333MB (SLO: <46.000MB -5.8%) vs baseline: +4.6% ✅ index_noaspectTime: ✅ 40.854µs (SLO: <300.000µs 📉 -86.4%) vs baseline: +0.8% Memory: ✅ 43.640MB (SLO: <46.000MB -5.1%) vs baseline: +4.8% ✅ join_aspectTime: ✅ 211.044µs (SLO: <300.000µs 📉 -29.7%) vs baseline: -0.6% Memory: ✅ 43.426MB (SLO: <46.000MB -5.6%) vs baseline: +5.0% ✅ join_noaspectTime: ✅ 139.903µs (SLO: <300.000µs 📉 -53.4%) vs baseline: -1.3% Memory: ✅ 43.604MB (SLO: <46.000MB -5.2%) vs baseline: +4.7% ✅ ljust_aspectTime: ✅ 496.718µs (SLO: <700.000µs 📉 -29.0%) vs baseline: -1.6% Memory: ✅ 43.235MB (SLO: <46.000MB -6.0%) vs baseline: +4.8% ✅ ljust_noaspectTime: ✅ 254.376µs (SLO: <300.000µs 📉 -15.2%) vs baseline: +0.1% Memory: ✅ 43.607MB (SLO: <46.000MB -5.2%) vs baseline: +4.8% ✅ lower_aspectTime: ✅ 291.950µs (SLO: <500.000µs 📉 -41.6%) vs baseline: -1.0% Memory: ✅ 43.314MB (SLO: <46.000MB -5.8%) vs baseline: +4.7% ✅ lower_noaspectTime: ✅ 237.284µs (SLO: <300.000µs 📉 -20.9%) vs baseline: -0.1% Memory: ✅ 43.613MB (SLO: <46.000MB -5.2%) vs baseline: +4.9% ✅ lstrip_aspectTime: ✅ 0.314ms (SLO: <3.000ms 📉 -89.5%) vs baseline: 📈 +16.0% Memory: ✅ 43.417MB (SLO: <46.000MB -5.6%) vs baseline: +5.3% ✅ lstrip_noaspectTime: ✅ 0.175ms (SLO: <3.000ms 📉 -94.2%) vs baseline: -0.7% Memory: ✅ 43.575MB (SLO: <46.000MB -5.3%) vs baseline: +4.6% ✅ modulo_aspectTime: ✅ 14.264ms (SLO: <18.750ms 📉 -23.9%) vs baseline: +0.3% Memory: ✅ 43.491MB (SLO: <46.000MB -5.5%) vs baseline: +5.0% ✅ modulo_aspect_for_bytearray_bytearrayTime: ✅ 15.031ms (SLO: <19.350ms 📉 -22.3%) vs baseline: +1.3% Memory: ✅ 43.601MB (SLO: <46.000MB -5.2%) vs baseline: +5.6% ✅ modulo_aspect_for_bytesTime: ✅ 14.395ms (SLO: <18.900ms 📉 -23.8%) vs baseline: -0.3% Memory: ✅ 43.480MB (SLO: <46.000MB -5.5%) vs baseline: +4.6% ✅ modulo_aspect_for_bytes_bytearrayTime: ✅ 14.603ms (SLO: <19.150ms 📉 -23.7%) vs baseline: -0.4% Memory: ✅ 43.574MB (SLO: <46.000MB -5.3%) vs baseline: +5.0% ✅ modulo_noaspectTime: ✅ 0.364ms (SLO: <3.000ms 📉 -87.9%) vs baseline: +1.3% Memory: ✅ 43.614MB (SLO: <46.000MB -5.2%) vs baseline: +4.9% ✅ replace_aspectTime: ✅ 18.421ms (SLO: <24.000ms 📉 -23.2%) vs baseline: -0.1% Memory: ✅ 43.478MB (SLO: <46.000MB -5.5%) vs baseline: +4.6% ✅ replace_noaspectTime: ✅ 279.371µs (SLO: <300.000µs -6.9%) vs baseline: ~same Memory: ✅ 43.568MB (SLO: <46.000MB -5.3%) vs baseline: +4.5% ✅ repr_aspectTime: ✅ 312.074µs (SLO: <420.000µs 📉 -25.7%) vs baseline: +0.4% Memory: ✅ 43.407MB (SLO: <46.000MB -5.6%) vs baseline: +5.0% ✅ repr_noaspectTime: ✅ 46.711µs (SLO: <90.000µs 📉 -48.1%) vs baseline: -0.5% Memory: ✅ 43.671MB (SLO: <46.000MB -5.1%) vs baseline: +4.9% ✅ rstrip_aspectTime: ✅ 385.917µs (SLO: <500.000µs 📉 -22.8%) vs baseline: +0.2% Memory: ✅ 43.449MB (SLO: <46.000MB -5.5%) vs baseline: +5.0% ✅ rstrip_noaspectTime: ✅ 179.537µs (SLO: <300.000µs 📉 -40.2%) vs baseline: -0.6% Memory: ✅ 43.548MB (SLO: <46.000MB -5.3%) vs baseline: +4.7% ✅ slice_aspectTime: ✅ 184.036µs (SLO: <300.000µs 📉 -38.7%) vs baseline: -0.1% Memory: ✅ 43.425MB (SLO: <46.000MB -5.6%) vs baseline: +4.8% ✅ slice_noaspectTime: ✅ 53.800µs (SLO: <90.000µs 📉 -40.2%) vs baseline: -0.2% Memory: ✅ 43.607MB (SLO: <46.000MB -5.2%) vs baseline: +4.9% ✅ stringio_aspectTime: ✅ 3.819ms (SLO: <5.000ms 📉 -23.6%) vs baseline: ~same Memory: ✅ 43.295MB (SLO: <46.000MB -5.9%) vs baseline: +4.5% ✅ stringio_noaspectTime: ✅ 341.507µs (SLO: <500.000µs 📉 -31.7%) vs baseline: -0.6% Memory: ✅ 43.684MB (SLO: <46.000MB -5.0%) vs baseline: +4.5% ✅ strip_aspectTime: ✅ 268.537µs (SLO: <350.000µs 📉 -23.3%) vs baseline: -1.2% Memory: ✅ 43.391MB (SLO: <46.000MB -5.7%) vs baseline: +5.2% ✅ strip_noaspectTime: ✅ 177.236µs (SLO: <240.000µs 📉 -26.2%) vs baseline: +0.6% Memory: ✅ 43.660MB (SLO: <46.000MB -5.1%) vs baseline: +4.7% ✅ swapcase_aspectTime: ✅ 332.832µs (SLO: <500.000µs 📉 -33.4%) vs baseline: -0.7% Memory: ✅ 43.496MB (SLO: <46.000MB -5.4%) vs baseline: +4.8% ✅ swapcase_noaspectTime: ✅ 272.779µs (SLO: <400.000µs 📉 -31.8%) vs baseline: -0.2% Memory: ✅ 43.665MB (SLO: <46.000MB -5.1%) vs baseline: +5.1% ✅ title_aspectTime: ✅ 342.452µs (SLO: <500.000µs 📉 -31.5%) vs baseline: +7.4% Memory: ✅ 43.252MB (SLO: <46.000MB -6.0%) vs baseline: +4.6% ✅ title_noaspectTime: ✅ 259.835µs (SLO: <400.000µs 📉 -35.0%) vs baseline: ~same Memory: ✅ 43.509MB (SLO: <46.000MB -5.4%) vs baseline: +4.5% ✅ translate_aspectTime: ✅ 494.565µs (SLO: <700.000µs 📉 -29.3%) vs baseline: +0.2% Memory: ✅ 43.183MB (SLO: <46.000MB -6.1%) vs baseline: +4.5% ✅ translate_noaspectTime: ✅ 421.589µs (SLO: <500.000µs 📉 -15.7%) vs baseline: -1.8% Memory: ✅ 43.696MB (SLO: <46.000MB -5.0%) vs baseline: +5.0% ✅ upper_aspectTime: ✅ 295.704µs (SLO: <500.000µs 📉 -40.9%) vs baseline: ~same Memory: ✅ 43.274MB (SLO: <46.000MB -5.9%) vs baseline: +4.4% ✅ upper_noaspectTime: ✅ 234.077µs (SLO: <400.000µs 📉 -41.5%) vs baseline: -0.7% Memory: ✅ 43.640MB (SLO: <46.000MB -5.1%) vs baseline: +5.0% 📈 iastaspectsospath - 24/24✅ ospathbasename_aspectTime: ✅ 488.713µs (SLO: <700.000µs 📉 -30.2%) vs baseline: 📈 +17.2% Memory: ✅ 43.498MB (SLO: <46.000MB -5.4%) vs baseline: +5.6% ✅ ospathbasename_noaspectTime: ✅ 422.326µs (SLO: <700.000µs 📉 -39.7%) vs baseline: -0.2% Memory: ✅ 43.332MB (SLO: <46.000MB -5.8%) vs baseline: +4.6% ✅ ospathjoin_aspectTime: ✅ 617.980µs (SLO: <700.000µs 📉 -11.7%) vs baseline: -0.1% Memory: ✅ 43.301MB (SLO: <46.000MB -5.9%) vs baseline: +4.6% ✅ ospathjoin_noaspectTime: ✅ 630.587µs (SLO: <700.000µs -9.9%) vs baseline: +0.9% Memory: ✅ 43.321MB (SLO: <46.000MB -5.8%) vs baseline: +4.6% ✅ ospathnormcase_aspectTime: ✅ 347.309µs (SLO: <700.000µs 📉 -50.4%) vs baseline: +0.3% Memory: ✅ 43.291MB (SLO: <46.000MB -5.9%) vs baseline: +4.9% ✅ ospathnormcase_noaspectTime: ✅ 354.384µs (SLO: <700.000µs 📉 -49.4%) vs baseline: +0.9% Memory: ✅ 43.234MB (SLO: <46.000MB -6.0%) vs baseline: +4.5% ✅ ospathsplit_aspectTime: ✅ 478.365µs (SLO: <700.000µs 📉 -31.7%) vs baseline: -0.5% Memory: ✅ 43.278MB (SLO: <46.000MB -5.9%) vs baseline: +4.5% ✅ ospathsplit_noaspectTime: ✅ 489.220µs (SLO: <700.000µs 📉 -30.1%) vs baseline: -0.6% Memory: ✅ 43.136MB (SLO: <46.000MB -6.2%) vs baseline: +4.1% ✅ ospathsplitdrive_aspectTime: ✅ 367.075µs (SLO: <700.000µs 📉 -47.6%) vs baseline: +0.2% Memory: ✅ 43.470MB (SLO: <46.000MB -5.5%) vs baseline: +5.0% ✅ ospathsplitdrive_noaspectTime: ✅ 73.251µs (SLO: <700.000µs 📉 -89.5%) vs baseline: +0.4% Memory: ✅ 43.306MB (SLO: <46.000MB -5.9%) vs baseline: +4.8% ✅ ospathsplitext_aspectTime: ✅ 449.022µs (SLO: <700.000µs 📉 -35.9%) vs baseline: ~same Memory: ✅ 43.293MB (SLO: <46.000MB -5.9%) vs baseline: +4.7% ✅ ospathsplitext_noaspectTime: ✅ 458.515µs (SLO: <700.000µs 📉 -34.5%) vs baseline: -0.3% Memory: ✅ 43.293MB (SLO: <46.000MB -5.9%) vs baseline: +4.7% 🟡 Near SLO Breach (1 suite)🟡 flasksimple - 18/18✅ appsec-getTime: ✅ 3.462ms (SLO: <4.750ms 📉 -27.1%) vs baseline: +0.5% Memory: ✅ 55.396MB (SLO: <66.500MB 📉 -16.7%) vs baseline: +4.8% ✅ appsec-postTime: ✅ 2.912ms (SLO: <6.750ms 📉 -56.9%) vs baseline: +0.1% Memory: ✅ 55.679MB (SLO: <66.500MB 📉 -16.3%) vs baseline: +4.8% ✅ appsec-telemetryTime: ✅ 3.436ms (SLO: <4.750ms 📉 -27.7%) vs baseline: +0.6% Memory: ✅ 55.512MB (SLO: <66.500MB 📉 -16.5%) vs baseline: +4.9% ✅ debuggerTime: ✅ 1.879ms (SLO: <2.000ms -6.0%) vs baseline: ~same Memory: ✅ 48.917MB (SLO: <51.500MB -5.0%) vs baseline: +4.7% ✅ iast-getTime: ✅ 1.878ms (SLO: <2.000ms -6.1%) vs baseline: +0.4% Memory: ✅ 45.886MB (SLO: <49.000MB -6.4%) vs baseline: +4.9% ✅ profilerTime: ✅ 1.914ms (SLO: <2.100ms -8.9%) vs baseline: -0.1% Memory: ✅ 51.979MB (SLO: <52.500MB 🟡 -1.0%) vs baseline: +5.0% ✅ resource-renamingTime: ✅ 3.412ms (SLO: <3.650ms -6.5%) vs baseline: -0.3% Memory: ✅ 55.513MB (SLO: <60.000MB -7.5%) vs baseline: +4.9% ✅ tracerTime: ✅ 3.431ms (SLO: <3.650ms -6.0%) vs baseline: ~same Memory: ✅ 55.481MB (SLO: <60.000MB -7.5%) vs baseline: +5.0% ✅ tracer-nativeTime: ✅ 3.420ms (SLO: <3.650ms -6.3%) vs baseline: -0.3% Memory: ✅ 55.418MB (SLO: <60.000MB -7.6%) vs baseline: +4.8%
|
Backport of #17297