Attached patches handle NULL callbacks in [cpg|evs|confdb]_initialize
and *_dispatch. Handling is same as in cfg service (and SIMILAR (see
bellow) as in quorum and votequorum), so if callback is NULL -> no
memcpy -> instance callbacks will have all items set to NULL.

In *_dispatch, if callbacks.$CALLBACK_NAME is NULL it will break. And
there is difference between CFG and QUORUM service, so I like to ask
what behavior is correct/better/...

quorum and votequorum calls use continue -> ignore code:

switch (dispatch_types) {
case CS_DISPATCH_ONE:
cont = 0;
break;
case CS_DISPATCH_ALL:
break;
case CS_DISPATCH_BLOCKING:
break;
}

so if CS_DISPATCH is set to CS_DISPATCH_ONE, you will process more than
ONE dispatch.

CFG will use break and doesn't ignore the code, this means,
CS_DISPATCH_ONE will process ONE dispatch.

>From a user point of view, it looks like QUORUM solution is more correct
(user wanted ONE dispatch, not zero), but I'm not sure.

Is it possible to make behavior same?


Regards,
  Honza
>From 25e448fa78560fbdc7be5ad5ac460e8f9939d0ef Mon Sep 17 00:00:00 2001
From: Jan Friesse <jfrie...@redhat.com>
Date: Wed, 19 Aug 2009 15:29:30 +0200
Subject: [PATCH 1/3] cpg_initialize - handle NULL as callbacks

---
 trunk/lib/cpg.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/trunk/lib/cpg.c b/trunk/lib/cpg.c
index e3ab8e6..b024549 100644
--- a/trunk/lib/cpg.c
+++ b/trunk/lib/cpg.c
@@ -142,7 +142,9 @@ cs_error_t cpg_initialize (
                goto error_put_destroy;
        }
 
-       memcpy (&cpg_inst->callbacks, callbacks, sizeof (cpg_callbacks_t));
+       if (callbacks) {
+               memcpy (&cpg_inst->callbacks, callbacks, sizeof 
(cpg_callbacks_t));
+       }
 
        list_init(&cpg_inst->iteration_list_head);
 
@@ -310,6 +312,9 @@ cs_error_t cpg_dispatch (
                 */
                switch (dispatch_data->id) {
                case MESSAGE_RES_CPG_DELIVER_CALLBACK:
+                       if (!callbacks.cpg_deliver_fn)
+                               break;
+
                        res_cpg_deliver_callback = (struct 
res_lib_cpg_deliver_callback *)dispatch_data;
 
                        marshall_from_mar_cpg_name_t (
@@ -325,6 +330,9 @@ cs_error_t cpg_dispatch (
                        break;
 
                case MESSAGE_RES_CPG_CONFCHG_CALLBACK:
+                       if (!callbacks.cpg_confchg_fn)
+                               break;
+
                        res_cpg_confchg_callback = (struct 
res_lib_cpg_confchg_callback *)dispatch_data;
 
                        for (i = 0; i < 
res_cpg_confchg_callback->member_list_entries; i++) {
-- 
1.6.2.2

>From d0e72cffcbc0868ef466c5fb1e83b00c84b88560 Mon Sep 17 00:00:00 2001
From: Jan Friesse <jfrie...@redhat.com>
Date: Wed, 19 Aug 2009 15:34:41 +0200
Subject: [PATCH 2/3] confdb lib - handle NULL as callbacks

---
 trunk/lib/confdb.c |   13 ++++++++++++-
 1 files changed, 12 insertions(+), 1 deletions(-)

diff --git a/trunk/lib/confdb.c b/trunk/lib/confdb.c
index 8402f32..507dde4 100644
--- a/trunk/lib/confdb.c
+++ b/trunk/lib/confdb.c
@@ -158,7 +158,9 @@ cs_error_t confdb_initialize (
        if (error != CS_OK)
                goto error_put_destroy;
 
-       memcpy (&confdb_inst->callbacks, callbacks, sizeof 
(confdb_callbacks_t));
+       if (callbacks) {
+               memcpy (&confdb_inst->callbacks, callbacks, sizeof 
(confdb_callbacks_t));
+       }
 
        list_init (&confdb_inst->object_find_head);
        list_init (&confdb_inst->object_iter_head);
@@ -336,6 +338,9 @@ cs_error_t confdb_dispatch (
                 */
                switch (dispatch_data->id) {
                        case MESSAGE_RES_CONFDB_KEY_CHANGE_CALLBACK:
+                               if (!callbacks.confdb_key_change_notify_fn)
+                                       break;
+
                                res_key_changed_pt = (struct 
res_lib_confdb_key_change_callback *)dispatch_data;
 
                                callbacks.confdb_key_change_notify_fn(handle,
@@ -351,6 +356,9 @@ cs_error_t confdb_dispatch (
                                break;
 
                        case MESSAGE_RES_CONFDB_OBJECT_CREATE_CALLBACK:
+                               if 
(!callbacks.confdb_object_create_change_notify_fn)
+                                       break;
+
                                res_object_created_pt = (struct 
res_lib_confdb_object_create_callback *)dispatch_data;
 
                                
callbacks.confdb_object_create_change_notify_fn(handle,
@@ -361,6 +369,9 @@ cs_error_t confdb_dispatch (
                                break;
 
                        case MESSAGE_RES_CONFDB_OBJECT_DESTROY_CALLBACK:
+                               if 
(!callbacks.confdb_object_delete_change_notify_fn)
+                                       break;
+
                                res_object_destroyed_pt = (struct 
res_lib_confdb_object_destroy_callback *)dispatch_data;
 
                                
callbacks.confdb_object_delete_change_notify_fn(handle,
-- 
1.6.2.2

>From a112a99e8578159a1c697838a38b46d87c6066dd Mon Sep 17 00:00:00 2001
From: Jan Friesse <jfrie...@redhat.com>
Date: Wed, 19 Aug 2009 15:36:40 +0200
Subject: [PATCH 3/3] evs lib - handle NULL as callbacks

---
 trunk/lib/evs.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/trunk/lib/evs.c b/trunk/lib/evs.c
index 6bf1448..7161cf3 100644
--- a/trunk/lib/evs.c
+++ b/trunk/lib/evs.c
@@ -116,7 +116,9 @@ evs_error_t evs_initialize (
                goto error_put_destroy;
        }
 
-       memcpy (&evs_inst->callbacks, callbacks, sizeof (evs_callbacks_t));
+       if (callbacks) {
+               memcpy (&evs_inst->callbacks, callbacks, sizeof 
(evs_callbacks_t));
+       }
 
        hdb_handle_put (&evs_handle_t_db, *handle);
 
@@ -277,6 +279,9 @@ evs_error_t evs_dispatch (
                 */
                switch (dispatch_data->id) {
                case MESSAGE_RES_EVS_DELIVER_CALLBACK:
+                       if (!callbacks.evs_deliver_fn)
+                               break;
+
                        res_evs_deliver_callback = (struct 
res_evs_deliver_callback *)dispatch_data;
                        callbacks.evs_deliver_fn (
                                handle,
@@ -286,6 +291,9 @@ evs_error_t evs_dispatch (
                        break;
 
                case MESSAGE_RES_EVS_CONFCHG_CALLBACK:
+                       if (!callbacks.evs_confchg_fn)
+                               break;
+
                        res_evs_confchg_callback = (struct 
res_evs_confchg_callback *)dispatch_data;
                        callbacks.evs_confchg_fn (
                                handle,
-- 
1.6.2.2

_______________________________________________
Openais mailing list
Openais@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to