osaf/services/saf/avsv/avd/avd_node.c | 11 +-----
osaf/services/saf/avsv/avd/avd_sgproc.c | 23 ++----------
osaf/services/saf/avsv/avd/avd_su.c | 52 ++++++++++++++++++++++------
osaf/services/saf/avsv/avd/include/avd_su.h | 10 +----
4 files changed, 48 insertions(+), 48 deletions(-)
SUs assigned before instantiated:
May 2 18:56:32 linux osafamfnd[12420]: NO Assigned 'safSi=Dataplane-
Np1-SI-1,safApp=DataplaneApp' STANDBY to 'safSu=Dataplane-SU1,safSg
=Dataplane-Np1,safApp=DataplaneApp' May 2 18:56:39 linux
osafamfnd[12420]:
NO 'safSu=Dataplane-SU1,safSg=Dataplane-Np1,safApp=DataplaneApp'
Presence
State INSTANTIATING => INSTANTIATED
In some places where the macro m_AVD_APP_SU_IS_INSVC is used, the presence state
for pre-instantiable SUs is not handled properly.
By changing the macro into a function which correctly checks presence state for
pre-instantiable SUs this problem can be solved.
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
@@ -860,16 +860,7 @@ void avd_node_admin_lock_unlock_shutdown
su = node->list_of_su;
while (su != NULL) {
- m_AVD_GET_SU_NODE_PTR(cb, su, su_node_ptr);
-
- if (m_AVD_APP_SU_IS_INSVC(su, su_node_ptr) &&
- ((su->saAmfSUPreInstantiable) ?
- (su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_INSTANTIATED):true)) {
- /* Pres state check is to prevent assignment to
SU in case node is instantiating
- * in Node locked state and somebody issues
UNLOCK on Node. Since SU are in instantiating
- * state, so AMFND will not assign the role to
components. Anyway when SU gets
- * instantiated, then assignment will be given
to components/SU.
- */
+ if (su_is_insvc(su) == true) {
avd_su_readiness_state_set(su,
SA_AMF_READINESS_IN_SERVICE);
su->sg_of_su->su_insvc(cb, su);
diff --git a/osaf/services/saf/avsv/avd/avd_sgproc.c
b/osaf/services/saf/avsv/avd/avd_sgproc.c
--- a/osaf/services/saf/avsv/avd/avd_sgproc.c
+++ b/osaf/services/saf/avsv/avd/avd_sgproc.c
@@ -259,7 +259,6 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
AVD_AVND *node;
AVD_SU *su, *i_su;
SaAmfReadinessStateT old_state;
- AVD_AVND *su_node_ptr = NULL;
bool node_reboot_req = true;
TRACE_ENTER2("id:%u, node:%x, '%s' state:%u",
n2d_msg->msg_info.n2d_opr_state.msg_id,
@@ -297,8 +296,6 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
goto done;
}
- m_AVD_GET_SU_NODE_PTR(cb, su, su_node_ptr);
-
if (n2d_msg->msg_info.n2d_opr_state.rec_rcvr.saf_amf ==
SA_AMF_NODE_SWITCHOVER) {
saflog(LOG_NOTICE, amfSvcUsrName, "Node Switch-Over requested
by '%s'",
node->name.value);
@@ -468,7 +465,6 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
* the SG FSM.
*/
if (su->sg_of_su->sg_ncs_spec == SA_TRUE) {
- m_AVD_GET_SU_NODE_PTR(cb, su, su_node_ptr);
if (su->saAmfSUAdminState == SA_AMF_ADMIN_UNLOCKED) {
avd_su_readiness_state_set(su,
SA_AMF_READINESS_IN_SERVICE);
/* Run the SG FSM */
@@ -485,9 +481,8 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
} else { /* if(su->sg_of_su->sg_ncs_spec == SA_TRUE) */
old_state = su->saAmfSuReadinessState;
- m_AVD_GET_SU_NODE_PTR(cb, su, su_node_ptr);
- if (m_AVD_APP_SU_IS_INSVC(su, su_node_ptr)) {
+ if (su_is_insvc(su) == true) {
avd_su_readiness_state_set(su,
SA_AMF_READINESS_IN_SERVICE);
if ((cb->init_state == AVD_APP_STATE) &&
(old_state == SA_AMF_READINESS_OUT_OF_SERVICE)) {
/* An application SU has become in
service call SG FSM */
@@ -1090,7 +1085,6 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
void avd_sg_app_node_su_inst_func(AVD_CL_CB *cb, AVD_AVND *avnd)
{
AVD_SU *i_su;
- AVD_AVND *su_node_ptr = NULL;
TRACE_ENTER2("'%s'", avnd->name.value);
@@ -1121,9 +1115,7 @@ void avd_sg_app_node_su_inst_func(AVD_CL
/* mark the non preinstatiable as
enable. */
avd_su_oper_state_set(i_su,
SA_AMF_OPERATIONAL_ENABLED);
- m_AVD_GET_SU_NODE_PTR(cb, i_su,
su_node_ptr);
-
- if (m_AVD_APP_SU_IS_INSVC(i_su,
su_node_ptr)) {
+ if (su_is_insvc(i_su) == true) {
avd_su_readiness_state_set(i_su, SA_AMF_READINESS_IN_SERVICE);
}
}
@@ -1203,9 +1195,8 @@ uint32_t avd_sg_app_su_inst_func(AVD_CL_
(su_node_ptr->saAmfNodeOperState ==
SA_AMF_OPERATIONAL_ENABLED) &&
(i_su->term_state == false)) {
avd_su_oper_state_set(i_su,
SA_AMF_OPERATIONAL_ENABLED);
- m_AVD_GET_SU_NODE_PTR(cb, i_su, su_node_ptr);
- if (m_AVD_APP_SU_IS_INSVC(i_su, su_node_ptr)) {
+ if (su_is_insvc(i_su) == true) {
avd_su_readiness_state_set(i_su,
SA_AMF_READINESS_IN_SERVICE);
i_su->sg_of_su->su_insvc(cb, i_su);
@@ -1275,7 +1266,6 @@ uint32_t avd_sg_app_sg_admin_func(AVD_CL
{
uint32_t rc = NCSCC_RC_FAILURE;
AVD_SU *i_su;
- AVD_AVND *i_su_node_ptr = NULL;
TRACE_ENTER2("'%s'", sg->name.value);
@@ -1296,12 +1286,7 @@ uint32_t avd_sg_app_sg_admin_func(AVD_CL
* state.
*/
for (i_su = sg->list_of_su; i_su != NULL; i_su =
i_su->sg_list_su_next) {
- m_AVD_GET_SU_NODE_PTR(cb, i_su, i_su_node_ptr);
- // TODO(nagu) remove saAmfSUPreInstantiable check and
move into m_AVD_APP_SU_IS_INSVC
- if (m_AVD_APP_SU_IS_INSVC(i_su, i_su_node_ptr) &&
- ((i_su->saAmfSUPreInstantiable) ?
- (i_su->saAmfSUPresenceState ==
- SA_AMF_PRESENCE_INSTANTIATED):true)) {
+ if (su_is_insvc(i_su) == true) {
avd_su_readiness_state_set(i_su,
SA_AMF_READINESS_IN_SERVICE);
}
}
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
@@ -28,6 +28,7 @@
#include <avd_ntf.h>
#include <avd_proc.h>
#include <avd_csi.h>
+#include <avd_cluster.h>
static NCS_PATRICIA_TREE su_db;
@@ -960,17 +961,11 @@ static void su_admin_op_cb(SaImmOiHandle
switch (op_id) {
case SA_AMF_ADMIN_UNLOCK:
avd_su_admin_state_set(su, SA_AMF_ADMIN_UNLOCKED);
- if (((m_AVD_APP_SU_IS_INSVC(su, node)) ||
(su->sg_of_su->sg_ncs_spec == true)) &&
- ((su->saAmfSUPreInstantiable) ?
- (su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_INSTANTIATED):true)) {
- /* Pres state check is to prevent assignment to SU in
case SU is instantiating in
- * locked state and somebody issues UNLOCK on SU. Since
comp are in instantiating state,
- * so AMFND will not assign the role to components.
Anyway when SU gets instantiated, then
- * assignment will be given to components/SU.
- */
- /* Reason for adding "su->sg_of_su->sg_ncs_spec ==
true" is for Middleware component
- * node oper state and SU oper state are marked enabled
after they gets assignments.
- * So, we cann't check compatibility with
m_AVD_APP_SU_IS_INSVC for them.
+ if ((su_is_insvc(su) == true) || (su->sg_of_su->sg_ncs_spec ==
true)) {
+ /* Reason for adding "su->sg_of_su->sg_ncs_spec ==
true" is for
+ * Middleware component node oper state and SU oper
state are marked
+ * enabled after they gets assignments. So, we can't
check
+ * compatibility with m_AVD_APP_SU_IS_INSVC for them.
*/
avd_su_readiness_state_set(su,
SA_AMF_READINESS_IN_SERVICE);
if (su->sg_of_su->su_insvc(cb, su) != NCSCC_RC_SUCCESS)
@@ -1588,3 +1583,38 @@ void avd_su_constructor(void)
avd_class_impl_set("SaAmfSU", su_rt_attr_cb, su_admin_op_cb,
su_ccb_completed_cb, su_ccb_apply_cb);
}
+/**
+ * Checks if the SU can be made in-service
+ * For reference see 3.2.1.4 and for pre-instantiable SUs Table 4
+ *
+ * @param su
+ * @return true if SU can be made in-service
+ */
+bool su_is_insvc(const AVD_SU *su)
+{
+ const AVD_AVND *node;
+ const AVD_SG *sg = su->sg_of_su;
+ const AVD_APP *app = sg->app;
+
+ m_AVD_GET_SU_NODE_PTR(avd_cb, su, node);
+
+ if (su->saAmfSUPreInstantiable == true) {
+ return (avd_cluster->saAmfClusterAdminState ==
SA_AMF_ADMIN_UNLOCKED) &&
+ (app->saAmfApplicationAdminState ==
SA_AMF_ADMIN_UNLOCKED) &&
+ (su->saAmfSUAdminState ==
SA_AMF_ADMIN_UNLOCKED) &&
+ (sg->saAmfSGAdminState ==
SA_AMF_ADMIN_UNLOCKED) &&
+ (node->saAmfNodeAdminState ==
SA_AMF_ADMIN_UNLOCKED) &&
+ (node->saAmfNodeOperState ==
SA_AMF_OPERATIONAL_ENABLED) &&
+ (su->saAmfSUOperState ==
SA_AMF_OPERATIONAL_ENABLED) &&
+ ((su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_INSTANTIATED ||
+ su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_RESTARTING));
+ } else {
+ return (avd_cluster->saAmfClusterAdminState ==
SA_AMF_ADMIN_UNLOCKED) &&
+ (app->saAmfApplicationAdminState ==
SA_AMF_ADMIN_UNLOCKED) &&
+ (su->saAmfSUAdminState ==
SA_AMF_ADMIN_UNLOCKED) &&
+ (sg->saAmfSGAdminState ==
SA_AMF_ADMIN_UNLOCKED) &&
+ (node->saAmfNodeAdminState ==
SA_AMF_ADMIN_UNLOCKED) &&
+ (node->saAmfNodeOperState ==
SA_AMF_OPERATIONAL_ENABLED) &&
+ (su->saAmfSUOperState ==
SA_AMF_OPERATIONAL_ENABLED);
+ }
+}
diff --git a/osaf/services/saf/avsv/avd/include/avd_su.h
b/osaf/services/saf/avsv/avd/include/avd_su.h
--- a/osaf/services/saf/avsv/avd/include/avd_su.h
+++ b/osaf/services/saf/avsv/avd/include/avd_su.h
@@ -130,18 +130,12 @@ su->su_switch = state;\
m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVSV_CKPT_SU_SWITCH);\
}
-#define m_AVD_APP_SU_IS_INSVC(i_su,su_node_ptr) \
-((su_node_ptr->saAmfNodeAdminState == SA_AMF_ADMIN_UNLOCKED) && \
-(su_node_ptr->saAmfNodeOperState == SA_AMF_OPERATIONAL_ENABLED) && \
-(i_su->sg_of_su->saAmfSGAdminState == SA_AMF_ADMIN_UNLOCKED) &&\
-(i_su->saAmfSUAdminState == SA_AMF_ADMIN_UNLOCKED) &&\
-(i_su->saAmfSUOperState == SA_AMF_OPERATIONAL_ENABLED)\
-)
-
#define m_AVD_GET_SU_NODE_PTR(avd_cb,i_su,su_node_ptr) \
if(true == i_su->su_is_external) su_node_ptr =
avd_cb->ext_comp_info.local_avnd_node; \
else su_node_ptr = i_su->su_on_node;
+bool su_is_insvc(const AVD_SU *su);
+
/**
* Allocate SU memory and initialize attributes to defaults
* @param dn
------------------------------------------------------------------------------
Is your legacy SCM system holding you back? Join Perforce May 7 to find out:
• 3 signs your SCM is hindering your productivity
• Requirements for releasing software faster
• Expert tips and advice for migrating your SCM now
http://p.sf.net/sfu/perforce
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel