From 2b23ee28bd520eda3fb12b2b43f9ff24a3fd1004 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20M=C3=A9riaux?= Date: Thu, 15 Apr 2021 22:13:43 +0200 Subject: [PATCH 1/5] expose write buffer manager method through Java Api --- java/rocksjni/write_buffer_manager.cc | 41 ++++++++++++++ .../java/org/rocksdb/WriteBufferManager.java | 55 +++++++++++++++++-- 2 files changed, 90 insertions(+), 6 deletions(-) diff --git a/java/rocksjni/write_buffer_manager.cc b/java/rocksjni/write_buffer_manager.cc index a52daed7d11..eb1800b6b30 100644 --- a/java/rocksjni/write_buffer_manager.cc +++ b/java/rocksjni/write_buffer_manager.cc @@ -40,3 +40,44 @@ void Java_org_rocksdb_WriteBufferManager_disposeInternal( assert(write_buffer_manager != nullptr); delete write_buffer_manager; } + +/* + * Class: org_rocksdb_WriteBufferManager + * Method: getMemoryUsage + * Signature: (J)J + */ +jlong Java_org_rocksdb_WriteBufferManager_getMemoryUsage(JNIEnv* /*env*/, + jclass, + jlong jhandle) { + auto* write_buffer_manager = + reinterpret_cast*>( + jhandle); + return static_cast(write_buffer_manager->memory_usage()); +} + +/* + * Class: org_rocksdb_WriteBufferManager + * Method: getMutableMemtableMemoryUsage + * Signature: (J)J + */ +jlong Java_org_rocksdb_WriteBufferManager_getMutableMemtableMemoryUsage( + JNIEnv* /*env*/, jclass, jlong jhandle) { + auto* write_buffer_manager = + reinterpret_cast < + std::shared_ptr(jhandle); + return static_cast( + write_buffer_manager->mutable_memtable_memory_usage()); +} + +/* + * Class: org_rocksdb_WriteBufferManager + * Method: getBufferSize + * Signature: (J)J + */ +jlong Java_org_rocksdb_WriteBufferManager_getBufferSize(JNIEnv*, jclass, + jlong jhandle) { + auto* write_buffer_manager = + reinterpret_cast < + std::shared_ptr(jhandle); + return static_cast(write_buffer_manager->buffer_size()); +} \ No newline at end of file diff --git a/java/src/main/java/org/rocksdb/WriteBufferManager.java b/java/src/main/java/org/rocksdb/WriteBufferManager.java index b244aa9522d..657615241ec 100644 --- a/java/src/main/java/org/rocksdb/WriteBufferManager.java +++ b/java/src/main/java/org/rocksdb/WriteBufferManager.java @@ -16,18 +16,61 @@ public class WriteBufferManager extends RocksObject { /** * Construct a new instance of WriteBufferManager. * - * Check - * https://github.com/facebook/rocksdb/wiki/Write-Buffer-Manager - * for more details on when to use it + * Check + * + * https://github.com/facebook/rocksdb/wiki/Write-Buffer-Manager for more + * details on when to use it * - * @param bufferSizeBytes buffer size(in bytes) to use for native write_buffer_manager - * @param cache cache whose memory should be bounded by this write buffer manager + * @param bufferSizeBytes buffer size(in bytes) to use for native + * write_buffer_manager + * @param cache cache whose memory should be bounded by this write + * buffer manager */ - public WriteBufferManager(final long bufferSizeBytes, final Cache cache){ + public WriteBufferManager(final long bufferSizeBytes, final Cache cache) { super(newWriteBufferManager(bufferSizeBytes, cache.nativeHandle_)); } + /** + * Returns the buffer size of the write buffer manager + * + * @return buffer size. + * + */ + public long getBufferSize() { + assert (isOwningHandle()); + return getBufferSize(this.nativeHandle_); + } + + /** + * Returns the memory usage of the write buffer manager + * + * @return memory usage. + * + */ + public long getMemoryUsage() { + assert (isOwningHandle()); + return getMemoryUsage(this.nativeHandle_); + } + + /** + * Returns the mutable memtable memory usage of the write buffer manager + * + * @return mutable memtable memory usage size. + * + */ + public long getMutableMemtableMemoryUsage() { + assert (isOwningHandle()); + return getMutableMemtableMemoryUsage(this.nativeHandle_); + } + private native static long newWriteBufferManager(final long bufferSizeBytes, final long cacheHandle); + + private native static long getMemoryUsage(final long handle); + + private native static long getMutableMemtableMemoryUsage(final long handle); + + private native static long getBufferSize(final long handle); + @Override protected native void disposeInternal(final long handle); } From c4e81c28a1c983663a419763f2ef91b3c347c6ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20M=C3=A9riaux?= Date: Fri, 16 Apr 2021 11:15:50 +0200 Subject: [PATCH 2/5] fix build and expose write buffer manager constructor without cache --- java/rocksjni/write_buffer_manager.cc | 31 ++++++++++++++----- .../java/org/rocksdb/WriteBufferManager.java | 17 ++++++++++ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/java/rocksjni/write_buffer_manager.cc b/java/rocksjni/write_buffer_manager.cc index eb1800b6b30..df78af91c75 100644 --- a/java/rocksjni/write_buffer_manager.cc +++ b/java/rocksjni/write_buffer_manager.cc @@ -27,6 +27,20 @@ jlong Java_org_rocksdb_WriteBufferManager_newWriteBufferManager( return reinterpret_cast(write_buffer_manager); } +/* + * Class: org_rocksdb_WriteBufferManager + * Method: newWriteBufferManager + * Signature: (JJ)J + */ +jlong Java_org_rocksdb_WriteBufferManager_newWriteBufferManager( + JNIEnv* /*env*/, jclass /*jclazz*/, jlong jbuffer_size) { + auto* write_buffer_manager = + new std::shared_ptr( + std::make_shared(jbuffer_size, + nullptr)); + return reinterpret_cast(write_buffer_manager); +} + /* * Class: org_rocksdb_WriteBufferManager * Method: disposeInternal @@ -47,11 +61,14 @@ void Java_org_rocksdb_WriteBufferManager_disposeInternal( * Signature: (J)J */ jlong Java_org_rocksdb_WriteBufferManager_getMemoryUsage(JNIEnv* /*env*/, - jclass, + jobject, jlong jhandle) { auto* write_buffer_manager = reinterpret_cast*>( jhandle); + auto* write_buffer_manager = + reinterpret_cast*>( + jhandle); return static_cast(write_buffer_manager->memory_usage()); } @@ -61,10 +78,10 @@ jlong Java_org_rocksdb_WriteBufferManager_getMemoryUsage(JNIEnv* /*env*/, * Signature: (J)J */ jlong Java_org_rocksdb_WriteBufferManager_getMutableMemtableMemoryUsage( - JNIEnv* /*env*/, jclass, jlong jhandle) { + JNIEnv* /*env*/, jobject, jlong jhandle) { auto* write_buffer_manager = - reinterpret_cast < - std::shared_ptr(jhandle); + reinterpret_cast*>( + jhandle); return static_cast( write_buffer_manager->mutable_memtable_memory_usage()); } @@ -74,10 +91,10 @@ jlong Java_org_rocksdb_WriteBufferManager_getMutableMemtableMemoryUsage( * Method: getBufferSize * Signature: (J)J */ -jlong Java_org_rocksdb_WriteBufferManager_getBufferSize(JNIEnv*, jclass, +jlong Java_org_rocksdb_WriteBufferManager_getBufferSize(JNIEnv*, jobject, jlong jhandle) { auto* write_buffer_manager = - reinterpret_cast < - std::shared_ptr(jhandle); + reinterpret_cast*>( + jhandle); return static_cast(write_buffer_manager->buffer_size()); } \ No newline at end of file diff --git a/java/src/main/java/org/rocksdb/WriteBufferManager.java b/java/src/main/java/org/rocksdb/WriteBufferManager.java index 657615241ec..73a28752c3d 100644 --- a/java/src/main/java/org/rocksdb/WriteBufferManager.java +++ b/java/src/main/java/org/rocksdb/WriteBufferManager.java @@ -30,6 +30,21 @@ public WriteBufferManager(final long bufferSizeBytes, final Cache cache) { super(newWriteBufferManager(bufferSizeBytes, cache.nativeHandle_)); } + /** + * Construct a new instance of WriteBufferManager. + * + * Check + * + * https://github.com/facebook/rocksdb/wiki/Write-Buffer-Manager for more + * details on when to use it + * + * @param bufferSizeBytes buffer size(in bytes) to use for native + * write_buffer_manager + */ + public WriteBufferManager(final long bufferSizeBytes) { + super(newWriteBufferManager(bufferSizeBytes)); + } + /** * Returns the buffer size of the write buffer manager * @@ -65,6 +80,8 @@ public long getMutableMemtableMemoryUsage() { private native static long newWriteBufferManager(final long bufferSizeBytes, final long cacheHandle); + private native static long newWriteBufferManager(final long bufferSizeBytes); + private native static long getMemoryUsage(final long handle); private native static long getMutableMemtableMemoryUsage(final long handle); From 0b9108149131646591e9567b96b22457ce2e220a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20M=C3=A9riaux?= Date: Mon, 19 Apr 2021 17:16:18 +0200 Subject: [PATCH 3/5] fix build --- java/rocksjni/write_buffer_manager.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/java/rocksjni/write_buffer_manager.cc b/java/rocksjni/write_buffer_manager.cc index df78af91c75..8be2d33bc51 100644 --- a/java/rocksjni/write_buffer_manager.cc +++ b/java/rocksjni/write_buffer_manager.cc @@ -66,10 +66,8 @@ jlong Java_org_rocksdb_WriteBufferManager_getMemoryUsage(JNIEnv* /*env*/, auto* write_buffer_manager = reinterpret_cast*>( jhandle); - auto* write_buffer_manager = - reinterpret_cast*>( - jhandle); - return static_cast(write_buffer_manager->memory_usage()); + assert(write_buffer_manager != nullptr); + return static_cast(write_buffer_manager->get()->memory_usage()); } /* @@ -82,8 +80,9 @@ jlong Java_org_rocksdb_WriteBufferManager_getMutableMemtableMemoryUsage( auto* write_buffer_manager = reinterpret_cast*>( jhandle); + assert(write_buffer_manager != nullptr); return static_cast( - write_buffer_manager->mutable_memtable_memory_usage()); + write_buffer_manager->get()->mutable_memtable_memory_usage()); } /* @@ -96,5 +95,6 @@ jlong Java_org_rocksdb_WriteBufferManager_getBufferSize(JNIEnv*, jobject, auto* write_buffer_manager = reinterpret_cast*>( jhandle); - return static_cast(write_buffer_manager->buffer_size()); + assert(write_buffer_manager != nullptr); + return static_cast(write_buffer_manager->get()->buffer_size()); } \ No newline at end of file From bc93e3b0e8b9aad2719f3464af2bbf7a4665ab42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20M=C3=A9riaux?= Date: Mon, 19 Apr 2021 20:23:49 +0200 Subject: [PATCH 4/5] add test --- java/Makefile | 7 ++-- java/rocksjni/write_buffer_manager.cc | 4 +- .../org/rocksdb/WriteBufferManagerTest.java | 38 +++++++++++++++++++ 3 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 java/src/test/java/org/rocksdb/WriteBufferManagerTest.java diff --git a/java/Makefile b/java/Makefile index 1c702371222..a17af8bcf82 100644 --- a/java/Makefile +++ b/java/Makefile @@ -105,7 +105,7 @@ ARCH := $(shell getconf LONG_BIT) SHA256_CMD ?= sha256sum JAVA_TESTS = \ - org.rocksdb.BackupableDBOptionsTest\ +org.rocksdb.BackupableDBOptionsTest\ org.rocksdb.BackupEngineTest\ org.rocksdb.BlockBasedTableConfigTest\ org.rocksdb.BuiltinComparatorTest\ @@ -189,7 +189,8 @@ JAVA_TESTS = \ org.rocksdb.WriteBatchTest\ org.rocksdb.WriteBatchThreadedTest\ org.rocksdb.WriteOptionsTest\ - org.rocksdb.WriteBatchWithIndexTest + org.rocksdb.WriteBatchWithIndexTest\ + org.rocksdb.WriteBufferManagerTest MAIN_SRC = src/main/java TEST_SRC = src/test/java @@ -282,7 +283,7 @@ ifeq ($(shell java -version 2>&1 | grep 1.7.0 > /dev/null; printf $$?), 0) endif sample: java - $(AM_V_GEN)mkdir -p $(SAMPLES_MAIN_CLASSES) + $(AM_V_GEN)mkdir -p $(SAMPLES_MAIN_CLASSE $(AM_V_at)javac $(JAVAC_ARGS) -cp $(MAIN_CLASSES) -d $(SAMPLES_MAIN_CLASSES) $(SAMPLES_MAIN_SRC)/RocksDBSample.java $(AM_V_at)@rm -rf /tmp/rocksdbjni $(AM_V_at)@rm -rf /tmp/rocksdbjni_not_found diff --git a/java/rocksjni/write_buffer_manager.cc b/java/rocksjni/write_buffer_manager.cc index 8be2d33bc51..0177fb6d077 100644 --- a/java/rocksjni/write_buffer_manager.cc +++ b/java/rocksjni/write_buffer_manager.cc @@ -29,10 +29,10 @@ jlong Java_org_rocksdb_WriteBufferManager_newWriteBufferManager( /* * Class: org_rocksdb_WriteBufferManager - * Method: newWriteBufferManager + * Method: newWriteBufferManagerWithoutCache * Signature: (JJ)J */ -jlong Java_org_rocksdb_WriteBufferManager_newWriteBufferManager( +jlong Java_org_rocksdb_WriteBufferManager_newWriteBufferManagerWithoutCache( JNIEnv* /*env*/, jclass /*jclazz*/, jlong jbuffer_size) { auto* write_buffer_manager = new std::shared_ptr( diff --git a/java/src/test/java/org/rocksdb/WriteBufferManagerTest.java b/java/src/test/java/org/rocksdb/WriteBufferManagerTest.java new file mode 100644 index 00000000000..5a4d414d4ae --- /dev/null +++ b/java/src/test/java/org/rocksdb/WriteBufferManagerTest.java @@ -0,0 +1,38 @@ +// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. +// This source code is licensed under both the GPLv2 (found in the +// COPYING file in the root directory) and Apache 2.0 License +// (found in the LICENSE.Apache file in the root directory). + +package org.rocksdb; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.ClassRule; +import org.junit.Test; + +public class WriteBufferManagerTest { + + @ClassRule + public static final RocksNativeLibraryResource ROCKS_NATIVE_LIBRARY_RESOURCE = new RocksNativeLibraryResource(); + + @Test + public void newWriteBufferManagerWithCache() { + final long capacity = 1000; + try (final Cache lruCache = new LRUCache(capacity); + final WriteBufferManager wbm = new WriteBufferManager(capacity, lruCache)) { + assertThat(wbm.getBufferSize()).isEqualTo(capacity); + assertThat(wbm.getMemoryUsage()).isEqualTo(0); + assertThat(wbm.getMutableMemtableMemoryUsage()).isEqualTo(0); + } + } + + @Test + public void newWriteBufferManagerWithoutCache() { + final long capacity = 1000; + try (final WriteBufferManager wbm = new WriteBufferManager(capacity)) { + assertThat(wbm.getBufferSize()).isEqualTo(capacity); + assertThat(wbm.getMemoryUsage()).isEqualTo(0); + assertThat(wbm.getMutableMemtableMemoryUsage()).isEqualTo(0); + } + } +} From e99a655b3f1669a2a846f20fb4e8a9a5f330d92e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20M=C3=A9riaux?= Date: Mon, 19 Apr 2021 20:24:14 +0200 Subject: [PATCH 5/5] fix build multiple constructor --- java/src/main/java/org/rocksdb/WriteBufferManager.java | 7 ++----- java/src/test/java/org/rocksdb/WriteBufferManagerTest.java | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/java/src/main/java/org/rocksdb/WriteBufferManager.java b/java/src/main/java/org/rocksdb/WriteBufferManager.java index 73a28752c3d..cb8502c17b6 100644 --- a/java/src/main/java/org/rocksdb/WriteBufferManager.java +++ b/java/src/main/java/org/rocksdb/WriteBufferManager.java @@ -9,9 +9,6 @@ * Java wrapper over native write_buffer_manager class */ public class WriteBufferManager extends RocksObject { - static { - RocksDB.loadLibrary(); - } /** * Construct a new instance of WriteBufferManager. @@ -42,7 +39,7 @@ public WriteBufferManager(final long bufferSizeBytes, final Cache cache) { * write_buffer_manager */ public WriteBufferManager(final long bufferSizeBytes) { - super(newWriteBufferManager(bufferSizeBytes)); + super(newWriteBufferManagerWithoutCache(bufferSizeBytes)); } /** @@ -80,7 +77,7 @@ public long getMutableMemtableMemoryUsage() { private native static long newWriteBufferManager(final long bufferSizeBytes, final long cacheHandle); - private native static long newWriteBufferManager(final long bufferSizeBytes); + private native static long newWriteBufferManagerWithoutCache(final long bufferSizeBytes); private native static long getMemoryUsage(final long handle); diff --git a/java/src/test/java/org/rocksdb/WriteBufferManagerTest.java b/java/src/test/java/org/rocksdb/WriteBufferManagerTest.java index 5a4d414d4ae..8a2759b8ee0 100644 --- a/java/src/test/java/org/rocksdb/WriteBufferManagerTest.java +++ b/java/src/test/java/org/rocksdb/WriteBufferManagerTest.java @@ -19,7 +19,7 @@ public class WriteBufferManagerTest { public void newWriteBufferManagerWithCache() { final long capacity = 1000; try (final Cache lruCache = new LRUCache(capacity); - final WriteBufferManager wbm = new WriteBufferManager(capacity, lruCache)) { + final WriteBufferManager wbm = new WriteBufferManager(capacity, lruCache)) { assertThat(wbm.getBufferSize()).isEqualTo(capacity); assertThat(wbm.getMemoryUsage()).isEqualTo(0); assertThat(wbm.getMutableMemtableMemoryUsage()).isEqualTo(0);