osaf/services/saf/immsv/immloadd/imm_loader.cc             |   7 +-
 osaf/services/saf/immsv/immnd/ImmModel.cc                  |  81 +++++++++++++-
 osaf/services/saf/immsv/immnd/immnd_evt.c                  |   8 +-
 osaf/services/saf/immsv/schema/SAI-AIS-IMM-XSD-A.02.16.xsd |   1 +
 4 files changed, 94 insertions(+), 3 deletions(-)


This flag is only allowed to be set on attributes that have a default value.
Attributes with this flag will never be NULL.

Adding this flag to an existing attribute (schema change) will be allowed after 
checking for ccb interference and existing objects of the class.
Do not allow to add a new attribute with this flag when doing schema change.

When there's an attempt to set NULL value (or to delete all values with 
ATTR_VALUES_DELETE) to attributes with this flag, default value will be set.

ImmAttrValue::operator= is used to assign value to ImmAttrValue.
This will also work with ImmAttrMultiValue (head value will be assigned).

diff --git a/osaf/services/saf/immsv/immloadd/imm_loader.cc 
b/osaf/services/saf/immsv/immloadd/imm_loader.cc
--- a/osaf/services/saf/immsv/immloadd/imm_loader.cc
+++ b/osaf/services/saf/immsv/immloadd/imm_loader.cc
@@ -1720,7 +1720,8 @@ static bool loadXsd(const char *xsdFile)
                     strcmp(value, "SA_INITIALIZED") && strcmp(value, 
"SA_PERSISTENT") &&
                     strcmp(value, "SA_CACHED") && strcmp(value, "SA_NOTIFY") &&
                     strcmp(value, "SA_NO_DUPLICATES") && strcmp(value, 
"SA_NO_DANGLING") &&
-                    strcmp(value, "SA_DN") && strcmp(value, 
"SA_DEFAULT_REMOVED")) {
+                    strcmp(value, "SA_DN") && strcmp(value, 
"SA_DEFAULT_REMOVED") &&
+                    strcmp(value, "SA_STRONG_DEFAULT")) {
                 attrFlagSet.insert(value);
             }
         }
@@ -1797,6 +1798,10 @@ static SaImmAttrFlagsT charsToFlagsHelpe
     {
         return SA_IMM_ATTR_DEFAULT_REMOVED;
     }
