Hi Zoran, All the attribute definition will be moved to the top of the file. The response for the remaining comments.
Thanks, Neel. On 2016/08/12 07:36 PM, Zoran Milinkovic wrote: > Hi Neelakanta, > > Find my comments inline > > -----Original Message----- > From: reddy.neelaka...@oracle.com [mailto:reddy.neelaka...@oracle.com] > Sent: den 27 juli 2016 10:32 > To: Zoran Milinkovic; Hung Duc Nguyen > Cc: opensaf-devel@lists.sourceforge.net > Subject: [PATCH 3 of 5] imm: Checking of Imm limits [#195] > > osaf/services/saf/immsv/immnd/ImmModel.cc | 322 > +++++++++++++++++++++++++++++- > osaf/services/saf/immsv/immnd/ImmModel.hh | 5 +- > 2 files changed, 324 insertions(+), 3 deletions(-) > > > 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 > @@ -1154,6 +1154,13 @@ immModel_protocol50Allowed(IMMND_CB *cb) > SA_TRUE : SA_FALSE; > } > > +SaBoolT > +immModel_protocol51Allowed(IMMND_CB *cb) > +{ > + return (ImmModel::instance(&cb->immModel)->protocol51Allowed()) ? > + SA_TRUE : SA_FALSE; > +} > + > OsafImmAccessControlModeT > immModel_accessControlMode(IMMND_CB *cb) > { > @@ -3271,6 +3278,21 @@ ImmModel::classCreate(const ImmsvOmClass > return SA_AIS_ERR_INVALID_PARAM; > } > > + ObjectMap::iterator oit = sObjectMap.find(immObjectDn); > + if(protocol51Allowed() && oit != sObjectMap.end() && !isLoading ){ > + std::string immMaxClasses(OPENSAF_IMMSV_MAX_CLASSES); > + ObjectInfo* immObject = oit->second; > + ImmAttrValueMap::iterator avi = > immObject->mAttrValueMap.find(immMaxClasses); > + osafassert(avi != immObject->mAttrValueMap.end()); > + osafassert(!(avi->second->isMultiValued())); > + ImmAttrValue* valuep = avi->second; > + unsigned int maxClasses = valuep->getValue_int(); > + if( sClassMap.size() >= maxClasses){ > + LOG_NO("ERR_NO_RESOURCES: maximum class limit %d has been reched > for the cluster", > + maxClasses); > + return SA_AIS_ERR_NO_RESOURCES; > + } > + } > > [Zoran] "std::string immMaxClasses(OPENSAF_IMMSV_MAX_CLASSES);" can be moved > to the top of the file with other definition of strings. > I would create a common method for finding max number of classes and use it > in the block above. The code is not wrong. I'll leave it to you if you want > to create a common method. > > ClassMap::iterator i = sClassMap.find(className); > if (i == sClassMap.end()) { > /* Class-name is unique case-sensitive. > @@ -3597,6 +3619,8 @@ ImmModel::classCreate(const ImmsvOmClass > } > } > > + > + > if(illegal) { > if(err == SA_AIS_OK) { > LOG_NO("ERR_INVALID_PARAM: Problem with new class '%s'", > className.c_str()); > @@ -3966,6 +3990,34 @@ ImmModel::protocol50Allowed() > return noStdFlags & OPENSAF_IMM_FLAG_PRT50_ALLOW; > } > > + > +bool > +ImmModel::protocol51Allowed() > +{ > + //TRACE_ENTER(); > + /* Assume that all nodes are running the same version when loading */ > + if (sImmNodeState == IMM_NODE_LOADING) { > + return true; > + } > + ObjectMap::iterator oi = sObjectMap.find(immObjectDn); > + if(oi == sObjectMap.end()) { > + TRACE_LEAVE(); > + return false; > + } > + > + ObjectInfo* immObject = oi->second; > + ImmAttrValueMap::iterator avi = > + immObject->mAttrValueMap.find(immAttrNostFlags); > + osafassert(avi != immObject->mAttrValueMap.end()); > + osafassert(!(avi->second->isMultiValued())); > + ImmAttrValue* valuep = avi->second; > + unsigned int noStdFlags = valuep->getValue_int(); > + > + //TRACE_LEAVE(); > + return noStdFlags & OPENSAF_IMM_FLAG_PRT51_ALLOW; > +} > + > + > bool > ImmModel::protocol41Allowed() > { > @@ -4114,6 +4166,44 @@ ImmModel::verifySchemaChange(const std:: > verifyFailed = notCompatibleAtt(className, newClassInfo, > attName, NULL, newAttr, NULL) || > verifyFailed; > newAttrs[inew->first] = newAttr; > + if(!verifyFailed && (className == immClassName)){ > + unsigned int val; > + if ( attName == OPENSAF_IMMSV_MAX_CLASSES) { > > [Zoran] Same as in earlier comment. Create a string for > OPENSAF_IMMSV_MAX_CLASSES in the top of the file with strings for other > attributes. > > + val = newAttr->mDefaultValue.getValue_int(); > + if( sClassMap.size() > val){ > + LOG_NO("The Number of classes in the cluster %lu > greater than the schema change" > + "value %d", sClassMap.size(), val); > + verifyFailed = true; > + } > + } > + > + if ( !verifyFailed && attName == > OPENSAF_IMMSV_MAX_IMPLEMENTERS) { > > [Zoran] Same here for OPENSAF_IMMSV_MAX_IMPLEMENTERS. > > + val = newAttr->mDefaultValue.getValue_int(); > + if( sImplementerVector.size() > val){ > + LOG_NO("The Number of Implementers in the cluster > %lu greater than the schema change" > + "value %d", sImplementerVector.size(), val); > + verifyFailed = true; > + } > + } > + > + if ( !verifyFailed && attName == > OPENSAF_IMMSV_MAX_ADMINOWNERS) { > > [Zoran] And here for OPENSAF_IMMSV_MAX_ADMINOWNERS > > + val = newAttr->mDefaultValue.getValue_int(); > + if( sOwnerVector.size() > val){ > + LOG_NO("The Number of AdminOwners in the cluster %lu > greater than the schema change" > + "value %d", sOwnerVector.size(), val); > + verifyFailed = true; > + } > + } > + > + if ( !verifyFailed && attName == OPENSAF_IMMSV_MAX_CCBS) { > > [Zoran] And here for OPENSAF_IMMSV_MAX_CCBS > > + val = newAttr->mDefaultValue.getValue_int(); > + if( sCcbVector.size() > val){ > + LOG_NO("The Number of Ccbs in the cluster %lu > greater than the schema change" > + "value %d", sCcbVector.size(), val); > + verifyFailed = true; > + } > + } > + } > > [Zoran] In the upper block, maybe it would be good to add a check that with a > schema change, new attribute values cannot be lower than IMMSV_MAX_* values. > > } else { > TRACE_5("Existing attribute %s", attName.c_str()); > verifyFailed = notCompatibleAtt(className, newClassInfo, > attName, iold->second, newAttr, > @@ -4799,6 +4889,8 @@ ImmModel::adminOwnerCreate(const ImmsvOm > unsigned int nodeId) > { > SaAisErrorT err = SA_AIS_OK; > + bool isLoading = (sImmNodeState == IMM_NODE_LOADING); > + > TRACE_ENTER(); > if(immNotWritable()) { > TRACE_LEAVE(); > @@ -4812,7 +4904,24 @@ ImmModel::adminOwnerCreate(const ImmsvOm > return SA_AIS_ERR_INVALID_PARAM; > } > } > - > + > + ObjectMap::iterator oi = sObjectMap.find(immObjectDn ); > + if(protocol51Allowed() && oi != sObjectMap.end() && !isLoading ){ > + std::string immMaxAdmOwn(OPENSAF_IMMSV_MAX_ADMINOWNERS); > > [Zoran] Same here for OPENSAF_IMMSV_MAX_ADMINOWNERS > > + ObjectInfo* immObject = oi->second; > + ImmAttrValueMap::iterator avi = > immObject->mAttrValueMap.find(immMaxAdmOwn); > + osafassert(avi != immObject->mAttrValueMap.end()); > + osafassert(!(avi->second->isMultiValued())); > + ImmAttrValue* valuep = avi->second; > + unsigned int maxAdmOwn= valuep->getValue_int(); > + if( sOwnerVector.size() >= maxAdmOwn ){ > + LOG_NO("ERR_NO_RESOURCES: maximum AdminOwners limit %d has been > reached for the cluster", > + maxAdmOwn); > + TRACE_LEAVE(); > + return SA_AIS_ERR_NO_RESOURCES; > + } > + } > + > AdminOwnerInfo* info = new AdminOwnerInfo; > > info->mId = ownerId; > @@ -4899,6 +5008,15 @@ ImmModel::adminOwnerDelete(SaUint32T own > immObject->mAttrValueMap.find(immAttrNostFlags); > osafassert(avi != immObject->mAttrValueMap.end()); > osafassert(!(avi->second->isMultiValued())); > + ImmAttrValueMap::iterator avi1 = > + > immObject->mAttrValueMap.find(OPENSAF_IMMSV_MAX_CLASSES); > + ImmAttrValueMap::iterator avi2 = > + > immObject->mAttrValueMap.find(OPENSAF_IMMSV_MAX_IMPLEMENTERS); > + ImmAttrValueMap::iterator avi3 = > + > immObject->mAttrValueMap.find(OPENSAF_IMMSV_MAX_ADMINOWNERS); > + ImmAttrValueMap::iterator avi4 = > + > immObject->mAttrValueMap.find(OPENSAF_IMMSV_MAX_CCBS); > > [Zoran] Same string issue for all 4 attribute names > > + > ImmAttrValue* valuep = (ImmAttrValue *) avi->second; > unsigned int noStdFlags = valuep->getValue_int(); > noStdFlags |= OPENSAF_IMM_FLAG_PRT41_ALLOW; > @@ -4907,6 +5025,16 @@ ImmModel::adminOwnerDelete(SaUint32T own > noStdFlags |= OPENSAF_IMM_FLAG_PRT46_ALLOW; > noStdFlags |= OPENSAF_IMM_FLAG_PRT47_ALLOW; > noStdFlags |= OPENSAF_IMM_FLAG_PRT50_ALLOW; > + if( (avi1 == immObject->mAttrValueMap.end()) || > + (avi2 == immObject->mAttrValueMap.end()) || > + (avi3 == immObject->mAttrValueMap.end()) || > + (avi4 == immObject->mAttrValueMap.end())){ > + LOG_NO("protcol51 is not set for > opensafImmNostdFlags because" > + "The new OpenSAF 5.1 attributes are > not added to OpensafImm class"); > + } else { > + > + noStdFlags |= OPENSAF_IMM_FLAG_PRT51_ALLOW; > + } > valuep->setValue_int(noStdFlags); > LOG_NO("%s changed to: 0x%x", immAttrNostFlags.c_str(), > noStdFlags); > /* END Temporary code. */ > @@ -5174,12 +5302,31 @@ ImmModel::ccbCreate(SaUint32T adminOwner > SaUint32T originatingConn) > { > SaAisErrorT err = SA_AIS_OK; > + bool isLoading = (sImmNodeState == IMM_NODE_LOADING); > + > TRACE_ENTER(); > > if(immNotWritable()) { > TRACE_LEAVE(); > return SA_AIS_ERR_TRY_AGAIN; > } > + > + ObjectMap::iterator oi = sObjectMap.find(immObjectDn); > + if(protocol51Allowed() && oi != sObjectMap.end() && !isLoading){ > + std::string immMaxCcbs(OPENSAF_IMMSV_MAX_CCBS); > > [Zoran] OPENSAF_IMMSV_MAX_CCBS > > + ObjectInfo* immObject = oi->second; > + ImmAttrValueMap::iterator avi = > immObject->mAttrValueMap.find(immMaxCcbs); > + osafassert(avi != immObject->mAttrValueMap.end()); > + osafassert(!(avi->second->isMultiValued())); > + ImmAttrValue* valuep = avi->second; > + unsigned int maxCcbs= valuep->getValue_int(); > + if (sCcbVector.size() >= maxCcbs){ > + LOG_NO("ERR_NO_RESOURCES: maximum Ccbs limit %d has been reached > for the cluster", > + maxCcbs); > + TRACE_LEAVE(); > + return SA_AIS_ERR_NO_RESOURCES; > + } > + } > > CcbInfo* info = new CcbInfo; > info->mId = ccbId; > @@ -7422,6 +7569,78 @@ ImmModel::getAllWritableAttributes(const > return result; > } > > +SaAisErrorT ImmModel::verifyImmLimits(ObjectInfo* object, > + std::string objectName){ > + > + SaAisErrorT err = SA_AIS_OK; > + SaUint32T val; > + > + TRACE_ENTER(); > + osafassert(objectName == immObjectDn); > + ImmAttrValueMap::iterator class_avmi = > object->mAttrValueMap.find(OPENSAF_IMMSV_MAX_CLASSES); > + if( class_avmi != object->mAttrValueMap.end()){ > + osafassert(class_avmi->second); > + val = (SaUint32T)class_avmi->second->getValue_int(); > + } else { > + val = IMMSV_MAX_CLASSES; > + } > + if(sClassMap.size() > val){ > + LOG_NO("ERR_NO_RESOURCES: maximum class limit %d has been reched for > the cluster", > + val); > + err = SA_AIS_ERR_NO_RESOURCES; > + TRACE_LEAVE(); > + return err; > + } > + > + ImmAttrValueMap::iterator impl_avmi = > object->mAttrValueMap.find(OPENSAF_IMMSV_MAX_IMPLEMENTERS); > + if( impl_avmi != object->mAttrValueMap.end()){ > + osafassert(impl_avmi->second); > + val = (SaUint32T)impl_avmi->second->getValue_int(); > + } else { > + val = IMMSV_MAX_IMPLEMENTERS; > + } > + if(sImplementerVector.size() > val){ > + LOG_NO("ERR_NO_RESOURCES: maximum implementers limit %d has been > reched for the cluster", > + val); > + err = SA_AIS_ERR_NO_RESOURCES; > + TRACE_LEAVE(); > + return err; > + } > + > + ImmAttrValueMap::iterator admi_avmi = > object->mAttrValueMap.find(OPENSAF_IMMSV_MAX_ADMINOWNERS); > + if( admi_avmi != object->mAttrValueMap.end()){ > + osafassert(admi_avmi->second); > + val = (SaUint32T)admi_avmi->second->getValue_int(); > + } else { > + val = IMMSV_MAX_ADMINOWNERS; > + } > + if(sOwnerVector.size() > val){ > + LOG_NO("ERR_NO_RESOURCES: maximum adminownerslimit %d has been > reched for the cluster", > + val); > + err = SA_AIS_ERR_NO_RESOURCES; > + TRACE_LEAVE(); > + return err; > + } > + > + ImmAttrValueMap::iterator ccb_avmi = > object->mAttrValueMap.find(OPENSAF_IMMSV_MAX_CCBS); > + if( ccb_avmi != object->mAttrValueMap.end()){ > + osafassert(ccb_avmi->second); > + val = (SaUint32T)ccb_avmi->second->getValue_int(); > + } else { > + val = IMMSV_MAX_CCBS; > + } > + if(sCcbVector.size() > val){ > + LOG_NO("ERR_NO_RESOURCES: maximum ccbs limit %d has been reched for > the cluster", > + val); > + err = SA_AIS_ERR_NO_RESOURCES; > + TRACE_LEAVE(); > + return err; > + } > > [Zoran] It would be good to create new methods for finding max numbers of new > attributes. All the attributes are static variables in the same file, so, i thought using them directly. > Again the same issue with new attribute names which can be defined in the top > of the file > > + > + TRACE_LEAVE(); > + return err; > +} > + > /** > * Creates an object > */ > @@ -8342,6 +8561,8 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im > */ > sIsLongDnLoaded = true; > } > + err = verifyImmLimits(object, immObjectDn); > + setCcbErrorString(ccb, IMM_RESOURCE_ABORT "Verifying of > immLimits failed"); > } else { > setCcbErrorString(ccb, > "IMM: ERR_BAD_OPERATION: Imm not allowing creates > of instances of class '%s'", > @@ -9380,6 +9601,83 @@ ImmModel::ccbObjectModify(const ImmsvOmC > } > } > > + /* From OpenSAF 5.1 immObjectDn has added with attributes > maxClasses, maxImplementers, > + maxAdminowners and maxCcbs */ > + > + > + ImmAttrValueMap::iterator class_avmi = > afim->mAttrValueMap.find(OPENSAF_IMMSV_MAX_CLASSES); > + ImmAttrValueMap::iterator impl_avmi = > afim->mAttrValueMap.find(OPENSAF_IMMSV_MAX_IMPLEMENTERS); > + ImmAttrValueMap::iterator admi_avmi = > afim->mAttrValueMap.find(OPENSAF_IMMSV_MAX_ADMINOWNERS); > + ImmAttrValueMap::iterator ccb_avmi = > afim->mAttrValueMap.find(OPENSAF_IMMSV_MAX_CCBS); > + > + if ( !protocol51Allowed() && class_avmi != > afim->mAttrValueMap.end()) { > + LOG_WA("ERR_NOT_EXIST: The attribute %s can not be modified. > The cluster is not yet upgraded" > + "to OpenSAF 5.1", OPENSAF_IMMSV_MAX_CLASSES); > + err = SA_AIS_ERR_NOT_EXIST; > + goto bypass_impl; > + } else if(class_avmi != afim->mAttrValueMap.end()) { > + osafassert(class_avmi->second); > + SaUint32T val = > (SaUint32T)class_avmi->second->getValue_int(); > + if(val < IMMSV_MAX_CLASSES){ > + LOG_WA("ERR_BAD_OPERATION: The value %d is less than the > minimum supported value %d for" > + "the attribute %s", val,IMMSV_MAX_CLASSES, > OPENSAF_IMMSV_MAX_CLASSES); > + err = SA_AIS_ERR_BAD_OPERATION; > + goto bypass_impl; > + } > + } > + > + if ( !protocol51Allowed() && impl_avmi != > afim->mAttrValueMap.end()) { > + LOG_WA("ERR_NOT_EXIST: The attribute %s can not be modified. > The cluster is not yet upgraded" > + "to OpenSAF 5.1", OPENSAF_IMMSV_MAX_IMPLEMENTERS); > + err = SA_AIS_ERR_NOT_EXIST; > + goto bypass_impl; > + > + } else if(class_avmi != afim->mAttrValueMap.end()) { > + osafassert(impl_avmi->second); > + SaUint32T val = (SaUint32T)impl_avmi->second->getValue_int(); > + if(val < IMMSV_MAX_IMPLEMENTERS){ > + LOG_WA("ERR_BAD_OPERATION: The value %d is less than the > minimum supported value %d for" > + "the attribute %s", val, IMMSV_MAX_IMPLEMENTERS, > OPENSAF_IMMSV_MAX_IMPLEMENTERS); > + err = SA_AIS_ERR_BAD_OPERATION; > + goto bypass_impl; > + } > + } > + > + if ( !protocol51Allowed() && admi_avmi != > afim->mAttrValueMap.end()) { > + LOG_WA("ERR_NOT_EXIST: The attribute %s can not be modified. > The cluster is not yet upgraded" > + "to OpenSAF 5.1", OPENSAF_IMMSV_MAX_ADMINOWNERS); > + err = SA_AIS_ERR_NOT_EXIST; > + goto bypass_impl; > + > + } else if(admi_avmi != afim->mAttrValueMap.end()) { > + osafassert(admi_avmi->second); > + SaUint32T val = (SaUint32T)admi_avmi->second->getValue_int(); > + if(val < IMMSV_MAX_ADMINOWNERS){ > + LOG_WA("ERR_BAD_OPERATION: The value %d is less than the > minimum supported value %d for" > + "the attribute %s", val, IMMSV_MAX_ADMINOWNERS, > OPENSAF_IMMSV_MAX_ADMINOWNERS); > + err = SA_AIS_ERR_BAD_OPERATION; > + goto bypass_impl; > + } > + } > + > + if ( !protocol51Allowed() && ccb_avmi != > afim->mAttrValueMap.end()) { > + LOG_WA("ERR_NOT_EXIST: The attribute %s can not be modified. > The cluster is not yet upgraded" > + "to OpenSAF 5.1", OPENSAF_IMMSV_MAX_CCBS); > + err = SA_AIS_ERR_NOT_EXIST; > + goto bypass_impl; > + > + } else if(ccb_avmi != afim->mAttrValueMap.end()) { > + osafassert(ccb_avmi->second); > + SaUint32T val = (SaUint32T)ccb_avmi->second->getValue_int(); > + if(val < IMMSV_MAX_CCBS){ > + LOG_WA("ERR_BAD_OPERATION: The value %d is less than the > minimum supported value %d for" > + "the attribute %s", val, IMMSV_MAX_CCBS, > OPENSAF_IMMSV_MAX_CCBS); > + err = SA_AIS_ERR_BAD_OPERATION; > + goto bypass_impl; > + } > + } > + > + > > [Zoran] Make an extra space when breaking LOG message in a next line. > Otherwise strings will be concatenated. will do while pushing > /* Pre validate any changes. More efficent here than in > apply/completed and > we need to guard against race on long DN creation allowed. > Such long DNs > are themselves created in CCBs or RTO creates. > @@ -13972,6 +14270,8 @@ ImmModel::implementerSet(const IMMSV_OCT > { > SaAisErrorT err = SA_AIS_OK; > CcbVector::iterator i; > + bool isLoading = (sImmNodeState == IMM_NODE_LOADING); > + > TRACE_ENTER(); > > *discardImplementer = SA_FALSE; > @@ -13997,7 +14297,25 @@ ImmModel::implementerSet(const IMMSV_OCT > return err; > //This return code not formally allowed here according to IMM > standard. > } > - > + > + ObjectMap::iterator oi = sObjectMap.find(immObjectDn); > + if(protocol51Allowed() && oi != sObjectMap.end() && !isLoading){ > + std::string immMaxImp(OPENSAF_IMMSV_MAX_IMPLEMENTERS); > > [Zoran] Same here with OPENSAF_IMMSV_MAX_IMPLEMENTERS > > Thanks, > Zoran > > + ObjectInfo* immObject = oi->second; > + ImmAttrValueMap::iterator avi = > immObject->mAttrValueMap.find(immMaxImp); > + osafassert(avi != immObject->mAttrValueMap.end()); > + osafassert(!(avi->second->isMultiValued())); > + ImmAttrValue* valuep = avi->second; > + unsigned int maxImp = valuep->getValue_int(); > + if( sImplementerVector.size() >= maxImp){ > + LOG_NO("ERR_NO_RESOURCES: maximum Implementers limit %d has been > reached for the cluster", > + maxImp); > + TRACE_LEAVE(); > + return SA_AIS_ERR_NO_RESOURCES; > + } > + } > + > + > bool isApplier = (implName.at(0) == '@'); > > ImplementerInfo* info = findImplementer(implName); > diff --git a/osaf/services/saf/immsv/immnd/ImmModel.hh > b/osaf/services/saf/immsv/immnd/ImmModel.hh > --- a/osaf/services/saf/immsv/immnd/ImmModel.hh > +++ b/osaf/services/saf/immsv/immnd/ImmModel.hh > @@ -116,6 +116,7 @@ public: > bool protocol46Allowed(); > bool protocol47Allowed(); > bool protocol50Allowed(); > + bool protocol51Allowed(); > bool oneSafe2PBEAllowed(); > bool purgeSyncRequest(SaUint32T clientId); > bool verifySchemaChange(const std::string& className, > @@ -661,7 +662,9 @@ public: > ObjectInfo* obj, > AdminOwnerInfo* adm, > bool doIt); > - > + SaAisErrorT verifyImmLimits( > + ObjectInfo* object, > + std::string objectName); > > private: > bool checkSubLevel( ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel