New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
uWSGI process got Segmentation Fault #330
Comments
Thank you for the report. From the backtrace, this appears to be happening while the process is shutting down ( I haven't been able to reproduce it, though, so any details that would assist in that would be appreciated. |
Using uWSGI 2.0.20 (64bit) Logs for one process : spawned uWSGI worker 1 (pid: 3573452, cores: 1)
spawned 1 offload threads for uWSGI worker 1
WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x5631c694ff70 pid: 3573452 (default app)
[busyness] 5s average busyness is at 92%, will spawn 1 new worker(s)
spawned uWSGI worker 2 (pid: 3574020, cores: 1)
spawned 1 offload threads for uWSGI worker 2
WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x5631c694ff70 pid: 3574020 (default app)
[busyness] 5s average busyness is at 1%, cheap one of 2 running workers
[HERE SEGFAULT]
worker 1 killed successfully (pid: 3573452)
uWSGI worker 1 cheaped. From logs, i think this is produces when we spawn more workers and we remove one |
Thank you, but there's a lot more that I need to know to reproduce this (trust me, I tried for two days and could not reproduce a crash with any combination of uWSGI args and app code). Things like:
|
Hi, i will try my best to give you more details, here some new traces WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x55dc54f91f70 pid: 1552112 (default app)
[busyness] 5s average busyness is at 0%, cheap one of 4 running workers
terminate called after throwing an instance of 'greenlet::TypeError'
what(): Expected a greenlet
worker 2 killed successfully (pid: 1539874) |
Hi all! # wsgi.py
from boolean_parser.parsers import Parser
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] I start it with the following uwsgi settings
docker build . -t foo
docker run -it --rm -p 8000:8000 foo
Here are the logs
I hope I could help :) |
This bisects to c7841e3, and can be simplified to: from greenlet import getcurrent
getcurrent()
def application(env, start_response):
start_response("200 OK", [("Content-Type", "text/html")])
return [b"Hello World"] I found more repeatability with stopping the Docker container, rather than making a request: #!/usr/bin/env bash
set -eux
cd "$(dirname "$0")"
docker build . -t uwsgi-greenlet-crash
(
sleep 3
docker stop "$(docker ps -ql)" -t 1
) &
docker run -it --rm -p 8000:8000 uwsgi-greenlet-crash |
I lied -- that commit happened to pass the race condition, and wasn't the actual culprit. AFAICT a421362 is. During |
Working from latest master, this issue repros every time for me. It looks like the tricks it is playing aren't working: greenlet/src/greenlet/greenlet.cpp Lines 302 to 304 in d80abc7
Adding some debugging I see the This is the debugging I added master...rectalogic:greenlet:crash#diff-456554c7ddb2c4b7e56ce6326b9f03dedb03a89a243b924f7fc312737f83b22c And this is what it prints (see the lines prefixed
|
The destructor runs before the last take_next_to_destroy - and so it gets a NULL pointer and crashes. Fixes python-greenlet#330
I apologize, it looks like I never said thanks for all the detective work in this thread. |
Pull in the fix for python-greenlet/greenlet#330. (cherry picked from commit 2e760f1)
Switch to wheel.mk. 3.0.1 (2023-10-25) ================== - Fix a potential crash on Python 3.8 at interpreter shutdown time. This was a regression from earlier 3.0.x releases. Reported by Matt Wozniski in `issue 376 <https://github.com/python-greenlet/greenlet/issues/376>`_. 3.0.0 (2023-10-02) ================== - No changes from 3.0rc3 aside from the version number. 3.0.0rc3 (2023-09-12) ===================== - Fix an intermittent error during process termination on some platforms (GCC/Linux/libstdc++). 3.0.0rc2 (2023-09-09) ===================== - Fix some potential bugs (assertion failures and memory leaks) in previously-untested error handling code. In some cases, this means that the process will execute a controlled ``abort()`` after severe trouble when previously the process might have continued for some time with a corrupt state. It is unlikely those errors occurred in practice. - Fix some assertion errors and potential bugs with re-entrant switches. - Fix a potential crash when certain compilers compile greenlet with high levels of optimization. The symptom would be that switching to a greenlet for the first time immediately crashes. - Fix a potential crash when the callable object passed to the greenlet constructor (or set as the ``greenlet.run`` attribute) has a destructor attached to it that switches. Typically, triggering this issue would require an unlikely subclass of ``greenlet.greenlet``. - Python 3.11+: Fix rare switching errors that could occur when a garbage collection was triggered during the middle of a switch, and Python-level code in ``__del__`` or weakref callbacks switched to a different greenlet and ultimately switched back to the original greenlet. This often manifested as a ``SystemError``: "switch returned NULL without an exception set." For context on the fixes, see `gevent issue #1985 <https://github.com/gevent/gevent/issues/1985>`_. 3.0.0rc1 (2023-09-01) ===================== - Windows wheels are linked statically to the C runtime in an effort to prevent import errors on systems without the correct C runtime installed. It's not clear if this will make the situation better or worse, so please share your experiences in `issue 346 <https://github.com/python-greenlet/greenlet/issues/346>`_. Note that this only applies to the binary wheels found on PyPI. Building greenlet from source defaults to the shared library. Set the environment variable ``GREENLET_STATIC_RUNTIME=1`` at build time to change that. - Build binary wheels for Python 3.12 on macOS. - Fix compiling greenlet on a debug build of CPython 3.12. There is `one known issue <https://github.com/python-greenlet/greenlet/issues/368>`_ that leads to an interpreter crash on debug builds. - Python 3.12: Fix walking the frame stack of suspended greenlets. Previously accessing ``glet.gr_frame.f_back`` would crash due to `changes in CPython's undocumented internal frame handling <https://github.com/python/cpython/commit/1e197e63e21f77b102ff2601a549dda4b6439455>`_. Platforms --------- - Now, greenlet *may* compile and work on Windows ARM64 using llvm-mingw, but this is untested and unsupported. See `PR <https://github.com/python-greenlet/greenlet/pull/224>`_ by Adrian Vladu. - Now, greenlet *may* compile and work on LoongArch64 Linux systems, but this is untested and unsupported. See `PR 257 <https://github.com/python-greenlet/greenlet/pull/257/files>`_ by merore. Known Issues ------------ - There may be (very) subtle issues with tracing on Python 3.12, which has redesigned the entire tracing infrastructure. 3.0.0a1 (2023-06-21) ==================== - Build binary wheels for S390x Linux. See `PR 358 <https://github.com/python-greenlet/greenlet/pull/358>`_ from Steven Silvester. - Fix a rare crash on shutdown seen in uWSGI deployments. See `issue 330 <https://github.com/python-greenlet/greenlet/issues/330>`_ and `PR 356 <https://github.com/python-greenlet/greenlet/pull/356>`_ from Andrew Wason. - Make the platform-specific low-level C/assembly snippets stop using the ``register`` storage class. Newer versions of standards remove this storage class, and it has been generally ignored by many compilers for some time. See `PR 347 <https://github.com/python-greenlet/greenlet/pull/347>`_ from Khem Raj. - Add initial support for Python 3.12. See `issue <https://github.com/python-greenlet/greenlet/issues/323>`_ and `PR <https://github.com/python-greenlet/greenlet/pull/327>`_; thanks go to (at least) Michael Droettboom, Andreas Motl, Thomas A Caswell, raphaelauv, Hugo van Kemenade, Mark Shannon, and Petr Viktorin. - Remove support for end-of-life Python versions, including Python 2.7, Python 3.5 and Python 3.6. - Require a compiler that supports ``noinline`` directives. See `issue 271 <https://github.com/python-greenlet/greenlet/issues/266>`_. - Require a compiler that supports C++11.
Hi,
It's look like one of our dependencies bumped greenlet to 2.0.1.
Last night we had a failure on our server :
Remind me of #325 cause of
_ZN24ThreadState_DestroyNoGIL19DestroyQueueWithGILEPv
The text was updated successfully, but these errors were encountered: