Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

expose write buffer manager memory usage methods through Java Api #8194

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 4 additions & 3 deletions java/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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\
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
58 changes: 58 additions & 0 deletions java/rocksjni/write_buffer_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,20 @@ jlong Java_org_rocksdb_WriteBufferManager_newWriteBufferManager(
return reinterpret_cast<jlong>(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<ROCKSDB_NAMESPACE::WriteBufferManager>(
std::make_shared<ROCKSDB_NAMESPACE::WriteBufferManager>(jbuffer_size,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think that this make_shared is supported in C++14?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, I'm not an expert of C++, and had some troubles to setup the toolchain on my machine, I'll fix this

nullptr));
return reinterpret_cast<jlong>(write_buffer_manager);
}

/*
* Class: org_rocksdb_WriteBufferManager
* Method: disposeInternal
Expand All @@ -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<std::shared_ptr<ROCKSDB_NAMESPACE::WriteBufferManager>*>(
jhandle);
assert(write_buffer_manager != nullptr);
return static_cast<jlong>(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<std::shared_ptr<ROCKSDB_NAMESPACE::WriteBufferManager>*>(
jhandle);
assert(write_buffer_manager != nullptr);
return static_cast<jlong>(
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<std::shared_ptr<ROCKSDB_NAMESPACE::WriteBufferManager>*>(
jhandle);
assert(write_buffer_manager != nullptr);
return static_cast<jlong>(write_buffer_manager->get()->buffer_size());
}
75 changes: 66 additions & 9 deletions java/src/main/java/org/rocksdb/WriteBufferManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 <a href="https://github.com/facebook/rocksdb/wiki/Write-Buffer-Manager">
* https://github.com/facebook/rocksdb/wiki/Write-Buffer-Manager</a>
* for more details on when to use it
* Check
* <a href="https://github.com/facebook/rocksdb/wiki/Write-Buffer-Manager">
* https://github.com/facebook/rocksdb/wiki/Write-Buffer-Manager</a> 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
* <a href="https://github.com/facebook/rocksdb/wiki/Write-Buffer-Manager">
* https://github.com/facebook/rocksdb/wiki/Write-Buffer-Manager</a> 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);
}
38 changes: 38 additions & 0 deletions java/src/test/java/org/rocksdb/WriteBufferManagerTest.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
}