From 5529c1ad1b50a4e84e4ca75ab194e35eede9b3a3 Mon Sep 17 00:00:00 2001 From: fyrz Date: Mon, 10 Nov 2014 12:55:58 +0100 Subject: [PATCH 1/2] [RocksJava] GetIntProperty in RocksDB Expose GetIntProperty methods to RocksJava. As the integer(64-Bit) value is no integer in Java the method is aligned with the return type which is long. --- java/org/rocksdb/RocksDB.java | 36 ++++++++++++++++ java/org/rocksdb/test/ColumnFamilyTest.java | 3 +- java/org/rocksdb/test/RocksDBTest.java | 33 ++++++++++++++ java/rocksjni/rocksjni.cc | 48 ++++++++++++++++++++- 4 files changed, 118 insertions(+), 2 deletions(-) diff --git a/java/org/rocksdb/RocksDB.java b/java/org/rocksdb/RocksDB.java index 79b00f3c0..fc45e3611 100644 --- a/java/org/rocksdb/RocksDB.java +++ b/java/org/rocksdb/RocksDB.java @@ -1032,6 +1032,38 @@ public class RocksDB extends RocksObject { return getProperty0(nativeHandle_, property, property.length()); } + /** + *

Similar to GetProperty(), but only works for a subset of properties whose + * return value is a numerical value. Return the value as long.

+ * + * @param property to be fetched. + * + * @return property value + * + * @throws RocksDBException if an error happens in the underlying native code. + */ + public long getLongProperty(String property) throws RocksDBException { + return getLongProperty(nativeHandle_, property, property.length()); + } + + /** + *

Similar to GetProperty(), but only works for a subset of properties whose + * return value is a numerical value. Return the value as long.

+ * + * @param columnFamilyHandle {@link org.rocksdb.ColumnFamilyHandle} + * instance + * @param property to be fetched. + * + * @return property value + * + * @throws RocksDBException if an error happens in the underlying native code. + */ + public long getLongProperty(ColumnFamilyHandle columnFamilyHandle, String property) + throws RocksDBException { + return getLongProperty(nativeHandle_, columnFamilyHandle.nativeHandle_, property, + property.length()); + } + /** * Return a heap-allocated iterator over the contents of the database. * The result of newIterator() is initially invalid (caller must @@ -1297,6 +1329,10 @@ public class RocksDB extends RocksObject { String property, int propertyLength) throws RocksDBException; protected native String getProperty0(long nativeHandle, long cfHandle, String property, int propertyLength) throws RocksDBException; + protected native long getLongProperty(long nativeHandle, + String property, int propertyLength) throws RocksDBException; + protected native long getLongProperty(long nativeHandle, long cfHandle, + String property, int propertyLength) throws RocksDBException; protected native long iterator0(long handle); protected native long iterator0(long handle, long cfHandle); protected native long[] iterators(long handle, diff --git a/java/org/rocksdb/test/ColumnFamilyTest.java b/java/org/rocksdb/test/ColumnFamilyTest.java index 0a77240ac..92f977ce3 100644 --- a/java/org/rocksdb/test/ColumnFamilyTest.java +++ b/java/org/rocksdb/test/ColumnFamilyTest.java @@ -351,7 +351,6 @@ public class ColumnFamilyTest { } } - @Test public void properties() throws RocksDBException { RocksDB db = null; @@ -371,6 +370,8 @@ public class ColumnFamilyTest { cfNames, columnFamilyHandleList); assertThat(db.getProperty("rocksdb.estimate-num-keys")). isNotNull(); + assertThat(db.getLongProperty(columnFamilyHandleList.get(0), + "rocksdb.estimate-num-keys")).isGreaterThanOrEqualTo(0); assertThat(db.getProperty("rocksdb.stats")).isNotNull(); assertThat(db.getProperty(columnFamilyHandleList.get(0), "rocksdb.sstables")).isNotNull(); diff --git a/java/org/rocksdb/test/RocksDBTest.java b/java/org/rocksdb/test/RocksDBTest.java index 4f51e8b97..5a8613aa1 100644 --- a/java/org/rocksdb/test/RocksDBTest.java +++ b/java/org/rocksdb/test/RocksDBTest.java @@ -279,4 +279,37 @@ public class RocksDBTest { } } } + + @Test + public void getIntProperty() throws RocksDBException { + RocksDB db = null; + Options options = null; + WriteOptions wOpt = null; + try { + options = new Options(); + wOpt = new WriteOptions(); + // Setup options + options.setCreateIfMissing(true); + options.setMaxWriteBufferNumber(10); + options.setMinWriteBufferNumberToMerge(10); + wOpt.setDisableWAL(true); + db = RocksDB.open(options, dbFolder.getRoot().getAbsolutePath()); + db.put(wOpt, "key1".getBytes(), "value1".getBytes()); + db.put(wOpt, "key2".getBytes(), "value2".getBytes()); + db.put(wOpt, "key3".getBytes(), "value3".getBytes()); + db.put(wOpt, "key4".getBytes(), "value4".getBytes()); + assertThat(db.getLongProperty("rocksdb.num-entries-active-mem-table")).isGreaterThan(0); + assertThat(db.getLongProperty("rocksdb.cur-size-active-mem-table")).isGreaterThan(0); + } finally { + if (db != null) { + db.close(); + } + if (options != null) { + options.dispose(); + } + if (wOpt != null) { + wOpt.dispose(); + } + } + } } diff --git a/java/rocksjni/rocksjni.cc b/java/rocksjni/rocksjni.cc index 4fa1a544c..5af3c6b68 100644 --- a/java/rocksjni/rocksjni.cc +++ b/java/rocksjni/rocksjni.cc @@ -1289,6 +1289,53 @@ jstring Java_org_rocksdb_RocksDB_getProperty0__JJLjava_lang_String_2I( return env->NewStringUTF(property_value.data()); } +/* + * Class: org_rocksdb_RocksDB + * Method: getLongProperty + * Signature: (JLjava/lang/String;I)L; + */ +jlong Java_org_rocksdb_RocksDB_getLongProperty__JLjava_lang_String_2I( + JNIEnv* env, jobject jdb, jlong db_handle, jstring jproperty, + jint jproperty_len) { + auto db = reinterpret_cast(db_handle); + + const char* property = env->GetStringUTFChars(jproperty, 0); + rocksdb::Slice property_slice(property, jproperty_len); + + uint64_t property_value = 0; + bool retCode = db->GetIntProperty(property_slice, &property_value); + env->ReleaseStringUTFChars(jproperty, property); + + if (!retCode) { + rocksdb::RocksDBExceptionJni::ThrowNew(env, rocksdb::Status::NotFound()); + } + return property_value; +} + +/* + * Class: org_rocksdb_RocksDB + * Method: getLongProperty + * Signature: (JJLjava/lang/String;I)L; + */ +jlong Java_org_rocksdb_RocksDB_getLongProperty__JJLjava_lang_String_2I( + JNIEnv* env, jobject jdb, jlong db_handle, jlong jcf_handle, + jstring jproperty, jint jproperty_len) { + auto db = reinterpret_cast(db_handle); + auto cf_handle = reinterpret_cast(jcf_handle); + + const char* property = env->GetStringUTFChars(jproperty, 0); + rocksdb::Slice property_slice(property, jproperty_len); + + uint64_t property_value; + bool retCode = db->GetIntProperty(cf_handle, property_slice, &property_value); + env->ReleaseStringUTFChars(jproperty, property); + + if (!retCode) { + rocksdb::RocksDBExceptionJni::ThrowNew(env, rocksdb::Status::NotFound()); + } + return property_value; +} + ////////////////////////////////////////////////////////////////////////////// // rocksdb::DB::Flush @@ -1332,4 +1379,3 @@ void Java_org_rocksdb_RocksDB_flush__JJJ( auto cf_handle = reinterpret_cast(jcf_handle); rocksdb_flush_helper(env, db, *flush_options, cf_handle); } - From 8efd4bb42494143cc9ed160ece0cfb9eaadd2334 Mon Sep 17 00:00:00 2001 From: fyrz Date: Mon, 17 Nov 2014 21:29:05 +0100 Subject: [PATCH 2/2] [RocksJava] Improved comments in RocksDB class Improved comments in RocksDB getLongProperty methods, to describe the behavior more detailed. --- java/org/rocksdb/RocksDB.java | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/java/org/rocksdb/RocksDB.java b/java/org/rocksdb/RocksDB.java index fc45e3611..bb88710ed 100644 --- a/java/org/rocksdb/RocksDB.java +++ b/java/org/rocksdb/RocksDB.java @@ -1036,9 +1036,21 @@ public class RocksDB extends RocksObject { *