+    else if (len == strlen("SA_STRONG_DEFAULT") && strncmp((const char*)str, 
"SA_STRONG_DEFAULT", len) == 0)
+    {
+        return SA_IMM_ATTR_STRONG_DEFAULT;
+    }
 
     std::string unflag((char *)str, len);
     if(!isXsdLoaded) {
diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc 
b/osaf/services/saf/immsv/immnd/ImmModel.cc
--- a/osaf/services/saf/immsv/immnd/ImmModel.cc
+++ b/osaf/services/saf/immsv/immnd/ImmModel.cc
@@ -3243,6 +3243,14 @@ ImmModel::classCreate(const ImmsvOmClass
             illegal = 1;
         }
 
+        if (attr->attrFlags & SA_IMM_ATTR_STRONG_DEFAULT) {
+            if (!attr->attrDefaultValue) {
+                LOG_NO("ERR_INVALID_PARAM: Attribute '%s' can not have 
SA_IMM_ATTR_STRONG_DEFAULT flag "
+                        "without having a default value", attNm);
+                illegal = 1;
+            }
+        }
+
         if(attr->attrDefaultValue) {
             if(attr->attrFlags & SA_IMM_ATTR_RDN) {
                 LOG_NO("ERR_INVALID_PARAM: RDN '%s' can not have a default", 
attNm);
@@ -3866,6 +3874,7 @@ ImmModel::notCompatibleAtt(const std::st
         bool checkCcb=false;
         bool checkNoDup=false;
         bool checkNoDanglingRefs=false;
+        bool checkStrongDefault=false;
         osafassert(changedAttrs);
         if(oldAttr->mValueType != newAttr->mValueType) {
             LOG_NO("Impossible upgrade, attribute %s:%s changes value type",
@@ -4048,6 +4057,22 @@ ImmModel::notCompatibleAtt(const std::st
                     change = true;
                 }
             }
+
+            if(!(oldAttr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT) &&
+               (newAttr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT)) {
+                LOG_NO("Allowed upgrade, attribute %s:%s adds flag "
+                    "SA_IMM_ATTR_STRONG_DEFAULT", className.c_str(), 
attName.c_str());
+                checkCcb = true;
+                checkStrongDefault = true;
+                change = true;
+            }
+
+            if((oldAttr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT) &&
+               !(newAttr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT)) {
+                LOG_NO("Allowed upgrade, attribute %s:%s removes flag "
+                    "SA_IMM_ATTR_STRONG_DEFAULT", className.c_str(), 
attName.c_str());
+                change = true;
+            }
         }
 
         osafassert(!checkNoDup || checkCcb); //Duplicate-check implies 
ccb-check
@@ -4117,6 +4142,25 @@ ImmModel::notCompatibleAtt(const std::st
                     }
                 }
             }
+
+            if (checkStrongDefault) {
+                /* Screen all instances of the class.
+                 * If there's an instance with the attribute being NULL, abort 
the schema change. */
+                ObjectSet::iterator osi = oldClassInfo->mExtent.begin();
+                for(;osi!=oldClassInfo->mExtent.end();++osi) {
+                    obj = *osi;
+                    ImmAttrValueMap::iterator oavi = 
obj->mAttrValueMap.find(attName);
+                    osafassert(oavi!= obj->mAttrValueMap.end());
+                    if(oavi->second->empty()) {
+                        std::string objName;
+                        getObjectName(obj, objName);
+                        LOG_NO("Impossible upgrade, attribute %s:%s adds 
SA_IMM_ATTR_STRONG_DEFAULT flag, "
+                            "but that attribute of object '%s' has NULL value",
+                            className.c_str(), attName.c_str(), 
objName.c_str());
+                        return true;
+                    }
+                }
+            }
         }
 
         /* "changedAttrs != NULL" ensures that this check is only for the 
schema update */
@@ -4241,6 +4285,12 @@ ImmModel::notCompatibleAtt(const std::st
                 "flag set", className.c_str(), attName.c_str());
             return true;
         }
+
+        if (newAttr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT) {
+            LOG_NO("Impossible upgrade, new attribute %s:%s has 
SA_IMM_ATTR_STRONG_DEFAULT "
+                "flag set", className.c_str(), attName.c_str());
+            return true;
+        }
     }
 
     return false;
