Reviewed-by: Steven Dake <[email protected]>

On 03/28/2011 07:25 PM, Angus Salkeld wrote:
> If you are connected to corosync and registered for
> object notifications then corosync is asked to shutdown
> the IPC server will get stuck. This is because the pipe
> is closed and the refcount is increased. This leaves ipcs
> with a connection that it can't destroy.
> 
> Solution:
> 1) if a write to the pipe fails (pipe closed) decrement the refcounter.
> 2) fix the object_track_stop() - it was not working as the functions
>    did not match up. (this caused the late callbacks).
> 3) in ipcs call exit_fn() then stats_destroy_connection() so that
>    the service engine can have time to call object_track_stop()
>    before the object gets destroyed.
> 
> Signed-off-by: Angus Salkeld <[email protected]>
> ---
>  exec/coroipcs.c   |    2 +-
>  services/confdb.c |    3 ++-
>  2 files changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/exec/coroipcs.c b/exec/coroipcs.c
> index 29655ba..dbafb18 100644
> --- a/exec/coroipcs.c
> +++ b/exec/coroipcs.c
> @@ -527,8 +527,8 @@ static inline int conn_info_destroy (struct conn_info 
> *conn_info)
>        * Retry library exit function if busy
>        */
>       if (conn_info->state == CONN_STATE_THREAD_DESTROYED) {
> -             api->stats_destroy_connection (conn_info->stats_handle);
>               res = api->exit_fn_get (conn_info->service) (conn_info);
> +             api->stats_destroy_connection (conn_info->stats_handle);
>               if (res == -1) {
>                       api->serialize_unlock ();
>                       return (0);
> diff --git a/services/confdb.c b/services/confdb.c
> index 3187718..b57a041 100644
> --- a/services/confdb.c
> +++ b/services/confdb.c
> @@ -348,7 +348,7 @@ static int confdb_lib_exit_fn (void *conn)
>       api->object_track_stop(confdb_notify_lib_of_key_change,
>               confdb_notify_lib_of_new_object,
>               confdb_notify_lib_of_destroyed_object,
> -             NULL,
> +             confdb_notify_lib_of_reload,
>               conn);
>       return (0);
>  }
> @@ -857,6 +857,7 @@ retry_write:
>       if (written == sizeof(struct confdb_ipc_message_holder)) {
>               return 0;
>       } else {
> +             api->ipc_refcnt_dec(conn);
>               return -1;
>       }
>  }

_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to