diff --git a/bindings/java/src/main/com/apple/foundationdb/BufferPool.java b/bindings/java/src/main/com/apple/foundationdb/BufferPool.java index a7c5fb9fcf..66ee5d7db2 100644 --- a/bindings/java/src/main/com/apple/foundationdb/BufferPool.java +++ b/bindings/java/src/main/com/apple/foundationdb/BufferPool.java @@ -33,6 +33,8 @@ import java.util.concurrent.CompletableFuture; class DirectBufferPool { static final DirectBufferPool __instance = new DirectBufferPool(); + // When tuning this, make sure that the size of the buffer, + // is always greater than the maximum size KV allowed by FDB. static private final int DEFAULT_NUM_BUFFERS = 128; static private final int DEFAULT_BUFFER_SIZE = 1024 * 512; diff --git a/bindings/java/src/main/com/apple/foundationdb/FDBTransaction.java b/bindings/java/src/main/com/apple/foundationdb/FDBTransaction.java index 967c9e16ec..80788f89a3 100644 --- a/bindings/java/src/main/com/apple/foundationdb/FDBTransaction.java +++ b/bindings/java/src/main/com/apple/foundationdb/FDBTransaction.java @@ -37,6 +37,7 @@ class FDBTransaction extends NativeObjectWrapper implements Transaction, OptionC private final TransactionOptions options; private boolean transactionOwner; + private boolean enableDirectBufferQueries = false; public final ReadTransaction snapshot; @@ -283,6 +284,17 @@ class FDBTransaction extends NativeObjectWrapper implements Transaction, OptionC return this.getEstimatedRangeSizeBytes(range.begin, range.end); } + /////////////////// + // Feature Options + /////////////////// + + /** + * Use DirectByteBuffers to fetch getRange() results. + */ + public void setDirectBufferQueryEnabled(boolean v) { + enableDirectBufferQueries = v; + } + /////////////////// // getRange -> KeySelectors /////////////////// @@ -373,7 +385,7 @@ class FDBTransaction extends NativeObjectWrapper implements Transaction, OptionC return new FutureResults(Transaction_getRange( getPtr(), begin.getKey(), begin.orEqual(), begin.getOffset(), end.getKey(), end.orEqual(), end.getOffset(), rowLimit, targetBytes, - streamingMode, iteration, isSnapshot, reverse), executor); + streamingMode, iteration, isSnapshot, reverse), enableDirectBufferQueries, executor); } finally { pointerReadLock.unlock(); } diff --git a/bindings/java/src/main/com/apple/foundationdb/FutureResults.java b/bindings/java/src/main/com/apple/foundationdb/FutureResults.java index 731866bb64..715e2bf569 100644 --- a/bindings/java/src/main/com/apple/foundationdb/FutureResults.java +++ b/bindings/java/src/main/com/apple/foundationdb/FutureResults.java @@ -24,9 +24,10 @@ import java.nio.ByteBuffer; import java.util.concurrent.Executor; class FutureResults extends NativeFuture<RangeResultInfo> { - FutureResults(long cPtr, Executor executor) { + FutureResults(long cPtr, boolean enableDirectBufferQueries, Executor executor) { super(cPtr); registerMarshalCallback(executor); + this.enableDirectBufferQueries = enableDirectBufferQueries; } @Override @@ -46,7 +47,9 @@ class FutureResults extends NativeFuture<RangeResultInfo> { } public RangeResult getResults() { - DirectBufferIterator directIterator = new DirectBufferIterator(); + DirectBufferIterator directIterator = enableDirectBufferQueries + ? new DirectBufferIterator() + : null; try { pointerReadLock.lock(); if (directIterator.getBuffer() != null) { @@ -61,6 +64,8 @@ class FutureResults extends NativeFuture<RangeResultInfo> { } } + private boolean enableDirectBufferQueries = false; + private native RangeResult FutureResults_get(long cPtr) throws FDBException; private native void FutureResults_getDirect(long cPtr, ByteBuffer buffer, int capacity) throws FDBException;