ack, code review. MInor comments inlined/Thanks HansN
On 02/29/2016 04:14 PM, Anders Widell wrote:
> 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
>
[HansN] use #include <cstdint>
> +#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);
[HansN] The const_cast below is not needed.
> + 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);
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel