You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directmemory.apache.org by ra...@apache.org on 2011/12/08 12:14:53 UTC

svn commit: r1211830 - in /incubator/directmemory/trunk/directmemory-cache/src: main/java/org/apache/directmemory/cache/ main/java/org/apache/directmemory/memory/ test/java/org/apache/directmemory/memory/test/

Author: raffaeleguidi
Date: Thu Dec  8 11:14:53 2011
New Revision: 1211830

URL: http://svn.apache.org/viewvc?rev=1211830&view=rev
Log:
Added a MemoryManager.allocate(<size>) that returns a Pointer. The pointer in this case contains a directBuffer property which contains a slice() of the original ByteBuffer with the limit() set to <size>. The method does not allow to express an expiry date (yet).

Fixes https://issues.apache.org/jira/browse/DIRECTMEMORY-37

Added:
    incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/NIOTests.java
Modified:
    incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/cache/Cache.java
    incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManager.java
    incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerService.java
    incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerServiceImpl.java
    incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/OffHeapMemoryBuffer.java
    incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/Pointer.java
    incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/MallocTests.java
    incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/MemoryManagerTests.java

Modified: incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/cache/Cache.java
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/cache/Cache.java?rev=1211830&r1=1211829&r2=1211830&view=diff
==============================================================================
--- incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/cache/Cache.java (original)
+++ incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/cache/Cache.java Thu Dec  8 11:14:53 2011
@@ -31,7 +31,7 @@ import org.slf4j.LoggerFactory;
 
 public class Cache {
 
-	private static Logger logger = LoggerFactory.getLogger(Cache.class);
+  private static Logger logger = LoggerFactory.getLogger(Cache.class);
   private static MemoryManagerService memoryManager = MemoryManager.getMemoryManager();
   private static CacheService cacheService = new CacheServiceImpl(memoryManager);
 

Modified: incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManager.java
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManager.java?rev=1211830&r1=1211829&r2=1211830&view=diff
==============================================================================
--- incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManager.java (original)
+++ incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManager.java Thu Dec  8 11:14:53 2011
@@ -83,4 +83,8 @@ public class MemoryManager {
   public static MemoryManagerService getMemoryManager() {
     return memoryManager;
   }
+
+  public static Pointer allocate(int size) {
+	return memoryManager.allocate(size ,-1, -1); //add a version with expiry
+  }
 }

Modified: incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerService.java
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerService.java?rev=1211830&r1=1211829&r2=1211830&view=diff
==============================================================================
--- incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerService.java (original)
+++ incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/MemoryManagerService.java Thu Dec  8 11:14:53 2011
@@ -48,4 +48,6 @@ public interface MemoryManagerService {
 
   public OffHeapMemoryBuffer getActiveBuffer();
 
+  public Pointer allocate(int size, int expiresIn, int expires);
+
 }

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=1211830&r1=1211829&r2=1211830&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 Thu Dec  8 11:14:53 2011
@@ -127,4 +127,19 @@ public class MemoryManagerServiceImpl im
   public void setActiveBuffer(OffHeapMemoryBuffer activeBuffer) {
     this.activeBuffer = activeBuffer;
   }
+
+@Override
+public Pointer allocate(int size, int expiresIn, int expires) {
+    Pointer p = activeBuffer.allocate(size, expiresIn, expires);
+    if (p == null) {
+      if (activeBuffer.bufferNumber + 1 == buffers.size()) {
+        return null;
+      } else {
+        // try next buffer
+        activeBuffer = buffers.get(activeBuffer.bufferNumber + 1);
+        p = activeBuffer.allocate(size, expiresIn, expires);
+      }
+    }
+    return p;
+}
 }

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=1211830&r1=1211829&r2=1211830&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 Thu Dec  8 11:14:53 2011
@@ -281,5 +281,36 @@ public class OffHeapMemoryBuffer {
 		free(pointer);
 		return store(payload);
 	}
