osaf/services/saf/amf/amfd/include/su.h | 6 +-
osaf/services/saf/amf/amfd/ndproc.cc | 77 ++++++++++++++++++++++-
osaf/services/saf/amf/amfd/sgproc.cc | 27 ++++++++
osaf/services/saf/amf/amfd/su.cc | 106 +++++++++++++++++++++++++++++++-
osaf/services/saf/amf/amfnd/su.cc | 21 ++++++-
5 files changed, 230 insertions(+), 7 deletions(-)
Admin operation is supported for both restartable and non-restartable
su.
Patch for #315 contains changes in amfnd and amfd which are common
for all the three tickets viz. #315, #334 and #1455.
TODO: To take care of controller role change when operation in
progress.
diff --git a/osaf/services/saf/amf/amfd/include/su.h
b/osaf/services/saf/amf/amfd/include/su.h
--- a/osaf/services/saf/amf/amfd/include/su.h
+++ b/osaf/services/saf/amf/amfd/include/su.h
@@ -132,6 +132,7 @@ class AVD_SU {
void unlock_instantiation(SaImmOiHandleT immoi_handle,
SaInvocationT invocation);
void repaired(SaImmOiHandleT immoi_handle, SaInvocationT invocation);
+ void restart(SaImmOiHandleT immoi_handle, SaInvocationT invocation);
void shutdown(SaImmOiHandleT immoi_handle, SaInvocationT invocation);
void lock(SaImmOiHandleT immoi_handle, SaInvocationT invocation,
SaAmfAdminStateT adm_state);
@@ -140,7 +141,10 @@ class AVD_SU {
SaAisErrorT check_su_stability();
bool su_any_comp_undergoing_restart_admin_op();
AVD_COMP *su_get_comp_undergoing_restart_admin_op();
-
+ bool su_all_comps_restartable();
+ bool is_any_non_restartable_comp_assigned();
+ bool all_pi_comps_restartable();
+ bool all_pi_comps_nonrestartable();
private:
void initialize();
void send_attribute_update(AVSV_AMF_SU_ATTR_ID attrib_id);
diff --git a/osaf/services/saf/amf/amfd/ndproc.cc
b/osaf/services/saf/amf/amfd/ndproc.cc
--- a/osaf/services/saf/amf/amfd/ndproc.cc
+++ b/osaf/services/saf/amf/amfd/ndproc.cc
@@ -352,6 +352,72 @@ done:
TRACE_LEAVE2("(%llu)", comp->admin_pend_cbk.invocation);
}
+static void surestart_admin_op_report_to_imm(AVD_SU *su, SaAmfPresenceStateT
pres)
+{
+ TRACE_ENTER2("%s", avd_pres_state_name[pres]);
+ SaAisErrorT rc = SA_AIS_OK;
+
+ if ((su->su_all_comps_restartable() == true) ||
+ ((su->saAmfSUPreInstantiable == true) &&
+ (su->all_pi_comps_restartable() == true))) {
+ if ((su->saAmfSUPresenceState == SA_AMF_PRESENCE_INSTANTIATED)
&&
+ (pres != SA_AMF_PRESENCE_RESTARTING))
+ rc = SA_AIS_ERR_BAD_OPERATION;
+ else if ((su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_RESTARTING) &&
+ (pres != SA_AMF_PRESENCE_INSTANTIATING))
+ rc = SA_AIS_ERR_BAD_OPERATION;
+ else if (su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_INSTANTIATING) {
+ if (pres == SA_AMF_PRESENCE_INSTANTIATED)
+ rc = SA_AIS_OK;
+ else
+ rc = SA_AIS_ERR_REPAIR_PENDING;
+ } else if ((pres == SA_AMF_PRESENCE_RESTARTING) ||
+ (pres == SA_AMF_PRESENCE_INSTANTIATING)) {
+ TRACE("Valid state transition, wait for final
transition.");
+ goto done;
+ }
+
+ } else {
+ if ((su->saAmfSUPresenceState == SA_AMF_PRESENCE_INSTANTIATED)
&&
+ (pres != SA_AMF_PRESENCE_TERMINATING))
+ rc = SA_AIS_ERR_BAD_OPERATION;
+ else if ((su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_TERMINATING) &&
+ (pres != SA_AMF_PRESENCE_INSTANTIATING)) {
+ if (((su->saAmfSUPreInstantiable == false) ||
+
(su->all_pi_comps_nonrestartable() == true)) &&
+ (pres ==
SA_AMF_PRESENCE_UNINSTANTIATED)) {
+ TRACE("Valid state transition, wait for final
transition.");
+ goto done;
+ }
+ rc = SA_AIS_ERR_BAD_OPERATION;
+ } else if ((su->all_pi_comps_nonrestartable() == true) &&
+ (su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_UNINSTANTIATED) &&
+ (pres != SA_AMF_PRESENCE_INSTANTIATING))
+ rc = SA_AIS_ERR_BAD_OPERATION;
+ else if (su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_INSTANTIATING) {
+ if (pres == SA_AMF_PRESENCE_INSTANTIATED)
+ rc = SA_AIS_OK;
+ else
+ rc = SA_AIS_ERR_REPAIR_PENDING;
+ } else if ((pres == SA_AMF_PRESENCE_TERMINATING) ||
+ (pres == SA_AMF_PRESENCE_INSTANTIATING)) {
+ TRACE("Valid state transition, wait for final
transition.");
+ goto done;
+ }
+ }
+ if (rc == SA_AIS_OK) {
+
avd_saImmOiAdminOperationResult(avd_cb->immOiHandle,su->pend_cbk.invocation,
rc);
+ } else {
+ report_admin_op_error(avd_cb->immOiHandle,
su->pend_cbk.invocation,
+ rc, &su->pend_cbk, "Couldn't restart su '%s'",
+ su->name.value);
+ }
+ su->pend_cbk.admin_oper = static_cast<SaAmfAdminOperationIdT>(0);
+ su->pend_cbk.invocation = 0;
+done:
+ TRACE_LEAVE2("(%llu)", su->pend_cbk.invocation);
+}
+
/**
* handler to report error response to imm for any pending admin operation on
su
*
@@ -412,6 +478,9 @@ static void su_admin_op_report_to_imm(AV
su->name.value);
}
break;
+ case SA_AMF_ADMIN_RESTART:
+ surestart_admin_op_report_to_imm(su, pres);
+ break;
default:
break;
}
@@ -809,16 +878,18 @@ void avd_data_update_req_evh(AVD_CL_CB *
TRACE("su pres state");
if
(n2d_msg->msg_info.n2d_data_req.param_info.value_len == sizeof(uint32_t)) {
l_val = ntohl(*((uint32_t
*)&n2d_msg->msg_info.n2d_data_req.param_info.value[0]));
-
su->set_pres_state(static_cast<SaAmfPresenceStateT>(l_val));
/* Send response to any admin callbacks
delivered by IMM if not sent already. */
if
(su->su_on_node->admin_node_pend_cbk.invocation != 0) {
node_admin_op_report_to_imm(su,
static_cast<SaAmfPresenceStateT>(l_val));
} else if (su->pend_cbk.invocation !=
0) {
su_admin_op_report_to_imm(su,
static_cast<SaAmfPresenceStateT>(l_val));
- } else if (su->su_on_node->admin_ng !=
NULL) {
+ }
+
+
su->set_pres_state(static_cast<SaAmfPresenceStateT>(l_val));
+
+ if (su->su_on_node->admin_ng != NULL)
process_su_si_response_for_ng(su, SA_AIS_OK);
- }
if (l_val ==
SA_AMF_PRESENCE_TERMINATION_FAILED) {
for (AVD_SI* si =
su->sg_of_su->list_of_si; si != NULL;
diff --git a/osaf/services/saf/amf/amfd/sgproc.cc
b/osaf/services/saf/amf/amfd/sgproc.cc
--- a/osaf/services/saf/amf/amfd/sgproc.cc
+++ b/osaf/services/saf/amf/amfd/sgproc.cc
@@ -931,6 +931,31 @@ void process_su_si_response_for_comp(AVD
}
TRACE_LEAVE();
}
+
+void process_su_si_response_for_surestart_admin_op(AVD_SU *su)
+{
+ TRACE_ENTER();
+ if (su->list_of_susi != NULL) {
+ if ((su->saAmfSUPreInstantiable == false) &&
(su->su_all_comps_restartable() == false) &&
+ (su->list_of_susi->state ==
SA_AMF_HA_QUIESCED)) {
+ TRACE("For NPI '%s' RESTART admin op
ends.",su->name.value);
+ su->complete_admin_op(SA_AIS_OK);
+ }
+ TRACE_LEAVE();
+ return;
+ }
+
+ uint32_t rc = avd_admin_op_msg_snd(&su->name, AVSV_SA_AMF_SU,
SA_AMF_ADMIN_RESTART,
+ su->su_on_node);
+ if (rc != NCSCC_RC_SUCCESS) {
+ report_admin_op_error(avd_cb->immOiHandle,
su->pend_cbk.invocation,
+ SA_AIS_ERR_TIMEOUT, NULL,
+ "Admin op request send failed '%s'",
su->name.value);
+ su->pend_cbk.admin_oper =
static_cast<SaAmfAdminOperationIdT>(0);
+ su->pend_cbk.invocation = 0;
+ }
+ TRACE_LEAVE();
+}
/*****************************************************************************
* Function: avd_su_si_assign_func
*
@@ -1370,6 +1395,8 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
}
else
su->complete_admin_op(SA_AIS_ERR_TIMEOUT);
+ } else if (su->pend_cbk.admin_oper ==
SA_AMF_ADMIN_RESTART) {
+
process_su_si_response_for_surestart_admin_op(su);
}
} else if (su->su_on_node->admin_node_pend_cbk.invocation != 0)
{
/* decrement the SU count on the node undergoing admin
operation
diff --git a/osaf/services/saf/amf/amfd/su.cc b/osaf/services/saf/amf/amfd/su.cc
--- a/osaf/services/saf/amf/amfd/su.cc
+++ b/osaf/services/saf/amf/amfd/su.cc
@@ -1133,7 +1133,35 @@ void AVD_SU::repaired(SaImmOiHandleT imm
done:
TRACE_LEAVE();
}
+void AVD_SU::restart(SaImmOiHandleT immoi_handle,
+ SaInvocationT invocation) {
+ TRACE_ENTER2("'%s'", name.value);
+ pend_cbk.admin_oper = SA_AMF_ADMIN_RESTART;
+ pend_cbk.invocation = invocation;
+ if ((su_all_comps_restartable() == true) ||
+ (is_any_non_restartable_comp_assigned() == false)) {
+ if (avd_admin_op_msg_snd(&name, AVSV_SA_AMF_SU,
SA_AMF_ADMIN_RESTART,
+ su_on_node) != NCSCC_RC_SUCCESS) {
+ report_admin_op_error(immoi_handle, invocation,
SA_AIS_ERR_TIMEOUT, NULL,
+ "Admin op request send failed '%s'",
name.value);
+ pend_cbk.invocation = 0;
+ pend_cbk.admin_oper =
static_cast<SaAmfAdminOperationIdT>(0);
+ }
+ } else {
+ /* Atleast one non-restartable (saAmfCompDisableRestart or
+ saAmfCtDefDisableRestart is true) comp is assigned.
+ First gracefully switch-over SU's assignments to other
+ At present assignment of whole SU will be gracefully
+ reassigned.
+ Thus for PI applications modeled on NWay and Nway Active
model
+ this is spec deviation.
+ */
+ set_readiness_state(SA_AMF_READINESS_OUT_OF_SERVICE);
+ sg_of_su->su_fault(avd_cb, this);
+ }
+ TRACE_LEAVE();
+}
/**
* Handle admin operations on SaAmfSU objects.
*
@@ -1153,7 +1181,7 @@ static void su_admin_op_cb(SaImmOiHandle
TRACE_ENTER2("%llu, '%s', %llu", invocation, su_name->value, op_id);
- if ( op_id > SA_AMF_ADMIN_SHUTDOWN && op_id != SA_AMF_ADMIN_REPAIRED) {
+ if ( op_id > SA_AMF_ADMIN_RESTART && op_id != SA_AMF_ADMIN_REPAIRED) {
report_admin_op_error(immoi_handle, invocation,
SA_AIS_ERR_NOT_SUPPORTED, NULL,
"Unsupported admin op for SU: %llu", op_id);
goto done;
@@ -1228,10 +1256,12 @@ static void su_admin_op_cb(SaImmOiHandle
if (((su->saAmfSUAdminState == SA_AMF_ADMIN_UNLOCKED) &&
(op_id != SA_AMF_ADMIN_LOCK) &&
(op_id != SA_AMF_ADMIN_SHUTDOWN) &&
+ (op_id != SA_AMF_ADMIN_RESTART) &&
(op_id != SA_AMF_ADMIN_REPAIRED)) ||
((su->saAmfSUAdminState == SA_AMF_ADMIN_LOCKED) &&
(op_id != SA_AMF_ADMIN_UNLOCK) &&
(op_id != SA_AMF_ADMIN_REPAIRED) &&
+ (op_id != SA_AMF_ADMIN_RESTART) &&
(op_id != SA_AMF_ADMIN_LOCK_INSTANTIATION)) ||
((su->saAmfSUAdminState == SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
(op_id != SA_AMF_ADMIN_UNLOCK_INSTANTIATION) &&
@@ -1243,7 +1273,36 @@ static void su_admin_op_cb(SaImmOiHandle
"State transition invalid, state %u, op %llu",
su->saAmfSUAdminState, op_id);
goto done;
}
-
+ if (op_id == SA_AMF_ADMIN_RESTART) {
+ if (su->sg_of_su->sg_ncs_spec == true) {
+ report_admin_op_error(immoi_handle, invocation,
SA_AIS_ERR_BAD_OPERATION, NULL,
+ "Not allowed on middleware SU: %s,
op_id: %llu",
+ su->name.value, op_id);
+ goto done;
+ }
+ if (su->saAmfSUPresenceState == SA_AMF_PRESENCE_UNINSTANTIATED)
{
+ report_admin_op_error(immoi_handle, invocation,
SA_AIS_ERR_BAD_OPERATION, NULL,
+ "Prescence state of SU is
uninstantiated, it is: %u, op_id: %llu",
+ su->saAmfSUPresenceState, op_id);
+ goto done;
+ }
+ if (su->saAmfSUOperState == SA_AMF_OPERATIONAL_DISABLED) {
+ report_admin_op_error(immoi_handle, invocation,
SA_AIS_ERR_BAD_OPERATION, NULL,
+ "SU is disabled (%u), repair it or
check node status, op_id: %llu",
+ su->saAmfSUOperState, op_id);
+ goto done;
+ }
+ SaAisErrorT rc = SA_AIS_OK;
+ rc = su->check_su_stability();
+ if (rc != SA_AIS_OK) {
+ report_admin_op_error(immoi_handle, invocation,
+ SA_AIS_ERR_TRY_AGAIN, NULL,
+ "Some entity is unstable,
Operation cannot "
+ "be performed on '%s'"
+ "Check syslog for entity
details", su->name.value);
+ goto done;
+ }
+ }
node = su->get_node_ptr();
if (node->admin_node_pend_cbk.admin_oper != 0) {
report_admin_op_error(immoi_handle, invocation,
SA_AIS_ERR_TRY_AGAIN, NULL,
@@ -1272,6 +1331,9 @@ static void su_admin_op_cb(SaImmOiHandle
case SA_AMF_ADMIN_REPAIRED:
su->repaired(immoi_handle, invocation);
break;
+ case SA_AMF_ADMIN_RESTART:
+ su->restart(immoi_handle, invocation);
+ break;
default:
report_admin_op_error(immoi_handle, invocation,
SA_AIS_ERR_INVALID_PARAM, NULL,
"Unsupported admin op");
@@ -2202,3 +2264,43 @@ AVD_COMP *AVD_SU::su_get_comp_undergoing
}
return NULL;
}
+bool AVD_SU::su_all_comps_restartable()
+{
+ for (AVD_COMP *comp = list_of_comp; comp; comp = comp->su_comp_next) {
+ if (comp->comp_info.comp_restart == true)
+ return false;
+ }
+ return true;
+}
+bool AVD_SU::is_any_non_restartable_comp_assigned()
+{
+ for (AVD_COMP *comp = list_of_comp; comp; comp = comp->su_comp_next) {
+ if ((comp->comp_info.comp_restart == true) &&
+ (is_comp_assigned_any_csi(comp) == true))
+ return true;
+ }
+ return false;
+}
+bool AVD_SU::all_pi_comps_restartable()
+{
+ for (AVD_COMP *comp = list_of_comp; comp; comp = comp->su_comp_next) {
+ AVD_COMP_TYPE *comptype =
comptype_db->find(Amf::to_string(&comp->saAmfCompType));
+ if ((comp->comp_info.comp_restart == true) &&
+ ((comptype->saAmfCtCompCategory ==
SA_AMF_COMP_SA_AWARE) ||
+
(IS_COMP_PROXIED_PI(comptype->saAmfCtCompCategory))))
+ return false;
+ }
+ return true;
+}
+bool AVD_SU::all_pi_comps_nonrestartable()
+{
+ for (AVD_COMP *comp = list_of_comp; comp; comp = comp->su_comp_next) {
+ AVD_COMP_TYPE *comptype =
comptype_db->find(Amf::to_string(&comp->saAmfCompType));
+ if ((comp->comp_info.comp_restart == false) &&
+ ((comptype->saAmfCtCompCategory ==
SA_AMF_COMP_SA_AWARE) ||
+
(IS_COMP_PROXIED_PI(comptype->saAmfCtCompCategory))))
+ return false;
+ }
+ return true;
+}
+
diff --git a/osaf/services/saf/amf/amfnd/su.cc
b/osaf/services/saf/amf/amfnd/su.cc
--- a/osaf/services/saf/amf/amfnd/su.cc
+++ b/osaf/services/saf/amf/amfnd/su.cc
@@ -668,12 +668,31 @@ uint32_t avnd_evt_su_admin_op_req(AVND_C
break;
}
+ case SA_AMF_ADMIN_RESTART: {
+ LOG_NO("Admin Restart request for '%s'", su->name.value);
+ su->admin_op_Id = SA_AMF_ADMIN_RESTART;
+ set_suRestart_flag(su);
+ m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
AVND_CKPT_SU_FLAG_CHANGE);
+ if ((su_all_comps_restartable(*su) == true) ||
+ (is_any_non_restartable_comp_assigned(*su) ==
false)) {
+ rc = avnd_su_curr_info_del(cb, su);
+ if (NCSCC_RC_SUCCESS != rc)
+ goto done;
+ rc = avnd_su_si_unmark(cb, su);
+ if (NCSCC_RC_SUCCESS != rc)
+ goto done;
+ }
+ rc = avnd_su_pres_fsm_run(cb, su, 0,
AVND_SU_PRES_FSM_EV_RESTART);
+ if (NCSCC_RC_SUCCESS != rc)
+ goto done;
+ break;
+ }
default:
LOG_NO("%s: unsupported adm op %u", __FUNCTION__,
info->oper_id);
rc = NCSCC_RC_FAILURE;
break;
}
-
+done:
TRACE_LEAVE();
return rc;
}
------------------------------------------------------------------------------
Monitor Your Dynamic Infrastructure at Any Scale With Datadog!
Get real-time metrics from all of your servers, apps and tools
in one place.
SourceForge users - Click here to start your Free Trial of Datadog now!
http://pubads.g.doubleclick.net/gampad/clk?id=241902991&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel