Author: raffaeleguidi
Date: Tue Oct 18 19:38:14 2011
New Revision: 1185815

URL: http://svn.apache.org/viewvc?rev=1185815&view=rev
Log:
added a very basic check to avoid unnecessary LFU eviction if we are not in 
shortage of free buffers

Modified:
    
incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/OffHeapMemoryBuffer.java

Modified: 
incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/OffHeapMemoryBuffer.java
URL: 
http://svn.apache.org/viewvc/incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/OffHeapMemoryBuffer.java?rev=1185815&r1=1185814&r2=1185815&view=diff
==============================================================================
--- 
incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/OffHeapMemoryBuffer.java
 (original)
+++ 
incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/OffHeapMemoryBuffer.java
 Tue Oct 18 19:38:14 2011
@@ -44,7 +44,8 @@ public class OffHeapMemoryBuffer {
 //     public List<Pointer> pointers = new CopyOnWriteArrayList<Pointer>();
        AtomicInteger used = new AtomicInteger();
        public int bufferNumber;
-       
+       public int allocationErrors = 0;
+       public static int maxAllocationErrors = 0;
        
        public int used() {
                return used.get();
@@ -138,6 +139,7 @@ public class OffHeapMemoryBuffer {
        }
        
        public void clear() {
+               allocationErrors = 0;
                pointers.clear();
                createAndAddFirstPointer();
                buffer.clear();
@@ -156,7 +158,8 @@ public class OffHeapMemoryBuffer {
                Pointer goodOne = firstMatch(payload.length);
                
                if (goodOne == null ) {
-                       throw new NullPointerException("did not find a suitable 
buffer");
+                       allocationErrors++;
+                       throw new NullPointerException("did not find a suitable 
buffer " + allocationErrors + " times since last cleanup");
                }
                
                Pointer fresh = slice(goodOne, payload.length);
@@ -201,7 +204,15 @@ public class OffHeapMemoryBuffer {
                return qr;
        }
        
+       private boolean inShortage() {
+               // a place holder for a more refined version
+               return allocationErrors > 
OffHeapMemoryBuffer.maxAllocationErrors;
+       }
+       
        public long collectLFU(int limit) {
+               if (!inShortage()) {
+                       return 0;
+               }
                if (limit<=0) limit = pointers.size()/10;
                QueryResults qr;
                try {


Reply via email to