Bug 7419 : Ids from id pool exhausted 94/49694/5
authorKency Kurian <kency.kurian@ericsson.com>
Wed, 21 Dec 2016 12:27:30 +0000 (17:57 +0530)
committerKency Kurian <kency.kurian@ericsson.com>
Fri, 23 Dec 2016 05:59:07 +0000 (05:59 +0000)
Observed that there were many threads waiting to allocate block of ids
from parent pool. Once a thread acquired lock it just used to update its
availableIdHolder with that block without checking if some other thread
has already updated the localPoolCache.

After acquiring lock, a check has been added to know if some other thread
has already updated the availableIdHolder/releaseIdHolder.

Change-Id: Id5550bb2a483d14572803f0e346f2209b9cb9bcc
Signed-off-by: Kency Kurian <kency.kurian@ericsson.com>
idmanager/idmanager-impl/src/main/java/org/opendaylight/genius/idmanager/AvailableIdHolder.java
idmanager/idmanager-impl/src/main/java/org/opendaylight/genius/idmanager/IdLocalPool.java
idmanager/idmanager-impl/src/main/java/org/opendaylight/genius/idmanager/IdManager.java
idmanager/idmanager-impl/src/main/java/org/opendaylight/genius/idmanager/ReleasedIdHolder.java

index 477a9065804299185b97c4867cd68d7e00baa2ea..2726f7324f01586f3a865a55d9a48287db6efbd5 100644 (file)
@@ -13,8 +13,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.
 
 public class AvailableIdHolder implements IdHolder {
 
-    private long low = 0;
-    private long high = 0;
+    private final long low;
+    private final long high;
     private final AtomicLong cur = new AtomicLong();
 
     private final IdUtils idUtils;
index 7465ee8f1ffddf033ed495e0a8a2ec403ce2a97f..f11d8c9fe745bbebdd657dc68850041a9f71bfd9 100644 (file)
@@ -9,9 +9,9 @@ package org.opendaylight.genius.idmanager;
 
 public class IdLocalPool {
 
-    private String poolName;
-    private IdHolder availableIds; // List of available IDs
-    private IdHolder releasedIds; // List of released IDs
+    private final String poolName;
+    private volatile IdHolder availableIds; // List of available IDs
+    private volatile IdHolder releasedIds; // List of released IDs
 
     public IdLocalPool(IdUtils idUtils, String poolName, long low, long high) {
         this.poolName = poolName;
@@ -80,10 +80,6 @@ public class IdLocalPool {
         return poolName;
     }
 
-    public void setPoolName(String poolName) {
-        this.poolName = poolName;
-    }
-
     public IdHolder getAvailableIds() {
         return availableIds;
     }
index 346c2ced6c9b51b24fb0b2ee07437d679252f417..83b9dc7f0a12bfd57bdd211c2812dfc8cc02a15b 100644 (file)
@@ -412,6 +412,13 @@ public class IdManager implements IdManagerService, IdManagerMonitor {
         parentPoolName = parentPoolName.intern();
         idUtils.lockPool(lockManager, parentPoolName);
         try {
+            // Check if the childpool already got id block.
+            long availableIdCount =
+                    localIdPool.getAvailableIds().getAvailableIdCount()
+                            + localIdPool.getReleasedIds().getAvailableIdCount();
+            if (availableIdCount > 0) {
+                return availableIdCount;
+            }
             WriteTransaction tx = broker.newWriteOnlyTransaction();
             IdPool parentIdPool = singleTxDB.syncRead(CONFIGURATION, idPoolInstanceIdentifier);
             long idCount = allocateIdBlockFromParentPool(localIdPool, parentIdPool, tx);
index ee1ad5898efe7649f5cfc40eeb9161a9daafacfe..379f5e0e85621571c92cd9bbe3193e110294b401 100644 (file)
@@ -21,7 +21,7 @@ public class ReleasedIdHolder implements IdHolder, Serializable {
 
     private final AtomicLong availableIdCount = new AtomicLong();
 
-    private long timeDelaySec;
+    private final long timeDelaySec;
     private List<DelayedIdEntry> delayedEntries;
 
     private final IdUtils idUtils;
@@ -116,10 +116,6 @@ public class ReleasedIdHolder implements IdHolder, Serializable {
         return delayedEntries;
     }
 
-    public void setTimeDelaySec(long timeDelaySec) {
-        this.timeDelaySec = timeDelaySec;
-    }
-
     public void setDelayedEntries(List<DelayedIdEntry> delayedEntries) {
         this.delayedEntries = delayedEntries;
     }