Bug #21157
Updated by John Spray over 6 years ago
I think this got broken when use of sub-interpreters was added. MonCommandCompletion used to use PyGILState_Ensure, which would create thread state if needed, but then switched to Gil(), which expects you to explicitly specify whether you're possibly calling from a non-initialized thread (such as the MonClient Finisher, where we get our moncommand completions).
<pre>
ceph version 12.1.1-1977-gfae184f (fae184fe001d8b655b4ca1914871c6e62a5e1430) mimic (dev)
1: (ceph::BackTrace::BackTrace(int)+0x45) [0x557d448371eb]
2: (()+0x15d71f9) [0x557d448361f9]
3: (()+0x11390) [0x7fc0e2fd0390]
4: (PyDict_SetItem()+0x20) [0x7fc0e415be70]
5: (PyEval_EvalFrameEx()+0x326e) [0x7fc0e40b3f6e]
6: (PyEval_EvalFrameEx()+0x7124) [0x7fc0e40b7e24]
7: (PyEval_EvalCodeEx()+0x85c) [0x7fc0e41e201c]
8: (PyEval_EvalFrameEx()+0x6ffd) [0x7fc0e40b7cfd]
9: (PyEval_EvalFrameEx()+0x7124) [0x7fc0e40b7e24]
10: (PyEval_EvalFrameEx()+0x7124) [0x7fc0e40b7e24]
11: (PyEval_EvalCodeEx()+0x85c) [0x7fc0e41e201c]
12: (()+0x13e2e0) [0x7fc0e41382e0]
13: (PyObject_Call()+0x43) [0x7fc0e410b1e3]
14: (()+0x18531c) [0x7fc0e417f31c]
15: (PyObject_Call()+0x43) [0x7fc0e410b1e3]
16: (PyEval_CallObjectWithKeywords()+0x47) [0x7fc0e41e1447]
17: (MonCommandCompletion::finish(int)+0x4bc) [0x557d446802b4]
18: (Context::complete(int)+0x27) [0x557d44621205]
19: (Finisher::finisher_thread_entry()+0x426) [0x557d44890e32]
20: (Finisher::FinisherThread::entry()+0x1c) [0x557d446a9000]
21: (Thread::entry_wrapper()+0xc1) [0x557d44b41b69]
22: (Thread::_entry_func(void*)+0x18) [0x557d44b41a9e]
23: (()+0x76ba) [0x7fc0e2fc66ba]
24: (clone()+0x6d) [0x7fc0e20323dd]
</pre>