NvmfRegisteredBufferCache: simplify

Simplify buffer cache by do not hold references to CrailBuffers.
We only return the corresponding key now instead of a wrapped
KeyedNativeBuffer.

Signed-off-by: Jonas Pfefferle <peppe...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/incubator-crail/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-crail/commit/db754995
Tree: http://git-wip-us.apache.org/repos/asf/incubator-crail/tree/db754995
Diff: http://git-wip-us.apache.org/repos/asf/incubator-crail/diff/db754995

Branch: refs/heads/master
Commit: db754995cb9ce42e97bbd131a117a315877c31f0
Parents: 50cf268
Author: Jonas Pfefferle <peppe...@apache.org>
Authored: Mon Apr 9 15:22:41 2018 +0200
Committer: Jonas Pfefferle <peppe...@apache.org>
Committed: Tue Apr 10 13:19:02 2018 +0200

----------------------------------------------------------------------
 storage-nvmf/pom.xml                            |  2 +-
 .../nvmf/client/NvmfRegisteredBufferCache.java  | 51 ++++----------------
 .../nvmf/client/NvmfStorageEndpoint.java        |  9 ++--
 3 files changed, 15 insertions(+), 47 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-crail/blob/db754995/storage-nvmf/pom.xml
----------------------------------------------------------------------
diff --git a/storage-nvmf/pom.xml b/storage-nvmf/pom.xml
index 20ad294..0e06569 100644
--- a/storage-nvmf/pom.xml
+++ b/storage-nvmf/pom.xml
@@ -24,7 +24,7 @@
     <dependency>
       <groupId>com.ibm.jnvmf</groupId>
       <artifactId>jnvmf</artifactId>
-      <version>1.0</version>
+      <version>1.2</version>
     </dependency>
     <dependency>
       <groupId>log4j</groupId>

http://git-wip-us.apache.org/repos/asf/incubator-crail/blob/db754995/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfRegisteredBufferCache.java
----------------------------------------------------------------------
diff --git 
a/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfRegisteredBufferCache.java
 
b/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfRegisteredBufferCache.java
index 0a364e8..ec9ee52 100644
--- 
a/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfRegisteredBufferCache.java
+++ 
b/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfRegisteredBufferCache.java
@@ -21,7 +21,6 @@ package org.apache.crail.storage.nvmf.client;
 
 import com.ibm.jnvmf.Freeable;
 import com.ibm.jnvmf.KeyedNativeBuffer;
-import com.ibm.jnvmf.NativeByteBuffer;
 import com.ibm.jnvmf.QueuePair;
 import org.apache.crail.CrailBuffer;
 
