osaf/services/infrastructure/fm/fms/fm_amf.c  |   2 +-
 osaf/services/infrastructure/fm/fms/fm_cb.h   |   3 +
 osaf/services/infrastructure/fm/fms/fm_evt.h  |   6 +
 osaf/services/infrastructure/fm/fms/fm_main.c |  87 ++++++++++++++++++++------
 4 files changed, 77 insertions(+), 21 deletions(-)


diff --git a/osaf/services/infrastructure/fm/fms/fm_amf.c 
b/osaf/services/infrastructure/fm/fms/fm_amf.c
--- a/osaf/services/infrastructure/fm/fms/fm_amf.c
+++ b/osaf/services/infrastructure/fm/fms/fm_amf.c
@@ -117,7 +117,7 @@ void fm_saf_CSI_set_callback(SaInvocatio
        syslog(LOG_INFO, "fm_saf_CSI_set_callback: Comp %s, state %s", 
compName->value, ha_role_string[haState - 1]);
        fm_amf_cb = fm_amf_take_hdl();
        if (fm_amf_cb != NULL) {
-               fm_cb->role = haState;
+               fm_cb->amf_state = haState;
                error = saAmfResponse(fm_amf_cb->amf_hdl, invocation, error);
                fm_cb->csi_assigned = true;
        }
diff --git a/osaf/services/infrastructure/fm/fms/fm_cb.h 
b/osaf/services/infrastructure/fm/fms/fm_cb.h
--- a/osaf/services/infrastructure/fm/fms/fm_cb.h
+++ b/osaf/services/infrastructure/fm/fms/fm_cb.h
@@ -57,6 +57,9 @@ typedef struct fm_cb {
 /* Holds own role. */
        PCS_RDA_ROLE role;
 
+/* AMF HA state for FM */
+       SaAmfHAStateT amf_state;
+       
 /* MDS handles. */
        MDS_DEST adest;
        MDS_HDL adest_hdl;
diff --git a/osaf/services/infrastructure/fm/fms/fm_evt.h 
b/osaf/services/infrastructure/fm/fms/fm_evt.h
--- a/osaf/services/infrastructure/fm/fms/fm_evt.h
+++ b/osaf/services/infrastructure/fm/fms/fm_evt.h
@@ -38,11 +38,16 @@ typedef struct gfm_gfm_msg {
 
 } GFM_GFM_MSG;
 
+typedef struct fm_rda_info_t {
+       PCS_RDA_ROLE role;
+} FM_RDA_INFO;
+
 /* FM generated events.*/
 typedef enum {
        FM_EVT_TMR_EXP,
        FM_EVT_NODE_DOWN,
        FM_EVT_PEER_UP,
+       FM_EVT_RDA_ROLE,
        FM_FSM_EVT_MAX
 } FM_FSM_EVT_CODE;
 
@@ -56,6 +61,7 @@ typedef struct fm_evt {
        union {
                FM_TMR *fm_tmr;
                GFM_GFM_MSG gfm_msg;
+               FM_RDA_INFO rda_info;
        } info;
 } FM_EVT;
 
diff --git a/osaf/services/infrastructure/fm/fms/fm_main.c 
b/osaf/services/infrastructure/fm/fms/fm_main.c
--- a/osaf/services/infrastructure/fm/fms/fm_main.c
+++ b/osaf/services/infrastructure/fm/fms/fm_main.c
@@ -74,6 +74,39 @@ static void sigusr1_handler(int sig)
        ncs_sel_obj_ind(usr1_sel_obj);
 }
 
+/**
+ * Callback from RDA. Post a message/event to the fm mailbox.
+ * @param cb_hdl
+ * @param cb_info
+ * @param error_code
+ */
+static void rda_cb(uint32_t cb_hdl, PCS_RDA_CB_INFO *cb_info, 
PCSRDA_RETURN_CODE error_code)
+{
+       uint32_t rc;
+       FM_EVT *evt = NULL;
+
+       TRACE_ENTER();
+
+       evt = calloc(1, sizeof(FM_EVT));
+       if (NULL == evt) {
+               LOG_ER("calloc failed");
+               goto done;
+       }
+
+       evt->evt_code = FM_EVT_RDA_ROLE;
+       evt->info.rda_info.role = cb_info->info.io_role;
+
+       rc = ncs_ipc_send(&fm_cb->mbx, (NCS_IPC_MSG *)evt, 
MDS_SEND_PRIORITY_HIGH);
+       if (rc != NCSCC_RC_SUCCESS) {
+               syslog(LOG_ERR, "IPC send failed %d", rc);
+               free(evt);      
+       }
+
+ done:
+       TRACE_LEAVE();
+}
+
+
 /*****************************************************************************
 
 PROCEDURE NAME:       main
@@ -144,6 +177,11 @@ int main(int argc, char *argv[])
                goto fm_init_failed;
        }
 
+       if ((rc = rda_register_callback(0, rda_cb)) != NCSCC_RC_SUCCESS) {
+               syslog(LOG_ERR, "rda_register_callback FAILED %u", rc);
+               goto done;
+       }
+
        if ((rc = ncs_sel_obj_create(&usr1_sel_obj)) != NCSCC_RC_SUCCESS) {
                LOG_ER("ncs_sel_obj_create FAILED");
                goto fm_init_failed;
@@ -326,27 +364,32 @@ static void fm_mbx_msg_handler(FM_CB *fm
        switch (fm_mbx_evt->evt_code) {
        case FM_EVT_NODE_DOWN:
                LOG_NO("Role: %s, Node Down for node id: %x", 
role_string[fm_cb->role], fm_mbx_evt->node_id);
-               if ((fm_cb->role == PCS_RDA_STANDBY)||(fm_cb->role == 
PCS_RDA_QUIESCED)) {
-                       if ((fm_mbx_evt->node_id == fm_cb->peer_node_id)) {
-                               /* Start Promote active timer */
-                               if ((fm_cb->role != PCS_RDA_QUIESCED) && 
(fm_cb->active_promote_tmr_val != 0)){
-                                       
fm_tmr_start(&fm_cb->promote_active_tmr, fm_cb->active_promote_tmr_val);
-                                       LOG_NO("Promote active timer started");
-                               } else {
-                                       /* Check whether node(AMF) 
initialization is done */
-                                       if (fm_cb->csi_assigned == false) {
-                                               opensaf_reboot(0, NULL,
-                                               "Failover occurred, but this 
node is not yet ready");
-                                       }
-                                       fm_cb->role = PCS_RDA_ACTIVE;
-                                       opensaf_reboot(fm_cb->peer_node_id, 
(char *)fm_cb->peer_node_name.value,
-                                               "Received Node Down for Active 
peer");
-                                       fm_rda_set_role(fm_cb, PCS_RDA_ACTIVE);
-                               }
+               if ((fm_mbx_evt->node_id == fm_cb->peer_node_id)) {
+                       /* Check whether node(AMF) initialization is done */
+                       if (fm_cb->csi_assigned == false) {
+                               opensaf_reboot(0, NULL,
+                                       "Failover occurred, but this node is 
not yet ready");
                        }
-               } else if (fm_cb->role == PCS_RDA_ACTIVE) {
+                       /* Start Promote active timer */
+                       if ((fm_cb->role == PCS_RDA_STANDBY) && 
(fm_cb->active_promote_tmr_val != 0)){
+                               fm_tmr_start(&fm_cb->promote_active_tmr, 
fm_cb->active_promote_tmr_val);
+                               LOG_NO("Promote active timer started");
+                       } else {
+                               TRACE("rda role: %s, amf_state: %u", 
role_string[fm_cb->role], fm_cb->amf_state);
+                       /* The local node is either Quiesced or Active. Reboot 
the peer node. 
+                        * Note: If local node is Active, there are two 
interpretations.
+                        *      - Normal scenario where the Standby went down
+                        *      - Standby went down in the middle of a 
swtichover and AMF has
+                        *        transitioned CSI state, but not the RDA state.
+                        *       In both the cases, this node should be set to 
ACTIVE.
+                        */
+                               if (fm_cb->role != fm_cb->amf_state )
+                                       LOG_NO("Failover occurred in the middle 
of switchover");
+                               fm_cb->role = PCS_RDA_ACTIVE;
                                opensaf_reboot(fm_cb->peer_node_id, (char 
*)fm_cb->peer_node_name.value,
-                                       "Received Node Down for standby peer");
+                                       "Received Node Down for peer 
controller");
+                               fm_rda_set_role(fm_cb, PCS_RDA_ACTIVE);
+                       }
                }
                break;
        case FM_EVT_PEER_UP:
@@ -371,7 +414,11 @@ static void fm_mbx_msg_handler(FM_CB *fm
                        fm_rda_set_role(fm_cb, PCS_RDA_ACTIVE);
                }
                break;
-
+       case FM_EVT_RDA_ROLE:
+               /* RDA role assignment for this controller node */
+               fm_cb->role = fm_mbx_evt->info.rda_info.role;
+               TRACE(LOG_INFO, "RDA role for this controller node: %s", 
role_string[fm_cb->role]);
+               break;
        default:
                break;
        }

------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to