Similar to GetProperty(), but only works for a subset of properties whose * return value is a numerical value. Return the value as long.

* + *

Note: As the returned property is of type + * {@code uint64_t} on C++ side the returning value can be negative + * because Java supports in Java 7 only signed long values.

+ * + *

Java 7: To mitigate the problem of the non + * existent unsigned long tpye, values should be encapsulated using + * {@link java.math.BigInteger} to reflect the correct value. The correct + * behavior is guaranteed if {@code 2^64} is added to negative values.

+ * + *

Java 8: In Java 8 the value should be treated as + * unsigned long using provided methods of type {@link Long}.

+ * * @param property to be fetched. * - * @return property value + * @return numerical property value. * * @throws RocksDBException if an error happens in the underlying native code. */ @@ -1050,11 +1062,23 @@ public class RocksDB extends RocksObject { *

Similar to GetProperty(), but only works for a subset of properties whose * return value is a numerical value. Return the value as long.

* + *

Note: As the returned property is of type + * {@code uint64_t} on C++ side the returning value can be negative + * because Java supports in Java 7 only signed long values.

+ * + *

Java 7: To mitigate the problem of the non + * existent unsigned long tpye, values should be encapsulated using + * {@link java.math.BigInteger} to reflect the correct value. The correct + * behavior is guaranteed if {@code 2^64} is added to negative values.

+ * + *

Java 8: In Java 8 the value should be treated as + * unsigned long using provided methods of type {@link Long}.

+ * * @param columnFamilyHandle {@link org.rocksdb.ColumnFamilyHandle} * instance * @param property to be fetched. * - * @return property value + * @return numerical property value * * @throws RocksDBException if an error happens in the underlying native code. */