Hi Jan
>>> Jan Friesse <[email protected]> 09/26/14 5:12 PM >>>
>So can you please describe me what are you trying to fix (test case)?
>Are really all locks/unlocks you've implemented needed? How did you
>tested patch? Didn't deadlock happened?
I have one corosync core dump issue, and according to the stack I think
it related to lock/unlock incorrect using, so I checked the code and modified
all the incorrect place.
the stack as below:
------------------------------------
(gdb) bt
#0 0x00007f12bd5fc138 in object_key_increment
(object_handle=1750143901185867924, key_name=0x7f12c10044a4, key_len=8,
value=0x7f12c1aedb14) at objdb.c:1088
#1 0x0000000000405847 in corosync_stats_increment_value
(handle=1750143901185867924, name=0x7f12c10044a4 "requests")
at main.c:1269
#2 0x00007f12c1002cf7 in pthread_ipc_consumer (conn=0x6a7f60) at coroipcs.c:719
#3 0x00007f12c0807e76 in check_list (l=<optimized out>) at allocatestack.c:835
#4 __reclaim_stacks () at allocatestack.c:850
#5 0x0000000000000000 in ?? ()
(gdb) p *instance->key_head.next
$15 = {next = 0x6a1008, prev = 0x6a7090}
(gdb) p *(*instance->key_head.next).next
$16 = {next = 0x69b8d8, prev = 0x6a0ee8}
(gdb) p *(*(*instance->key_head.next).next).next
$17 = {next = 0x69b958, prev = 0x6a1008}
(gdb) p &instance->key_head
$18 = (struct list_head *) 0x6a7090
(gdb) p *(*(*(*instance->key_head.next).next).next).next
$19 = {next = 0x7f12b03fe150 <cpg_pd_list_head>, prev =
0x69b8d8}------------------------------------
Regards,
Xia, Li
xia li napsal(a):
> patch for v1.4.7
>
> Signed-off-by: xia li <[email protected]>
> ---
> exec/objdb.c | 16 +++++++++++++---
> 1 file changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/exec/objdb.c b/exec/objdb.c
> index 5d7c124..1a0b2fb 100644
> --- a/exec/objdb.c
> +++ b/exec/objdb.c
> @@ -1412,7 +1412,7 @@ static int object_priv_get (
> int res;
> struct object_instance *object_instance;
>
> - objdb_unlock();
> + objdb_lock();
> res = hdb_handle_get (&object_instance_database,
> object_handle, (void *)&object_instance);
> if (res != 0) {
> @@ -1723,9 +1723,12 @@ static int object_track_start(hdb_handle_t
> object_handle,
> unsigned int res;
> struct object_tracker * tracker_pt;
>
> + objdb_lock();
> +
> res = hdb_handle_get (&object_instance_database,
> object_handle, (void *)&instance);
> if (res != 0) {
> + objdb_unlock();
> return (res);
> }
> tracker_pt = malloc(sizeof(struct object_tracker));
> @@ -1746,6 +1749,7 @@ static int object_track_start(hdb_handle_t
> object_handle,
>
> hdb_handle_put (&object_instance_database, object_handle);
>
> + objdb_unlock();
> return (res);
> }
>
> @@ -1762,6 +1766,8 @@ static void
> object_track_stop(object_key_change_notify_fn_t key_change_notify_fn
> struct list_head *obj_list, *tmp_obj_list;
> unsigned int res;
>
> + objdb_lock();
> +
> /* go through the global list and find all the trackers to stop */
> for (list = objdb_trackers_head.next, tmp_list = list->next;
> list != &objdb_trackers_head; list = tmp_list, tmp_list =
> tmp_list->next) {
> @@ -1796,6 +1802,7 @@ static void
> object_track_stop(object_key_change_notify_fn_t key_change_notify_fn
> free(tracker_pt);
> }
> }
> + objdb_unlock();
> }
>
> static int object_dump(hdb_handle_t object_handle,
> @@ -1852,10 +1859,11 @@ static int object_reload_config(int flush, const char
> **error_string)
> int res;
>
> main_get_config_modules(&modules, &num_modules);
> - object_reload_notification(OBJDB_RELOAD_NOTIFY_START, flush);
>
> objdb_lock();
>
> + object_reload_notification(OBJDB_RELOAD_NOTIFY_START, flush);
> +
> for (i=0; i<num_modules; i++) {
> if (modules[i]->config_reloadconfig) {
> res = modules[i]->config_reloadconfig(&objdb_iface,
> flush, error_string);
> @@ -1866,8 +1874,10 @@ static int object_reload_config(int flush, const char
> **error_string)
> }
> }
> }
> - objdb_unlock();
> +
> object_reload_notification(OBJDB_RELOAD_NOTIFY_END, flush);
> +
> + objdb_unlock();
> return 0;
> }
>
>
_______________________________________________
discuss mailing list
[email protected]
http://lists.corosync.org/mailman/listinfo/discuss