@@ -4373,7 +4423,8 @@ ImmModel::attrCreate(ClassInfo* classInf
             SA_IMM_ATTR_NOTIFY |
             SA_IMM_ATTR_NO_DANGLING |
             SA_IMM_ATTR_DN |
-            SA_IMM_ATTR_DEFAULT_REMOVED);
+            SA_IMM_ATTR_DEFAULT_REMOVED |
+            SA_IMM_ATTR_STRONG_DEFAULT);
 
         if(unknownFlags) {
             /* This error means that at least one attribute flag is not 
supported by this
@@ -8467,6 +8518,11 @@ ImmModel::ccbObjectModify(const ImmsvOmC
                         err = SA_AIS_ERR_INVALID_PARAM;
                         break; //out of switch
                     }
+
+                    if (attr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT) {
+                        osafassert(!attr->mDefaultValue.empty());
+                        (*attrValue) = attr->mDefaultValue;
+                    }
                     continue; //Ok to replace with nothing.
                 }
                 //else intentional fall-through
@@ -8633,6 +8689,11 @@ ImmModel::ccbObjectModify(const ImmsvOmC
                         err = SA_AIS_ERR_INVALID_PARAM;
                         break; //out of switch
                     }
+
+                    if (attrValue->empty() && (attr->mFlags & 
SA_IMM_ATTR_STRONG_DEFAULT)) {
+                        osafassert(!attr->mDefaultValue.empty());
+                        (*attrValue) = attr->mDefaultValue;
+                    }
                 }
 
                 break; //out of switch
@@ -15991,6 +16052,11 @@ ImmModel::rtObjectUpdate(const ImmsvOmCc
                         attrValue->discardValues();
                     }
                     if(p->attrValue.attrValuesNumber == 0) {
+                        if (attr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT) {
+                            osafassert(!attr->mDefaultValue.empty());
+                            (*attrValue) = attr->mDefaultValue;
+                        }
+
                         p = p->next;
                         continue; //Ok to replace with nothing.
                     }
@@ -16114,6 +16180,11 @@ ImmModel::rtObjectUpdate(const ImmsvOmCc
                                 al = al->next;
                             }
                         }
+
+                        if (attrValue->empty() && (attr->mFlags & 
SA_IMM_ATTR_STRONG_DEFAULT)) {
+                            osafassert(!attr->mDefaultValue.empty());
+                            (*attrValue) = attr->mDefaultValue;
+                        }
                     }
                     break; //out of switch
                     
@@ -16866,6 +16937,7 @@ ImmModel::objectSync(const ImmsvOmObject
         } //while(p)
         
         //Check that all attributes with INITIALIZED flag have been set.
+        //Check that all attributes with STRONG_DEFAULT flag have been set.
         ImmAttrValueMap::iterator i6;
         for(i6=object->mAttrValueMap.begin(); 
             i6!=object->mAttrValueMap.end() && err==SA_AIS_OK;
@@ -16883,6 +16955,13 @@ ImmModel::objectSync(const ImmsvOmObject
                     attrName.c_str());
                 err = SA_AIS_ERR_INVALID_PARAM;
             }
+
+            if ((attr->mFlags & SA_IMM_ATTR_STRONG_DEFAULT) && 
attrValue->empty()) {
+                LOG_NO("ERR_INVALID_PARAM: attr '%s' has STRONG_DEFAULT flag "
+                    "yet no value provided in the object create call",
+                    attrName.c_str());
+                err = SA_AIS_ERR_INVALID_PARAM;
+            }
         }
         
         if(err == SA_AIS_OK) {
diff --git a/osaf/services/saf/immsv/immnd/immnd_evt.c 
b/osaf/services/saf/immsv/immnd/immnd_evt.c
--- a/osaf/services/saf/immsv/immnd/immnd_evt.c
+++ b/osaf/services/saf/immsv/immnd/immnd_evt.c
@@ -3261,7 +3261,7 @@ static SaAisErrorT immnd_fevs_local_chec
                }
                if (!immModel_protocol47Allowed(cb)) {
                        /* IMM supports creating classes with unknown flags.
-                        * When the upgrade process is not completed, a 
class-create request (with DEFAULT_REMOVED flag)
+                        * When the upgrade process is not completed, a 
class-create request (with a new flag)
                         * may be accepted on nodes with old version and 
rejected on nodes with new version.
                         * That will cause an inconsistency between nodes. */
                        IMMSV_ATTR_DEF_LIST* list = 
frwrd_evt.info.immnd.info.classDescr.attrDefinitions;
@@ -3272,6 +3272,12 @@ static SaAisErrorT immnd_fevs_local_chec
                                        error = SA_AIS_ERR_TRY_AGAIN;
                                        break; /* while */
                                }
+                               if (list->d.attrFlags & 
SA_IMM_ATTR_STRONG_DEFAULT) {
+                                       LOG_WA("ERR_TRY_AGAIN: Can not create 
class with SA_IMM_ATTR_STRONG_DEFAULT "
+                                                       "when proto47 is not 
enabled");
+                                       error = SA_AIS_ERR_TRY_AGAIN;
+                                       break; /* while */
+                               }
                                list = list->next;
                        }
                }
diff --git a/osaf/services/saf/immsv/schema/SAI-AIS-IMM-XSD-A.02.16.xsd 
b/osaf/services/saf/immsv/schema/SAI-AIS-IMM-XSD-A.02.16.xsd
--- a/osaf/services/saf/immsv/schema/SAI-AIS-IMM-XSD-A.02.16.xsd
+++ b/osaf/services/saf/immsv/schema/SAI-AIS-IMM-XSD-A.02.16.xsd
@@ -69,6 +69,7 @@
                        <xs:enumeration value="SA_NO_DANGLING"/>
                        <xs:enumeration value="SA_DN"/>
                        <xs:enumeration value="SA_DEFAULT_REMOVED"/>
+                       <xs:enumeration value="SA_STRONG_DEFAULT"/>
                </xs:restriction>
        </xs:simpleType>
        <!--

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

Reply via email to