Patch solves problem, when one process connect multiple times to one
group by disallow this situation.

Please see patch comment for more informations.

David, do you agree, that this is how cpg should behave, or you would
rather see to support multiple (node, pid, grp)? (for me, it really
doesn't make any sense).

Regards,
  Honza
commit b357222ce691be531b8a1ba57ea1ec92898c3536
Author: Jan Friesse <[email protected]>
Date:   Thu Jul 16 18:12:21 2009 +0200

    Allow only one connection per (node, pid, grp)
    
    This patch allows only one connection per (node, pid, grp_name) tuple.
    This means, you cannot make more connection from one process to same
    group_name. This is (I hope) how cpg should behave. In case, you will
    try to do that, CPG_ERR_EXISTS error is returned.
    
    Of course, there is no problem with creating:
    - more connection with same (pid, grp) if nodeid is different
    - more connection with same (node, grp) if pid is different (for example
      after fork, or two distinct processes)
    - more connection with same (node, pid) if grp is different (connect
      one process to more cpgs).

diff --git a/trunk/services/cpg.c b/trunk/services/cpg.c
index 1212ef0..984bd37 100644
--- a/trunk/services/cpg.c
+++ b/trunk/services/cpg.c
@@ -942,6 +942,20 @@ static void message_handler_req_lib_cpg_join (void *conn, const void *message)
 	struct cpg_pd *cpd = (struct cpg_pd *)api->ipc_private_data_get (conn);
 	struct res_lib_cpg_join res_lib_cpg_join;
 	cs_error_t error = CPG_OK;
+	struct list_head *iter;
+
+	/* Test, if we don't have same pid and group name joined */
+	for (iter = cpg_pd_list_head.next; iter != &cpg_pd_list_head; iter = iter->next) {
+		struct cpg_pd *cpd_item = list_entry (iter, struct cpg_pd, list);
+
+		if (cpd_item->pid == req_lib_cpg_join->pid &&
+			mar_name_compare(&req_lib_cpg_join->group_name, &cpd_item->group_name) == 0) {
+
+			/* We have same pid and group name joined -> return error */
+			error = CPG_ERR_EXIST;
+			goto response_send;
+		}
+	}
 
 	switch (cpd->cpd_state) {
 	case CPD_STATE_UNJOINED:
@@ -966,6 +980,7 @@ static void message_handler_req_lib_cpg_join (void *conn, const void *message)
 		break;
 	}
 
+response_send:
 	res_lib_cpg_join.header.size = sizeof(res_lib_cpg_join);
         res_lib_cpg_join.header.id = MESSAGE_RES_CPG_JOIN;
         res_lib_cpg_join.header.error = error;
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to