osaf/services/saf/amf/amfd/include/sg.h |    6 +-
 osaf/services/saf/amf/amfd/sg.cc        |  112 +++++++++++++++++++------------
 2 files changed, 73 insertions(+), 45 deletions(-)


When an SG is extended with a new SU, it will not be instantiated or
assigned.

SG attributes saAmfSGNumPrefAssignedSUs and saAmfSGNumPrefInserviceSUs
are not calculated dynamically as SUs are added (and deleted).

Add a shadow bool "xxx_configured" member of the SG struct
(following the same pattern as for SGautorepair). If the value of this member
is false, the value of the corresponding attribute will be calculated.

diff --git a/osaf/services/saf/amf/amfd/include/sg.h 
b/osaf/services/saf/amf/amfd/include/sg.h
--- a/osaf/services/saf/amf/amfd/include/sg.h
+++ b/osaf/services/saf/amf/amfd/include/sg.h
@@ -71,7 +71,11 @@ typedef struct avd_sg_tag {
                                 * Checkpointing - Sent as a one time update.
                                 */
 
-       bool saAmfSGAutoRepair_configured; /* True when user configures 
saAmfSGAutoRepair else false */
+       /* True when the corresponding configuration attribute is configured */
+       bool saAmfSGAutoRepair_configured;
+       bool saAmfSGNumPrefInserviceSUs_configured;
+       bool saAmfSGNumPrefAssignedSUs_configured;
+
    /******************** B.04 model 
*************************************************/
        SaNameT saAmfSGType;    /* Network order. */
        SaNameT saAmfSGSuHostNodeGroup; /* Network order. */
diff --git a/osaf/services/saf/amf/amfd/sg.cc b/osaf/services/saf/amf/amfd/sg.cc
--- a/osaf/services/saf/amf/amfd/sg.cc
+++ b/osaf/services/saf/amf/amfd/sg.cc
@@ -33,6 +33,53 @@
 static NCS_PATRICIA_TREE sg_db;
 static void avd_verify_equal_ranked_su(AVD_SG *avd_sg);
 
+/**
+ * Returns number of SUs contained in SG
+ * @param sg
+ *
+ * @return int
+ */
+static unsigned int sg_su_cnt(const AVD_SG *sg)
+{
+       AVD_SU *su;
+       int cnt;
+
+       for (su = sg->list_of_su, cnt = 0; su; su = su->sg_list_su_next)
+               cnt++;
+
+       return cnt;
+}
+
+/**
+ * Adjusts saAmfSGNumPrefInserviceSUs and saAmfSGNumPrefAssignedSUs
+ * To be used for example when an SU has been added or removed from the SG.
+ * @param sg
+ */
+static void adjust_num_preferred(AVD_SG *sg)
+{
+       /* adjust saAmfSGNumPrefInserviceSUs if not configured */
+       if (sg->saAmfSGNumPrefInserviceSUs_configured == false) {
+               sg->saAmfSGNumPrefInserviceSUs = sg_su_cnt(sg);
+               if ((sg->sg_type->saAmfSgtRedundancyModel == 
SA_AMF_2N_REDUNDANCY_MODEL) &&
+                               (sg->saAmfSGNumPrefInserviceSUs < 2)) {
+                       sg->saAmfSGNumPrefInserviceSUs = 2;
+               }
+               TRACE("'%s' saAmfSGNumPrefInserviceSUs adjusted to %u",
+                       sg->name.value, sg->saAmfSGNumPrefInserviceSUs);
+       }
+
+       /* adjust saAmfSGNumPrefAssignedSUs if not configured, only applicable 
for
+        * the N-way and N-way active redundancy models
+        */
+       if ((sg->saAmfSGNumPrefAssignedSUs_configured == false) &&
+                       ((sg->sg_type->saAmfSgtRedundancyModel == 
SA_AMF_N_WAY_REDUNDANCY_MODEL) ||
+                               (sg->sg_type->saAmfSgtRedundancyModel == 
SA_AMF_N_WAY_ACTIVE_REDUNDANCY_MODEL))) {
+               sg->saAmfSGNumPrefAssignedSUs = sg->saAmfSGNumPrefInserviceSUs;
+               TRACE("'%s' saAmfSGNumPrefAssignedSUs adjusted to %u",
+                               sg->name.value, sg->saAmfSGNumPrefAssignedSUs);
+       }
+}
+
 void avd_sg_db_add(AVD_SG *sg)
 {
        unsigned int rc;
@@ -308,12 +355,14 @@ static AVD_SG *sg_create(const SaNameT *
                sg->saAmfSGNumPrefStandbySUs = 1;
        }
 
-       if 
(immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSGNumPrefInserviceSUs"), 
attributes, 0, &sg->saAmfSGNumPrefInserviceSUs) != SA_AIS_OK) {
-               /* empty => later assign number of SUs */
+       if 
(immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSGNumPrefInserviceSUs"),
+                       attributes, 0, &sg->saAmfSGNumPrefInserviceSUs) == 
SA_AIS_OK) {
+               sg->saAmfSGNumPrefInserviceSUs_configured = true;
        }
 
-       if 
(immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSGNumPrefAssignedSUs"), 
attributes, 0, &sg->saAmfSGNumPrefAssignedSUs) != SA_AIS_OK) {
-               /* empty => later assign to saAmfSGNumPrefInserviceSUs */
+       if 
(immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSGNumPrefAssignedSUs"),
+                       attributes, 0, &sg->saAmfSGNumPrefAssignedSUs) == 
SA_AIS_OK) {
+               sg->saAmfSGNumPrefAssignedSUs_configured = true;
        }
 
        sg->saAmfSGMaxActiveSIsperSU = -1; // magic number for no limit
