osaf/services/saf/avsv/avd/avd_node.c | 9 +++++++++
osaf/services/saf/avsv/avd/avd_su.c | 8 ++++++++
osaf/services/saf/avsv/avnd/avnd_comp.c | 2 +-
3 files changed, 18 insertions(+), 1 deletions(-)
Problem: When su is either in instantiating/Terminating/restarting state and
if either su/node lock-in operation is performed, then
it interrupt SU states and forces component to try again.
Ideally this condition shouldn;t arise.
Also, TRY_AGAIN need to be changed to BAD_OPERATIO because
aplication can exit and not stay in loop in wrong path.
Analysis: When su is not in appropriate state, allowing lock-in admin
operation is making su states and CLC weird.
Returning BAD_OP instead of TRY_AGAIN can make application exit.
Fix: Now, Amfd is returning try again for su/node
lock-in admin command if su is in insting/terminating/restarting state.
Once, SU reaches to insted/term failed/inst failed/uninstantiated,
this command can be accepted.
Also, return BAD_OP instead of TRY_AGAIN.
diff --git a/osaf/services/saf/avsv/avd/avd_node.c
b/osaf/services/saf/avsv/avd/avd_node.c
--- a/osaf/services/saf/avsv/avd/avd_node.c
+++ b/osaf/services/saf/avsv/avd/avd_node.c
@@ -1081,6 +1081,15 @@ static void node_admin_op_cb(SaImmOiHand
LOG_WA("SU on this node is undergoing admin op (%s)",
su->name.value);
goto done;
}
+
+ if ((su->saAmfSUPresenceState == SA_AMF_PRESENCE_INSTANTIATING)
||
+ (su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_TERMINATING) ||
+ (su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_RESTARTING)) {
+ rc = SA_AIS_ERR_TRY_AGAIN;
+ LOG_WA("'%s' presence state is '%u'", su->name.value,
su->saAmfSUPresenceState);
+ goto done;
+ }
+
if (su->sg_of_su->sg_fsm_state != AVD_SG_FSM_STABLE) {
rc = SA_AIS_ERR_TRY_AGAIN;
LOG_WA("SG of SU on this node not in STABLE state
(%s)", su->name.value);
diff --git a/osaf/services/saf/avsv/avd/avd_su.c
b/osaf/services/saf/avsv/avd/avd_su.c
--- a/osaf/services/saf/avsv/avd/avd_su.c
+++ b/osaf/services/saf/avsv/avd/avd_su.c
@@ -1057,6 +1057,14 @@ static void su_admin_op_cb(SaImmOiHandle
goto done;
}
+ if ((su->saAmfSUPresenceState == SA_AMF_PRESENCE_INSTANTIATING)
||
+ (su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_TERMINATING) ||
+ (su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_RESTARTING)) {
+ rc = SA_AIS_ERR_TRY_AGAIN;
+ LOG_WA("'%s' presence state is '%u'", su_name->value,
su->saAmfSUPresenceState);
+ goto done;
+ }
+
if ((su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_UNINSTANTIATED) ||
(su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_INSTANTIATION_FAILED) ||
(su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_TERMINATION_FAILED)) {
diff --git a/osaf/services/saf/avsv/avnd/avnd_comp.c
b/osaf/services/saf/avsv/avnd/avnd_comp.c
--- a/osaf/services/saf/avsv/avnd/avnd_comp.c
+++ b/osaf/services/saf/avsv/avnd/avnd_comp.c
@@ -508,7 +508,7 @@ proceed_next:
if (!m_AVND_COMP_TYPE_IS_PROXIED(*o_comp) &&
((*o_comp)->pres != SA_AMF_PRESENCE_INSTANTIATING) &&
((*o_comp)->pres != SA_AMF_PRESENCE_INSTANTIATED) &&
((*o_comp)->pres != SA_AMF_PRESENCE_RESTARTING)) {
- *o_amf_rc = SA_AIS_ERR_TRY_AGAIN;
+ *o_amf_rc = SA_AIS_ERR_BAD_OPERATION;
return;
}
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel