/****************************************************************************\ PROCEDURE NAME : immd_saf_csi_set_cb DESCRIPTION : This is a SAF callback function which will be called when there is any change in the HA state. ARGUMENTS : invocation - This parameter designated a particular invocation of this callback function. The invoke process return invocation when it responds to the Avilability Management FrameWork using the saAmfResponse() function. compName - A pointer to the name of the component whose readiness stae the Availability Management Framework is setting. haState - The new HA state to be assumeb by the component service instance identified by csiName. csiDescriptor - RETURNS : Nothing. \*****************************************************************************/ static void immd_saf_csi_set_cb(SaInvocationT invocation, const SaNameT *compName, SaAmfHAStateT new_haState, SaAmfCSIDescriptorT csiDescriptor) { SaAisErrorT error = SA_AIS_OK; SaAmfHAStateT prev_ha_state; bool role_change = true; uint32_t rc = NCSCC_RC_SUCCESS; IMMD_CB *cb = immd_cb; TRACE_ENTER(); prev_ha_state = cb->ha_state; /* Invoke the appropriate state handler routine */ switch (new_haState) { case SA_AMF_HA_ACTIVE: error = amf_active_state_handler(cb, invocation); break; case SA_AMF_HA_STANDBY: error = amf_standby_state_handler(cb, invocation); break; case SA_AMF_HA_QUIESCED: /* switch over */ error = amf_quiesced_state_handler(cb, invocation); break; case SA_AMF_HA_QUIESCING: /* shut down */ error = amf_quiescing_state_handler(cb, invocation); break; default: LOG_WA("invalid state: %d ", new_haState); error = SA_AIS_ERR_FAILED_OPERATION; break; } if (error != SA_AIS_OK) goto response; if (new_haState == SA_AMF_HA_QUIESCED) { /*Note: should we not change state in cb->ha_state here. This is done in immd_mds_quiesced_ack_process */ goto done; } /* Update control block */ cb->ha_state = new_haState; TRACE_5("New-state: %s, prev-state: %s", ha_state_name(new_haState), ha_state_name(prev_ha_state)); /* Handle active to active role change. */ if (prev_ha_state == new_haState) { TRACE_5("No role change!"); /* bug? */ role_change = false; } if (role_change) { if ((rc = immd_mds_change_role(cb)) != NCSCC_RC_SUCCESS) { LOG_WA("immd_mds_change_role FAILED"); error = SA_AIS_ERR_FAILED_OPERATION; goto response; } TRACE_5("Inform MBCSV of HA state change to %s", (new_haState == SA_AMF_HA_ACTIVE) ? "ACTIVE" : "STANDBY"); if (immd_mbcsv_chgrole(cb) != NCSCC_RC_SUCCESS) { LOG_WA("immd_mbcsv_chgrole FAILED"); error = SA_AIS_ERR_FAILED_OPERATION; goto response; } if (new_haState == SA_AMF_HA_ACTIVE) { /* Change of role to active => We may need to elect new coord */ if(immd_cb->m2PbeCanLoad) { LOG_IN("Electing coord in immd_saf_csi_set_cb() to ACTIVE"); immd_proc_elect_coord(cb, true); } immd_db_purge_fevs(cb); } } response: saAmfResponse(cb->amf_hdl, invocation, error); done: TRACE_LEAVE(); }
/** * Initialize immd * * @return uns32 */ static uns32 immd_initialize(void) { uns32 rc = NCSCC_RC_SUCCESS; TRACE_ENTER(); if (ncs_agents_startup() != NCSCC_RC_SUCCESS) { LOG_ER("ncs_agents_startup FAILED"); goto done; } if ((rc = rda_get_role(&immd_cb->ha_state)) != NCSCC_RC_SUCCESS) { LOG_ER("rda_get_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; } /* Init the EDU Handle */ m_NCS_EDU_HDL_INIT(&immd_cb->edu_hdl); if ((rc = immd_cb_db_init(immd_cb)) != NCSCC_RC_SUCCESS) { LOG_ER("immd_cb_db_init FAILED"); goto done; } /* Create a mail box */ if ((rc = m_NCS_IPC_CREATE(&immd_cb->mbx)) != NCSCC_RC_SUCCESS) { LOG_ER("m_NCS_IPC_CREATE FAILED"); goto done; } /* Attach the IPC to mail box */ if ((rc = m_NCS_IPC_ATTACH(&immd_cb->mbx)) != NCSCC_RC_SUCCESS) { LOG_ER("m_NCS_IPC_ATTACH FAILED"); goto done; } if ((rc = immd_mds_register(immd_cb)) != NCSCC_RC_SUCCESS) { LOG_ER("immd_mds_register FAILED %d", rc); goto done; } /* Initialise with the MBCSV service */ if ((rc = immd_mbcsv_register(immd_cb)) != NCSCC_RC_SUCCESS) { LOG_ER("immd_mbcsv_register FAILED %d", rc); goto done; } if ((rc = immd_mbcsv_chgrole(immd_cb)) != NCSCC_RC_SUCCESS) { LOG_ER("immd_mbcsv_chgrole FAILED %d", rc); goto done; } /* Create a selection object */ if ((rc = ncs_sel_obj_create(&immd_cb->usr1_sel_obj)) != NCSCC_RC_SUCCESS) { LOG_ER("ncs_sel_obj_create failed"); goto done; } /* * Initialize a signal handler that will use the selection object. * The signal is sent from our script when AMF does instantiate. */ if ((signal(SIGUSR1, sigusr1_handler)) == SIG_ERR) { LOG_ER("signal USR1 failed: %s", strerror(errno)); rc = NCSCC_RC_FAILURE; goto done; } syslog(LOG_INFO, "Initialization Success, role %s", (immd_cb->ha_state == SA_AMF_HA_ACTIVE) ? "ACTIVE" : "STANDBY"); done: if (nid_notify("IMMD", rc, NULL) != NCSCC_RC_SUCCESS) { LOG_ER("nid_notify failed"); rc = NCSCC_RC_FAILURE; } TRACE_LEAVE(); return rc; }