Hi Anders,

Ack with minor inline comments.

-----Original Message-----
From: Anders Widell 
Sent: Monday, February 29, 2016 3:56 PM
To: Hung Duc Nguyen; reddy.neelaka...@oracle.com; Zoran Milinkovic
Cc: opensaf-devel@lists.sourceforge.net
Subject: [PATCH 1 of 2] imm: Support AMF configurations containing more than 
two OpenSAF 2N SUs [#79]

 osaf/services/saf/immsv/immd/immd.h       |   5 ++
 osaf/services/saf/immsv/immd/immd_amf.c   |   9 ++++-
 osaf/services/saf/immsv/immd/immd_cb.h    |   1 +
 osaf/services/saf/immsv/immd/immd_db.c    |   6 +++
 osaf/services/saf/immsv/immd/immd_evt.c   |  15 ++++++-
 osaf/services/saf/immsv/immd/immd_main.c  |  55 ++++++++++++++++++++----------
 osaf/services/saf/immsv/immd/immd_mbcsv.c |   4 +-
 osaf/services/saf/immsv/immd/immd_mds.c   |   6 +-
 osaf/services/saf/immsv/immd/immd_mds.h   |   4 +-
 osaf/services/saf/immsv/immd/immd_proc.h  |   2 +-
 osaf/services/saf/immsv/immd/immd_sbedu.h |   2 +-
 11 files changed, 79 insertions(+), 30 deletions(-)


Add support for configuring the system with more than two OpenSAF 2N SUs. In
particular, this means that all OpenSAF directors must support starting up
and running without (initially) getting any assignment from AMF. Locking of
an OpenSAF 2N SU is currently not supported on a system configured with more
than two OpenSAF 2N SUs.

diff --git a/osaf/services/saf/immsv/immd/immd.h 
b/osaf/services/saf/immsv/immd/immd.h
--- a/osaf/services/saf/immsv/immd/immd.h
+++ b/osaf/services/saf/immsv/immd/immd.h
@@ -30,6 +30,9 @@
 #ifndef IMMD_H
 #define IMMD_H
 
+#include <stdint.h>
+#include "saAmf.h"
+
 #include "immsv.h"
 #include "mbcsv_papi.h"
 #include "immd_cb.h"
@@ -41,4 +44,6 @@
 
 IMMD_CB *immd_cb;
 
+extern uint32_t initialize_for_assignment(IMMD_CB *cb, SaAmfHAStateT ha_state);
+
 #endif   /* IMMD_H */
diff --git a/osaf/services/saf/immsv/immd/immd_amf.c 
b/osaf/services/saf/immsv/immd/immd_amf.c
--- a/osaf/services/saf/immsv/immd/immd_amf.c
+++ b/osaf/services/saf/immsv/immd/immd_amf.c
@@ -190,6 +190,13 @@ static void immd_saf_csi_set_cb(SaInvoca
 
        prev_ha_state = cb->ha_state;
 
+       if ((rc = initialize_for_assignment(cb, new_haState))
+               != NCSCC_RC_SUCCESS) {
+               TRACE("initialize_for_assignment FAILED %u", (unsigned) rc);
+               error = SA_AIS_ERR_FAILED_OPERATION;
+               goto response;
+       }
+
        /* Invoke the appropriate state handler routine */
        switch (new_haState) {
        case SA_AMF_HA_ACTIVE:
@@ -242,7 +249,7 @@ static void immd_saf_csi_set_cb(SaInvoca
                TRACE_5("Inform MBCSV of HA state change to %s",
                        (new_haState == SA_AMF_HA_ACTIVE) ? "ACTIVE" : 
"STANDBY");
 
-               if (immd_mbcsv_chgrole(cb) != NCSCC_RC_SUCCESS) {
+               if (immd_mbcsv_chgrole(cb, new_haState) != NCSCC_RC_SUCCESS) {

[Zoran] If cb->fully_initialized is set to FALSE before 
initialize_for_assignment() is called, immd_mds_change_role() and 
immd_mbcsv_chgrole() are called twice.
This can be easy fixed with saving cb->fully_initalized value before the call 
of initialize_for_assignment().

                        LOG_WA("immd_mbcsv_chgrole FAILED");
                        error = SA_AIS_ERR_FAILED_OPERATION;
                        goto response;
diff --git a/osaf/services/saf/immsv/immd/immd_cb.h 
b/osaf/services/saf/immsv/immd/immd_cb.h
--- a/osaf/services/saf/immsv/immd/immd_cb.h
+++ b/osaf/services/saf/immsv/immd/immd_cb.h
@@ -92,6 +92,7 @@ typedef struct immd_cb_tag {
        bool is_loc_immnd_up;
        bool is_rem_immnd_up;
        bool is_quiesced_set;   /* ABT new csi_set */
+       bool fully_initialized;
        bool is_loading;  /* True when loading */
        MDS_DEST loc_immnd_dest;
        MDS_DEST rem_immnd_dest;        /*ABT used if local immnd crashes ? */
diff --git a/osaf/services/saf/immsv/immd/immd_db.c 
b/osaf/services/saf/immsv/immd/immd_db.c
--- a/osaf/services/saf/immsv/immd/immd_db.c
+++ b/osaf/services/saf/immsv/immd/immd_db.c
@@ -262,6 +262,12 @@ uint32_t immd_cb_db_init(IMMD_CB *cb)
                cb->is_loading = true;
        }
 
+       cb->fully_initialized = false;
+       cb->mbcsv_sel_obj = -1;
+       cb->usr1_sel_obj.raise_obj = -1;
+       cb->usr1_sel_obj.rmv_obj = -1;
+       cb->amf_sel_obj = -1;
+
        return (NCSCC_RC_SUCCESS);
 }
 
diff --git a/osaf/services/saf/immsv/immd/immd_evt.c 
b/osaf/services/saf/immsv/immd/immd_evt.c
--- a/osaf/services/saf/immsv/immd/immd_evt.c
+++ b/osaf/services/saf/immsv/immd/immd_evt.c
@@ -26,6 +26,7 @@
 
 #include "immsv.h"
 #include "immsv_evt.h"
+#include <stdlib.h>
 #include "immd.h"
 #include "ncssysf_mem.h"
 #include "osaf_extended_name.h"
@@ -2376,7 +2377,15 @@ static uint32_t immd_evt_proc_rda_callba
 {
        uint32_t rc = NCSCC_RC_SUCCESS;
 
-       TRACE_ENTER();
+       TRACE_ENTER2("%d", (int) evt->info.rda_info.io_role);
+
+       if ((rc = initialize_for_assignment(cb,
+               (SaAmfHAStateT) evt->info.rda_info.io_role))
+               != NCSCC_RC_SUCCESS) {
+               LOG_ER("initialize_for_assignment FAILED %u", (unsigned) rc);
+               exit(EXIT_FAILURE);
+       }
+
        if ((cb->ha_state != SA_AMF_HA_ACTIVE) &&
                (evt->info.rda_info.io_role == PCS_RDA_ACTIVE)) {
                cb->mds_role = V_DEST_RL_ACTIVE;
@@ -2389,7 +2398,7 @@ static uint32_t immd_evt_proc_rda_callba
                        goto done;
                }
 
-               if (immd_mbcsv_chgrole(cb) != NCSCC_RC_SUCCESS) {
+               if (immd_mbcsv_chgrole(cb, cb->ha_state) != NCSCC_RC_SUCCESS) {

[Zoran] Same as the upper comment.

Thanks,
Zoran

                        LOG_WA("immd_mbcsv_chgrole FAILED");
                        goto done;
                }
@@ -2426,7 +2435,7 @@ static uint32_t immd_evt_mds_quiesced_ac
                cb->is_quiesced_set = false;
 
                /* Inform mbcsv about the changed role */
-               if (immd_mbcsv_chgrole(cb) != NCSCC_RC_SUCCESS)
+               if (immd_mbcsv_chgrole(cb, cb->ha_state) != NCSCC_RC_SUCCESS)
                        LOG_WA("mbcsv_chgrole to quiesced FAILED");
 
                /* Finally respond to AMF */
diff --git a/osaf/services/saf/immsv/immd/immd_main.c 
b/osaf/services/saf/immsv/immd/immd_main.c
--- a/osaf/services/saf/immsv/immd/immd_main.c
+++ b/osaf/services/saf/immsv/immd/immd_main.c
@@ -149,22 +149,6 @@ static uint32_t immd_initialize(void)
                goto done;
        }
 
-       if ((rc = immd_mds_register(immd_cb)) != NCSCC_RC_SUCCESS) {
-               LOG_ER("immd_mds_register FAILED %d", rc);
-               goto done;
-       }
-
-       /* Initialise with the MBCSV service  */
-       if ((rc = immd_mbcsv_register(immd_cb)) != NCSCC_RC_SUCCESS) {
-               LOG_ER("immd_mbcsv_register FAILED %d", rc);
-               goto done;
-       }
-
-       if ((rc = immd_mbcsv_chgrole(immd_cb)) != NCSCC_RC_SUCCESS) {
-               LOG_ER("immd_mbcsv_chgrole FAILED %d", rc);
-               goto done;
-       }
-
        /* Create a selection object */
        if (immd_cb->nid_started &&
                (rc = ncs_sel_obj_create(&immd_cb->usr1_sel_obj)) != 
NCSCC_RC_SUCCESS) {
@@ -189,6 +173,12 @@ static uint32_t immd_initialize(void)
                goto done;
        }
 
+       if ((rc = initialize_for_assignment(immd_cb, immd_cb->ha_state)) !=
+               NCSCC_RC_SUCCESS) {
+               LOG_ER("initialize_for_assignment FAILED %u", (unsigned) rc);
+               goto done;
+       }
+
        syslog(LOG_INFO, "Initialization Success, role %s",
               (immd_cb->ha_state == SA_AMF_HA_ACTIVE) ? "ACTIVE" : "STANDBY");
 
@@ -203,6 +193,34 @@ done:
        return rc;
 }
 
+uint32_t initialize_for_assignment(IMMD_CB *cb, SaAmfHAStateT ha_state)
+{
+       TRACE_ENTER2("ha_state = %d", (int) ha_state);
+       uint32_t rc = NCSCC_RC_SUCCESS;
+       if (cb->fully_initialized || ha_state == SA_AMF_HA_QUIESCED) goto done;
+       cb->ha_state = ha_state;
+       if ((rc = immd_mds_register(cb, ha_state)) != NCSCC_RC_SUCCESS) {
+               LOG_ER("immd_mds_register FAILED %d", rc);
+               goto done;
+       }
+       if ((rc = immd_mbcsv_register(cb)) != NCSCC_RC_SUCCESS) {
+               LOG_ER("immd_mbcsv_register FAILED %d", rc);
+               immd_mds_unregister(cb);
+               goto done;
+       }
+       if ((rc = immd_mbcsv_chgrole(cb, ha_state)) != NCSCC_RC_SUCCESS) {
+               LOG_ER("immd_mbcsv_chgrole FAILED %d", rc);
+               immd_mbcsv_close(cb);
+               immd_mbcsv_finalize(cb);
+               immd_mds_unregister(cb);
+               goto done;
+       }
+       cb->fully_initialized = true;
+done:
+       TRACE_LEAVE2("rc = %u", rc);
+       return rc;
+}
+
 /**
  * The main routine for the IMM director daemon.
  * @param argc
@@ -260,12 +278,13 @@ int main(int argc, char *argv[])
        fds[FD_AMF].fd = immd_cb->nid_started ?
                immd_cb->usr1_sel_obj.rmv_obj : immd_cb->amf_sel_obj;
        fds[FD_AMF].events = POLLIN;
-       fds[FD_MBCSV].fd = immd_cb->mbcsv_sel_obj;
-       fds[FD_MBCSV].events = POLLIN;
        fds[FD_MBX].fd = mbx_fd.rmv_obj;
        fds[FD_MBX].events = POLLIN;
 
        while (1) {
+               fds[FD_MBCSV].fd = immd_cb->mbcsv_sel_obj;
+               fds[FD_MBCSV].events = POLLIN;
+
                int ret = poll(fds, 4, timeout);
 
                if (ret == -1) {
diff --git a/osaf/services/saf/immsv/immd/immd_mbcsv.c 
b/osaf/services/saf/immsv/immd/immd_mbcsv.c
--- a/osaf/services/saf/immsv/immd/immd_mbcsv.c
+++ b/osaf/services/saf/immsv/immd/immd_mbcsv.c
@@ -282,7 +282,7 @@ uint32_t immd_mbcsv_selobj_get(IMMD_CB *
  *                          Role Active - send ckpt data to multiple standby
  *                           peers
 ******************************************************************************/
-uint32_t immd_mbcsv_chgrole(IMMD_CB *cb)
+uint32_t immd_mbcsv_chgrole(IMMD_CB *cb, SaAmfHAStateT ha_state)
 {
        NCS_MBCSV_ARG arg;
        uint32_t rc = NCSCC_RC_SUCCESS;
@@ -292,7 +292,7 @@ uint32_t immd_mbcsv_chgrole(IMMD_CB *cb)
        arg.i_op = NCS_MBCSV_OP_CHG_ROLE;
        arg.i_mbcsv_hdl = cb->mbcsv_handle;
        arg.info.chg_role.i_ckpt_hdl = cb->o_ckpt_hdl;
-       arg.info.chg_role.i_ha_state = cb->ha_state;
+       arg.info.chg_role.i_ha_state = ha_state;
 
        /*  ha_state is assigned at the time of amf_init where csi_set_callback 
           will assign the state */
diff --git a/osaf/services/saf/immsv/immd/immd_mds.c 
b/osaf/services/saf/immsv/immd/immd_mds.c
--- a/osaf/services/saf/immsv/immd/immd_mds.c
+++ b/osaf/services/saf/immsv/immd/immd_mds.c
@@ -91,7 +91,7 @@ uint32_t immd_mds_vdest_create(IMMD_CB *
  
   Notes         : None.
 ****************************************************************************/
-uint32_t immd_mds_register(IMMD_CB *cb)
+uint32_t immd_mds_register(IMMD_CB *cb, SaAmfHAStateT ha_state)
 {
        uint32_t rc = NCSCC_RC_SUCCESS;
        NCSMDS_INFO svc_info;
@@ -106,10 +106,10 @@ uint32_t immd_mds_register(IMMD_CB *cb)
        }
 
        /* Set the role of MDS  ABT added new code see lgs_mds.c lgs_mds_init */
-       if (cb->ha_state == SA_AMF_HA_ACTIVE) {
+       if (ha_state == SA_AMF_HA_ACTIVE) {
                TRACE_5("Set MDS role to ACTIVE");
                cb->mds_role = V_DEST_RL_ACTIVE;
-       } else if (cb->ha_state == SA_AMF_HA_STANDBY) {
+       } else if (ha_state == SA_AMF_HA_STANDBY) {
                TRACE_5("Set MDS role to STANDBY");
                cb->mds_role = V_DEST_RL_STANDBY;
        } else {
diff --git a/osaf/services/saf/immsv/immd/immd_mds.h 
b/osaf/services/saf/immsv/immd/immd_mds.h
--- a/osaf/services/saf/immsv/immd/immd_mds.h
+++ b/osaf/services/saf/immsv/immd/immd_mds.h
@@ -18,7 +18,9 @@
 #ifndef IMMD_MDS_H
 #define IMMD_MDS_H
 
-uint32_t immd_mds_register(IMMD_CB *cb);
+#include "saAmf.h"
+
+uint32_t immd_mds_register(IMMD_CB *cb, SaAmfHAStateT ha_state);
 void immd_mds_unregister(IMMD_CB *cb);
 uint32_t immd_mds_msg_sync_send(IMMD_CB *cb, uint32_t to_svc, MDS_DEST to_dest,
                                      IMMSV_EVT *i_evt, IMMSV_EVT **o_evt, 
uint32_t timeout);
diff --git a/osaf/services/saf/immsv/immd/immd_proc.h 
b/osaf/services/saf/immsv/immd/immd_proc.h
--- a/osaf/services/saf/immsv/immd/immd_proc.h
+++ b/osaf/services/saf/immsv/immd/immd_proc.h
@@ -38,7 +38,7 @@ void immd_pending_payload_discards(IMMD_
 
 void immd_cb_dump(void);
 
-uint32_t immd_mbcsv_chgrole(IMMD_CB *cb);
+uint32_t immd_mbcsv_chgrole(IMMD_CB *cb, SaAmfHAStateT ha_state);
 
 uint32_t immd_mbcsv_encode_proc(NCS_MBCSV_CB_ARG *arg);
 uint32_t immd_get_slot_and_subslot_id_from_mds_dest(MDS_DEST dest);
diff --git a/osaf/services/saf/immsv/immd/immd_sbedu.h 
b/osaf/services/saf/immsv/immd/immd_sbedu.h
--- a/osaf/services/saf/immsv/immd/immd_sbedu.h
+++ b/osaf/services/saf/immsv/immd/immd_sbedu.h
@@ -28,7 +28,7 @@ uint32_t immd_mbcsv_async_update(IMMD_CB
 uint32_t immd_mbcsv_register(IMMD_CB *cb);
 uint32_t immd_mbcsv_callback(NCS_MBCSV_CB_ARG *arg);
 uint32_t immd_mbcsv_finalize(IMMD_CB *cb);
-uint32_t immd_mbcsv_chgrole(IMMD_CB *cb);
+uint32_t immd_mbcsv_chgrole(IMMD_CB *cb, SaAmfHAStateT ha_state);
 uint32_t immd_process_sb_fevs(IMMD_CB *cb, IMMSV_FEVS *fevs_msg);
 uint32_t immd_process_sb_count(IMMD_CB *cb, uint32_t count, uint32_t evt_type);
 uint32_t immd_process_node_accept(IMMD_CB *cb, IMMSV_D2ND_CONTROL *ctrl);

------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785231&iu=/4140
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to