Skip to content

Commit 995e2ec

Browse files
committed
undo the python undo
fixup dbgsym? fixup dbgsym? fixup dbgsym? fixup dbgsym? fixup dbgsym? fixup dbgsym? fixup dbgsym? fixup dbgsym fixup dbgpkg Revert "DISPATCH-1942 Use findPython when on CMake3.15+" This reverts commit f486435 fixup too many decrefs fixup travis yml; this is the best way ;DDDD fixup travis yml? fixup try -fno-omit-frame-pointer fixup try -fno-omit-frame-pointer fixup try -fno-omit-frame-pointer fixup try -fno-omit-frame-pointer fixup try -fno-omit-frame-pointer try -fno-omit-frame-pointer WIP: attempt at improving situation around DISPATCH-1962 WIP: attempt at improving situation around DISPATCH-1962
1 parent b919a63 commit 995e2ec

File tree

9 files changed

+104
-57
lines changed

9 files changed

+104
-57
lines changed

.github/workflows/build.yaml

+3-3
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ jobs:
4848
DispatchCMakeExtraArgs: >
4949
-DCMAKE_C_COMPILER_LAUNCHER=ccache
5050
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
51-
-DCMAKE_C_FLAGS=-DQD_MEMORY_DEBUG
51+
-DCMAKE_C_FLAGS="-DQD_MEMORY_DEBUG"
5252
-DQD_ENABLE_ASSERTIONS=ON
5353
-DCONSOLE_INSTALL=OFF
5454
-DUSE_BWRAP=ON
@@ -119,7 +119,7 @@ jobs:
119119
"-DCMAKE_INSTALL_PREFIX=${InstallPrefix}" \
120120
"-DCMAKE_BUILD_TYPE=${BuildType}" \
121121
"-GNinja" \
122-
${ProtonCMakeExtraArgs}
122+
${{env.ProtonCMakeExtraArgs}}
123123
124124
- name: qpid-proton cmake build/install
125125
run: cmake --build "${ProtonBuildDir}" --config ${BuildType} -t install
@@ -134,7 +134,7 @@ jobs:
134134
"-DCMAKE_INSTALL_PREFIX=${InstallPrefix}" \
135135
"-DCMAKE_BUILD_TYPE=${BuildType}" \
136136
"-GNinja" \
137-
${DispatchCMakeExtraArgs}
137+
${{env.DispatchCMakeExtraArgs}}
138138
139139
- name: qpid-dispatch cmake build/install
140140
run: cmake --build "${DispatchBuildDir}" --config ${BuildType} -t install

.travis.yml

+5-3
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ jobs:
5050
env:
5151
- PATH="/usr/bin:$PATH" PROTON_VERSION=main BUILD_TYPE=Debug
5252
- DISPATCH_CMAKE_ARGS='-DRUNTIME_CHECK=asan'
53+
- PYTHON_EXECUTABLE=/usr/bin/python2.7-dbg
5354
- name: "qdrouterd:Coverage"
5455
os: linux
5556
env:
@@ -59,6 +60,7 @@ jobs:
5960
env:
6061
- PATH="/usr/bin:$PATH" PROTON_VERSION=0.34.0 BUILD_TYPE=RelWithDebInfo
6162
- DISPATCH_CMAKE_ARGS='-DRUNTIME_CHECK=asan -DCMAKE_C_FLAGS=-DQD_MEMORY_DEBUG'
63+
- PYTHON_EXECUTABLE=/usr/bin/python2.7-dbg
6264
- name: "qdrouterd:RelWithDebInfo+MemoryDebug (clang on focal)"
6365
os: linux
6466
dist: focal
@@ -159,7 +161,7 @@ addons:
159161
- cmake
160162
- libsasl2-dev
161163
- libssl-dev
162-
- python2.7
164+
- python2.7-dbg
163165
- python2.7-dev
164166
- sasl2-bin
165167
- swig
@@ -186,15 +188,15 @@ install:
186188
# Build and install proton from source.
187189
- mkdir qpid-proton/build
188190
- pushd qpid-proton/build
189-
- cmake .. -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DBUILD_BINDINGS=python
191+
- cmake .. -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7_d.so -DBUILD_BINDINGS=python
190192
- cmake --build . --target install -- -j $NPROC
191193
- popd
192194