@@ -31,68 +30,36 @@ import java.util.concurrent.ConcurrentHashMap;
 
 class NvmfRegisteredBufferCache implements Freeable {
        private final QueuePair queuePair;
-       private final Map<CrailBuffer, KeyedNativeBuffer> bufferMap;
        private final Map<Long, KeyedNativeBuffer> regionMap;
        private boolean valid;
 
        public NvmfRegisteredBufferCache(QueuePair queuePair) {
                this.queuePair = queuePair;
-               this.bufferMap = new ConcurrentHashMap<>();
                this.regionMap = new ConcurrentHashMap<>();
                this.valid = true;
        }
 
-       static class Buffer extends NativeByteBuffer implements 
KeyedNativeBuffer {
-               private final KeyedNativeBuffer registeredRegionBuffer;
-
-               Buffer(CrailBuffer buffer, KeyedNativeBuffer 
registeredRegionBuffer) {
-                       super(buffer.getByteBuffer());
-                       this.registeredRegionBuffer = registeredRegionBuffer;
-               }
-
-               @Override
-               public int getRemoteKey() {
-                       return registeredRegionBuffer.getRemoteKey();
-               }
-
-               @Override
-               public int getLocalKey() {
-                       return registeredRegionBuffer.getLocalKey();
-               }
-       }
-
-       KeyedNativeBuffer get(CrailBuffer buffer) throws IOException {
-               KeyedNativeBuffer keyedNativeBuffer = bufferMap.get(buffer);
+       int getRemoteKey(CrailBuffer buffer) throws IOException {
+               CrailBuffer regionBuffer = buffer.getRegion();
+               KeyedNativeBuffer keyedNativeBuffer = 
regionMap.get(regionBuffer.address());
                if (keyedNativeBuffer == null) {
-                       CrailBuffer regionBuffer = buffer.getRegion();
-                       keyedNativeBuffer = 
regionMap.get(regionBuffer.address());
-                       if (keyedNativeBuffer == null) {
-                               /* region has not been registered yet */
-                               keyedNativeBuffer = 
queuePair.registerMemory(regionBuffer.getByteBuffer());
-                               KeyedNativeBuffer prevKeyedNativeBuffer =
-                                               
regionMap.putIfAbsent(keyedNativeBuffer.getAddress(), keyedNativeBuffer);
-                               if (prevKeyedNativeBuffer != null) {
-                                       /* someone registered the same region 
in parallel */
-                                       keyedNativeBuffer.free();
-                                       keyedNativeBuffer = 
prevKeyedNativeBuffer;
-                               }
-                       }
-                       keyedNativeBuffer = new Buffer(buffer, 
keyedNativeBuffer);
+                       /* region has not been registered yet */
+                       keyedNativeBuffer = 
queuePair.registerMemory(regionBuffer.getByteBuffer());
                        KeyedNativeBuffer prevKeyedNativeBuffer =
-                                       bufferMap.putIfAbsent(buffer, 
keyedNativeBuffer);
+                                       
regionMap.putIfAbsent(keyedNativeBuffer.getAddress(), keyedNativeBuffer);
                        if (prevKeyedNativeBuffer != null) {
-                               /* someone added the same buffer parallel */
+                               /* someone registered the same region in 
parallel */
                                keyedNativeBuffer.free();
                                keyedNativeBuffer = prevKeyedNativeBuffer;
                        }
                }
-               return keyedNativeBuffer;
+               return keyedNativeBuffer.getRemoteKey();
        }
 
 
        @Override
        public void free() throws IOException {
-               for (KeyedNativeBuffer buffer : bufferMap.values()) {
+               for (KeyedNativeBuffer buffer : regionMap.values()) {
                        buffer.free();
                }
                valid = false;

http://git-wip-us.apache.org/repos/asf/incubator-crail/blob/db754995/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfStorageEndpoint.java
----------------------------------------------------------------------
diff --git 
a/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfStorageEndpoint.java
 
b/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfStorageEndpoint.java
index 8188d82..e17a013 100644
--- 
a/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfStorageEndpoint.java
+++ 
b/storage-nvmf/src/main/java/org/apache/crail/storage/nvmf/client/NvmfStorageEndpoint.java
@@ -206,10 +206,11 @@ public class NvmfStorageEndpoint implements 
StorageEndpoint {
                /* TODO: on read this potentially overwrites data beyond the 
set limit */
                short numLogicalBlocks = (short)(getNumLogicalBlocks(buffer) - 
1);
                sqe.setNumberOfLogicalBlocks(numLogicalBlocks);
-               KeyedNativeBuffer registeredBuffer = 
registeredBufferCache.get(buffer);
-               registeredBuffer.position(buffer.position());
-               registeredBuffer.limit(registeredBuffer.position() + 
(numLogicalBlocks + 1) * getLBADataSize());
-               command.getCommandCapsule().setSglDescriptor(registeredBuffer);
+               int remoteKey = registeredBufferCache.getRemoteKey(buffer);
+               KeyedSglDataBlockDescriptor dataBlockDescriptor = 
sqe.getKeyedSglDataBlockDescriptor();
+               dataBlockDescriptor.setAddress(buffer.address() + 
buffer.position());
+               dataBlockDescriptor.setLength(buffer.remaining());
+               dataBlockDescriptor.setKey(remoteKey);
 
                command.execute(response);
 

Reply via email to