You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directmemory.apache.org by ol...@apache.org on 2012/06/12 16:57:39 UTC

svn commit: r1349385 - in /incubator/directmemory/trunk: directmemory-cache/src/main/java/org/apache/directmemory/memory/ directmemory-cache/src/test/java/org/apache/directmemory/cache/ server/directmemory-server/src/main/java/org/apache/directmemory/s...

Author: olamy
Date: Tue Jun 12 14:57:38 2012
New Revision: 1349385

URL: http://svn.apache.org/viewvc?rev=1349385&view=rev
Log:
[DIRECTMEMORY-87] collectExpired frees not expired items instead of expired ones
Submitted by Jeff Maury

Modified:
    incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerServiceImpl.java
    incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheServiceImplTest.java
    incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/TextPlainContentTypeHandler.java

Modified: incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerServiceImpl.java?rev=1349385&r1=1349384&r2=1349385&view=diff
==============================================================================
--- incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerServiceImpl.java (original)
+++ incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerServiceImpl.java Tue Jun 12 14:57:38 2012
@@ -19,10 +19,12 @@ package org.apache.directmemory.memory;
  * under the License.
  */
 
-import static com.google.common.collect.Iterables.filter;
-import static com.google.common.collect.Iterables.limit;
-import static com.google.common.collect.Ordering.from;
-import static java.lang.String.format;
+import com.google.common.base.Predicate;
+import org.apache.directmemory.measures.Ram;
+import org.apache.directmemory.memory.allocator.ByteBufferAllocator;
+import org.apache.directmemory.memory.allocator.MergingByteBufferAllocatorImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
@@ -34,13 +36,10 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicLong;
 
-import org.apache.directmemory.measures.Ram;
-import org.apache.directmemory.memory.allocator.ByteBufferAllocator;
-import org.apache.directmemory.memory.allocator.MergingByteBufferAllocatorImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Predicate;
+import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.limit;
+import static com.google.common.collect.Ordering.from;
+import static java.lang.String.format;
 
 public class MemoryManagerServiceImpl<V>
     implements MemoryManagerService<V>
