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 );
}