Any PLM admin operation which requires hypervisor assistance (e.g. unlock-in,
abrupt restart) will fail after middleware switchover.
When plmcds are reconnecting to the new active plmd, the plmd does not attempt
to connect to the hypervisor if the EE is a virtual machine monitor.
Connect to the hypervisor when the virtual machine monitor EE reconnects, and
perform any admin-pending-operations that occurred while the hypervisor was
out of contact.
---
src/plm/common/plms.h | 4 +
src/plm/plmd/plms_adm_fsm.c | 213 ++++++++++++++++++++++++--------------------
src/plm/plmd/plms_plmc.c | 36 ++++++++
3 files changed, 155 insertions(+), 98 deletions(-)
diff --git a/src/plm/common/plms.h b/src/plm/common/plms.h
index 57c7e374d..5041663c5 100644
--- a/src/plm/common/plms.h
+++ b/src/plm/common/plms.h
@@ -409,6 +409,7 @@ typedef enum {
PLMS_MNGT_EE_UNLOCK,
PLMS_MNGT_EE_TERM,
PLMS_MNGT_EE_RESTART,
+ PLMS_MNGT_EE_RESTART_ABRUPT,
PLMS_MNGT_EE_GET_OS_INFO,
PLMS_MNGT_EE_INST,
PLMS_MNGT_EE_ISOLATE,
@@ -547,6 +548,9 @@ SaUint32T plms_imm_adm_op_req_process(PLMS_EVT *);
SaUint32T plms_cbk_response_process(PLMS_EVT *);
void plms_deact_completed_cbk_call(PLMS_ENTITY *, PLMS_TRACK_INFO *);
void plms_deact_start_cbk_call(PLMS_ENTITY *, PLMS_TRACK_INFO *);
+void plms_post_abrupt_restart(PLMS_ENTITY *,
+ PLMS_EVT *,
+ PLMS_GROUP_ENTITY *aff_ent_list);
/* Function declaration from plms_utils.c*/
SaUint32T plms_readiness_impact_process(PLMS_EVT *);
diff --git a/src/plm/plmd/plms_adm_fsm.c b/src/plm/plmd/plms_adm_fsm.c
index 370c30f36..5ab8db65d 100644
--- a/src/plm/plmd/plms_adm_fsm.c
+++ b/src/plm/plmd/plms_adm_fsm.c
@@ -5510,6 +5510,116 @@ void plms_deact_completed_cbk_call(PLMS_ENTITY *ent,
PLMS_TRACK_INFO *trk_info)
return;
}
+void plms_post_abrupt_restart(PLMS_ENTITY *ent,
+ PLMS_EVT *evt,
+ PLMS_GROUP_ENTITY *aff_ent_list) {
+ SaUint32T count = 0;
+ PLMS_GROUP_ENTITY *head = 0;
+ PLMS_ENTITY_GROUP_INFO_LIST *log_head_grp = 0;
+ PLMS_TRACK_INFO *trk_info = 0;
+
+ TRACE_ENTER();
+
+ /* Admin operation started. */
+ ent->adm_op_in_progress = SA_PLM_CAUSE_EE_RESTART;
+ ent->am_i_aff_ent = true;
+ plms_aff_ent_flag_mark_unmark(aff_ent_list, true);
+
+ /* Take care of target EE. */
+ plms_presence_state_set(ent, SA_PLM_EE_PRESENCE_INSTANTIATING, NULL,
+ SA_NTF_MANAGEMENT_OPERATION,
+ SA_PLM_NTFID_STATE_CHANGE_ROOT);
+
+ plms_readiness_state_set(ent, SA_PLM_READINESS_OUT_OF_SERVICE, NULL,
+ SA_NTF_MANAGEMENT_OPERATION,
+ SA_PLM_NTFID_STATE_CHANGE_ROOT);
+ count++;
+
+ /* Get the trk_info ready.*/
+ trk_info = (PLMS_TRACK_INFO *)calloc(1, sizeof(PLMS_TRACK_INFO));
+ trk_info->root_entity = ent;
+ ent->trk_info = trk_info;
+
+ /* Reset all the dependent EEs.*/
+ head = aff_ent_list;
+ while (head) {
+ SaUint32T ret_err =
+ plms_ee_reboot(head->plm_entity, false, true);
+
+ if (NCSCC_RC_SUCCESS == ret_err) {
+ plms_presence_state_set(
+ head->plm_entity, SA_PLM_EE_PRESENCE_UNINSTANTIATED,
+ ent, SA_NTF_MANAGEMENT_OPERATION,
+ SA_PLM_NTFID_STATE_CHANGE_DEP);
+ head->plm_entity->trk_info = trk_info;
+ count++;
+ } else {
+ LOG_ER("EE reset failed. Ent: %s",
+ head->plm_entity->dn_name_str);
+ }
+ plms_readiness_state_set(
+ head->plm_entity, SA_PLM_READINESS_OUT_OF_SERVICE, ent,
+ SA_NTF_MANAGEMENT_OPERATION, SA_PLM_NTFID_STATE_CHANGE_DEP);
+ plms_readiness_flag_mark_unmark(
+ head->plm_entity, SA_PLM_RF_DEPENDENCY, 1 /* mark */, ent,
+ SA_NTF_MANAGEMENT_OPERATION, SA_PLM_NTFID_STATE_CHANGE_DEP);
+ head = head->next;
+ }
+
+ plms_aff_ent_exp_rdness_state_ow(aff_ent_list);
+ plms_ent_exp_rdness_state_ow(ent);
+
+ trk_info->aff_ent_list = aff_ent_list;
+
+ /* Add the groups, root entity(ent) belong to.*/
+ plms_ent_grp_list_add(ent, &(trk_info->group_info_list));
+
+ /* Find out all the groups, all affected entities belong to and add
+ the groups to trk_info->group_info_list.*/
+ plms_ent_list_grp_list_add(aff_ent_list, &(trk_info->group_info_list));
+
+ TRACE("Affected groups for ent %s: ", ent->dn_name_str);
+ log_head_grp = trk_info->group_info_list;
+ while (log_head_grp) {
+ TRACE("%llu,", log_head_grp->ent_grp_inf->entity_grp_hdl);
+ log_head_grp = log_head_grp->next;
+ }
+
+ trk_info->imm_adm_opr_id = evt ? evt->req_evt.admin_op.operation_id : 0;
+ trk_info->inv_id = evt ? evt->req_evt.admin_op.inv_id : 0;
+ trk_info->change_step = SA_PLM_CHANGE_COMPLETED;
+ trk_info->track_cause = SA_PLM_CAUSE_EE_RESTART;
+ trk_info->root_correlation_id = SA_NTF_IDENTIFIER_UNUSED;
+ trk_info->grp_op = SA_PLM_GROUP_MEMBER_READINESS_CHANGE;
+ trk_info->root_entity = ent;
+ trk_info->track_count = count;
+ /* 1. Call the 1st callback for restart.*/
+ plms_cbk_call(trk_info, 1);
+
+ plms_aff_ent_exp_rdness_status_clear(aff_ent_list);
+ plms_ent_exp_rdness_status_clear(ent);
+ plms_ent_grp_list_free(trk_info->group_info_list);
+ trk_info->group_info_list = NULL;
+ /* Not needed for abrupt restart.*/
+ trk_info->track_cause = 0;
+
+ /********************************************************************/
+
+ /* Target EE as well as affected EEs are restarted. When each restarted
+ EE is instantiated, move the EE to InSvc and call the completed cbk
+ with track cause as SA_PLM_CAUSE_EE_INSTANTIATED and root entity as
+ the target entity. Make sure to free the trk_info->group_info_list
+ and decrement the trk_info->count.
+
+ After all the aff EEs are instantiated (trk_info->count becomes 0),
+ return to IMM. Clear the admin context.
+ Free trk_info->group_info_list, trk_info, trk_info->aff_ent_list.
+
+ */
+
+ TRACE_LEAVE();
+}
+
/******************************************************************************
@brief : Process EE abrupt restart.
@param[in] : ent - EE to be restarted.
@@ -5521,10 +5631,7 @@ void plms_deact_completed_cbk_call(PLMS_ENTITY *ent,
PLMS_TRACK_INFO *trk_info)
static SaUint32T plms_ee_abrupt_restart_process(PLMS_ENTITY *ent, PLMS_EVT
*evt,
PLMS_GROUP_ENTITY *aff_ent_list)
{
- SaUint32T ret_err = NCSCC_RC_SUCCESS, count = 0;
- PLMS_TRACK_INFO *trk_info;
- PLMS_GROUP_ENTITY *head;
- PLMS_ENTITY_GROUP_INFO_LIST *log_head_grp;
+ SaUint32T ret_err = NCSCC_RC_SUCCESS;
PLMS_CB *cb = plms_cb;
TRACE_ENTER2("Entity: %s. Op: Admin restart variant: Abrupt.",
@@ -5616,6 +5723,9 @@ static SaUint32T
plms_ee_abrupt_restart_process(PLMS_ENTITY *ent, PLMS_EVT *evt,
SA_PLM_NTFID_STATE_CHANGE_ROOT);
plms_mngt_lost_clear_cbk_call(ent, 1 /*mark*/);
+
+ ent->mngt_lost_tri =
+ PLMS_MNGT_EE_RESTART_ABRUPT;
}
ret_err = saImmOiAdminOperationResult(
@@ -5633,100 +5743,7 @@ static SaUint32T
plms_ee_abrupt_restart_process(PLMS_ENTITY *ent, PLMS_EVT *evt,
assert(0);
}
- /* Admin operation started. */
- ent->adm_op_in_progress = SA_PLM_CAUSE_EE_RESTART;
- ent->am_i_aff_ent = true;
- plms_aff_ent_flag_mark_unmark(aff_ent_list, true);
-
- /* Take care of target EE. */
- plms_presence_state_set(ent, SA_PLM_EE_PRESENCE_INSTANTIATING, NULL,
- SA_NTF_MANAGEMENT_OPERATION,
- SA_PLM_NTFID_STATE_CHANGE_ROOT);
-
- plms_readiness_state_set(ent, SA_PLM_READINESS_OUT_OF_SERVICE, NULL,
- SA_NTF_MANAGEMENT_OPERATION,
- SA_PLM_NTFID_STATE_CHANGE_ROOT);
- count++;
-
- /* Get the trk_info ready.*/
- trk_info = (PLMS_TRACK_INFO *)calloc(1, sizeof(PLMS_TRACK_INFO));
- trk_info->root_entity = ent;
- ent->trk_info = trk_info;
-
- /* Reset all the dependent EEs.*/
- head = aff_ent_list;
- while (head) {
- ret_err = plms_ee_reboot(head->plm_entity, false, true);
- if (NCSCC_RC_SUCCESS == ret_err) {
- plms_presence_state_set(
- head->plm_entity, SA_PLM_EE_PRESENCE_UNINSTANTIATED,
- ent, SA_NTF_MANAGEMENT_OPERATION,
- SA_PLM_NTFID_STATE_CHANGE_DEP);
- head->plm_entity->trk_info = trk_info;
- count++;
- } else {
- LOG_ER("EE reset failed. Ent: %s",
- head->plm_entity->dn_name_str);
- }
- plms_readiness_state_set(
- head->plm_entity, SA_PLM_READINESS_OUT_OF_SERVICE, ent,
- SA_NTF_MANAGEMENT_OPERATION, SA_PLM_NTFID_STATE_CHANGE_DEP);
- plms_readiness_flag_mark_unmark(
- head->plm_entity, SA_PLM_RF_DEPENDENCY, 1 /* mark */, ent,
- SA_NTF_MANAGEMENT_OPERATION, SA_PLM_NTFID_STATE_CHANGE_DEP);
- head = head->next;
- }
-
- plms_aff_ent_exp_rdness_state_ow(aff_ent_list);
- plms_ent_exp_rdness_state_ow(ent);
-
- trk_info->aff_ent_list = aff_ent_list;
-
- /* Add the groups, root entity(ent) belong to.*/
- plms_ent_grp_list_add(ent, &(trk_info->group_info_list));
-
- /* Find out all the groups, all affected entities belong to and add
- the groups to trk_info->group_info_list.*/
- plms_ent_list_grp_list_add(aff_ent_list, &(trk_info->group_info_list));
-
- TRACE("Affected groups for ent %s: ", ent->dn_name_str);
- log_head_grp = trk_info->group_info_list;
- while (log_head_grp) {
- TRACE("%llu,", log_head_grp->ent_grp_inf->entity_grp_hdl);
- log_head_grp = log_head_grp->next;
- }
-
- trk_info->imm_adm_opr_id = evt->req_evt.admin_op.operation_id;
- trk_info->inv_id = evt->req_evt.admin_op.inv_id;
- trk_info->change_step = SA_PLM_CHANGE_COMPLETED;
- trk_info->track_cause = SA_PLM_CAUSE_EE_RESTART;
- trk_info->root_correlation_id = SA_NTF_IDENTIFIER_UNUSED;
- trk_info->grp_op = SA_PLM_GROUP_MEMBER_READINESS_CHANGE;
- trk_info->root_entity = ent;
- trk_info->track_count = count;
- /* 1. Call the 1st callback for restart.*/
- plms_cbk_call(trk_info, 1);
-
- plms_aff_ent_exp_rdness_status_clear(aff_ent_list);
- plms_ent_exp_rdness_status_clear(ent);
- plms_ent_grp_list_free(trk_info->group_info_list);
- trk_info->group_info_list = NULL;
- /* Not needed for abrupt restart.*/
- trk_info->track_cause = 0;
-
- /********************************************************************/
-
- /* Target EE as well as affected EEs are restarted. When each restarted
- EE is instantiated, move the EE to InSvc and call the completed cbk
- with track cause as SA_PLM_CAUSE_EE_INSTANTIATED and root entity as
- the target entity. Make sure to free the trk_info->group_info_list
- and decrement the trk_info->count.
-
- After all the aff EEs are instantiated (trk_info->count becomes 0),
- return to IMM. Clear the admin context.
- Free trk_info->group_info_list, trk_info, trk_info->aff_ent_list.
-
- */
+ plms_post_abrupt_restart(ent, evt, aff_ent_list);
TRACE_LEAVE2("ret_err: %d", ret_err);
return ret_err;
diff --git a/src/plm/plmd/plms_plmc.c b/src/plm/plmd/plms_plmc.c
index 1f0cef609..cf8687219 100644
--- a/src/plm/plmd/plms_plmc.c
+++ b/src/plm/plmd/plms_plmc.c
@@ -401,7 +401,43 @@ SaUint32T plms_plmc_tcp_connect_process(PLMS_ENTITY *ent)
}
if (plms_is_rdness_state_set(ent, SA_PLM_READINESS_IN_SERVICE)) {
+ PLMS_ENTITY *child = ent->leftmost_child;
TRACE("Ent %s is already in insvc.", ent->dn_name_str);
+
+ /* if this is a parent EE, connect to the hypervisor */
+ if (child)
+ plms_ee_hypervisor_instantiated(ent);
+
+ /* do any pending admin operations on child EEs */
+ while (child) {
+ if (plms_rdness_flag_is_set(
+ child, SA_PLM_RF_ADMIN_OPERATION_PENDING)) {
+ /* hypervisor can handle these operations */
+ if (child->mngt_lost_tri == PLMS_MNGT_EE_INST)
+ plms_ee_instantiate(child, false, true);
+ else if (child->mngt_lost_tri ==
+ PLMS_MNGT_EE_RESTART_ABRUPT) {
+ ret_err = plms_ee_restart_vm(child);
+
+ if (ret_err == NCSCC_RC_SUCCESS) {
+ PLMS_GROUP_ENTITY *aff_ent_list
+ = 0;
+ plms_affected_ent_list_get(
+ ent,
+ &aff_ent_list,
+ 0);
+
+ plms_post_abrupt_restart(
+ child,
+ 0,
+ aff_ent_list);
+ }
+ }
+ }
+
+ child = child->right_sibling;
+ }
+
return NCSCC_RC_SUCCESS;
}
/*If previous state is not instantiating/intantiated, then get os info
--
2.13.6
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel