Hi

Just one comments inline.

-Angus

On Wed, May 11, 2011 at 05:35:44PM +0200, Jan Friesse wrote:
> Information about processes using cpg are now stored in objdb.
> Each process info is object stored in cpg object, with nodeid,
> pid and group name keys.
> ---
>  services/cpg.c |  124 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 124 insertions(+), 0 deletions(-)
> 
> diff --git a/services/cpg.c b/services/cpg.c
> index ec509e0..a40fb49 100644
> --- a/services/cpg.c
> +++ b/services/cpg.c
> @@ -177,6 +177,7 @@ struct process_info {
>       uint32_t pid;
>       mar_cpg_name_t group;
>       struct list_head list; /* on the group_info members list */
> +     hdb_handle_t objdb_object_handle;
>  };
>  DECLARE_LIST_INIT(process_info_list_head);
>  
> @@ -580,6 +581,127 @@ static int notify_lib_totem_membership (
>       return CPG_OK;
>  }
>  
> +static int object_find_or_create (
> +     hdb_handle_t parent_object_handle,
> +     hdb_handle_t *object_handle,
> +     const void *object_name,
> +     size_t object_name_len)
> +{
> +     hdb_handle_t obj_finder;
> +     hdb_handle_t obj;
> +     int ret = -1;
> +
> +     api->object_find_create (
> +             parent_object_handle,
> +             object_name,
> +             object_name_len,
> +             &obj_finder);
> +
> +     if (api->object_find_next (obj_finder, &obj) == 0) {
> +             /* found it */
> +             *object_handle = obj;
> +             ret = 0;
> +     } else {
> +             ret = api->object_create (parent_object_handle,
> +                     object_handle,
> +                     object_name, object_name_len);
> +     }
> +
> +     api->object_find_destroy (obj_finder);
> +
> +     return ret;
> +}
> +
> +static int update_confdb_info_add_process(
> +     struct process_info *pi)
> +{
> +     hdb_handle_t cpg_handle;
> +     hdb_handle_t pi_handle;
> +     int ret;
> +
> +     ret = object_find_or_create (OBJECT_PARENT_HANDLE, &cpg_handle, "cpg", 
> strlen ("cpg"));

I think this should be under runtime/services/cpg

> +     if (ret != 0) {
> +             goto error_exit;
> +     }
> +
> +     ret = api->object_create (cpg_handle, &pi_handle, "process", strlen 
> ("process"));
> +     if (ret != 0) {
> +             goto error_exit;
> +     }
> +
> +     ret = api->object_key_create_typed (pi_handle,
> +             "nodeid", &pi->nodeid,
> +             sizeof(pi->nodeid),
> +             OBJDB_VALUETYPE_UINT32);
> +     if (ret != 0) {
> +             goto error_destroy_exit;
> +     }
> +
> +     ret = api->object_key_create_typed (pi_handle,
> +             "pid", &pi->pid,
> +             sizeof(pi->pid),
> +             OBJDB_VALUETYPE_UINT32);
> +     if (ret != 0) {
> +             goto error_destroy_exit;
> +     }
> +
> +     ret = api->object_key_create (pi_handle,
> +             "group", sizeof("group"),
> +             &pi->group.value, pi->group.length);
> +     if (ret != 0) {
> +             goto error_destroy_exit;
> +     }
> +
> +     pi->objdb_object_handle = pi_handle;
> +
> +     return 0;
> +
> +error_destroy_exit:
> +     api->object_destroy (pi->objdb_object_handle);
> +error_exit:
> +     log_printf(LOGSYS_LEVEL_WARNING, "can't update cpg membership 
> information in objdb\n");
> +     return ret;
> +}
> +
> +static int update_confdb_info_remove_process(
> +     struct process_info *pi)
> +{
> +     api->object_destroy (pi->objdb_object_handle);
> +
> +     return 0;
> +}
> +
> +static int update_confdb_info(
> +     const mar_cpg_name_t *group_name,
> +     int joined_list_entries,
> +     mar_cpg_address_t *joined_list,
> +     int left_list_entries,
> +     mar_cpg_address_t *left_list)
> +{
> +     struct list_head *iter;
> +     int i;
> +
> +     for (iter = process_info_list_head.next; iter != 
> &process_info_list_head; iter = iter->next) {
> +             struct process_info *pi = list_entry (iter, struct 
> process_info, list);
> +
> +             for (i = 0; i < joined_list_entries; i++) {
> +                     if (joined_list[i].nodeid == pi->nodeid && 
> joined_list[i].pid == pi->pid &&
> +                         mar_name_compare (&pi->group, group_name) == 0) {
> +                             update_confdb_info_add_process (pi);
> +                     }
> +             }
> +
> +             for (i = 0; i < left_list_entries; i++) {
> +                     if (left_list[i].nodeid == pi->nodeid && 
> left_list[i].pid == pi->pid &&
> +                         mar_name_compare (&pi->group, group_name) == 0) {
> +                             update_confdb_info_remove_process (pi);
> +                     }
> +             }
> +     }
> +
> +     return (CPG_OK);
> +}
> +
>  static int notify_lib_joinlist(
>       const mar_cpg_name_t *group_name,
>       void *conn,
> @@ -708,6 +830,8 @@ static int notify_lib_joinlist(
>               }
>       }
>  
> +     update_confdb_info(group_name, joined_list_entries, joined_list, 
> left_list_entries, left_list);
> +
>       return CPG_OK;
>  }
>  
> -- 
> 1.6.2.5
> 
> _______________________________________________
> Openais mailing list
> [email protected]
> https://lists.linux-foundation.org/mailman/listinfo/openais
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to