osaf/services/saf/amf/amfd/include/si.h |   2 ++
 osaf/services/saf/amf/amfd/si.cc        |  22 ++++++++++++++++++----
 osaf/services/saf/amf/amfd/siass.cc     |   3 +++
 3 files changed, 23 insertions(+), 4 deletions(-)


To perform scalein, shutdown is performed on a nodegroup. No-red application 
SI's are
receiving alarm "SI has no current active assignments" which is not wanted at 
scalein.
Thereafter OpenSAF is stopped via opensafd stop, the M/W No-red SI's are 
receiving
"SI has no current active assignments" which is not wanted at scalein.

diff --git a/osaf/services/saf/amf/amfd/include/si.h 
b/osaf/services/saf/amf/amfd/include/si.h
--- a/osaf/services/saf/amf/amfd/include/si.h
+++ b/osaf/services/saf/amf/amfd/include/si.h
@@ -108,6 +108,8 @@ public:
        
        bool alarm_sent; /* SI unassigned alarm has been sent */
 
+       AVD_AVND *si_on_node; /* the node on which this SI resides */
+       AVD_SU *curr_su; /* the SU with the latest assignment*/
        void inc_curr_act_ass();
        void dec_curr_act_ass();
        void inc_curr_stdby_ass();
diff --git a/osaf/services/saf/amf/amfd/si.cc b/osaf/services/saf/amf/amfd/si.cc
--- a/osaf/services/saf/amf/amfd/si.cc
+++ b/osaf/services/saf/amf/amfd/si.cc
@@ -26,6 +26,7 @@
 #include <csi.h>
 #include <proc.h>
 #include <si_dep.h>
+#include <node.h>
 
 AmfDb<std::string, AVD_SI> *si_db = NULL;
 
@@ -319,7 +320,9 @@ AVD_SI::AVD_SI() :
        list_of_sus_per_si_rank(NULL),
        rankedsu_list_head(NULL),
        invocation(0),
-       alarm_sent(false)
+       alarm_sent(false),
+       si_on_node{nullptr},
+       curr_su{nullptr}
 {
        memset(&name, 0, sizeof(SaNameT));
        memset(&saAmfSvcType, 0, sizeof(SaNameT));
@@ -1314,9 +1317,20 @@ void AVD_SI::update_ass_state()
 
                /* alarm & notifications */
                if (saAmfSIAssignmentState == SA_AMF_ASSIGNMENT_UNASSIGNED) {
-                       avd_send_si_unassigned_alarm(&name);
-                       alarm_sent = true;
-                       m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, this, 
AVSV_CKPT_SI_ALARM_SENT);
+                       osafassert(si_on_node != nullptr);
+                       osafassert(curr_su != nullptr);
+                       if ((sg_of_si->sg_type->saAmfSgtRedundancyModel == 
SA_AMF_NO_REDUNDANCY_MODEL) &&
+                           (curr_su->saAmfSUPresenceState != 
SA_AMF_PRESENCE_INSTANTIATION_FAILED) &&
+                           (curr_su->saAmfSUPresenceState != 
SA_AMF_PRESENCE_TERMINATION_FAILED) &&
+                           ((si_on_node->saAmfNodeAdminState == 
SA_AMF_ADMIN_SHUTTING_DOWN) ||
+                            (si_on_node->saAmfNodeAdminState == 
SA_AMF_ADMIN_LOCKED) ||
+                            (si_on_node->saAmfNodeAdminState == 
SA_AMF_ADMIN_LOCKED_INSTANTIATION))) {
+                               LOG_NO("Node is locked, no SI unassigned alarm 
will be sent");
+                       } else {
+                               avd_send_si_unassigned_alarm(&name);
+                               alarm_sent = true;
+                               m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, this, 
AVSV_CKPT_SI_ALARM_SENT);
+                       }
                }
                else {
                        avd_send_si_assigned_ntf(&name, oldState, 
saAmfSIAssignmentState);
diff --git a/osaf/services/saf/amf/amfd/siass.cc 
b/osaf/services/saf/amf/amfd/siass.cc
--- a/osaf/services/saf/amf/amfd/siass.cc
+++ b/osaf/services/saf/amf/amfd/siass.cc
@@ -166,6 +166,9 @@ AVD_SU_SI_REL *avd_susi_create(AVD_CL_CB
        su_si->si = si;
        su_si->su = su;
 
+       si->si_on_node = su->su_on_node;
+       si->curr_su = su;
+
        /* 
         * Add the susi rel rec to the ordered si-list
         */

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to