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