@@ -766,17 +815,6 @@ static void sg_nd_attribute_update(AVD_S
        TRACE_LEAVE();
 }
 
-static unsigned int sg_su_cnt(AVD_SG *sg)
-{
-       AVD_SU *su;
-       int cnt;
-
-       for (su = sg->list_of_su, cnt = 0; su; su = su->sg_list_su_next)
-               cnt++;
-
-       return cnt;
-}
-
 static void ccb_apply_modify_hdlr(CcbUtilOperationData_t *opdata)
 {
        AVD_SG *sg;
@@ -873,16 +911,22 @@ static void ccb_apply_modify_hdlr(CcbUti
                                        sg->saAmfSGNumPrefStandbySUs = 
*((SaUint32T *)value);
                                TRACE("Modified saAmfSGNumPrefStandbySUs is 
'%u'", sg->saAmfSGNumPrefStandbySUs);
                        } else if (!strcmp(attribute->attrName, 
"saAmfSGNumPrefInserviceSUs")) {
-                               if (value_is_deleted)
-                                       sg->saAmfSGNumPrefInserviceSUs = 
sg_su_cnt(sg);
-                               else
+                               if (value_is_deleted) {
+                                       
sg->saAmfSGNumPrefInserviceSUs_configured = false;
+                                       adjust_num_preferred(sg);
+                               } else {
+                                       
sg->saAmfSGNumPrefInserviceSUs_configured = true;
                                        sg->saAmfSGNumPrefInserviceSUs = 
*((SaUint32T *)value);
+                               }
                                TRACE("Modified saAmfSGNumPrefInserviceSUs is 
'%u'", sg->saAmfSGNumPrefInserviceSUs);
                        } else if (!strcmp(attribute->attrName, 
"saAmfSGNumPrefAssignedSUs")) {
-                               if (value_is_deleted)
-                                       sg->saAmfSGNumPrefAssignedSUs = 
sg->saAmfSGNumPrefInserviceSUs;
-                               else
+                               if (value_is_deleted)  {
+                                       
sg->saAmfSGNumPrefAssignedSUs_configured = false;
+                                       adjust_num_preferred(sg);
+                               } else {
+                                       
sg->saAmfSGNumPrefAssignedSUs_configured = true;
                                        sg->saAmfSGNumPrefAssignedSUs = 
*((SaUint32T *)value);
+                               }
                                TRACE("Modified saAmfSGNumPrefAssignedSUs is 
'%u'", sg->saAmfSGNumPrefAssignedSUs);
                        } else if (!strcmp(attribute->attrName, 
"saAmfSGMaxActiveSIsperSU")) {
                                if (value_is_deleted)
@@ -1448,6 +1492,7 @@ void avd_sg_remove_su(AVD_SU* su)
                su->sg_of_su = NULL;
        } /* if (su->sg_of_su != AVD_SG_NULL) */
 
+       adjust_num_preferred(sg);
        avd_verify_equal_ranked_su(sg);
        return;
 }
@@ -1474,6 +1519,8 @@ void avd_sg_add_su(AVD_SU* su)
                prev_su->sg_list_su_next = su;
                su->sg_list_su_next = i_su;
        }
+
+       adjust_num_preferred(su->sg_of_su);
        avd_verify_equal_ranked_su(su->sg_of_su);
 }
 
@@ -1568,32 +1615,9 @@ void avd_sg_adjust_config(AVD_SG *sg)
                                su_nd_attribute_update(su, saAmfSUFailOver_ID);
                        }
                }
-
-       }
-
-       /* adjust saAmfSGNumPrefInserviceSUs if not configured */
-       if (sg->saAmfSGNumPrefInserviceSUs == 0) {
-               sg->saAmfSGNumPrefInserviceSUs = sg_su_cnt(sg);
-               if ((sg->sg_type->saAmfSgtRedundancyModel == 
SA_AMF_2N_REDUNDANCY_MODEL) &&
-                               (sg->saAmfSGNumPrefInserviceSUs < 2)) {
-                       sg->saAmfSGNumPrefInserviceSUs = 2;
-                       LOG_NO("'%s' saAmfSGNumPrefInserviceSUs adjusted to 2", 
sg->name.value);
-               }
-       }
-
-       /* adjust saAmfSGNumPrefAssignedSUs if not configured, only applicable 
for
-        * the N-way and N-way active redundancy models
-        */
-       if ((sg->saAmfSGNumPrefAssignedSUs == 0) &&
-                       ((sg->sg_type->saAmfSgtRedundancyModel == 
SA_AMF_N_WAY_REDUNDANCY_MODEL) ||
-                               (sg->sg_type->saAmfSgtRedundancyModel == 
SA_AMF_N_WAY_ACTIVE_REDUNDANCY_MODEL))) {
-               sg->saAmfSGNumPrefAssignedSUs = sg->saAmfSGNumPrefInserviceSUs;
-               LOG_NO("'%s' saAmfSGNumPrefAssignedSUs adjusted to %u",
-                               sg->name.value, sg->saAmfSGNumPrefAssignedSUs);
        }
 }
 
-
 /**
  * @brief Counts number of instantiated su in the sg.
  * @param Service Group

------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/NeoTech
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to