193195
before_script:
194196
- source qpid-proton/build/config.sh
195197
- mkdir build
196198
- pushd build
197-
- cmake .. -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${DISPATCH_CMAKE_ARGS}
199+
- cmake .. -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE} -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7_d.so ${DISPATCH_CMAKE_ARGS}
198200
- . config.sh
199201
- make -j $NPROC
200202

src/dispatch.c

+9-2
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ qd_error_t qd_dispatch_prepare(qd_dispatch_t *qd)
341341
void qd_dispatch_set_agent(qd_dispatch_t *qd, void *agent) {
342342
assert(agent);
343343
assert(!qd->agent);
344+
Py_IncRef(agent); // TODO: why not incref here? actually probably needed, I get a leak in test 9 without this, strange...
344345
qd->agent = agent;
345346
}
346347

@@ -368,12 +369,18 @@ void qd_dispatch_free(qd_dispatch_t *qd)
368369
qd_connection_manager_free(qd->connection_manager);
369370
qd_policy_free(qd->policy);
370371
Py_XDECREF((PyObject*) qd->agent);
372+
// Py_XDECREF(qd_python_module()); // hack
373+
PyGC_Collect(); // run destructors while we still have the router around
374+
// int ret = PyRun_SimpleString("import objgraph; import gc; gc.collect(); from qpid_dispatch_internal.management import config");
375+
// assert(ret == 0);
376+
377+
// qd_python_finalize();
378+
371379
qd_router_free(qd->router);
372380
qd_container_free(qd->container);
373381
qd_server_free(qd->server);
374382
qd_log_finalize();
375-
qd_alloc_finalize();
376-
qd_python_finalize();
383+
qd_alloc_finalize(); // python objects may use alloc pool objects during finalization? TODO: they do that now // actually, no, too late to do real work now
377384
qd_dispatch_set_router_id(qd, NULL);
378385
qd_dispatch_set_router_area(qd, NULL);
379386
}

src/python_embedded.c

+22-6
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,8 @@ static PyTypeObject LogAdapterType = {
562562
.tp_dealloc = (destructor)LogAdapter_dealloc,
563563
.tp_flags = Py_TPFLAGS_DEFAULT,
564564
.tp_methods = LogAdapter_methods,
565-
.tp_init = (initproc)LogAdapter_init
565+
.tp_init = (initproc)LogAdapter_init,
566+
.tp_new = PyType_GenericNew,
566567
};
567568

568569

@@ -716,10 +717,24 @@ static int IoAdapter_init(IoAdapter *self, PyObject *args, PyObject *kwds)
716717
return 0;
717718
}
718719

720+
// visit all members which may conceivably participate in reference cycles
721+
static int IoAdapter_traverse(IoAdapter* self, visitproc visit, void *arg)
722+
{
723+
Py_VISIT(self->handler);
724+
return 0;
725+
}
726+
727+
static int IoAdapter_clear(IoAdapter* self)
728+
{
729+
Py_CLEAR(self->handler);
730+
return 0;
731+
}
732+
719733
static void IoAdapter_dealloc(IoAdapter* self)
720734
{
721735
qdr_core_unsubscribe(self->sub);
722-
Py_DECREF(self->handler);
736+
PyObject_GC_UnTrack(self);
737+
IoAdapter_clear(self);
723738
Py_TYPE(self)->tp_free((PyObject*)self);
724739
}
725740

@@ -812,10 +827,13 @@ static PyTypeObject IoAdapterType = {
812827
.tp_name = DISPATCH_MODULE ".IoAdapter",
813828
.tp_doc = "Dispatch IO Adapter",
814829
.tp_basicsize = sizeof(IoAdapter),
830+
.tp_traverse = (traverseproc)IoAdapter_traverse,
831+
.tp_clear = (inquiry)IoAdapter_clear,
815832
.tp_dealloc = (destructor)IoAdapter_dealloc,
816-
.tp_flags = Py_TPFLAGS_DEFAULT,
833+
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
817834
.tp_methods = IoAdapter_methods,
818835
.tp_init = (initproc)IoAdapter_init,
836+
.tp_new = PyType_GenericNew,
819837
};
820838

821839

