osaf/libs/common/smfsv/include/smfsv_evt.h | 1 +
osaf/services/saf/smfsv/smfd/smfd_amf.c | 36 +++++++++++++++++-----------
osaf/services/saf/smfsv/smfd/smfd_cb.h | 2 +-
osaf/services/saf/smfsv/smfd/smfd_evt.c | 37 ++++++++++++++++++++++++++++++
osaf/services/saf/smfsv/smfd/smfd_mds.c | 16 ++++++++----
5 files changed, 72 insertions(+), 20 deletions(-)
diff --git a/osaf/libs/common/smfsv/include/smfsv_evt.h
b/osaf/libs/common/smfsv/include/smfsv_evt.h
--- a/osaf/libs/common/smfsv/include/smfsv_evt.h
+++ b/osaf/libs/common/smfsv/include/smfsv_evt.h
@@ -42,6 +42,7 @@ typedef enum {
SMFD_EVT_MDS_INFO = 1,
SMFD_EVT_CMD_RSP = 2,
SMFD_EVT_CBK_RSP = 3,
+ SMFD_EVT_QUIESCED_ACK = 4,
SMFD_EVT_MAX
} SMFD_EVT_TYPE;
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
@@ -124,26 +124,33 @@ static SaAisErrorT amf_quiescing_state_h
static SaAisErrorT amf_quiesced_state_handler(smfd_cb_t * cb,
SaInvocationT invocation)
{
- TRACE_ENTER2("HA AMF QUIESCED STATE request");
+ TRACE_ENTER();
+ V_DEST_RL mds_role;
+ SaAisErrorT rc = SA_AIS_OK;
+
+ /* Give up our IMM OI implementer role */
+ if (campaign_oi_deactivate(cb) != NCSCC_RC_SUCCESS) {
+ LOG_ER("amf_quiesced_state_handler oi deactivate FAILED");
+ }
/*
** Change the MDS VDSET role to Quiesced. Wait for MDS callback with
type
** MDS_CALLBACK_QUIESCED_ACK. Don't change cb->ha_state now.
*/
-
- if (campaign_oi_deactivate(cb) != NCSCC_RC_SUCCESS) {
- LOG_ER("amf_quiesced_state_handler oi deactivate FAILED");
- }
-
+ mds_role = cb->mds_role;
cb->mds_role = V_DEST_RL_QUIESCED;
-
- if (smfd_mds_change_role(cb) != NCSCC_RC_SUCCESS) {
- TRACE("smfd_mds_change_role FAILED");
+ if ((rc = smfd_mds_change_role(cb)) != NCSCC_RC_SUCCESS) {
+ LOG_ER("smfd_mds_change_role [V_DEST_RL_QUIESCED] FAILED");
+ rc = SA_AIS_ERR_FAILED_OPERATION;
+ cb->mds_role = mds_role;
+ goto done;
}
cb->amf_invocation_id = invocation;
- cb->is_quisced_set = true;
- return SA_AIS_OK;
+ cb->is_quiesced_set = true;
+done:
+ TRACE_LEAVE();
+ return rc;
}
/****************************************************************************
@@ -233,7 +240,7 @@ static void amf_csi_set_callback(SaInvoc
}
if (result != SA_AIS_OK)
- goto done;
+ goto response;
if (new_haState == SA_AMF_HA_QUIESCED)
/* AMF response will be done later when MDS quiesced ack has
been received */
@@ -254,11 +261,12 @@ static void amf_csi_set_callback(SaInvoc
if ((rc = smfd_mds_change_role(smfd_cb)) != NCSCC_RC_SUCCESS) {
TRACE("smfd_mds_change_role FAILED");
result = SA_AIS_ERR_FAILED_OPERATION;
+ goto response;
}
}
-
+ response:
+ saAmfResponse(smfd_cb->amf_hdl, invocation, result);
done:
- saAmfResponse(smfd_cb->amf_hdl, invocation, result);
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
@@ -36,7 +36,7 @@ typedef struct smfd_cb {
SaNameT comp_name; /* Components's name SMFD
*/
SaAmfHandleT amf_hdl; /* AMF handle, obtained
thru AMF init */
SaInvocationT amf_invocation_id; /* AMF InvocationID -
needed to handle Quiesed state */
- bool is_quisced_set;
+ bool is_quiesced_set;
SaSelectionObjectT amfSelectionObject; /* Selection Object to wait
for amf events */
SaImmOiHandleT campaignOiHandle; /* IMM Campaign OI handle
*/
SaSelectionObjectT campaignSelectionObject; /* Selection Object to wait
for campaign IMM events */
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
@@ -30,6 +30,7 @@
#include "smfsv_evt.h"
void proc_callback_rsp(smfd_cb_t *, SMFSV_EVT *);
+void proc_quiesced_ack(smfd_cb_t *, SMFSV_EVT *);
/****************************************************************************
* Name : proc_mds_info
@@ -125,6 +126,11 @@ void smfd_process_mbx(SYSF_MBX * mbx)
proc_callback_rsp(smfd_cb, evt);
break;
}
+ case SMFD_EVT_QUIESCED_ACK:
+ {
+ proc_quiesced_ack(smfd_cb, evt);
+ break;
+ }
default:
{
LOG_ER("SMFND received unknown event %d",
@@ -202,3 +208,34 @@ void proc_callback_rsp(smfd_cb_t *cb, SM
TRACE_LEAVE();
return;
}
+
+/****************************************************************************
+ * Name : proc_quiesced_ack
+ *
+ * Description : This is the function which is called when smfd receives an
+ * quiesced ack event from MDS
+ *
+ * Arguments : evt - Message that was posted to the SMFSV Mail box.
+ *
+ * Return Values : None
+ *
+ * Notes : None.
+ *****************************************************************************/
+void proc_quiesced_ack(smfd_cb_t *cb, SMFSV_EVT *evt)
+{
+ TRACE_ENTER();
+
+ if (cb->is_quiesced_set == true) {
+ /* Update control block */
+ cb->is_quiesced_set = false;
+ cb->ha_state = SA_AMF_HA_QUIESCED;
+
+ /* Respond to AMF */
+ if (saAmfResponse(cb->amf_hdl, cb->amf_invocation_id,
SA_AIS_OK) != SA_AIS_OK) {
+ LOG_ER("saAmfResponse failed");
+ }
+ } else
+ LOG_ER("Received SMFD_EVT_QUIESCED_ACK message but
is_quiesced_set==false");
+
+ TRACE_LEAVE();
+}
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
@@ -213,16 +213,22 @@ static uint32_t mds_rcv(struct ncsmds_ca
static uint32_t mds_quiesced_ack(struct ncsmds_callback_info *mds_info)
{
- SMFSV_EVT *smfsv_evt;
+ SMFSV_EVT *smfsv_evt;
- /** allocate an SMFSV_EVT now **/
+ /** allocate an SMFSV_EVT now **/
if (NULL == (smfsv_evt = calloc(1, sizeof(SMFSV_EVT)))) {
- LOG_WA("calloc FAILED");
+ LOG_NO("calloc FAILED");
goto err;
}
- if (smfd_cb->is_quisced_set == true) {
- {
+ if (smfd_cb->is_quiesced_set == true) {
+ /** Initialize the Event here **/
+ smfsv_evt->type = SMFSV_EVT_TYPE_SMFD;
+ smfsv_evt->info.smfd.type = SMFD_EVT_QUIESCED_ACK;
+ smfsv_evt->cb_hdl = (uint32_t)mds_info->i_yr_svc_hdl;
+
+ /* Push the event and we are done */
+ if (NCSCC_RC_FAILURE == m_NCS_IPC_SEND(&smfd_cb->mbx,
smfsv_evt, NCS_IPC_PRIORITY_VERY_HIGH)) {
TRACE("ipc send failed");
smfsv_evt_destroy(smfsv_evt);
goto err;
------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today.
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel