osaf/services/saf/amf/amfd/clm.cc         |  21 +++++-
 osaf/services/saf/amf/amfd/include/amfd.h |   2 +
 osaf/services/saf/amf/amfd/include/cb.h   |   1 +
 osaf/services/saf/amf/amfd/include/role.h |   2 +
 osaf/services/saf/amf/amfd/main.cc        |  78 ++++++---------------------
 osaf/services/saf/amf/amfd/ndfsm.cc       |   9 ++-
 osaf/services/saf/amf/amfd/node.cc        |   7 +--
 osaf/services/saf/amf/amfd/role.cc        |  86 ++++++++++++++++++++++++++++++-
 osaf/services/saf/amf/amfd/sgproc.cc      |  11 +++-
 osaf/services/saf/amf/amfnd/clm.cc        |  27 ++++++--
 10 files changed, 160 insertions(+), 84 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/amf/amfd/clm.cc 
b/osaf/services/saf/amf/amfd/clm.cc
--- a/osaf/services/saf/amf/amfd/clm.cc
+++ b/osaf/services/saf/amf/amfd/clm.cc
@@ -21,8 +21,7 @@
 #include <amfd.h>
 #include <clm.h>
 #include <node.h>
-
-static SaVersionT clmVersion = { 'B', 4, 1 };
+#include "osaf_time.h"
 
 static void clm_node_join_complete(AVD_AVND *node)
 {
@@ -392,9 +391,21 @@ SaAisErrorT avd_clm_init(void)
         SaAisErrorT error = SA_AIS_OK;
 
        TRACE_ENTER();
-       error = saClmInitialize_4(&avd_cb->clmHandle, &clm_callbacks, 
&clmVersion);
-       if (SA_AIS_OK != error) {
-               LOG_ER("Failed to initialize with CLM %u", error);
+       for (;;) {
+               SaVersionT Version = { 'B', 4, 1 };
+               error = saClmInitialize_4(&avd_cb->clmHandle, &clm_callbacks, 
&Version);
+               if (error == SA_AIS_ERR_TRY_AGAIN ||
+                   error == SA_AIS_ERR_TIMEOUT ||
+                    error == SA_AIS_ERR_UNAVAILABLE) {
+                       if (error != SA_AIS_ERR_TRY_AGAIN) {
+                               LOG_WA("saClmInitialize_4 returned %u",
+                                      (unsigned) error);
+                       }
+                       osaf_nanosleep(&kHundredMilliseconds);
+                       continue;
+               }
+               if (error == SA_AIS_OK) break;
+               LOG_ER("Failed to Initialize with CLM: %u", error);
                goto done;
        }
        error = saClmSelectionObjectGet(avd_cb->clmHandle, 
&avd_cb->clm_sel_obj);
diff --git a/osaf/services/saf/amf/amfd/include/amfd.h 
b/osaf/services/saf/amf/amfd/include/amfd.h
--- a/osaf/services/saf/amf/amfd/include/amfd.h
+++ b/osaf/services/saf/amf/amfd/include/amfd.h
@@ -33,6 +33,7 @@
 #ifndef AVD_H
 #define AVD_H
 
+#include <stdint.h>
 #include "logtrace.h"
 
 #include "amf.h"
@@ -65,5 +66,6 @@
 #include "ckpt_msg.h"
 #include "ckpt_edu.h"
 #include "ckpt_updt.h"
+#include "saAmf.h"
 
 #endif
diff --git a/osaf/services/saf/amf/amfd/include/cb.h 
b/osaf/services/saf/amf/amfd/include/cb.h
--- a/osaf/services/saf/amf/amfd/include/cb.h
+++ b/osaf/services/saf/amf/amfd/include/cb.h
@@ -207,6 +207,7 @@ typedef struct cl_cb_tag {
        SaClmHandleT clmHandle;
        SaSelectionObjectT clm_sel_obj;
 
+       bool fully_initialized;
        bool swap_switch; /* true - In middle of role switch. */
 
        /** true when active services (IMM, LOG, NTF, etc.) exist
diff --git a/osaf/services/saf/amf/amfd/include/role.h 
b/osaf/services/saf/amf/amfd/include/role.h
--- a/osaf/services/saf/amf/amfd/include/role.h
+++ b/osaf/services/saf/amf/amfd/include/role.h
@@ -34,6 +34,8 @@ extern uint32_t amfd_switch_qsd_stdby(AV
 extern uint32_t amfd_switch_stdby_actv(AVD_CL_CB *cb);
 extern uint32_t amfd_switch_qsd_actv(AVD_CL_CB *cb);
 extern uint32_t amfd_switch_actv_qsd(AVD_CL_CB *cb);
+extern uint32_t initialize_for_assignment(cl_cb_tag* cb,
+                                          SaAmfHAStateT ha_state);
 
 #endif /* ROLE_H */
 
diff --git a/osaf/services/saf/amf/amfd/main.cc 
b/osaf/services/saf/amf/amfd/main.cc
--- a/osaf/services/saf/amf/amfd/main.cc
+++ b/osaf/services/saf/amf/amfd/main.cc
@@ -56,6 +56,7 @@
 #include <sutcomptype.h>
 #include <sutype.h>
 #include <su.h>
+#include "osaf_utility.h"
 
 static const char* internal_version_id_  __attribute__ ((used)) = "@(#) $Id: " 
INTERNAL_VERSION_ID " $";
 
@@ -445,7 +446,8 @@ static void rda_cb(uint32_t notused, PCS
 
        if (((avd_cb->avail_state_avd == SA_AMF_HA_STANDBY) ||
             (avd_cb->avail_state_avd == SA_AMF_HA_QUIESCED)) &&
-           (cb_info->info.io_role == PCS_RDA_ACTIVE)) {
+           (cb_info->info.io_role == PCS_RDA_ACTIVE ||
+               cb_info->info.io_role == PCS_RDA_STANDBY)) {
 
                uint32_t rc;
                AVD_EVT *evt;
@@ -474,7 +476,6 @@ static uint32_t initialize(void)
 {
        AVD_CL_CB *cb = avd_cb;
        int rc = NCSCC_RC_FAILURE;
-       SaVersionT ntfVersion = { 'A', 0x01, 0x01 };
        SaAmfHAStateT role;
        char *val;
 
@@ -524,8 +525,13 @@ static uint32_t initialize(void)
        }
 
        cb->init_state = AVD_INIT_BGN;
+       cb->mbcsv_sel_obj = -1;
+       cb->imm_sel_obj = -1;
+       cb->clm_sel_obj = -1;
+       cb->fully_initialized = false;
        cb->swap_switch = false;
        cb->active_services_exist = true;
+       cb->mbcsv_sel_obj = -1;
        cb->stby_sync_state = AVD_STBY_IN_SYNC;
        cb->sync_required = true;
        
@@ -544,67 +550,20 @@ static uint32_t initialize(void)
        /* get the node id of the node on which the AVD is running. */
        cb->node_id_avd = m_NCS_GET_NODE_ID;
 
-       if (avd_mds_init(cb) != NCSCC_RC_SUCCESS) {
-               LOG_ER("avd_mds_init FAILED");
-               goto done;
-       }
-
-       if (NCSCC_RC_FAILURE == avsv_mbcsv_register(cb)) {
-               LOG_ER("avsv_mbcsv_register FAILED");
-               goto done;
-       }
-
-       if (avd_clm_init() != SA_AIS_OK) {
-               LOG_EM("avd_clm_init FAILED");
-               goto done;
-       }
-
-       if (avd_imm_init(cb) != SA_AIS_OK) {
-               LOG_ER("avd_imm_init FAILED");
-               goto done;
-       }
-
-       if ((rc = saNtfInitialize(&cb->ntfHandle, nullptr, &ntfVersion)) != 
SA_AIS_OK) {
-               LOG_ER("saNtfInitialize Failed (%u)", rc);
-               rc = NCSCC_RC_FAILURE;
-               goto done;
-       }
-
        if ((rc = rda_get_role(&role)) != NCSCC_RC_SUCCESS) {
                LOG_ER("rda_get_role FAILED");
                goto done;
        }
 
-       cb->avail_state_avd = role;
-
-       if (NCSCC_RC_SUCCESS != avd_mds_set_vdest_role(cb, role)) {
-               LOG_ER("avd_mds_set_vdest_role FAILED");
-               goto done;
-       }
-
-       if (NCSCC_RC_SUCCESS != avsv_set_ckpt_role(cb, role)) {
-               LOG_ER("avsv_set_ckpt_role FAILED");
-               goto done;
-       }
-
        if ((rc = rda_register_callback(0, rda_cb)) != NCSCC_RC_SUCCESS) {
                LOG_ER("rda_register_callback FAILED %u", rc);
                goto done;
        }
 
-       if (role == SA_AMF_HA_ACTIVE) {
-               rc = avd_active_role_initialization(cb, role);
-               if (rc != NCSCC_RC_SUCCESS) {
-                       LOG_ER("avd_active_role_initialization FAILED");
-                       goto done;
-               }
-       }
-       else {
-               rc = avd_standby_role_initialization(cb);
-               if (rc != NCSCC_RC_SUCCESS) {
-                       LOG_ER("avd_standby_role_initialization FAILED");
-                       goto done;
-               }
+       if ((rc = initialize_for_assignment(cb, role))
+               != NCSCC_RC_SUCCESS) {
+               LOG_ER("initialize_for_assignment FAILED %u", (unsigned) rc);
+               goto done;
        }
 
        rc = NCSCC_RC_SUCCESS;
@@ -647,14 +606,13 @@ static void main_loop(void)
        fds[FD_TERM].events = POLLIN;
        fds[FD_MBX].fd = mbx_fd.rmv_obj;
        fds[FD_MBX].events = POLLIN;
-       fds[FD_MBCSV].fd = cb->mbcsv_sel_obj;
-       fds[FD_MBCSV].events = POLLIN;
-       fds[FD_CLM].fd = cb->clm_sel_obj;
-       fds[FD_CLM].events = POLLIN;
-       fds[FD_IMM].fd = cb->imm_sel_obj; // IMM fd must be last in array
-       fds[FD_IMM].events = POLLIN;
-
        while (1) {
+               fds[FD_MBCSV].fd = cb->mbcsv_sel_obj;
+               fds[FD_MBCSV].events = POLLIN;
+               fds[FD_CLM].fd = cb->clm_sel_obj;
+               fds[FD_CLM].events = POLLIN;
+               fds[FD_IMM].fd = cb->imm_sel_obj; // IMM fd must be last in 
array
+               fds[FD_IMM].events = POLLIN;
                
                if (cb->immOiHandle != 0) {
                        fds[FD_IMM].fd = cb->imm_sel_obj;
diff --git a/osaf/services/saf/amf/amfd/ndfsm.cc 
b/osaf/services/saf/amf/amfd/ndfsm.cc
--- a/osaf/services/saf/amf/amfd/ndfsm.cc
+++ b/osaf/services/saf/amf/amfd/ndfsm.cc
@@ -190,8 +190,9 @@ void avd_nd_ncs_su_assigned(AVD_CL_CB *c
        TRACE_ENTER();
 
        for (const auto& ncs_su : avnd->list_of_ncs_su) {
-               if ((ncs_su->list_of_susi == AVD_SU_SI_REL_NULL) ||
-                   (ncs_su->list_of_susi->fsm != AVD_SU_SI_STATE_ASGND)) {
+               if ((ncs_su->sg_of_su->curr_assigned_sus() < 2) &&
+                       ((ncs_su->list_of_susi == AVD_SU_SI_REL_NULL) ||
+                       (ncs_su->list_of_susi->fsm != AVD_SU_SI_STATE_ASGND))) {
                        TRACE_LEAVE();
                        /* this is an unassigned SU so no need to scan further 
return here. */
                        return;
@@ -328,6 +329,10 @@ void avd_mds_avnd_down_evh(AVD_CL_CB *cb
 
                if (avd_cb->avail_state_avd == SA_AMF_HA_ACTIVE) {
                        avd_node_failover(node);
+                       // Update standby out of sync if standby sc goes down
+                       if (avd_cb->node_id_avd_other == 
node->node_info.nodeId) {
+                               cb->stby_sync_state = AVD_STBY_OUT_OF_SYNC;
+                       }
                } else {
                        /* Remove dynamic info for node but keep in nodeid tree.
                         * Possibly used at the end of controller failover to
diff --git a/osaf/services/saf/amf/amfd/node.cc 
b/osaf/services/saf/amf/amfd/node.cc
--- a/osaf/services/saf/amf/amfd/node.cc
+++ b/osaf/services/saf/amf/amfd/node.cc
@@ -120,7 +120,7 @@ void AVD_AVND::initialize() {
   pg_csi_list = {};
   pg_csi_list.order = NCS_DBLIST_ANY_ORDER;
   pg_csi_list.cmp_cookie = avsv_dblist_uns32_cmp;
-  type = AVSV_AVND_CARD_PAYLOAD;
+  type = AVSV_AVND_CARD_SYS_CON;
   rcv_msg_id = {};
   snd_msg_id = {};
   cluster_list_node_next = {};
@@ -486,11 +486,6 @@ static SaAisErrorT node_ccb_completed_de
                return SA_AIS_ERR_BAD_OPERATION;
        }
 
-       if (node->type == AVSV_AVND_CARD_SYS_CON) {
-               report_ccb_validation_error(opdata, "Cannot remove controller 
node");
-               return SA_AIS_ERR_BAD_OPERATION;
-       }
-
        /* Check to see that the node is in admin locked state before delete */
        if (node->saAmfNodeAdminState != SA_AMF_ADMIN_LOCKED_INSTANTIATION) {
                report_ccb_validation_error(opdata, "Node '%s' is not locked 
instantiation", opdata->objectName.value);
diff --git a/osaf/services/saf/amf/amfd/role.cc 
b/osaf/services/saf/amf/amfd/role.cc
--- a/osaf/services/saf/amf/amfd/role.cc
+++ b/osaf/services/saf/amf/amfd/role.cc
@@ -46,6 +46,7 @@
 #include <si_dep.h>
 #include "osaf_utility.h"
 #include "role.h"
+#include "nid_api.h"
 
 extern pthread_mutex_t imm_reinit_mutex;
 
@@ -73,7 +74,15 @@ void avd_role_change_evh(AVD_CL_CB *cb, 
        AVD_ROLE_CHG_CAUSE_T cause = msg->msg_info.d2d_chg_role_req.cause;
        SaAmfHAStateT role = msg->msg_info.d2d_chg_role_req.role;
 
-       TRACE_ENTER2("cause=%u, role=%u", cause, role);
+       TRACE_ENTER2("cause=%u, role=%u, current_role=%u", cause, role,
+               cb->avail_state_avd);
+
+       if ((status = initialize_for_assignment(cb, role))
+               != NCSCC_RC_SUCCESS) {
+               LOG_ER("initialize_for_assignment FAILED %u",
+                       (unsigned) status);
+               _exit(EXIT_FAILURE);
+       }
 
        if (cb->avail_state_avd == role) {
                goto done;
@@ -128,6 +137,13 @@ void avd_role_change_evh(AVD_CL_CB *cb, 
        }
 
        if ((cause == AVD_FAIL_OVER) &&
+           (cb->avail_state_avd == SA_AMF_HA_QUIESCED) && (role == 
SA_AMF_HA_STANDBY)) {
+               /* Fail-over Quiesced to Active */
+               status = NCSCC_RC_SUCCESS;
+               goto done;
+       }
+
+       if ((cause == AVD_FAIL_OVER) &&
            (cb->avail_state_avd == SA_AMF_HA_QUIESCED) && (role == 
SA_AMF_HA_ACTIVE)) {
                /* Fail-over Quiesced to Active */
                status = avd_role_failover_qsd_actv(cb, role);
@@ -155,7 +171,73 @@ void avd_role_change_evh(AVD_CL_CB *cb, 
        return;
 }
 
-/****************************************************************************\
+uint32_t initialize_for_assignment(cl_cb_tag* cb, SaAmfHAStateT ha_state)
+{
+       TRACE_ENTER2("ha_state = %d", static_cast<int>(ha_state));
+       SaVersionT ntfVersion = {'A', 0x01, 0x01};
+       uint32_t rc = NCSCC_RC_SUCCESS;
+       SaAisErrorT error;
+       if (cb->fully_initialized) goto done;
+       cb->avail_state_avd = ha_state;
+       if (ha_state == SA_AMF_HA_QUIESCED) {
+               if ((rc = nid_notify(const_cast<char*>("AMFD"),
+                                    NCSCC_RC_SUCCESS, nullptr)) != 
NCSCC_RC_SUCCESS) {
+                       LOG_ER("nid_notify failed");
+               }
+               goto done;
+       }
+       if ((rc = avd_mds_init(cb)) != NCSCC_RC_SUCCESS) {
+               LOG_ER("avd_mds_init FAILED");
+               goto done;
+       }
+       if ((rc = avsv_mbcsv_register(cb)) != NCSCC_RC_SUCCESS) {
+               LOG_ER("avsv_mbcsv_register FAILED");
+               goto done;
+       }
+       if (avd_clm_init() != SA_AIS_OK) {
+               LOG_EM("avd_clm_init FAILED");
+               rc = NCSCC_RC_FAILURE;
+               goto done;
+       }
+       if (avd_imm_init(cb) != SA_AIS_OK) {
+               LOG_ER("avd_imm_init FAILED");
+               rc = NCSCC_RC_FAILURE;
+               goto done;
+       }
+       if ((error = saNtfInitialize(&cb->ntfHandle, nullptr, &ntfVersion)) !=
+           SA_AIS_OK) {
+               LOG_ER("saNtfInitialize Failed (%u)", error);
+               rc = NCSCC_RC_FAILURE;
+               goto done;
+       }
+       if ((rc = avd_mds_set_vdest_role(cb, ha_state)) != NCSCC_RC_SUCCESS) {
+               LOG_ER("avd_mds_set_vdest_role FAILED");
+               goto done;
+       }
+       if ((rc = avsv_set_ckpt_role(cb, ha_state)) != NCSCC_RC_SUCCESS) {
+               LOG_ER("avsv_set_ckpt_role FAILED");
+               goto done;
+       }
+       if (ha_state == SA_AMF_HA_ACTIVE) {
+               rc = avd_active_role_initialization(cb, ha_state);
+               if (rc != NCSCC_RC_SUCCESS) {
+                       LOG_ER("avd_active_role_initialization FAILED");
+                       goto done;
+               }
+       } else if (ha_state == SA_AMF_HA_STANDBY) {
+               rc = avd_standby_role_initialization(cb);
+               if (rc != NCSCC_RC_SUCCESS) {
+                       LOG_ER("avd_standby_role_initialization FAILED");
+                       goto done;
+               }
+       }
+       cb->fully_initialized = true;
+done:
+       TRACE_LEAVE2("rc = %u", rc);
+       return rc;
+}
+
+/**************************************************************************** \
  * Function: avd_init_role_set
  *
  * Purpose:  AVSV function to handle AVD's initial role setting. 
diff --git a/osaf/services/saf/amf/amfd/sgproc.cc 
b/osaf/services/saf/amf/amfd/sgproc.cc
--- a/osaf/services/saf/amf/amfd/sgproc.cc
+++ b/osaf/services/saf/amf/amfd/sgproc.cc
@@ -1390,7 +1390,16 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
                                        /* Since a NCS SU has been assigned 
trigger the node FSM. */
                                        /* For (ncs_spec == SA_TRUE), su will 
not be external, so su
                                                   will have node attached. */
-                                       avd_nd_ncs_su_assigned(cb, 
susi->su->su_on_node);
+                                       for (AmfDb<uint32_t, 
AVD_AVND>::const_iterator it = node_id_db->begin();
+                                               it != node_id_db->end(); it++) {
+                                               AVD_AVND *node = 
const_cast<AVD_AVND*>((*it).second);
+
+                                               if (node->node_state == 
AVD_AVND_STATE_NCS_INIT && node->adest != 0) {
+                                                       
avd_nd_ncs_su_assigned(cb, node);
+                                               } else {
+                                                       TRACE("Node_state: %u 
adest: %" PRIx64 " node not ready for assignments", node->node_state, 
node->adest);
+                                               }
+                                       }
                                }
                        }
                } else {
diff --git a/osaf/services/saf/amf/amfnd/clm.cc 
b/osaf/services/saf/amf/amfnd/clm.cc
--- a/osaf/services/saf/amf/amfnd/clm.cc
+++ b/osaf/services/saf/amf/amfnd/clm.cc
@@ -37,6 +37,7 @@
 #include "avnd.h"
 #include "mds_pvt.h"
 #include "nid_api.h"
+#include "osaf_time.h"
 
 static void clm_node_left(SaClmNodeIdT node_id)
 {
@@ -166,7 +167,6 @@ uint32_t avnd_evt_avd_node_up_evh(AVND_C
        info = &evt->info.avd->msg_info.d2n_node_up;
 
        /*** update this node with the supplied parameters ***/
-       cb->type = info->node_type;
        cb->su_failover_max = info->su_failover_max;
        cb->su_failover_prob = info->su_failover_prob;
 
@@ -249,8 +249,6 @@ done:
        return;
 }
 
-static SaVersionT Version = { 'B', 4, 1 };
-
 static const SaClmCallbacksT_4 callbacks = {
         0,
         /*.saClmClusterTrackCallback =*/ clm_track_cb
@@ -263,11 +261,24 @@ SaAisErrorT avnd_clm_init(void)
 
        TRACE_ENTER();
        avnd_cb->first_time_up = true;
-       error = saClmInitialize_4(&avnd_cb->clmHandle, &callbacks, &Version);
-        if (SA_AIS_OK != error) {
-                LOG_ER("Failed to Initialize with CLM: %u", error);
-                goto done;
-        }
+       for (;;) {
+               SaVersionT Version = { 'B', 4, 1 };
+               error = saClmInitialize_4(&avnd_cb->clmHandle, &callbacks,
+                                         &Version);
+               if (error == SA_AIS_ERR_TRY_AGAIN ||
+                   error == SA_AIS_ERR_TIMEOUT ||
+                    error == SA_AIS_ERR_UNAVAILABLE) {
+                       if (error != SA_AIS_ERR_TRY_AGAIN) {
+                               LOG_WA("saClmInitialize_4 returned %u",
+                                      (unsigned) error);
+                       }
+                       osaf_nanosleep(&kHundredMilliseconds);
+                       continue;
+               }
+               if (error == SA_AIS_OK) break;
+               LOG_ER("Failed to Initialize with CLM: %u", error);
+               goto done;
+       }
        error = saClmSelectionObjectGet(avnd_cb->clmHandle, 
&avnd_cb->clm_sel_obj);
         if (SA_AIS_OK != error) {
                 LOG_ER("Failed to get CLM selectionObject: %u", error);

------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to