osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc | 4 +-
osaf/services/saf/smfsv/smfd/smfd.h | 6 ++-
osaf/services/saf/smfsv/smfd/smfd_amf.c | 25 ++++++++++------
osaf/services/saf/smfsv/smfd/smfd_cb.h | 8 ++++-
osaf/services/saf/smfsv/smfd/smfd_evt.c | 26 +++++++++++++++++-
osaf/services/saf/smfsv/smfd/smfd_main.c | 38 +++++++++++++++++++++----
osaf/services/saf/smfsv/smfd/smfd_mds.c | 10 ++++--
7 files changed, 91 insertions(+), 26 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/smfsv/smfd/SmfUpgradeStep.cc
b/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc
--- a/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc
+++ b/osaf/services/saf/smfsv/smfd/SmfUpgradeStep.cc
@@ -2637,7 +2637,7 @@ bool SmfUpgradeStep::readSmfClusterContr
//This will override nodes set in SMF config class attr.
smfClusterControllers
//Find the CLM nodes with hard coded default node Id
LOG_NO("smfSSAffectedNodesEnable is [true]. SMF handle nodeId
%x and %x as controllers in SS procedures",
- SMF_NODE_ID_CONTROLLER_1, SMF_NODE_ID_CONTROLLER_2);
+ smfd_cb->smfNodeIdControllers[0],
smfd_cb->smfNodeIdControllers[1]);
SaImmSearchHandleT immSearchHandle;
SaNameT objectName;
@@ -2669,7 +2669,7 @@ bool SmfUpgradeStep::readSmfClusterContr
if (nodeId == NULL) {
continue;
}
- if ((*nodeId == SMF_NODE_ID_CONTROLLER_1) ||
(*nodeId == SMF_NODE_ID_CONTROLLER_2)) {
+ if ((*nodeId ==
smfd_cb->smfNodeIdControllers[0]) || (*nodeId ==
smfd_cb->smfNodeIdControllers[1])) {
smfd_cb->smfClusterControllers[ix] =
strdup(osaf_extended_name_borrow(&objectName));
LOG_NO("Cluster controller[%d] =
%s",ix ,smfd_cb->smfClusterControllers[ix]);
ix++;
diff --git a/osaf/services/saf/smfsv/smfd/smfd.h
b/osaf/services/saf/smfsv/smfd/smfd.h
--- a/osaf/services/saf/smfsv/smfd/smfd.h
+++ b/osaf/services/saf/smfsv/smfd/smfd.h
@@ -26,6 +26,8 @@
#include <assert.h>
#include <stdlib.h>
#include <string.h>
+#include <stdint.h>
+#include "saAmf.h"
#include <ncsgl_defs.h>
#include <ncs_lib.h>
@@ -51,8 +53,6 @@ extern "C" {
#define IMM_LONG_DN_CONFIG_ATTRIBUTE_NAME "longDnsAllowed"
#define SMF_SAF_APP_DN "safApp=safSmfService"
#define SMF_CAMP_RESTART_INDICATOR_RDN "smfCampaignRestartIndicator=smf"
-#define SMF_NODE_ID_CONTROLLER_1 0x2010f
-#define SMF_NODE_ID_CONTROLLER_2 0x2020f
#define SMF_CAMPAIGN_OI_NAME "safSmfCampaign"
#define SMF_PROC_OI_NAME_PREFIX "safSmfProc"
#define SMF_MERGED_SS_PROC_NAME "safSmfProc=SmfSSMergedProc"
@@ -75,6 +75,8 @@ extern "C" {
*/
extern smfd_cb_t *smfd_cb;
extern const SaNameT *smfApplDN;
+ extern uint32_t initialize_for_assignment(smfd_cb_t *cb,
+ SaAmfHAStateT ha_state);
extern uint32_t smfd_amf_init(smfd_cb_t *);
extern uint32_t smfd_mds_init(smfd_cb_t *);
extern uint32_t smfd_mds_finalize(smfd_cb_t *);
diff --git a/osaf/services/saf/smfsv/smfd/smfd_amf.c
b/osaf/services/saf/smfsv/smfd/smfd_amf.c
--- a/osaf/services/saf/smfsv/smfd/smfd_amf.c
+++ b/osaf/services/saf/smfsv/smfd/smfd_amf.c
@@ -211,7 +211,7 @@ static void amf_csi_set_callback(SaInvoc
SaAmfHAStateT new_haState,
SaAmfCSIDescriptorT csiDescriptor)
{
- SaAisErrorT result = SA_AIS_OK;
+ SaAisErrorT error = SA_AIS_OK;
SaAmfHAStateT prev_haState;
bool role_change = true;
uint32_t rc = NCSCC_RC_SUCCESS;
@@ -223,27 +223,34 @@ static void amf_csi_set_callback(SaInvoc
*/
prev_haState = smfd_cb->ha_state;
+ if ((rc = initialize_for_assignment(smfd_cb, new_haState)) !=
+ NCSCC_RC_SUCCESS) {
+ LOG_ER("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:
- result = amf_active_state_handler(smfd_cb, invocation);
+ error = amf_active_state_handler(smfd_cb, invocation);
break;
case SA_AMF_HA_STANDBY:
- result = amf_standby_state_handler(smfd_cb, invocation);
+ error = amf_standby_state_handler(smfd_cb, invocation);
break;
case SA_AMF_HA_QUIESCED:
- result = amf_quiesced_state_handler(smfd_cb, invocation);
+ error = amf_quiesced_state_handler(smfd_cb, invocation);
break;
case SA_AMF_HA_QUIESCING:
- result = amf_quiescing_state_handler(smfd_cb, invocation);
+ error = amf_quiescing_state_handler(smfd_cb, invocation);
break;
default:
LOG_WA("invalid state: %d ", new_haState);
- result = SA_AIS_ERR_BAD_OPERATION;
+ error = SA_AIS_ERR_BAD_OPERATION;
break;
}
- if (result != SA_AIS_OK)
+ if (error != SA_AIS_OK)
goto response;
if (new_haState == SA_AMF_HA_QUIESCED)
@@ -264,12 +271,12 @@ static void amf_csi_set_callback(SaInvoc
if (role_change == true) {
if ((rc = smfd_mds_change_role(smfd_cb)) != NCSCC_RC_SUCCESS) {
TRACE("smfd_mds_change_role FAILED");
- result = SA_AIS_ERR_FAILED_OPERATION;
+ error = SA_AIS_ERR_FAILED_OPERATION;
goto response;
}
}
response:
- saAmfResponse(smfd_cb->amf_hdl, invocation, result);
+ saAmfResponse(smfd_cb->amf_hdl, invocation, error);
done:
TRACE_LEAVE();
}
diff --git a/osaf/services/saf/smfsv/smfd/smfd_cb.h
b/osaf/services/saf/smfsv/smfd/smfd_cb.h
--- a/osaf/services/saf/smfsv/smfd/smfd_cb.h
+++ b/osaf/services/saf/smfsv/smfd/smfd_cb.h
@@ -18,12 +18,13 @@
#ifndef SMFD_CB_H
#define SMFD_CB_H
+#include <stdbool.h>
#include <saImmOm.h>
#include <saImmOi.h>
#include <smfd_smfnd.h>
/* Default HA state assigned locally during smfd initialization */
-#define SMFD_HA_INIT_STATE SA_AMF_HA_STANDBY
+#define SMFD_HA_INIT_STATE SA_AMF_HA_QUIESCED
#define SMFD_MDS_PVT_SUBPART_VERSION 1
@@ -41,6 +42,7 @@ typedef struct smfd_cb {
SaImmOiHandleT campaignOiHandle; /* IMM Campaign OI handle
*/
SaSelectionObjectT campaignSelectionObject; /* Selection Object to wait
for campaign IMM events */
SaAmfHAStateT ha_state; /* present AMF HA state of
the component */
+ bool fully_initialized;
MDS_DEST smfnd_dests[NCS_MAX_SLOTS]; /* destinations for all
smfnd */
char *backupCreateCmd; /* Backup create cmd string
*/
char *bundleCheckCmd; /* Bundle check cmd string
*/
@@ -59,7 +61,9 @@ typedef struct smfd_cb {
SaUint32T smfInactivatePbeDuringUpgrade; /* True (1) if PBE shall be
deactivated during upgrade */
SaUint32T smfVerifyEnable; /* dis/enable pre-campaign
verification callbacks */
SaTimeT smfVerifyTimeout; /* pre-campaign
verification timeout */
- char *smfClusterControllers[2];/* list of nodes where amfd is execting
*/
+ NODE_ID smfNodeIdControllers[2]; /* NODE_ID of the nodes
where amfd is executing */
+ bool smfControllersUp[2]; /* True if the
smfNodeIdControllers node is up */
+ char *smfClusterControllers[2];/* list of nodes where amfd is execting
*/
SaUint32T smfKeepDuState; /* Keep DU state in an
upgrade if true (>0) */
SaInvocationT cbk_inv_id; /* Invocation ID of the
callback */
SMFD_SMFND_ADEST_INVID_MAP *smfnd_list; /* SMFNDs need to respond
to the callback. */
diff --git a/osaf/services/saf/smfsv/smfd/smfd_evt.c
b/osaf/services/saf/smfsv/smfd/smfd_evt.c
--- a/osaf/services/saf/smfsv/smfd/smfd_evt.c
+++ b/osaf/services/saf/smfsv/smfd/smfd_evt.c
@@ -50,8 +50,32 @@ static void proc_mds_info(smfd_cb_t * cb
switch (mds_info->change) {
case NCSMDS_RED_UP:
- /* get the peer mds_red_up */
+ if (mds_info->svc_id != NCSMDS_SVC_ID_SMFD) break;
+ if (cb->smfNodeIdControllers[0] == mds_info->node_id ||
+ cb->smfControllersUp[1]) {
+ cb->smfNodeIdControllers[0] = mds_info->node_id;
+ cb->smfControllersUp[0] = true;
+ } else {
+ cb->smfNodeIdControllers[1] = mds_info->node_id;
+ cb->smfControllersUp[1] = true;
+ }
+ TRACE("SMFD up on node id 0x%x. Controllers: 0x%x & 0x%x",
+ mds_info->node_id,
+ cb->smfNodeIdControllers[0],
+ cb->smfNodeIdControllers[1]);
+ break;
+ case NCSMDS_RED_DOWN:
+ if (mds_info->svc_id != NCSMDS_SVC_ID_SMFD) break;
+ if (cb->smfNodeIdControllers[0] == mds_info->node_id) {
+ cb->smfControllersUp[0] = false;
+ } else {
+ cb->smfControllersUp[1] = false;
+ }
+ TRACE("SMFD down on node id 0x%x. Controllers: 0x%x & 0x%x",
+ mds_info->node_id,
+ cb->smfNodeIdControllers[0],
+ cb->smfNodeIdControllers[1]);
break;
case NCSMDS_UP:
diff --git a/osaf/services/saf/smfsv/smfd/smfd_main.c
b/osaf/services/saf/smfsv/smfd/smfd_main.c
--- a/osaf/services/saf/smfsv/smfd/smfd_main.c
+++ b/osaf/services/saf/smfsv/smfd/smfd_main.c
@@ -114,8 +114,10 @@ uint32_t smfd_cb_init(smfd_cb_t * smfd_c
pthread_mutexattr_t mutex_attr;
- /* Assign Initial HA state */
+ smfd_cb->amfSelectionObject = -1;
+ smfd_cb->campaignSelectionObject = -1;
smfd_cb->ha_state = SMFD_HA_INIT_STATE;
+ smfd_cb->fully_initialized = false;
/* TODO Assign Version. Currently, hardcoded, This will change later */
smfd_cb->smf_version.releaseCode = SMF_RELEASE_CODE;
@@ -131,6 +133,11 @@ uint32_t smfd_cb_init(smfd_cb_t * smfd_c
smfd_cb->clusterRebootCmd = NULL;
smfd_cb->smfnd_list = NULL;
+ smfd_cb->smfNodeIdControllers[0] = 0x2010f;
+ smfd_cb->smfNodeIdControllers[1] = 0x2020f;
+ smfd_cb->smfControllersUp[0] = false;
+ smfd_cb->smfControllersUp[1] = false;
+
if (pthread_mutexattr_init(&mutex_attr) != 0) {
LOG_ER("Failed pthread_mutexattr_init");
return NCSCC_RC_FAILURE;
@@ -198,23 +205,40 @@ static uint32_t initialize_smfd(void)
goto done;
}
- /* Init mds communication */
- if ((rc = smfd_mds_init(smfd_cb)) != NCSCC_RC_SUCCESS) {
- TRACE("smfd_mds_init FAILED %d", rc);
- return rc;
- }
-
/* Init with AMF */
if ((rc = smfd_amf_init(smfd_cb)) != NCSCC_RC_SUCCESS) {
LOG_ER("init amf failed");
goto done;
}
+ if ((rc = initialize_for_assignment(smfd_cb, smfd_cb->ha_state)) !=
+ NCSCC_RC_SUCCESS) {
+ LOG_ER("initialize_for_assignment FAILED %u", (unsigned) rc);
+ goto done;
+ }
+
done:
TRACE_LEAVE();
return (rc);
}
+uint32_t initialize_for_assignment(smfd_cb_t *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;
+ }
+ if ((rc = smfd_mds_init(cb)) != NCSCC_RC_SUCCESS) {
+ LOG_ER("clms_mds_init FAILED %d", rc);
+ goto done;
+ }
+ cb->fully_initialized = true;
+done:
+ TRACE_LEAVE2("rc = %u", rc);
+ return rc;
+}
+
typedef enum {
SMFD_TERM_FD,
SMFD_AMF_FD,
diff --git a/osaf/services/saf/smfsv/smfd/smfd_mds.c
b/osaf/services/saf/smfsv/smfd/smfd_mds.c
--- a/osaf/services/saf/smfsv/smfd/smfd_mds.c
+++ b/osaf/services/saf/smfsv/smfd/smfd_mds.c
@@ -265,7 +265,8 @@ static uint32_t mds_svc_event(struct ncs
}
/* If this evt was sent from SMFND act on this */
- if (info->info.svc_evt.i_svc_id == NCSMDS_SVC_ID_SMFND) {
+ if (info->info.svc_evt.i_svc_id == NCSMDS_SVC_ID_SMFND ||
+ info->info.svc_evt.i_svc_id == NCSMDS_SVC_ID_SMFD) {
/** allocate an SMFSV_EVENT **/
if (NULL == (evt = calloc(1, sizeof(SMFSV_EVT)))) {
LOG_ER("calloc FAILED");
@@ -281,9 +282,12 @@ static uint32_t mds_svc_event(struct ncs
evt->info.smfd.event.mds_info.svc_id = svc_evt->i_svc_id;
evt->info.smfd.event.mds_info.node_id = svc_evt->i_node_id;
evt->info.smfd.event.mds_info.rem_svc_pvt_ver =
svc_evt->i_rem_svc_pvt_ver;
+ evt->info.smfd.event.mds_info.role = svc_evt->i_role;
- TRACE("SMFND SVC event %d for nodeid %x, svc version %u",
svc_evt->i_change,
- svc_evt->i_node_id, svc_evt->i_rem_svc_pvt_ver);
+ TRACE("%s SVC event %d for nodeid %x, svc version %u role %u",
+ info->info.svc_evt.i_svc_id == NCSMDS_SVC_ID_SMFND ?
+ "SMFND" : "SMFD", svc_evt->i_change, svc_evt->i_node_id,
+ svc_evt->i_rem_svc_pvt_ver, svc_evt->i_role);
/* Put it in SMFD's Event Queue */
rc = m_NCS_IPC_SEND(&smfd_cb->mbx, (NCSCONTEXT) evt,
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel