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 a52daed7d11..0177fb6d077 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: newWriteBufferManagerWithoutCache + * Signature: (JJ)J + */ +jlong Java_org_rocksdb_WriteBufferManager_newWriteBufferManagerWithoutCache( + 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 @@ -40,3 +54,47 @@ 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*/, + jobject, + jlong jhandle) { + auto* write_buffer_manager = + reinterpret_cast*>( + jhandle); + assert(write_buffer_manager != nullptr); + return static_cast(write_buffer_manager->get()->memory_usage()); +} + +/* + * Class: org_rocksdb_WriteBufferManager + * Method: getMutableMemtableMemoryUsage + * Signature: (J)J + */ +jlong Java_org_rocksdb_WriteBufferManager_getMutableMemtableMemoryUsage( + JNIEnv* /*env*/, jobject, jlong jhandle) { + auto* write_buffer_manager = + reinterpret_cast*>( + jhandle); + assert(write_buffer_manager != nullptr); + return static_cast( + write_buffer_manager->get()->mutable_memtable_memory_usage()); +} + +/* + * Class: org_rocksdb_WriteBufferManager + * Method: getBufferSize + * Signature: (J)J + */ +jlong Java_org_rocksdb_WriteBufferManager_getBufferSize(JNIEnv*, jobject, + jlong jhandle) { + auto* write_buffer_manager = + reinterpret_cast*>( + jhandle); + assert(write_buffer_manager != nullptr); + return static_cast(write_buffer_manager->get()->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..cb8502c17b6 100644 --- a/java/src/main/java/org/rocksdb/WriteBufferManager.java +++ b/java/src/main/java/org/rocksdb/WriteBufferManager.java @@ -9,25 +9,82 @@ * Java wrapper over native write_buffer_manager class */ public class WriteBufferManager extends RocksObject { - static { - RocksDB.loadLibrary(); - } /** * 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_)); } + /** + * 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(newWriteBufferManagerWithoutCache(bufferSizeBytes)); + } + + /** + * 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 newWriteBufferManagerWithoutCache(final long bufferSizeBytes); + + 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); } 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..8a2759b8ee0 --- /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); + } + } +}