[Libguestfs] [PATCH NOT WORKING nbdkit 0/3] python: Allow thread model to be set from Python plugins.

Richard W.M. Jones rjones at redhat.com
Wed Aug 5 15:40:26 UTC 2020


Patch 2 certainly allows you to set the thread model.  However patch 3
shows that if you set it to nbdkit.THREAD_MODEL_PARALLEL it will
crash.

If you look closely at the stack trace (attached below) you can see
that ignoring threads which are in parts of nbdkit unrelated to
Python:

Thread 4: In pread, waiting in time.sleep().  This thread has released
          the GIL.

Thread 2: Started to process a pread call but didn't reach Python code yet.

Thread 1: In pread, segfaults when checking if pread() is defined
          in the Python code.

My understanding is this should all be OK and there's no reason for
Python to crash here.  I wonder if it's because we're calling "down"
into Python from C, rather than the usual way of calling from Python
into C.

Rich.

Core was generated by `/home/rjones/d/nbdkit/server/nbdkit -v -P test-python-thread-model.pid -U /tmp/'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007fc4b943e97c in find_name_in_mro (type=<optimized out>, 
    name=0x7fc4aba406b0, error=0x7fc4aa21e7d4)
    at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Python/errors.c:221
221	PyErr_Occurred(void)
[Current thread is 1 (Thread 0x7fc4aa21f640 (LWP 109870))]
 glibc-2.31.9000-21.fc33.x86_64 gmp-6.1.2-12.fc32.x86_64 libidn2-2.3.0-1.fc32.x86_64 libselinux-3.1-1.fc33.x86_64 libtasn1-4.15.0-1.fc32.x86_64 p11-kit-0.23.18.1-1.fc32.x86_64 pcre2-10.34-4.fc32.x86_64
(gdb) t a a bt

Thread 9 (Thread 0x7fc4a9a1e640 (LWP 109871)):
#0  0x00007fc4b9d32e5b in __lll_lock_wait_private () from /lib64/libpthread.so.0
#1  0x00007fc4b9d34115 in flockfile () from /lib64/libpthread.so.0
#2  0x000000000040a053 in nbdkit_debug (fs=0x41bada "starting worker thread %s") at debug.c:91
#3  0x00000000004081b7 in connection_worker (data=0x9ee9ff0) at connections.c:116
#4  0x00007fc4b9d293f9 in start_thread () from /lib64/libpthread.so.0
#5  0x00007fc4b9c55b23 in clone () from /lib64/libc.so.6

Thread 8 (Thread 0x7fc4aaa20640 (LWP 109869)):
#0  0x00007fc4b9d32e5b in __lll_lock_wait_private () from /lib64/libpthread.so.0
#1  0x00007fc4b9d34115 in flockfile () from /lib64/libpthread.so.0
#2  0x000000000040a053 in nbdkit_debug (fs=0x41b3ea "%s: pread count=%u offset=%lu") at debug.c:91
#3  0x0000000000406507 in backend_pread (b=0x9f07040, buf=0x9f80dc0, count=512, offset=0, flags=0, err=0x7fc4aaa1fa78) at backend.c:482
#4  0x0000000000411f7e in handle_request (cmd=0, flags=0, offset=0, count=512, buf=0x9f80dc0, extents=0x0) at protocol.c:241
#5  0x00000000004131c9 in protocol_recv_request_send_reply () at protocol.c:713
#6  0x00000000004081e7 in connection_worker (data=0x9ee9ff0) at connections.c:123
#7  0x00007fc4b9d293f9 in start_thread () from /lib64/libpthread.so.0
#8  0x00007fc4b9c55b23 in clone () from /lib64/libc.so.6

Thread 7 (Thread 0x7fc4aba22640 (LWP 109867)):
#0  0x00007fc4b9c5079b in mprotect () from /lib64/libc.so.6
#1  0x00007fc4b9d2a0e1 in pthread_create@@GLIBC_2.2.5 () from /lib64/libpthread.so.0
#2  0x0000000000408491 in handle_single_connection (sockin=8, sockout=8) at connections.c:204
#3  0x0000000000418824 in start_thread (datav=0x9ee9b10) at sockets.c:337
#4  0x00007fc4b9d293f9 in start_thread () from /lib64/libpthread.so.0
#5  0x00007fc4b9c55b23 in clone () from /lib64/libc.so.6

Thread 6 (Thread 0x7fc4b96bb200 (LWP 109858)):
#0  0x00007fc4b9c4aa2f in poll () from /lib64/libc.so.6
#1  0x0000000000418af3 in check_sockets_and_quit_fd (socks=0x7ffe7d9b3b80) at sockets.c:447
#2  0x0000000000418bd7 in accept_incoming_connections (socks=0x7ffe7d9b3b80) at sockets.c:475
#3  0x000000000040f6c9 in start_serving () at main.c:974
#4  0x000000000040ef8b in main (argc=9, argv=0x7ffe7d9b3de8) at main.c:736

Thread 5 (Thread 0x7fc4a921d640 (LWP 109872)):
#0  0x00007fc4b9c464ef in write () from /lib64/libc.so.6
#1  0x00007fc4b9bd5e5d in _IO_file_write@@GLIBC_2.2.5 () from /lib64/libc.so.6
#2  0x00007fc4b9bd5196 in new_do_write () from /lib64/libc.so.6
#3  0x00007fc4b9bd6f49 in __GI__IO_do_write () from /lib64/libc.so.6
#4  0x00007fc4b9bd73b3 in __GI__IO_file_overflow () from /lib64/libc.so.6
#5  0x00007fc4b9bd2423 in fputc () from /lib64/libc.so.6
#6  0x000000000040a0b9 in nbdkit_debug (fs=0x41bada "starting worker thread %s") at debug.c:98
#7  0x00000000004081b7 in connection_worker (data=0x9ee9cb0) at connections.c:116
#8  0x00007fc4b9d293f9 in start_thread () from /lib64/libpthread.so.0
#9  0x00007fc4b9c55b23 in clone () from /lib64/libc.so.6

Thread 4 (Thread 0x7fc4ab221640 (LWP 109868)):
#0  0x00007fc4b9c4d1bb in select () from /lib64/libc.so.6
#1  0x00007fc4b95321e9 in pysleep (secs=<optimized out>) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Modules/timemodule.c:1909
#2  time_sleep (self=<optimized out>, obj=<optimized out>) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Modules/timemodule.c:341
#3  0x00007fc4b9451a62 in cfunction_vectorcall_O (func=<built-in method sleep of module object at remote 0x7fc4abc41540>, args=0x7fc4abc3ffd0, nargsf=<optimized out>, kwnames=<optimized out>) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Objects/methodobject.c:510
#4  0x00007fc4b944a0a7 in _PyObject_VectorcallTstate (kwnames=0x0, nargsf=<optimized out>, args=0x7fc4abc3ffd0, callable=<built-in method sleep of module object at remote 0x7fc4abc41540>, tstate=0x9f0a610) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Include/cpython/abstract.h:118
#5  PyObject_Vectorcall (kwnames=0x0, nargsf=<optimized out>, args=0x7fc4abc3ffd0, callable=<built-in method sleep of module object at remote 0x7fc4abc41540>) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Include/cpython/abstract.h:127
#6  call_function (kwnames=0x0, oparg=<optimized out>, pp_stack=<synthetic pointer>, tstate=0x9f0a610) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Python/ceval.c:5044
#7  _PyEval_EvalFrameDefault (tstate=<optimized out>, f=<optimized out>, throwflag=<optimized out>) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Python/ceval.c:3459
#8  0x00007fc4b945270b in _PyEval_EvalFrame (throwflag=0, f=Frame 0x7fc4abc3fe40, for file ./python-thread-model.py, line 49, in pread (h={}, count=512, offset=0), tstate=0x9f0a610) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Include/internal/pycore_ceval.h:40
#9  function_code_fastcall (tstate=0x9f0a610, co=<optimized out>, args=<optimized out>, nargs=3, globals=<optimized out>) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Objects/call.c:329
#10 0x00007fc4b9455276 in _PyObject_VectorcallTstate (kwnames=0x0, nargsf=<optimized out>, args=0x7fc4ab220790, callable=<function at remote 0x7fc4aba34a60>, tstate=0x9f0a610) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Include/cpython/abstract.h:81
#11 _PyObject_CallFunctionVa (tstate=0x9f0a610, callable=<function at remote 0x7fc4aba34a60>, format=<optimized out>, va=<optimized out>, is_size_t=<optimized out>) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Objects/call.c:542
#12 0x00007fc4b94c8762 in _PyObject_CallFunction_SizeT (callable=<optimized out>, format=<optimized out>) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Objects/call.c:596
#13 0x00007fc4b9f7b840 in py_pread (handle=0x9ee9f20, buf=0x9f98ca0, count=512, offset=0, flags=0) at python.c:619
#14 0x0000000000410d89 in plugin_pread (b=0x9f07040, handle=0x9ee9f20, buf=0x9f98ca0, count=512, offset=0, flags=0, err=0x7fc4ab220a78) at plugins.c:524
#15 0x000000000040653f in backend_pread (b=0x9f07040, buf=0x9f98ca0, count=512, offset=0, flags=0, err=0x7fc4ab220a78) at backend.c:485
#16 0x0000000000411f7e in handle_request (cmd=0, flags=0, offset=0, count=512, buf=0x9f98ca0, extents=0x0) at protocol.c:241
#17 0x00000000004131c9 in protocol_recv_request_send_reply () at protocol.c:713
#18 0x00000000004081e7 in connection_worker (data=0x9ee9cb0) at connections.c:123
#19 0x00007fc4b9d293f9 in start_thread () from /lib64/libpthread.so.0
#20 0x00007fc4b9c55b23 in clone () from /lib64/libc.so.6

Thread 3 (Thread 0x7fc4a821b640 (LWP 109874)):
#0  0x00007fc4b9c55b15 in clone () from /lib64/libc.so.6
#1  0x00007fc4b9d29310 in annobin_start_thread.start () from /lib64/libpthread.so.0
#2  0x00007fc4a821b640 in ?? ()
#3  0x0000000000000000 in ?? ()

Thread 2 (Thread 0x7fc4a8a1c640 (LWP 109873)):
#0  0x00007fc4b9d32e5b in __lll_lock_wait_private () from /lib64/libpthread.so.0
#1  0x00007fc4b9d34115 in flockfile () from /lib64/libpthread.so.0
#2  0x000000000040a053 in nbdkit_debug (fs=0x41b3ea "%s: pread count=%u offset=%lu") at debug.c:91
#3  0x0000000000406507 in backend_pread (b=0x9f07040, buf=0x9f7cc40, count=512, offset=0, flags=0, err=0x7fc4a8a1ba78) at backend.c:482
#4  0x0000000000411f7e in handle_request (cmd=0, flags=0, offset=0, count=512, buf=0x9f7cc40, extents=0x0) at protocol.c:241
#5  0x00000000004131c9 in protocol_recv_request_send_reply () at protocol.c:713
#6  0x00000000004081e7 in connection_worker (data=0x9eea670) at connections.c:123
#7  0x00007fc4b9d293f9 in start_thread () from /lib64/libpthread.so.0
#8  0x00007fc4b9c55b23 in clone () from /lib64/libc.so.6

Thread 1 (Thread 0x7fc4aa21f640 (LWP 109870)):
#0  0x00007fc4b943e97c in find_name_in_mro (type=<optimized out>, name='pread', error=0x7fc4aa21e7d4) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Python/errors.c:221
#1  0x00007fc4b943e7e3 in _PyType_Lookup (type=0x7fc4b966c760 <PyModule_Type>, name='pread') at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Objects/typeobject.c:3232
#2  0x00007fc4b94512bd in _PyObject_GenericGetAttrWithDict (obj=<module at remote 0x7fc4abbfabd0>, name='pread', dict=0x0, suppress=0) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Objects/object.c:1194
#3  0x00007fc4b9455194 in PyObject_GenericGetAttr (name='pread', obj=<module at remote 0x7fc4abbfabd0>) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Objects/object.c:1278
#4  module_getattro (m=0x7fc4abbfabd0, name='pread') at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Objects/moduleobject.c:717
#5  0x00007fc4b94c2014 in PyObject_GetAttrString (v=<module at remote 0x7fc4abbfabd0>, name=<optimized out>) at /usr/src/debug/python3.9-3.9.0~b3-1.fc33.x86_64/Objects/object.c:795
#6  0x00007fc4b9f7a5e8 in callback_defined (name=0x7fc4b9f7d4b6 "pread", obj_rtn=0x7fc4aa21e940) at python.c:77
#7  0x00007fc4b9f7b7c8 in py_pread (handle=0x9ee9f20, buf=0x9f88890, count=512, offset=0, flags=0) at python.c:610
#8  0x0000000000410d89 in plugin_pread (b=0x9f07040, handle=0x9ee9f20, buf=0x9f88890, count=512, offset=0, flags=0, err=0x7fc4aa21ea78) at plugins.c:524
#9  0x000000000040653f in backend_pread (b=0x9f07040, buf=0x9f88890, count=512, offset=0, flags=0, err=0x7fc4aa21ea78) at backend.c:485
#10 0x0000000000411f7e in handle_request (cmd=0, flags=0, offset=0, count=512, buf=0x9f88890, extents=0x0) at protocol.c:241
#11 0x00000000004131c9 in protocol_recv_request_send_reply () at protocol.c:713
#12 0x00000000004081e7 in connection_worker (data=0x9ee9cb0) at connections.c:123
#13 0x00007fc4b9d293f9 in start_thread () from /lib64/libpthread.so.0
#14 0x00007fc4b9c55b23 in clone () from /lib64/libc.so.6








More information about the Libguestfs mailing list