@@ -127,7 +126,7 @@ public class MemoryManagerServiceImpl<V>
             allocator = allocationPolicy.getActiveAllocator( allocator, allocationNumber );
             if ( allocator == null )
             {
-                if (returnsNullWhenFull())
+                if ( returnsNullWhenFull() )
                 {
                     return null;
                 }
@@ -172,7 +171,7 @@ public class MemoryManagerServiceImpl<V>
     public byte[] retrieve( final Pointer<V> pointer )
     {
         // check if pointer has not been freed before
-        if (!pointers.contains( pointer ))
+        if ( !pointers.contains( pointer ) )
         {
             return null;
         }
@@ -199,7 +198,7 @@ public class MemoryManagerServiceImpl<V>
 
         getAllocator( pointer.getBufferNumber() ).free( pointer.getDirectBuffer() );
 
-        used.addAndGet( - pointer.getCapacity() );
+        used.addAndGet( -pointer.getCapacity() );
 
         pointer.setFree( true );
     }
@@ -207,12 +206,12 @@ public class MemoryManagerServiceImpl<V>
     @Override
     public void clear()
     {
-        for (Pointer<V> pointer : pointers)
+        for ( Pointer<V> pointer : pointers )
         {
             pointer.setFree( true );
         }
         pointers.clear();
-        for (ByteBufferAllocator allocator : allocators)
+        for ( ByteBufferAllocator allocator : allocators )
         {
             allocator.clear();
         }
@@ -223,7 +222,7 @@ public class MemoryManagerServiceImpl<V>
     public long capacity()
     {
         long totalCapacity = 0;
-        for (ByteBufferAllocator allocator : allocators)
+        for ( ByteBufferAllocator allocator : allocators )
         {
             totalCapacity += allocator.getCapacity();
         }
@@ -242,7 +241,7 @@ public class MemoryManagerServiceImpl<V>
         @Override
         public boolean apply( Pointer<V> input )
         {
-            return !input.isFree() && !input.isExpired();
+            return !input.isFree() && input.isExpired();
         }
 
     };
@@ -253,7 +252,7 @@ public class MemoryManagerServiceImpl<V>
         @Override
         public boolean apply( Pointer<V> input )
         {
-            return !input.isFree() && !input.isExpired();
+            return !input.isFree() && input.isExpired();
         }
 
     };
@@ -262,8 +261,8 @@ public class MemoryManagerServiceImpl<V>
     public long collectExpired()
     {
         int limit = 50;
-        return free( limit( filter( pointers, relative ), limit ) )
-                        + free( limit( filter( pointers, absolute ), limit ) );
+        return free( limit( filter( pointers, relative ), limit ) ) + free(
+            limit( filter( pointers, absolute ), limit ) );
 
     }
 
@@ -318,7 +317,8 @@ public class MemoryManagerServiceImpl<V>
 
     @Deprecated
     @Override
-    public <T extends V> Pointer<V> allocate( final Class<T> type, final int size, final long expiresIn, final long expires )
+    public <T extends V> Pointer<V> allocate( final Class<T> type, final int size, final long expiresIn,
+                                              final long expires )
     {
 
         Pointer<V> p = null;
@@ -330,7 +330,7 @@ public class MemoryManagerServiceImpl<V>
             allocator = allocationPolicy.getActiveAllocator( allocator, allocationNumber );
             if ( allocator == null )
             {
-                if (returnsNullWhenFull())
+                if ( returnsNullWhenFull() )
                 {
                     return null;
                 }
@@ -358,7 +358,8 @@ public class MemoryManagerServiceImpl<V>
         return p;
     }
 
-    protected Pointer<V> instanciatePointer( final ByteBuffer buffer, final int allocatorIndex, final long expiresIn, final long expires )
+    protected Pointer<V> instanciatePointer( final ByteBuffer buffer, final int allocatorIndex, final long expiresIn,
+                                             final long expires )
     {
 
         Pointer<V> p = new PointerImpl<V>();

Modified: incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheServiceImplTest.java
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheServiceImplTest.java?rev=1349385&r1=1349384&r2=1349385&view=diff
==============================================================================
--- incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheServiceImplTest.java (original)
+++ incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheServiceImplTest.java Tue Jun 12 14:57:38 2012
@@ -19,8 +19,6 @@ package org.apache.directmemory.cache;
  * under the License.
  */
 
-import static org.junit.Assert.assertTrue;
-
 import org.apache.directmemory.DirectMemory;
 import org.apache.directmemory.measures.Ram;
 import org.apache.directmemory.memory.AllocationPolicy;
@@ -30,6 +28,10 @@ import org.apache.directmemory.memory.Po
 import org.apache.directmemory.memory.RoundRobinAllocationPolicy;
 import org.junit.Test;
 
+import java.io.Serializable;
+
+import static org.junit.Assert.*;
+
 public class CacheServiceImplTest
 {
 
@@ -37,13 +39,10 @@ public class CacheServiceImplTest
     public void testOffHeapExceedMemoryReturnNullWhenTrue()
     {
         AllocationPolicy allocationPolicy = new RoundRobinAllocationPolicy();
-        MemoryManagerService<byte[]> memoryManager =
-            new MemoryManagerServiceImpl<byte[]>( allocationPolicy, true );
-        CacheService<Integer, byte[]> cache = new DirectMemory<Integer, byte[]>()
-                        .setMemoryManager( memoryManager )
-                        .setNumberOfBuffers( 1 )
-                        .setSize( Ram.Mb( 1 ) )
-                        .newCacheService();
+        MemoryManagerService<byte[]> memoryManager = new MemoryManagerServiceImpl<byte[]>( allocationPolicy, true );
+        CacheService<Integer, byte[]> cache =
+            new DirectMemory<Integer, byte[]>().setMemoryManager( memoryManager ).setNumberOfBuffers( 1 ).setSize(
+                Ram.Mb( 1 ) ).newCacheService();
 
         for ( int i = 0; i < 1000; i++ )
         {
@@ -57,4 +56,70 @@ public class CacheServiceImplTest
 
     }
 
+    private static class MyBean
+        implements Serializable
+    {
+        private static final long serialVersionUID = -8865690921195047235L;
+
+        private String name;
+
+        /**
+         * @return the name
+         */
+        public String getName()
+        {
+            return name;
+        }
+
+        /**
+         * @param name the name to set
+         */
+        public void setName( String name )
+        {
+            this.name = name;
+        }
+    }
+
+    @Test
+    public void testEntryIsNoMoreAvailableAfterExpiry()
+        throws InterruptedException
+    {
+        AllocationPolicy allocationPolicy = new RoundRobinAllocationPolicy();
+        MemoryManagerService<MyBean> memoryManager = new MemoryManagerServiceImpl<MyBean>( allocationPolicy, true );
+        CacheService<Integer, MyBean> cache =
+            new DirectMemory<Integer, MyBean>().setMemoryManager( memoryManager ).setNumberOfBuffers( 1 ).setSize(
+                Ram.Mb( 1 ) ).newCacheService();
+        /*
+         * let the scan run every 10s
+         */
+        cache.scheduleDisposalEvery( 3 * 1000 );
+        /*
+         * entry should be expired but not freed after 1s in the cache
+         */
+        MyBean originalEntry = new MyBean();
+        originalEntry.setName( "the name" );
+        cache.put( 1, originalEntry, 1 * 1000 );
+        Pointer<MyBean> pointer = cache.getPointer( 1 );
+        assertNotNull( pointer );
+        assertFalse( pointer.isExpired() );
+        assertFalse( pointer.isFree() );
+        /*
+         * wait for 2s to be sure the entry has been expired
+         */
+        Thread.sleep( 2000 );
+        pointer = cache.getPointer( 1 );
+        assertNotNull( pointer );
+        assertTrue( pointer.isExpired() );
+        assertFalse( pointer.isFree() );
+        /*
+         * wait for 11s to be sure the entry has been evicted
+         */
+        Thread.sleep( 4000 );
+        pointer = cache.getPointer( 1 );
+        assertNotNull( pointer );
+        assertTrue( pointer.isExpired() );
+        assertTrue( pointer.isFree() );
+    }
+
+
 }

Modified: incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/TextPlainContentTypeHandler.java
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/TextPlainContentTypeHandler.java?rev=1349385&r1=1349384&r2=1349385&view=diff
==============================================================================
--- incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/TextPlainContentTypeHandler.java (original)
+++ incubator/directmemory/trunk/server/directmemory-server/src/main/java/org/apache/directmemory/server/services/TextPlainContentTypeHandler.java Tue Jun 12 14:57:38 2012
@@ -27,6 +27,8 @@ import org.apache.directmemory.server.co
 import org.apache.directmemory.server.commons.DirectMemoryHttpConstants;
 import org.apache.directmemory.server.commons.DirectMemoryRequest;
 import org.apache.directmemory.server.commons.DirectMemoryResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -39,6 +41,7 @@ import java.io.IOException;
 public class TextPlainContentTypeHandler
     implements ContentTypeHandler
 {
+    private Logger log = LoggerFactory.getLogger( getClass() );
 
     @Override
     public byte[] handleGet( DirectMemoryRequest request, byte[] cacheResponseContent, HttpServletResponse resp,
@@ -86,7 +89,12 @@ public class TextPlainContentTypeHandler
         {
             throw new DirectMemoryException( e.getMessage(), e );
         }
-        return request;
+
+        String expiresInHeader = req.getHeader( DirectMemoryHttpConstants.EXPIRES_IN_HTTP_HEADER );
+        int expiresIn = StringUtils.isEmpty( expiresInHeader ) ? 0 : Integer.valueOf( expiresInHeader );
+        log.debug( "expiresIn: {} for header value: {}", expiresIn, expiresInHeader );
+
+        return request.setExpiresIn( expiresIn );
 
     }