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"));
+ 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