Author: raffaeleguidi
Date: Sun Sep 16 22:51:29 2012
New Revision: 1385390
URL: http://svn.apache.org/viewvc?rev=1385390&view=rev
Log:
added UnsafeMemoryServiceImpl
refactored MemoryServiceImpl -> moved common things to
AbstractMemoryService class
Added some basic tests for unsafe
Modified karaf startup configuration to allow sun.misc to be used
Added:
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/AbstractMemoryManager.java
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/UnsafeMemoryManagerServiceImpl.java
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/BaseUnsafeTest.java
- copied, changed from r1382598,
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/BaseTest.java
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/MallocWithUnsafeTest.java
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/UnsafeMemoryManagerTest.java
- copied, changed from r1382598,
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/Pointer.java
Modified:
directmemory/trunk/directmemory-cache/pom.xml
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/cache/Cache.java
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerService.java
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerServiceImpl.java
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/Pointer.java
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/PointerImpl.java
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/BasicTest.java
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheConcurrentTest.java
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheServiceImplTest.java
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/AbstractMemoryManagerServiceTest.java
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/BaseTest.java
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/MemoryManagerTest.java
Modified: directmemory/trunk/directmemory-cache/pom.xml
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/pom.xml?rev=1385390&r1=1385389&r2=1385390&view=diff
==============================================================================
--- directmemory/trunk/directmemory-cache/pom.xml (original)
+++ directmemory/trunk/directmemory-cache/pom.xml Sun Sep 16 22:51:29 2012
@@ -42,8 +42,9 @@ under the License.
com.google.common.collect;version="[9.0,11)",
com.google.common.base;version="[9.0,11)",
org.aspectj*;version="[1.6,2)",
- org.slf4j*
- </osgi.import> <!-- ,org.yaml.snakeyaml* -->
+ org.slf4j*,
+ sun.misc.*
+ </osgi.import> <!-- ,org.yaml.snakeyaml* -->
<osgi.export>org.apache.directmemory*;version="${project.version}</osgi.export>
</properties>
Modified:
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/cache/Cache.java
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/cache/Cache.java?rev=1385390&r1=1385389&r2=1385390&view=diff
==============================================================================
---
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/cache/Cache.java
(original)
+++
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/cache/Cache.java
Sun Sep 16 22:51:29 2012
@@ -51,8 +51,10 @@ public class Cache
public static void init( int numberOfBuffers, int size, int
initialCapacity, int concurrencyLevel )
{
cacheService =
- builder.setNumberOfBuffers( numberOfBuffers ).setInitialCapacity(
initialCapacity ).setConcurrencyLevel(
- concurrencyLevel ).setSize( size ).newCacheService();
+ builder.setNumberOfBuffers( numberOfBuffers ).setInitialCapacity(
initialCapacity )
+ .setConcurrencyLevel(concurrencyLevel )
+ .setSize( size ).newCacheService();
+// concurrencyLevel ).setMemoryManager( new
UnsafeMemoryManagerServiceImpl<Object>() ).setSize( size ).newCacheService();
}
public static void init( int numberOfBuffers, int size )
Added:
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/AbstractMemoryManager.java
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/AbstractMemoryManager.java?rev=1385390&view=auto
==============================================================================
---
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/AbstractMemoryManager.java
(added)
+++
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/AbstractMemoryManager.java
Sun Sep 16 22:51:29 2012
@@ -0,0 +1,142 @@
+package org.apache.directmemory.memory;
+
+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 java.util.Collections;
+import java.util.Comparator;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+
+import com.google.common.base.Predicate;
+
+public abstract class AbstractMemoryManager<V>
+{
+
+ protected static final long NEVER_EXPIRES = 0L;
+ protected final Set<Pointer<V>> pointers = Collections.newSetFromMap( new
ConcurrentHashMap<Pointer<V>, Boolean>() );
+ protected boolean returnNullWhenFull = true;
+ protected final AtomicLong used = new AtomicLong( 0L );
+
+ public AbstractMemoryManager()
+ {
+ super();
+ }
+
+ abstract public Pointer<V> store( byte[] payload, long expiresIn );
+
+ public Pointer<V> store( byte[] payload )
+ {
+ return store( payload, 0 );
+ }
+
+ abstract public Pointer<V> free( Pointer<V> pointer );
+
+ public Pointer<V> update( Pointer<V> pointer, byte[] payload )
+ {
+ free( pointer );
+ return store( payload );
+ }
+
+ public long used()
+ {
+ return used.get();
+ }
+
+
+ public long collectExpired()
+ {
+ int limit = 50;
+ return free( limit( filter( pointers, relative ), limit ) ) + free(
+ limit( filter( pointers, absolute ), limit ) );
+
+ }
+
+ final Predicate<Pointer<V>> relative = new Predicate<Pointer<V>>()
+ {
+
+ @Override
+ public boolean apply( Pointer<V> input )
+ {
+ return !input.isFree() && input.isExpired();
+ }
+
+ };
+
+ final Predicate<Pointer<V>> absolute = new Predicate<Pointer<V>>()
+ {
+
+ @Override
+ public boolean apply( Pointer<V> input )
+ {
+ return !input.isFree() && input.isExpired();
+ }
+
+ };
+
+ public void collectLFU()
+ {
+
+ int limit = pointers.size() / 10;
+
+ Iterable<Pointer<V>> result = from( new Comparator<Pointer<V>>()
+ {
+
+ public int compare( Pointer<V> o1, Pointer<V> o2 )
+ {
+ float f1 = o1.getFrequency();
+ float f2 = o2.getFrequency();
+
+ return Float.compare( f1, f2 );
+ }
+
+ } ).sortedCopy( limit( filter( pointers, new Predicate<Pointer<V>>()
+ {
+
+ @Override
+ public boolean apply( Pointer<V> input )
+ {
+ return !input.isFree();
+ }
+
+ } ), limit ) );
+
+ free( result );
+
+ }
+
+ protected long free( Iterable<Pointer<V>> pointers )
+ {
+ long howMuch = 0;
+ for ( Pointer<V> expired : pointers )
+ {
+ howMuch += expired.getCapacity();
+ free( expired );
+ }
+ return howMuch;
+ }
+
+ protected boolean returnsNullWhenFull()
+ {
+ return returnNullWhenFull;
+ }
+
+ public Set<Pointer<V>> getPointers()
+ {
+ return Collections.unmodifiableSet( pointers );
+ }
+
+ public <T extends V> Pointer<V> allocate( final Class<T> type, final int
size, final long expiresIn,
+ final long expires )
+ {
+
+ Pointer<V> p = store(new byte[size], expiresIn );
+
+ if (p != null) p.setClazz( type );
+
+ return p;
+ }
+
+}
\ No newline at end of file
Modified:
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerService.java
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerService.java?rev=1385390&r1=1385389&r2=1385390&view=diff
==============================================================================
---
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerService.java
(original)
+++
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerService.java
Sun Sep 16 22:51:29 2012
@@ -1,5 +1,7 @@
package org.apache.directmemory.memory;
+import java.util.Set;
+
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@@ -39,7 +41,7 @@ public interface MemoryManagerService<V>
* @param payload : the data to store
* @return the pointer to the value, or null if not enough space has been
found.
*/
- Pointer<V> store( byte[] payload, int expiresIn );
+ Pointer<V> store( byte[] payload, long expiresIn );
/**
* Same function as {@link #store(byte[])}, but add an relative expiration
delta in milliseconds
@@ -71,7 +73,7 @@ public interface MemoryManagerService<V>
byte[] retrieve( Pointer<V> pointer );
- void free( Pointer<V> pointer );
+ Pointer<V> free( Pointer<V> pointer );
void clear();
@@ -85,4 +87,6 @@ public interface MemoryManagerService<V>
<T extends V> Pointer<V> allocate( Class<T> type, int size, long
expiresIn, long expires );
+ Set<Pointer<V>> getPointers();
+
}
Modified:
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerServiceImpl.java
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerServiceImpl.java?rev=1385390&r1=1385389&r2=1385390&view=diff
==============================================================================
---
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerServiceImpl.java
(original)
+++
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerServiceImpl.java
Sun Sep 16 22:51:29 2012
@@ -19,43 +19,26 @@ package org.apache.directmemory.memory;
* under the License.
*/
-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 static java.lang.String.format;
import java.nio.BufferOverflowException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
import java.util.List;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicLong;
-
-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>
+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;
+
+public class MemoryManagerServiceImpl<V> extends AbstractMemoryManager<V>
implements MemoryManagerService<V>
{
- protected static final long NEVER_EXPIRES = 0L;
-
protected static Logger logger = LoggerFactory.getLogger(
MemoryManager.class );
- private List<ByteBufferAllocator> allocators;
-
- private final Set<Pointer<V>> pointers = Collections.newSetFromMap( new
ConcurrentHashMap<Pointer<V>, Boolean>() );
-
- private final boolean returnNullWhenFull;
-
- protected final AtomicLong used = new AtomicLong( 0L );
+ List<ByteBufferAllocator> allocators;
protected final AllocationPolicy allocationPolicy;
@@ -115,7 +98,7 @@ public class MemoryManagerServiceImpl<V>
}
@Override
- public Pointer<V> store( byte[] payload, int expiresIn )
+ public Pointer<V> store( byte[] payload, long expiresIn )
{
Pointer<V> p = null;
ByteBufferAllocator allocator = null;
@@ -155,19 +138,6 @@ public class MemoryManagerServiceImpl<V>
}
@Override
- public Pointer<V> store( byte[] payload )
- {
- return store( payload, 0 );
- }
-
- @Override
- public Pointer<V> update( Pointer<V> pointer, byte[] payload )
- {
- free( pointer );
- return store( payload );
- }
-
- @Override
public byte[] retrieve( final Pointer<V> pointer )
{
// check if pointer has not been freed before
@@ -187,13 +157,13 @@ public class MemoryManagerServiceImpl<V>
}
@Override
- public void free( final Pointer<V> pointer )
+ public Pointer<V> free( final Pointer<V> pointer )
{
if ( !pointers.remove( pointer ) )
{
// pointers has been already freed.
//throw new IllegalArgumentException( "This pointer " + pointer +
" has already been freed" );
- return;
+ return pointer;
}
getAllocator( pointer.getBufferNumber() ).free(
pointer.getDirectBuffer() );
@@ -201,21 +171,8 @@ public class MemoryManagerServiceImpl<V>
used.addAndGet( -pointer.getCapacity() );
pointer.setFree( true );
- }
-
- @Override
- public void clear()
- {
- for ( Pointer<V> pointer : pointers )
- {
- pointer.setFree( true );
- }
- pointers.clear();
- for ( ByteBufferAllocator allocator : allocators )
- {
- allocator.clear();
- }
- allocationPolicy.reset();
+
+ return pointer;
}
@Override
@@ -229,87 +186,7 @@ public class MemoryManagerServiceImpl<V>
return totalCapacity;
}
- @Override
- public long used()
- {
- return used.get();
- }
-
- private final Predicate<Pointer<V>> relative = new Predicate<Pointer<V>>()
- {
-
- @Override
- public boolean apply( Pointer<V> input )
- {
- return !input.isFree() && input.isExpired();
- }
-
- };
-
- private final Predicate<Pointer<V>> absolute = new Predicate<Pointer<V>>()
- {
-
- @Override
- public boolean apply( Pointer<V> input )
- {
- return !input.isFree() && input.isExpired();
- }
-
- };
-
- @Override
- public long collectExpired()
- {
- int limit = 50;
- return free( limit( filter( pointers, relative ), limit ) ) + free(
- limit( filter( pointers, absolute ), limit ) );
-
- }
-
- @Override
- public void collectLFU()
- {
-
- int limit = pointers.size() / 10;
-
- Iterable<Pointer<V>> result = from( new Comparator<Pointer<V>>()
- {
-
- public int compare( Pointer<V> o1, Pointer<V> o2 )
- {
- float f1 = o1.getFrequency();
- float f2 = o2.getFrequency();
-
- return Float.compare( f1, f2 );
- }
-
- } ).sortedCopy( limit( filter( pointers, new Predicate<Pointer<V>>()
- {
-
- @Override
- public boolean apply( Pointer<V> input )
- {
- return !input.isFree();
- }
-
- } ), limit ) );
-
- free( result );
-
- }
-
- protected long free( Iterable<Pointer<V>> pointers )
- {
- long howMuch = 0;
- for ( Pointer<V> expired : pointers )
- {
- howMuch += expired.getCapacity();
- free( expired );
- }
- return howMuch;
- }
-
-
+
protected List<ByteBufferAllocator> getAllocators()
{
return allocators;
@@ -358,12 +235,27 @@ public class MemoryManagerServiceImpl<V>
return p;
}
+ @Override
+ public void clear()
+ {
+ for ( Pointer<V> pointer : pointers )
+ {
+ pointer.setFree( true );
+ }
+ pointers.clear();
+ for ( ByteBufferAllocator allocator : allocators )
+ {
+ allocator.clear();
+ }
+ allocationPolicy.reset();
+ }
+
protected Pointer<V> instanciatePointer( final ByteBuffer buffer, final
int allocatorIndex, final long expiresIn,
final long expires )
{
Pointer<V> p = new PointerImpl<V>();
-
+
p.setDirectBuffer( buffer );
p.setExpiration( expires, expiresIn );
p.setBufferNumber( allocatorIndex );
@@ -374,14 +266,4 @@ public class MemoryManagerServiceImpl<V>
return p;
}
-
- protected boolean returnsNullWhenFull()
- {
- return returnNullWhenFull;
- }
-
- public Set<Pointer<V>> getPointers()
- {
- return Collections.unmodifiableSet( pointers );
- }
}
Modified:
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/Pointer.java
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/Pointer.java?rev=1385390&r1=1385389&r2=1385390&view=diff
==============================================================================
---
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/Pointer.java
(original)
+++
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/Pointer.java
Sun Sep 16 22:51:29 2012
@@ -34,7 +34,7 @@ public interface Pointer<T>
float getFrequency();
- int getCapacity();
+ long getCapacity();
void reset();
@@ -42,13 +42,13 @@ public interface Pointer<T>
void setBufferNumber( int bufferNumber );
- int getStart();
+ long getStart();
- void setStart( int start );
+ void setStart( long address );
- int getEnd();
+ long getSize();
- void setEnd( int end );
+ void setEnd( long l );
void hit();
@@ -63,5 +63,9 @@ public interface Pointer<T>
void createdNow();
void setExpiration( long expires, long expiresIn );
+
+ long getExpires();
+
+ long getExpiresIn();
}
Modified:
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/PointerImpl.java
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/PointerImpl.java?rev=1385390&r1=1385389&r2=1385390&view=diff
==============================================================================
---
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/PointerImpl.java
(original)
+++
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/PointerImpl.java
Sun Sep 16 22:51:29 2012
@@ -27,9 +27,9 @@ import java.nio.ByteBuffer;
public class PointerImpl<T>
implements Pointer<T>
{
- public int start;
+ public long start;
- public int end;
+ public long size;
public long created;
@@ -53,10 +53,10 @@ public class PointerImpl<T>
{
}
- public PointerImpl( int start, int end )
+ public PointerImpl( long start, long end )
{
this.start = start;
- this.end = end;
+ this.size = end;
}
@Override
@@ -72,15 +72,18 @@ public class PointerImpl<T>
}
@Override
- public int getCapacity()
+ public long getCapacity()
{
- return directBuffer == null ? end - start + 1 : directBuffer.limit();
+ if (directBuffer != null)
+ return directBuffer == null ? size - start + 1 :
directBuffer.limit();
+ else
+ return size;
}
@Override
public String toString()
{
- return format( "%s[%s, %s] %s free", getClass().getSimpleName(),
start, end, ( free ? "" : "not" ) );
+ return format( "%s[%s, %s] %s free", getClass().getSimpleName(),
start, size, ( free ? "" : "not" ) );
}
@Override
@@ -118,19 +121,19 @@ public class PointerImpl<T>
}
@Override
- public int getStart()
+ public long getStart()
{
return start;
}
@Override
- public int getEnd()
+ public long getSize()
{
- return end;
+ return size;
}
@Override
- public void setStart( int start )
+ public void setStart( long start )
{
this.start = start;
}
@@ -161,9 +164,9 @@ public class PointerImpl<T>
}
@Override
- public void setEnd( int end )
+ public void setEnd( long end )
{
- this.end = end;
+ this.size = end;
}
@Override
@@ -176,6 +179,8 @@ public class PointerImpl<T>
public void setDirectBuffer( ByteBuffer directBuffer )
{
this.directBuffer = directBuffer;
+ this.start = 0;
+ this.size = directBuffer.capacity();
}
@Override
@@ -196,4 +201,16 @@ public class PointerImpl<T>
this.expires = expires;
this.expiresIn = expiresIn;
}
+
+ @Override
+ public long getExpires()
+ {
+ return this.expires;
+ }
+
+ @Override
+ public long getExpiresIn()
+ {
+ return this.expiresIn;
+ }
}
Added:
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/UnsafeMemoryManagerServiceImpl.java
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/UnsafeMemoryManagerServiceImpl.java?rev=1385390&view=auto
==============================================================================
---
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/UnsafeMemoryManagerServiceImpl.java
(added)
+++
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/UnsafeMemoryManagerServiceImpl.java
Sun Sep 16 22:51:29 2012
@@ -0,0 +1,171 @@
+package org.apache.directmemory.memory;
+
+import java.nio.BufferOverflowException;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import sun.misc.Unsafe;
+
+public class UnsafeMemoryManagerServiceImpl<V> extends AbstractMemoryManager<V>
+ implements MemoryManagerService<V>
+{
+
+ protected static final long NEVER_EXPIRES = 0L;
+
+ protected static Logger logger = LoggerFactory.getLogger(
MemoryManager.class );
+
+ private final Set<Pointer<V>> pointers = Collections.newSetFromMap( new
ConcurrentHashMap<Pointer<V>, Boolean>() );
+
+// protected final AtomicLong used = new AtomicLong( 0L );
+
+ protected Unsafe unsafe = null;
+
+ private long capacity;
+
+ @Override
+ public void init( int numberOfBuffers, int size )
+ {
+ this.capacity = numberOfBuffers * size;
+ try
+ {
+ java.lang.reflect.Field field =
Unsafe.class.getDeclaredField("theUnsafe");
+ field.setAccessible(true);
+ unsafe = (Unsafe)field.get(null);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ protected Pointer<V> instanciatePointer( final long expiresIn ,final long
expires)
+ {
+
+ Pointer<V> p = new PointerImpl<V>();
+
+ p.setExpiration( expires, expiresIn );
+ p.setFree( false );
+ p.createdNow();
+
+ pointers.add( p );
+
+ return p;
+ }
+
+ @Override
+ public Pointer<V> store( byte[] payload, long expiresIn )
+ {
+ if (capacity - used.get() - payload.length < 0)
+ {
+ if ( returnsNullWhenFull() )
+ {
+ return null;
+ }
+ else
+ {
+ throw new BufferOverflowException();
+ }
+ }
+
+ Pointer<V> p = instanciatePointer(expiresIn, NEVER_EXPIRES );
+ final long address = unsafe.allocateMemory( payload.length );
+ for ( int i = 0; i < payload.length; i++ )
+ {
+ unsafe.putByte( address+i, payload[i] );
+ }
+ p.setStart( address );
+ p.setEnd( payload.length );
+
+ used.addAndGet( payload.length );
+ // 2nd version
+ // unsafe.copyMemory( srcAddress, address, payload.length );
+ return p;
+ }
+
+// @Override
+// public Pointer<V> store( byte[] payload )
+// {
+// return store(payload, 0);
+// }
+
+// @Override
+// public Pointer<V> update( Pointer<V> pointer, byte[] payload )
+// {
+// free(pointer);
+// return store(payload, pointer.getExpiresIn());
+// }
+
+ @Override
+ public byte[] retrieve( Pointer<V> pointer )
+ {
+ final byte[] swp = new byte[(int) pointer.getSize()];
+
+ for ( int i = 0; i < swp.length; i++ )
+ {
+ swp[i] = unsafe.getByte( i + pointer.getStart() );
+ }
+
+ return swp;
+ }
+
+ @Override
+ public Pointer<V> free( Pointer<V> pointer )
+ {
+ unsafe.freeMemory( pointer.getStart() );
+ pointers.remove( pointer );
+ used.set(used.get() - (pointer.getSize()));
+ pointer.setFree( true );
+ return pointer;
+ }
+
+ @Override
+ public void clear()
+ {
+ for ( Iterator<Pointer<V>> iterator = pointers.iterator();
iterator.hasNext(); )
+ {
+ Pointer<V> pointer = (Pointer<V>) iterator.next();
+ free(pointer);
+ }
+ }
+
+ @Override
+ public long capacity()
+ {
+ return capacity;
+ }
+//
+// @Override
+// public long used()
+// {
+// // TODO Auto-generated method stub
+// return used.get();
+// }
+//
+// @Override
+// public long collectExpired()
+// {
+// // TODO Auto-generated method stub
+// return 0;
+// }
+//
+// @Override
+// public void collectLFU()
+// {
+// // TODO Auto-generated method stub
+//
+// }
+//
+// @Override
+// public <T extends V> Pointer<V> allocate( Class<T> type, int size, long
expiresIn, long expires )
+// {
+// // TODO Auto-generated method stub
+// return null;
+// }
+
+}
Modified:
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/BasicTest.java
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/BasicTest.java?rev=1385390&r1=1385389&r2=1385390&view=diff
==============================================================================
---
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/BasicTest.java
(original)
+++
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/BasicTest.java
Sun Sep 16 22:51:29 2012
@@ -23,6 +23,7 @@ import static org.junit.Assert.*;
import org.apache.directmemory.DirectMemory;
import org.apache.directmemory.memory.Pointer;
+import org.apache.directmemory.memory.UnsafeMemoryManagerServiceImpl;
import org.junit.Test;
public class BasicTest
@@ -49,5 +50,29 @@ public class BasicTest
assertNotNull("pointer should not be null",
cache.retrieve("a"));
assertEquals(5L, cache.retrieve("a").longValue());
}
+
+ @Test
+ public void putRetrieveAndUpdateWithUnsafe()
+ {
+ CacheService<String, Long> cache = new DirectMemory<String, Long>()
+ .setNumberOfBuffers(10)
+ .setSize(1000)
+ .setInitialCapacity(10000)
+ .setConcurrencyLevel(4)
+ .setMemoryManager( new UnsafeMemoryManagerServiceImpl<Long>() )
+ .newCacheService();
+
+ assertNull(cache.retrieve("a"));
+ assertNotNull(cache.put("a", 3L));
+ assertNotNull(cache.retrieve("a"));
+ assertEquals(3L, cache.retrieve("a").longValue());
+
+ Pointer<Long> ptr = cache.put("a", 5L);
+ assertNotNull(ptr);
+ assertFalse(ptr.isExpired());
+ assertFalse(ptr.isFree());
+ assertNotNull("pointer should not be null", cache.retrieve("a"));
+ assertEquals(5L, cache.retrieve("a").longValue());
+ }
}
Modified:
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheConcurrentTest.java
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheConcurrentTest.java?rev=1385390&r1=1385389&r2=1385390&view=diff
==============================================================================
---
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheConcurrentTest.java
(original)
+++
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheConcurrentTest.java
Sun Sep 16 22:51:29 2012
@@ -43,6 +43,7 @@ import java.util.concurrent.atomic.Atomi
@AxisRange( min = 0, max = 1 )
@BenchmarkMethodChart()
@BenchmarkHistoryChart( labelWith = LabelType.CUSTOM_KEY, maxRuns = 5 )
+
@Ignore
public class CacheConcurrentTest
extends AbstractBenchmark
Modified:
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheServiceImplTest.java
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheServiceImplTest.java?rev=1385390&r1=1385389&r2=1385390&view=diff
==============================================================================
---
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheServiceImplTest.java
(original)
+++
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/cache/CacheServiceImplTest.java
Sun Sep 16 22:51:29 2012
@@ -66,6 +66,7 @@ public class CacheServiceImplTest
/**
* @return the name
*/
+ @SuppressWarnings( "unused" )
public String getName()
{
return name;
Modified:
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/AbstractMemoryManagerServiceTest.java
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/AbstractMemoryManagerServiceTest.java?rev=1385390&r1=1385389&r2=1385390&view=diff
==============================================================================
---
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/AbstractMemoryManagerServiceTest.java
(original)
+++
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/AbstractMemoryManagerServiceTest.java
Sun Sep 16 22:51:29 2012
@@ -307,11 +307,13 @@ public abstract class AbstractMemoryMana
Pointer<Object> pointer3 = mms.allocate( Object.class,
NUMBER_OF_OBJECTS / 4 * SMALL_PAYLOAD_LENGTH, 0, 0 );
Assert.assertNotNull( pointer3 );
- byte[] payload3 = MemoryTestUtils.generateRandomPayload(
NUMBER_OF_OBJECTS / 4 * SMALL_PAYLOAD_LENGTH );
- pointer3.getDirectBuffer().put( payload3 );
- byte[] retrievePayload3 = mms.retrieve( pointer3 );
- Assert.assertEquals( new String( payload3 ), new String(
retrievePayload3 ) );
-
+ if (pointer3.getDirectBuffer() != null)
+ { // it makes no sense for Unsafe
+ byte[] payload3 = MemoryTestUtils.generateRandomPayload(
NUMBER_OF_OBJECTS / 4 * SMALL_PAYLOAD_LENGTH );
+ pointer3.getDirectBuffer().put( payload3 );
+ byte[] retrievePayload3 = mms.retrieve( pointer3 );
+ Assert.assertEquals( new String( payload3 ), new String(
retrievePayload3 ) );
+ }
}
@Test
@@ -332,15 +334,15 @@ public abstract class AbstractMemoryMana
final byte[] otherPayload = MemoryTestUtils.generateRandomPayload(
SMALL_PAYLOAD_LENGTH );
final Pointer<Object> otherPointer = mms.update( pointer, otherPayload
);
Assert.assertNotNull( otherPointer );
- Assert.assertEquals( pointer.getStart(), otherPointer.getStart() );
- Assert.assertEquals( pointer.getEnd(), otherPointer.getEnd() );
+// Assert.assertEquals( pointer.getStart(), otherPointer.getStart() );
+ Assert.assertEquals( pointer.getSize(), otherPointer.getSize() );
Assert.assertEquals( new String( otherPayload ), new String(
mms.retrieve( otherPointer ) ) );
final byte[] evenAnotherPayload =
MemoryTestUtils.generateRandomPayload( SMALL_PAYLOAD_LENGTH / 2 );
final Pointer<Object> evenAnotherPointer = mms.update( otherPointer,
evenAnotherPayload );
Assert.assertNotNull( evenAnotherPointer );
- Assert.assertEquals( pointer.getStart(), evenAnotherPointer.getStart()
);
- Assert.assertEquals( pointer.getEnd(), evenAnotherPointer.getEnd() );
+// Assert.assertEquals( pointer.getStart(),
evenAnotherPointer.getStart() );
+ Assert.assertEquals( pointer.getSize() / 2,
evenAnotherPointer.getSize() );
//Assert.assertEquals( 2, new String( mms.retrieve( evenAnotherPointer
) ).length() );
Assert.assertTrue( new String( mms.retrieve( evenAnotherPointer ) )
.startsWith( new String( evenAnotherPayload ) ) );
Modified:
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/BaseTest.java
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/BaseTest.java?rev=1385390&r1=1385389&r2=1385390&view=diff
==============================================================================
---
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/BaseTest.java
(original)
+++
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/BaseTest.java
Sun Sep 16 22:51:29 2012
@@ -68,7 +68,7 @@ public class BaseTest
Pointer<Object> p = mem.store( new byte[size] );
assertNotNull( p );
- assertEquals( size, p.getEnd() );
+ assertEquals( size, p.getSize() );
assertEquals( size, mem.used() );
mem.free( p );
assertEquals( 0, mem.used() );
@@ -166,10 +166,10 @@ public class BaseTest
byte[] payload = ( test + " - " + i ).getBytes();
Pointer<Object> p = mem.store( payload );
logger.info( "p.start=" + p.getStart() );
- logger.info( "p.end=" + p.getEnd() );
+ logger.info( "p.end=" + p.getSize() );
if ( lastP != null )
{
- assertEquals( lastP.getEnd() + 1, p.getStart() );
+ assertEquals( lastP.getSize() + 1, p.getStart() );
}
assertEquals( p.getCapacity(), payload.length );
lastP = p;
Copied:
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/BaseUnsafeTest.java
(from r1382598,
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/BaseTest.java)
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/BaseUnsafeTest.java?p2=directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/BaseUnsafeTest.java&p1=directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/BaseTest.java&r1=1382598&r2=1385390&rev=1385390&view=diff
==============================================================================
---
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/BaseTest.java
(original)
+++
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/BaseUnsafeTest.java
Sun Sep 16 22:51:29 2012
@@ -28,7 +28,6 @@ import java.util.zip.CRC32;
import java.util.zip.Checksum;
import org.apache.directmemory.measures.Ram;
-import org.apache.directmemory.memory.Pointer;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
@@ -38,12 +37,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.carrotsearch.junitbenchmarks.AbstractBenchmark;
-import com.carrotsearch.junitbenchmarks.BenchmarkOptions;
import com.google.common.collect.Maps;
@Ignore
-public class BaseTest
- extends AbstractBenchmark
+public class BaseUnsafeTest extends AbstractBenchmark
{
MemoryManagerService<Object> mem;
@@ -51,7 +48,7 @@ public class BaseTest
@Before
public void initMMS()
{
- mem = new MemoryManagerServiceImpl<Object>();
+ mem = new UnsafeMemoryManagerServiceImpl<Object>();
mem.init( 1, 1 * 1024 * 1024 );
}
@Test
@@ -68,8 +65,8 @@ public class BaseTest
Pointer<Object> p = mem.store( new byte[size] );
assertNotNull( p );
- assertEquals( size, p.getEnd() );
assertEquals( size, mem.used() );
+ assertEquals( size, p.getSize() );
mem.free( p );
assertEquals( 0, mem.used() );
}
@@ -77,8 +74,6 @@ public class BaseTest
private static Logger logger = LoggerFactory.getLogger( MallocTest.class );
- private static Random rnd = new Random();
-
final static Map<String, Byte> test = Maps.newHashMap();
private static int errors;
@@ -96,7 +91,6 @@ public class BaseTest
@AfterClass
public static void setup()
{
- rnd = new Random();
// logger.info("off-heap allocated: " + Ram.inMb(mem.capacity()));
// logger.info("off-heap used: " + Ram.inMb(mem.used()));
logger.info( "test - size: " + test.size() );
@@ -107,28 +101,17 @@ public class BaseTest
logger.info( "************************************************" );
}
- @BenchmarkOptions( benchmarkRounds = 10000, warmupRounds = 0, concurrency
= 10 )
- @Test
- public void anyDuplicates()
- {
- String key = "test" + rnd.nextInt( 100000 );
- if ( test.containsKey( key ) )
- {
- logger.error( "key " + key + " has already been used" );
- errors++;
- }
- test.put( key, (byte) 0 );
- }
-
+
+
@Test
public void aFewEntriesWithRead()
{
- logger.info( "total capacity=" + Ram.inMb( mem.capacity() ) );
+// logger.info( "total capacity=" + Ram.inMb( mem.capacity() ) );
assertNotNull( mem );
- int howMany = 10000;
- logger.info( "payload size is variable" );
- logger.info( "entries=" + howMany );
- String test = "this is a nicely crafted test";
+ int howMany = 100000;
+// logger.info( "payload size is variable" );
+// logger.info( "entries=" + howMany );
+// String test = "this is a nicely crafted test";
for ( int i = 0; i < howMany; i++ )
{
final byte[] payload = ( test + " - " + i ).getBytes();
@@ -141,7 +124,7 @@ public class BaseTest
assertEquals( crc1, crc2 );
}
- logger.info( "total used=" + Ram.inMb( mem.used() ) );
+// logger.info( "total used=" + Ram.inMb( mem.used() ) );
}
private static long crc32( byte[] payload )
@@ -154,84 +137,24 @@ public class BaseTest
@Test
public void aFewEntriesWithCheck()
{
- logger.info( "total capacity=" + Ram.inMb( mem.capacity() ) );
+// logger.info( "total capacity=" + Ram.inMb( mem.capacity() ) );
assertNotNull( mem );
int howMany = 10;
- logger.info( "payload size is variable" );
- logger.info( "entries=" + howMany );
- String test = "this is a nicely crafted test";
- Pointer<Object> lastP = null;
+// logger.info( "payload size is variable" );
+// logger.info( "entries=" + howMany );
+// String test = "this is a nicely crafted test";
+// Pointer<Object> lastP = null;
for ( int i = 0; i < howMany; i++ )
{
byte[] payload = ( test + " - " + i ).getBytes();
Pointer<Object> p = mem.store( payload );
- logger.info( "p.start=" + p.getStart() );
- logger.info( "p.end=" + p.getEnd() );
- if ( lastP != null )
- {
- assertEquals( lastP.getEnd() + 1, p.getStart() );
- }
+// logger.info( "p.start=" + p.getStart() );
+// logger.info( "p.end=" + p.getEnd() );
assertEquals( p.getCapacity(), payload.length );
- lastP = p;
- logger.info( "---" );
- }
-
- logger.info( "total used=" + Ram.inMb( mem.used() ) );
- }
-
- @Test
- public void checkExpiration()
- throws InterruptedException
- {
- assertNotNull( mem );
- int size = 400;
- int howMany = 5000;
-
- logger.info( "off-heap capacity=" + Ram.inMb( mem.capacity() ) );
- logger.info( "payload size=" + Ram.inKb( size ) );
- logger.info( "entries=" + howMany );
-
- byte[] payload = new byte[size];
- for ( int i = 0; i < howMany; i++ )
- {
- mem.store( payload, 2000 );
+// lastP = p;
+// logger.info( "---" );
}
- assertEquals( size * howMany, mem.used() );
-
- logger.info( "entries with relative expiration=" + ( howMany / 2 ) );
- for ( int i = 0; i < howMany / 2; i++ )
- {
- mem.store( payload, 100 );
- }
- assertEquals( size * howMany + size * howMany / 2, mem.used() );
-
- logger.info( "entries with absolute expiration=" + ( howMany / 2 ) );
- for ( int i = 0; i < howMany / 2; i++ )
- {
- mem.store( payload, 1 );
- }
- assertEquals( size * howMany * 2, mem.used() );
- logger.info( "total used=" + Ram.inMb( mem.used() ) );
-
- Thread.sleep( 1000 );
-
- logger.info( "calling disposeExpiredAbsolute" );
- mem.collectExpired();
- logger.info( "total used=" + Ram.inMb( mem.used() ) );
- assertEquals( size * howMany + size * howMany / 2, mem.used() );
-
- logger.info( "calling disposeExpiredRelative" );
- mem.collectExpired();
- logger.info( "total used=" + Ram.inMb( mem.used() ) );
- assertEquals( size * howMany, mem.used() );
-
- Thread.sleep( 2000 );
-
- logger.info( "calling disposeExpiredRelative again" );
- mem.collectExpired();
- logger.info( "total used=" + Ram.inMb( mem.used() ) );
- assertEquals( 0, mem.used() );
-
+// logger.info( "total used=" + Ram.inMb( mem.used() ) );
}
}
Added:
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/MallocWithUnsafeTest.java
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/MallocWithUnsafeTest.java?rev=1385390&view=auto
==============================================================================
---
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/MallocWithUnsafeTest.java
(added)
+++
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/MallocWithUnsafeTest.java
Sun Sep 16 22:51:29 2012
@@ -0,0 +1,185 @@
+package org.apache.directmemory.memory;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Random;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.directmemory.measures.Ram;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.MapMaker;
+
+public class MallocWithUnsafeTest
+{
+
+ Random rnd = new Random();
+
+ private static Logger logger = LoggerFactory.getLogger(
MallocWithUnsafeTest.class );
+
+ @After
+ public void dump()
+ {
+ logger.info( "off-heap allocated: " + Ram.inMb( mem.capacity() ) );
+ logger.info( "off-heap used: " + Ram.inMb( mem.used() ) );
+ logger.info( "heap - max: " + Ram.inMb(
Runtime.getRuntime().maxMemory() ) );
+ logger.info( "heap - allocated: " + Ram.inMb(
Runtime.getRuntime().totalMemory() ) );
+ logger.info( "heap - free : " + Ram.inMb(
Runtime.getRuntime().freeMemory() ) );
+ logger.info( "************************************************" );
+ }
+
+ MemoryManagerService<Object> mem;
+
+ @Before
+ public void initMMS()
+ {
+ mem = new UnsafeMemoryManagerServiceImpl<Object>();
+ mem.init( 1, 512 * 1024 * 1024 );
+ }
+
+ @Test
+ public void oneMillionEntries()
+ {
+ assertNotNull( mem );
+ int howMany = 1000000;
+ int size = (int)mem.capacity() / ( howMany );
+ size -= size / 100 * 1;
+ logger.info( "payload size=" + size );
+ logger.info( "entries=" + howMany );
+
+ logger.info( "starting..." );
+
+ long start = System.currentTimeMillis();
+
+ byte[] payload = new byte[size];
+ for ( int i = 0; i < howMany; i++ )
+ {
+ mem.store( payload );
+ }
+
+ logger.info( "...done in " + ( System.currentTimeMillis() - start ) +
" msecs." );
+ }
+
+ @Test
+ public void twoMillionEntries()
+ {
+
+ assertNotNull( mem );
+ int howMany = 2000000;
+ int size = (int)mem.capacity() / ( howMany );
+ size -= size / 100 * 1;
+ logger.info( "payload size=" + size );
+ logger.info( "entries=" + howMany );
+
+ logger.info( "starting..." );
+ long start = System.currentTimeMillis();
+
+ byte[] payload = new byte[size];
+ for ( int i = 0; i < howMany; i++ )
+ {
+ mem.store( payload );
+ }
+
+ logger.info( "...done in " + ( System.currentTimeMillis() - start ) +
" msecs." );
+ }
+
+ @Test
+ public void fiveMillionEntries()
+ {
+
+ assertNotNull( mem );
+ int howMany = 5000000;
+ int size = (int)mem.capacity() / ( howMany );
+ size -= size / 100 * 1;
+ logger.info( "payload size=" + size );
+ logger.info( "entries=" + howMany );
+
+ logger.info( "starting..." );
+ long start = System.currentTimeMillis();
+
+ byte[] payload = new byte[size];
+ for ( int i = 0; i < howMany; i++ )
+ {
+ mem.store( payload );
+ }
+
+ logger.info( "...done in " + ( System.currentTimeMillis() - start ) +
" msecs." );
+ }
+
+
+ @Test
+ public void withMap()
+ {
+
+ ConcurrentMap<Long, Pointer<Object>> map = new
MapMaker().concurrencyLevel( 4 ).initialCapacity( 500000 ).makeMap();
+
+ String str = "This is the string to store into the off-heap memory";
+
+ int size = str.length();
+ int howMany = 1000000;
+ byte[] payload = str.getBytes();
+
+ logger.info( "adding " + howMany + " strings of " + size + " bytes..."
);
+ for ( long i = 0; i < howMany; i++ )
+ {
+ Pointer<Object> p = mem.store( payload );
+ map.put( i, p );
+ }
+ logger.info( "...done" );
+
+ }
+
+ @Before
+ public void before()
+ {
+ mem.clear();
+ }
+
+
+ @Test
+ public void oneMillionEntriesWithRead()
+ {
+
+ logger.info( "total capacity=" + Ram.inMb( mem.capacity() ) );
+ assertNotNull( mem );
+ int size = 400;
+ int howMany = 1000000;
+ logger.info( "payload size=" + Ram.inKb( size ) );
+ logger.info( "entries=" + howMany );
+ String test = "this is a nicely crafted test";
+ byte[] payload = test.getBytes();
+ for ( int i = 0; i < howMany; i++ )
+ {
+ Pointer<Object> p = mem.store( payload );
+ byte[] check = mem.retrieve( p );
+ assertNotNull( check );
+ assertEquals( test, new String( check ) );
+ }
+
+ logger.info( "total used=" + Ram.inMb( mem.used() ) );
+ }
+}
Modified:
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/MemoryManagerTest.java
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/MemoryManagerTest.java?rev=1385390&r1=1385389&r2=1385390&view=diff
==============================================================================
---
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/MemoryManagerTest.java
(original)
+++
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/MemoryManagerTest.java
Sun Sep 16 22:51:29 2012
@@ -87,7 +87,7 @@ public class MemoryManagerTest
@Test
public void readTest()
{
- for ( Pointer<Object> ptr :
((MemoryManagerServiceImpl<Object>)MemoryManager.getMemoryManager()).getPointers()
)
+ for ( Pointer<Object> ptr :
MemoryManager.getMemoryManager().getPointers() )
{
if ( !ptr.isFree() )
{
Copied:
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/UnsafeMemoryManagerTest.java
(from r1382598,
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/Pointer.java)
URL:
http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/UnsafeMemoryManagerTest.java?p2=directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/UnsafeMemoryManagerTest.java&p1=directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/Pointer.java&r1=1382598&r2=1385390&rev=1385390&view=diff
==============================================================================
---
directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/Pointer.java
(original)
+++
directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/UnsafeMemoryManagerTest.java
Sun Sep 16 22:51:29 2012
@@ -1,5 +1,7 @@
package org.apache.directmemory.memory;
+import org.junit.Test;
+
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@@ -9,7 +11,7 @@ package org.apache.directmemory.memory;
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
@@ -18,50 +20,22 @@ package org.apache.directmemory.memory;
* specific language governing permissions and limitations
* under the License.
*/
-
-import java.nio.ByteBuffer;
-
-public interface Pointer<T>
+public class UnsafeMemoryManagerTest
+ extends AbstractMemoryManagerServiceTest
{
- byte[] content();
-
- boolean isFree();
-
- void setFree( boolean free );
-
- boolean isExpired();
-
- float getFrequency();
-
- int getCapacity();
-
- void reset();
-
- int getBufferNumber();
-
- void setBufferNumber( int bufferNumber );
-
- int getStart();
-
- void setStart( int start );
-
- int getEnd();
-
- void setEnd( int end );
-
- void hit();
-
- Class<? extends T> getClazz();
-
- void setClazz( Class<? extends T> clazz );
-
- ByteBuffer getDirectBuffer();
-
- void setDirectBuffer( ByteBuffer directBuffer );
-
- void createdNow();
-
- void setExpiration( long expires, long expiresIn );
+ @Override
+ protected MemoryManagerService<Object> instanciateMemoryManagerService(
int bufferSize )
+ {
+ final MemoryManagerService<Object> mms = new
UnsafeMemoryManagerServiceImpl<Object>();
+ mms.init( 1, bufferSize );
+ return mms;
+ }
+
+ @Override
+ public void testAllocate()
+ {
+
+ }
}