Hi All,

I encountered a dead looping at the following code:

coroipcs_ipc_service_exit() {
...
while (conn_info_destroy (conn_info) != -1)
;
}

It happend when confdb service side was notifying library side about key
changing(or object creating/destroying) while corosync is unloading. When
it happend, i saw conn_info->refcount =3, and it was a confdb IPC
connection.

By analysing the code I found that there is a gap
between service_exit_schedwrk_handler()
and service_unlink_schedwrk_handler(), and if confdb service side calls
confdb_notify_lib_of_key_change() in this gap (triggered by some other
service), the conn_info->refcount will be increased
by ipc_dispatch_send_from_poll_thread(). Then, when we are in
coroipcs_ipc_service_exit(), dead loop will happen.

And more, after service_exit_schedwrk_handler() for confdb is
done, objdb_notify_dispatch() is unregistered from poll, thus, there is no
more chance to decrease conn->refcount after this(even we somehow omit the
dead loop).

Above is my conclusion only by code analysis. I haven't got any idea to
correct it , even not sure if it is the root cause of the dead loop. Please
help.

-- 
Yours,
Jason
_______________________________________________
discuss mailing list
[email protected]
http://lists.corosync.org/mailman/listinfo/discuss

Reply via email to