osaf/services/saf/immsv/README             |   6 ++++
 osaf/services/saf/immsv/immnd/ImmModel.cc  |  38 ++++++++++++++++++++++++-----
 osaf/services/saf/immsv/immnd/immnd_proc.c |   2 +-
 3 files changed, 38 insertions(+), 8 deletions(-)


diff --git a/osaf/services/saf/immsv/README b/osaf/services/saf/immsv/README
--- a/osaf/services/saf/immsv/README
+++ b/osaf/services/saf/immsv/README
@@ -2866,6 +2866,12 @@ IMMSV_MAX_CCBS 10000
 
 The user can not configure the values less than the default values.
 
+The value for maxCcbs are the acive ccbs present in the cluster.
+The terminated CCBs will be removed from the cluser after 5 minutes.
+If the number of terminated CCBs are greater than "2 * maxCcbs" then 
+CCBs will be removed from the cluster after 2 minutes.
+
+
 Notes on upgrading from OpenSAF 5.0 to OpenSAF 5.1
 ================================================================
 OpenSAF5.1 makes the IMM attributes as configurable (#195).
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
@@ -571,6 +571,7 @@ static SaImmRepositoryInitModeT immInitM
 static SaUint32T sCcbIdLongDnGuard  = 0; /* Disallow long DN additions if 
longDnsAllowed is being changed in ccb*/
 static bool      sIsLongDnLoaded   = false; /* track long DNs before 
opensafImm=opensafImm,safApp=safImmService is created */
 static bool      sAbortNonCriticalCcbs = false; /* Set to true at coord by the 
special imm admin-op to abort ccbs #1107 */
+static SaUint32T sTerminatedCcbcount = 0; /* Terminated ccbs count. calculated 
at cleanTheBasement  for every second*/ 
 
 struct AttrFlagIncludes
 {
@@ -4208,7 +4209,7 @@ ImmModel::verifySchemaChange(const std::
 
                 if ( !verifyFailed && attName == immMaxCcbs) {
                     val = newAttr->mDefaultValue.getValue_int();
-                    if( sCcbVector.size() > val){
+                    if( (sCcbVector.size() - sTerminatedCcbcount) > val){
                         LOG_NO("The Number of Ccbs in the cluster %zu greater 
than the schema change"
                                  "value %d", sCcbVector.size(), val);
                         verifyFailed = true;
@@ -5329,7 +5330,7 @@ ImmModel::ccbCreate(SaUint32T adminOwner
         osafassert(!(avi->second->isMultiValued()));
         ImmAttrValue* valuep = avi->second;
         unsigned int maxCcbs= valuep->getValue_int();
-        if (sCcbVector.size() >= maxCcbs){
+        if ((sCcbVector.size()- sTerminatedCcbcount) >= maxCcbs){
             LOG_NO("ERR_NO_RESOURCES: maximum Ccbs limit %d has been reached 
for the cluster",
                           maxCcbs);
             TRACE_LEAVE();
@@ -7636,7 +7637,7 @@ SaAisErrorT ImmModel::verifyImmLimits(Ob
     } else {
         val = IMMSV_MAX_CCBS;
     }
-    if(sCcbVector.size() > val){
+    if((sCcbVector.size()- sTerminatedCcbcount) > val){
         LOG_NO("ERR_NO_RESOURCES: maximum ccbs limit %d has been reched for 
the cluster",
                           val);
         err = SA_AIS_ERR_NO_RESOURCES;
@@ -8568,7 +8569,9 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im
                         sIsLongDnLoaded = true;
                     }
                     err = verifyImmLimits(object, immObjectDn);
-                    setCcbErrorString(ccb, IMM_RESOURCE_ABORT "Verifying of 
immLimits failed");
+                    if( err != SA_AIS_OK) {
+                        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'",
@@ -14085,13 +14088,34 @@ ImmModel::cleanTheBasement(InvocVector& 
     //do and solves the problem. 
 
     i3 = sCcbVector.begin();
+    int terminatedCcbTime = 300, val;
+    ObjectInfo* immObject = NULL;
+    ImmAttrValueMap::iterator avi;
+    ObjectMap::iterator oi = sObjectMap.find(immObjectDn);
+    osafassert(oi != sObjectMap.end() && oi->second);
+    immObject = oi->second;
+
+    avi = immObject->mAttrValueMap.find(immMaxCcbs);
+
+    if( avi != immObject->mAttrValueMap.end()){
+        osafassert(avi->second);
+        val = (SaUint32T)avi->second->getValue_int();
+    } else {
+        val = IMMSV_MAX_CCBS;
+    }
+
+    if( sTerminatedCcbcount > (SaUint32T) 2*val){
+        terminatedCcbTime = 120;
+    }
+    sTerminatedCcbcount = 0;
     while (i3 != sCcbVector.end()) {
         if((*i3)->mState > IMM_CCB_CRITICAL) {
+            sTerminatedCcbcount++;
             /* Garbage Collect ccbInfo more than five minutes old */
             if(osaf_timespec_compare(&(*i3)->mWaitStartTime, &kZeroSeconds) &&
-                    osaf_timer_is_expired_sec(&now, &(*i3)->mWaitStartTime, 
300)) {
-                TRACE_5("Removing CCB %u terminated more than 5 minutes ago", 
-                    (*i3)->mId);
+                    osaf_timer_is_expired_sec(&now, &(*i3)->mWaitStartTime, 
terminatedCcbTime)) {
+                TRACE_5("Removing CCB %u terminated more than %d minutes ago", 
+                    (*i3)->mId, terminatedCcbTime/60 );
                 (*i3)->mState = IMM_CCB_ILLEGAL;
                 delete (*i3);
                 i3 = sCcbVector.erase(i3);
diff --git a/osaf/services/saf/immsv/immnd/immnd_proc.c 
b/osaf/services/saf/immsv/immnd/immnd_proc.c
--- a/osaf/services/saf/immsv/immnd/immnd_proc.c
+++ b/osaf/services/saf/immsv/immnd/immnd_proc.c
@@ -2145,7 +2145,7 @@ uint32_t immnd_proc_server(uint32_t *tim
                        }
                }
 
-               if((cb->mStep == 0) || 
(osaf_timespec_compare(&cb->mCleanedHouseAt, &jobDurationTs)) || 
cb->mForceClean) {
+               if((cb->mStep == 0) || (osaf_timespec_compare(&jobDurationTs, 
&cb->mCleanedHouseAt )) || cb->mForceClean) {
                        immnd_cleanTheHouse(cb, coord == 1);
                        cb->mCleanedHouseAt = jobDurationTs;
                        if(cb->mForceClean) {

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

Reply via email to