+
+	public Pointer allocate(int size, int expiresIn, int expires) {
+		Pointer goodOne = firstMatch(size);
+		
+		if (goodOne == null ) {
+			allocationErrors++;
+			throw new NullPointerException("did not find a suitable buffer " + allocationErrors + " times since last cleanup");
+		}
+		
+		Pointer fresh = slice(goodOne, size);
+
+
+		fresh.created = System.currentTimeMillis();
+		if (expiresIn > 0) {
+			fresh.expiresIn = expiresIn;
+			fresh.expires = 0;
+		} else if (expires > 0) {
+			fresh.expiresIn = 0;
+			fresh.expires = expires;
+		}
+		
+		fresh.free = false;
+		used.addAndGet(size);
+		ByteBuffer buf = buffer.slice();
+		buf.position(fresh.start);
+		buf.limit(size);
+		
+		fresh.directBuffer = buf;
+		pointers.add(fresh);
+		return fresh;	
+	}
 	
 }

Modified: incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/Pointer.java
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/Pointer.java?rev=1211830&r1=1211829&r2=1211830&view=diff
==============================================================================
--- incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/Pointer.java (original)
+++ incubator/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/memory/Pointer.java Thu Dec  8 11:14:53 2011
@@ -1,5 +1,7 @@
 package org.apache.directmemory.memory;
 
+import java.nio.ByteBuffer;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -30,6 +32,7 @@ public class Pointer {
 	public long lastHit;
 	public int bufferNumber;
 	public Class<? extends Object> clazz;
+	public ByteBuffer directBuffer = null;
 	
 	public byte[] content() {
 		return null;

Modified: incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/MallocTests.java
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/MallocTests.java?rev=1211830&r1=1211829&r2=1211830&view=diff
==============================================================================
--- incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/MallocTests.java (original)
+++ incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/MallocTests.java Thu Dec  8 11:14:53 2011
@@ -30,15 +30,12 @@ import org.apache.directmemory.memory.Of
 import org.apache.directmemory.memory.Pointer;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.MethodRule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.carrotsearch.junitbenchmarks.AbstractBenchmark;
 import com.carrotsearch.junitbenchmarks.BenchmarkOptions;
-import com.carrotsearch.junitbenchmarks.BenchmarkRule;
 import com.carrotsearch.junitbenchmarks.annotation.AxisRange;
 import com.carrotsearch.junitbenchmarks.annotation.BenchmarkHistoryChart;
 import com.carrotsearch.junitbenchmarks.annotation.BenchmarkMethodChart;

Modified: incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/MemoryManagerTests.java
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/MemoryManagerTests.java?rev=1211830&r1=1211829&r2=1211830&view=diff
==============================================================================
--- incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/MemoryManagerTests.java (original)
+++ incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/MemoryManagerTests.java Thu Dec  8 11:14:53 2011
@@ -19,9 +19,7 @@ package org.apache.directmemory.memory.t
  * under the License.
  */
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
+import static org.junit.Assert.*;
 import java.util.Map;
 import java.util.Random;
 

Added: incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/NIOTests.java
URL: http://svn.apache.org/viewvc/incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/NIOTests.java?rev=1211830&view=auto
==============================================================================
--- incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/NIOTests.java (added)
+++ incubator/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/memory/test/NIOTests.java Thu Dec  8 11:14:53 2011
@@ -0,0 +1,71 @@
+package org.apache.directmemory.memory.test;
+
+/*
+ * 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 static org.junit.Assert.assertTrue;
+
+import java.nio.ByteBuffer;
+import java.util.Random;
+
+import org.apache.directmemory.measures.Ram;
+import org.apache.directmemory.memory.MemoryManager;
+import org.apache.directmemory.memory.Pointer;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NIOTests {
+
+  private static Logger logger = LoggerFactory.getLogger(NIOTests.class);
+	
+	@BeforeClass
+	public static void init() {
+		logger.info("init");
+		MemoryManager.init(1, Ram.Mb(100));
+	}
+	
+	@Test
+	public void NIOTest() {
+		Random rnd = new Random();
+		int size = rnd.nextInt(10) * (int)MemoryManager.capacity() / 100;
+		logger.info("payload size=" + Ram.inKb(size));
+		Pointer p = MemoryManager.allocate(size);
+		ByteBuffer b = p.directBuffer;
+		logger.info("allocated");
+		assertNotNull(p);
+		assertNotNull(b);
+		
+		assertTrue(b.isDirect());
+		assertEquals(0, b.position());
+		assertEquals(size, b.limit());
+		
+		//assertEquals(size,p.end);
+    assertEquals(size,p.end-p.start); 
+		assertEquals(size, MemoryManager.getActiveBuffer().used());
+		MemoryManager.free(p);
+		assertEquals(0, MemoryManager.getActiveBuffer().used());
+		logger.info("end");
+	}
+
+
+}