@@ -831,8 +849,6 @@ static void qd_register_constant(PyObject *module, const char *name, uint32_t va
831849

832850
static void qd_python_setup(void)
833851
{
834-
LogAdapterType.tp_new = PyType_GenericNew;
835-
IoAdapterType.tp_new = PyType_GenericNew;
836852
if ((PyType_Ready(&LogAdapterType) < 0) || (PyType_Ready(&IoAdapterType) < 0)) {
837853
qd_error_py();
838854
qd_log(log_source, QD_LOG_CRITICAL, "Unable to initialize Adapters");
@@ -880,7 +896,7 @@ static void qd_python_setup(void)
880896
qd_register_constant(m, "TREATMENT_ANYCAST_CLOSEST", QD_TREATMENT_ANYCAST_CLOSEST);
881897
qd_register_constant(m, "TREATMENT_ANYCAST_BALANCED", QD_TREATMENT_ANYCAST_BALANCED);
882898

883-
Py_INCREF(m);
899+
// Py_INCREF(m); // PyImport_ImportModule does the increment already
884900
dispatch_module = m;
885901
}
886902

src/router_core/modules/mobile_sync/mobile.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -936,11 +936,13 @@ static void qcm_mobile_sync_final_CT(void *module_context)
936936
{
937937
qdrm_mobile_sync_t *msync = (qdrm_mobile_sync_t*) module_context;
938938

939+
qdr_core_unsubscribe(msync->message_sub1);
940+
qdr_core_unsubscribe(msync->message_sub2);
939941
qdrc_event_unsubscribe_CT(msync->core, msync->event_sub);
940942
qdr_core_timer_free_CT(msync->core, msync->timer);
941943

942944
//
943-
// Don't explicitly unsubscribe the addresses, these are already gone at module-final time.
945+
// Don't explicitly unsubscribe the addresses, these are already gone at module-final time. // TODO: appears not?
944946
//
945947

946948
free(msync);

src/router_core/router_core.c

+39-33
Original file line numberDiff line numberDiff line change
@@ -150,37 +150,8 @@ void qdr_core_free(qdr_core_t *core)
150150
core->router_id = 0;
151151
core->router_area = 0;
152152

153-
// discard any left over actions
154-
155-
qdr_action_list_t action_list;
156-
DEQ_MOVE(core->action_list, action_list);
157-
DEQ_APPEND(action_list, core->action_list_background);
158-
qdr_action_t *action = DEQ_HEAD(action_list);
159-
while (action) {
160-
DEQ_REMOVE_HEAD(action_list);
161-
action->action_handler(core, action, true);
162-
free_qdr_action_t(action);
163-
action = DEQ_HEAD(action_list);
164-
}
165-
166-
// Drain the general work lists
167-
qdr_general_handler(core);
168-
169-
//
170-
// Free the core resources
171-
//
172-
sys_thread_free(core->thread);
173-
sys_cond_free(core->action_cond);
174-
sys_mutex_free(core->action_lock);
175-
sys_mutex_free(core->work_lock);
176-
sys_mutex_free(core->id_lock);
177-
qd_timer_free(core->work_timer);
178-
179-
for (int i = 0; i <= QD_TREATMENT_LINK_BALANCED; ++i) {
180-
if (core->forwarders[i]) {
181-
free(core->forwarders[i]);
182-
}
183-
}
153+
// I have to first run qdrc_endpoint_do_cleanup_CT src/router_core/core_link_endpoint.c:241
154+
// and only then qcm_edge_router_final_CT src/router_core/modules/edge_router/module.c:59
184155

185156
qdr_link_route_t *link_route = 0;
186157
while ( (link_route = DEQ_HEAD(core->link_routes))) {
@@ -303,11 +274,46 @@ void qdr_core_free(qdr_core_t *core)
303274
}
304275
assert(DEQ_SIZE(core->streaming_connections) == 0);
305276

306-
// at this point all the conn identifiers have been freed
307-
qd_hash_free(core->conn_id_hash);
277+
// this now adds unsubscribe actions, so have to do before the discard next
278+
// plus I need to run it before core mutexes are freed
308279

309280
qdr_modules_finalize(core);
310281

282+
// discard any left over actions
283+
284+
qdr_action_list_t action_list;
285+
DEQ_MOVE(core->action_list, action_list);
286+
DEQ_APPEND(action_list, core->action_list_background);
287+
qdr_action_t *action = DEQ_HEAD(action_list);
288+
while (action) {
289+
DEQ_REMOVE_HEAD(action_list);
290+
action->action_handler(core, action, true);
291+
free_qdr_action_t(action);
292+
action = DEQ_HEAD(action_list);
293+
}
294+
295+
// Drain the general work lists
296+
qdr_general_handler(core);
297+
298+
//
299+
// Free the core resources
300+
//
301+
sys_thread_free(core->thread);
302+
sys_cond_free(core->action_cond);
303+
sys_mutex_free(core->action_lock);
304+
sys_mutex_free(core->work_lock);
305+
sys_mutex_free(core->id_lock);
306+
qd_timer_free(core->work_timer);
307+
308+
for (int i = 0; i <= QD_TREATMENT_LINK_BALANCED; ++i) {
309+
if (core->forwarders[i]) {
310+
free(core->forwarders[i]);
311+
}
312+
}
313+
314+
// at this point all the conn identifiers have been freed
315+
qd_hash_free(core->conn_id_hash);
316+
311317
qdr_agent_free(core->mgmt_agent);
312318

313319
if (core->routers_by_mask_bit) free(core->routers_by_mask_bit);

src/router_node.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2153,12 +2153,12 @@ void qd_router_free(qd_router_t *router)
21532153

21542154
qd_container_set_default_node_type(router->qd, 0, 0, QD_DIST_BOTH);
21552155

2156+
qd_router_python_free(router);
21562157
qdr_core_free(router->router_core);
21572158
qd_tracemask_free(router->tracemask);
21582159
qd_timer_free(router->timer);
21592160
sys_mutex_free(router->lock);
21602161
qd_router_configure_free(router);
2161-
qd_router_python_free(router);
21622162

21632163
free(router);
21642164
free(node_id);

src/router_pynode.c

+13-7
Original file line numberDiff line numberDiff line change
@@ -307,11 +307,12 @@ static PyMethodDef RouterAdapter_methods[] = {
307307

308308
static PyTypeObject RouterAdapterType = {
309309
PyVarObject_HEAD_INIT(NULL, 0)
310-
.tp_name = "dispatch.RouterAdapter", /* tp_name*/
311-
.tp_basicsize = sizeof(RouterAdapter), /* tp_basicsize*/
312-
.tp_flags = Py_TPFLAGS_DEFAULT, /* tp_flags*/
313-
.tp_doc = "Dispatch Router Adapter", /* tp_doc */
314-
.tp_methods = RouterAdapter_methods, /* tp_methods */
310+
.tp_name = "dispatch.RouterAdapter",
311+
.tp_basicsize = sizeof(RouterAdapter),
312+
.tp_flags = Py_TPFLAGS_DEFAULT,
313+
.tp_doc = "Dispatch Router Adapter",
314+
.tp_methods = RouterAdapter_methods,
315+
.tp_new = PyType_GenericNew,
315316
};
316317

317318

@@ -392,7 +393,6 @@ qd_error_t qd_router_python_setup(qd_router_t *router)
392393
return QD_ERROR_NONE;
393394

394395
PyObject *pDispatchModule = qd_python_module();
395-
RouterAdapterType.tp_new = PyType_GenericNew;
396396
PyType_Ready(&RouterAdapterType);
397397
QD_ERROR_PY_RET();
398398

@@ -444,6 +444,7 @@ qd_error_t qd_router_python_setup(qd_router_t *router)
444444
// Instantiate the router
445445
//
446446
pyRouter = PyObject_CallObject(pClass, pArgs);
447+
Py_DECREF(pClass);
447448
Py_DECREF(pArgs);
448449
Py_DECREF(adapterType);
449450
QD_ERROR_PY_RET();
@@ -456,7 +457,12 @@ qd_error_t qd_router_python_setup(qd_router_t *router)
456457
}
457458

458459
void qd_router_python_free(qd_router_t *router) {
459-
// empty
460+
Py_XDECREF(pyRouter);
461+
Py_XDECREF(pyTick);
462+
Py_XDECREF(pySetMobileSeq);
463+
Py_XDECREF(pySetMyMobileSeq);
464+
Py_XDECREF(pyLinkLost);
465+
// qd_python_finalize();
460466
}
461467

462468

tests/lsan.supp

+9-1
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,21 @@ leak:sys_mutex
3838

3939
# expected, not a bug:
4040
#
41-
leak:qdr_core_subscribe
41+
#leak:qdr_core_subscribe
4242

4343
# Ubuntu 16.04 (Xenial)
4444
#
4545
leak:_ctypes_alloc_format_string
4646
leak:__strdup
4747

48+
# to be triaged; system_tests_http
49+
leak:^callback_healthz$
50+
leak:^callback_metrics$
51+
52+
# to be triaged; system_tests_http1_adaptor
53+
leak:^pn_condition$
54+
leak:^pn_raw_connection$
55+
4856
####
4957
#### Miscellaneous 3rd party libraries:
5058
####

0 commit comments

Comments
 (0)