diff --git a/java/Makefile b/java/Makefile index 2530af9bd..49afc6c45 100644 --- a/java/Makefile +++ b/java/Makefile @@ -1,5 +1,4 @@ NATIVE_JAVA_CLASSES = org.rocksdb.AbstractComparator\ - org.rocksdb.AbstractLogger\ org.rocksdb.AbstractSlice\ org.rocksdb.BackupableDB\ org.rocksdb.BackupableDBOptions\ @@ -18,6 +17,7 @@ NATIVE_JAVA_CLASSES = org.rocksdb.AbstractComparator\ org.rocksdb.GenericRateLimiterConfig\ org.rocksdb.HashLinkedListMemTableConfig\ org.rocksdb.HashSkipListMemTableConfig\ + org.rocksdb.Logger\ org.rocksdb.MergeOperator\ org.rocksdb.Options\ org.rocksdb.PlainTableConfig\ @@ -55,8 +55,7 @@ ifeq ($(PLATFORM), OS_MACOSX) ROCKSDB_JAR = rocksdbjni-$(ROCKSDB_MAJOR).$(ROCKSDB_MINOR).$(ROCKSDB_PATCH)-osx.jar endif -JAVA_TESTS = org.rocksdb.AbstractLoggerTest\ - org.rocksdb.BackupableDBOptionsTest\ +JAVA_TESTS = org.rocksdb.BackupableDBOptionsTest\ org.rocksdb.BackupableDBTest\ org.rocksdb.BlockBasedTableConfigTest\ org.rocksdb.CheckPointTest\ @@ -73,6 +72,7 @@ JAVA_TESTS = org.rocksdb.AbstractLoggerTest\ org.rocksdb.FlushTest\ org.rocksdb.InfoLogLevelTest\ org.rocksdb.KeyMayExistTest\ + org.rocksdb.LoggerTest\ org.rocksdb.MemTableTest\ org.rocksdb.MergeTest\ org.rocksdb.MixedOptionsTest\ diff --git a/java/rocksjni/loggerjnicallback.cc b/java/rocksjni/loggerjnicallback.cc index c6f7f1934..094049aad 100644 --- a/java/rocksjni/loggerjnicallback.cc +++ b/java/rocksjni/loggerjnicallback.cc @@ -1,12 +1,12 @@ -// Copyright (c) 2014, Facebook, Inc. All rights reserved. +// Copyright (c) 2015, Facebook, Inc. All rights reserved. // This source code is licensed under the BSD-style license found in the // LICENSE file in the root directory of this source tree. An additional grant // of patent rights can be found in the PATENTS file in the same directory. // // This file implements the callback "bridge" between Java and C++ for -// rocksdb::Comparator. +// rocksdb::Logger. -#include "include/org_rocksdb_AbstractLogger.h" +#include "include/org_rocksdb_Logger.h" #include "rocksjni/loggerjnicallback.h" #include "rocksjni/portal.h" @@ -14,15 +14,15 @@ namespace rocksdb { LoggerJniCallback::LoggerJniCallback( - JNIEnv* env, jobject jAbstractLogger) { + JNIEnv* env, jobject jlogger) { const jint rs = env->GetJavaVM(&m_jvm); assert(rs == JNI_OK); // Note: we want to access the Java Logger instance // across multiple method calls, so we create a global ref - m_jAbstractLogger = env->NewGlobalRef(jAbstractLogger); - m_jLogMethodId = AbstractLoggerJni::getLogMethodId(env); + m_jLogger = env->NewGlobalRef(jlogger); + m_jLogMethodId = LoggerJni::getLogMethodId(env); } /** @@ -44,6 +44,27 @@ void LoggerJniCallback::Logv(const InfoLogLevel log_level, const char* format, va_list ap) { if (GetInfoLogLevel() <= log_level) { JNIEnv* env = getJniEnv(); + + // determine InfoLogLevel java enum instance + jobject jlog_level; + switch (log_level) { + case rocksdb::InfoLogLevel::DEBUG_LEVEL: + jlog_level = InfoLogLevelJni::DEBUG_LEVEL(env); + break; + case rocksdb::InfoLogLevel::INFO_LEVEL: + jlog_level = InfoLogLevelJni::INFO_LEVEL(env); + break; + case rocksdb::InfoLogLevel::ERROR_LEVEL: + jlog_level = InfoLogLevelJni::ERROR_LEVEL(env); + break; + case rocksdb::InfoLogLevel::FATAL_LEVEL: + jlog_level = InfoLogLevelJni::FATAL_LEVEL(env); + break; + default: + jlog_level = InfoLogLevelJni::FATAL_LEVEL(env); + break; + } + // We try twice: the first time with a fixed-size stack allocated buffer, // and the second time with a much larger dynamically allocated buffer. char buffer[500]; @@ -77,26 +98,9 @@ void LoggerJniCallback::Logv(const InfoLogLevel log_level, assert(p < limit); *p++ = '\0'; - // determine InfoLogLevel java enum instance - jobject jlog_level; - switch(log_level) { - case rocksdb::InfoLogLevel::DEBUG_LEVEL: - jlog_level = InfoLogLevelJni::DEBUG_LEVEL(env); - break; - case rocksdb::InfoLogLevel::INFO_LEVEL: - jlog_level = InfoLogLevelJni::INFO_LEVEL(env); - break; - case rocksdb::InfoLogLevel::ERROR_LEVEL: - jlog_level = InfoLogLevelJni::ERROR_LEVEL(env); - case rocksdb::InfoLogLevel::FATAL_LEVEL: - jlog_level = InfoLogLevelJni::FATAL_LEVEL(env); - default: - jlog_level = InfoLogLevelJni::FATAL_LEVEL(env); - break; - } // pass java string to callback handler env->CallVoidMethod( - m_jAbstractLogger, + m_jLogger, m_jLogMethodId, jlog_level, env->NewStringUTF(base)); @@ -112,18 +116,18 @@ void LoggerJniCallback::Logv(const InfoLogLevel log_level, LoggerJniCallback::~LoggerJniCallback() { JNIEnv* env = getJniEnv(); - env->DeleteGlobalRef(m_jAbstractLogger); + env->DeleteGlobalRef(m_jLogger); m_jvm->DetachCurrentThread(); } } // namespace rocksdb /* - * Class: org_rocksdb_AbstractLogger + * Class: org_rocksdb_Logger * Method: createNewLoggerOptions * Signature: (J)V */ -void Java_org_rocksdb_AbstractLogger_createNewLoggerOptions( +void Java_org_rocksdb_Logger_createNewLoggerOptions( JNIEnv* env, jobject jobj, jlong joptions) { rocksdb::LoggerJniCallback* c = new rocksdb::LoggerJniCallback(env, jobj); @@ -133,15 +137,15 @@ void Java_org_rocksdb_AbstractLogger_createNewLoggerOptions( std::shared_ptr *pLoggerJniCallback = new std::shared_ptr; *pLoggerJniCallback = std::shared_ptr(c); - rocksdb::AbstractLoggerJni::setHandle(env, jobj, pLoggerJniCallback); + rocksdb::LoggerJni::setHandle(env, jobj, pLoggerJniCallback); } /* - * Class: org_rocksdb_AbstractLogger + * Class: org_rocksdb_Logger * Method: createNewLoggerDbOptions * Signature: (J)V */ -void Java_org_rocksdb_AbstractLogger_createNewLoggerDbOptions( +void Java_org_rocksdb_Logger_createNewLoggerDbOptions( JNIEnv* env, jobject jobj, jlong jdb_options) { rocksdb::LoggerJniCallback* c = new rocksdb::LoggerJniCallback(env, jobj); @@ -151,15 +155,15 @@ void Java_org_rocksdb_AbstractLogger_createNewLoggerDbOptions( std::shared_ptr *pLoggerJniCallback = new std::shared_ptr; *pLoggerJniCallback = std::shared_ptr(c); - rocksdb::AbstractLoggerJni::setHandle(env, jobj, pLoggerJniCallback); + rocksdb::LoggerJni::setHandle(env, jobj, pLoggerJniCallback); } /* - * Class: org_rocksdb_AbstractLogger + * Class: org_rocksdb_Logger * Method: setInfoLogLevel * Signature: (JB)V */ -void Java_org_rocksdb_AbstractLogger_setInfoLogLevel( +void Java_org_rocksdb_Logger_setInfoLogLevel( JNIEnv* env, jobject jobj, jlong jhandle, jbyte jlog_level) { std::shared_ptr *handle = reinterpret_cast *>(jhandle); @@ -167,11 +171,11 @@ void Java_org_rocksdb_AbstractLogger_setInfoLogLevel( } /* - * Class: org_rocksdb_AbstractLogger + * Class: org_rocksdb_Logger * Method: infoLogLevel * Signature: (J)B */ -jbyte Java_org_rocksdb_AbstractLogger_infoLogLevel( +jbyte Java_org_rocksdb_Logger_infoLogLevel( JNIEnv* env, jobject jobj, jlong jhandle) { std::shared_ptr *handle = reinterpret_cast *>(jhandle); @@ -179,11 +183,11 @@ jbyte Java_org_rocksdb_AbstractLogger_infoLogLevel( } /* - * Class: org_rocksdb_AbstractLogger + * Class: org_rocksdb_Logger * Method: disposeInternal * Signature: (J)V */ -void Java_org_rocksdb_AbstractLogger_disposeInternal( +void Java_org_rocksdb_Logger_disposeInternal( JNIEnv* env, jobject jobj, jlong jhandle) { std::shared_ptr *handle = reinterpret_cast *>(jhandle); diff --git a/java/rocksjni/loggerjnicallback.h b/java/rocksjni/loggerjnicallback.h index 600390d14..3936252bc 100644 --- a/java/rocksjni/loggerjnicallback.h +++ b/java/rocksjni/loggerjnicallback.h @@ -1,4 +1,4 @@ -// Copyright (c) 2014, Facebook, Inc. All rights reserved. +// Copyright (c) 2015, Facebook, Inc. All rights reserved. // This source code is licensed under the BSD-style license found in the // LICENSE file in the root directory of this source tree. An additional grant // of patent rights can be found in the PATENTS file in the same directory. @@ -17,27 +17,28 @@ namespace rocksdb { class LoggerJniCallback : public Logger { - public: - LoggerJniCallback(JNIEnv* env, jobject jAbstractLogger); - virtual ~LoggerJniCallback(); + public: + LoggerJniCallback(JNIEnv* env, jobject jLogger); + virtual ~LoggerJniCallback(); - using Logger::SetInfoLogLevel; - using Logger::GetInfoLogLevel; - // Write an entry to the log file with the specified format. - virtual void Logv(const char* format, va_list ap); - // Write an entry to the log file with the specified log level - // and format. Any log with level under the internal log level - // of *this (see @SetInfoLogLevel and @GetInfoLogLevel) will not be - // printed. - virtual void Logv(const InfoLogLevel log_level, const char* format, va_list ap); + using Logger::SetInfoLogLevel; + using Logger::GetInfoLogLevel; + // Write an entry to the log file with the specified format. + virtual void Logv(const char* format, va_list ap); + // Write an entry to the log file with the specified log level + // and format. Any log with level under the internal log level + // of *this (see @SetInfoLogLevel and @GetInfoLogLevel) will not be + // printed. + virtual void Logv(const InfoLogLevel log_level, + const char* format, va_list ap); - protected: - JNIEnv* getJniEnv() const; - private: - JavaVM* m_jvm; - jobject m_jAbstractLogger; - jmethodID m_jLogMethodId; + protected: + JNIEnv* getJniEnv() const; + private: + JavaVM* m_jvm; + jobject m_jLogger; + jmethodID m_jLogMethodId; }; -} +} // namespace rocksdb -#endif +#endif // JAVA_ROCKSJNI_LOGGERJNICALLBACK_H_ diff --git a/java/rocksjni/portal.h b/java/rocksjni/portal.h index 194d259fb..3d40f2dba 100644 --- a/java/rocksjni/portal.h +++ b/java/rocksjni/portal.h @@ -658,7 +658,6 @@ class WriteEntryJni { class InfoLogLevelJni { public: - // Get the DEBUG_LEVEL enum field of org.rocksdb.InfoLogLevel static jobject DEBUG_LEVEL(JNIEnv* env) { return getEnum(env, "DEBUG_LEVEL"); @@ -703,16 +702,16 @@ class InfoLogLevelJni { } }; -// The portal class for org.rocksdb.AbstractLogger -class AbstractLoggerJni : public RocksDBNativeClass< - std::shared_ptr*, AbstractLoggerJni> { +// The portal class for org.rocksdb.Logger +class LoggerJni : public RocksDBNativeClass< + std::shared_ptr*, LoggerJni> { public: static jclass getJClass(JNIEnv* env) { return RocksDBNativeClass::getJClass(env, - "org/rocksdb/AbstractLogger"); + "org/rocksdb/Logger"); } - // Get the java method `name` of org.rocksdb.AbstractLogger. + // Get the java method `name` of org.rocksdb.Logger. static jmethodID getLogMethodId(JNIEnv* env) { static jmethodID mid = env->GetMethodID( getJClass(env), "log", diff --git a/java/src/main/java/org/rocksdb/DBOptions.java b/java/src/main/java/org/rocksdb/DBOptions.java index 048e7ffbd..fa883600a 100644 --- a/java/src/main/java/org/rocksdb/DBOptions.java +++ b/java/src/main/java/org/rocksdb/DBOptions.java @@ -145,7 +145,7 @@ public class DBOptions extends RocksObject implements DBOptionsInterface { } @Override - public DBOptions setLogger(final AbstractLogger logger) { + public DBOptions setLogger(final Logger logger) { assert(isInitialized()); setLogger(nativeHandle_, logger.nativeHandle_); return this; diff --git a/java/src/main/java/org/rocksdb/DBOptionsInterface.java b/java/src/main/java/org/rocksdb/DBOptionsInterface.java index e042baecf..a3a71b2b7 100644 --- a/java/src/main/java/org/rocksdb/DBOptionsInterface.java +++ b/java/src/main/java/org/rocksdb/DBOptionsInterface.java @@ -136,10 +136,10 @@ public interface DBOptionsInterface { * *

Default: nullptr

* - * @param logger {@link AbstractLogger} instance. + * @param logger {@link Logger} instance. * @return the instance of the current Object. */ - Object setLogger(AbstractLogger logger); + Object setLogger(Logger logger); /** *

Sets the RocksDB log level. Default level is INFO

diff --git a/java/src/main/java/org/rocksdb/AbstractLogger.java b/java/src/main/java/org/rocksdb/Logger.java similarity index 81% rename from java/src/main/java/org/rocksdb/AbstractLogger.java rename to java/src/main/java/org/rocksdb/Logger.java index 74f328779..5796d5b1c 100644 --- a/java/src/main/java/org/rocksdb/AbstractLogger.java +++ b/java/src/main/java/org/rocksdb/Logger.java @@ -1,3 +1,8 @@ +// Copyright (c) 2015, Facebook, Inc. All rights reserved. +// This source code is licensed under the BSD-style license found in the +// LICENSE file in the root directory of this source tree. An additional grant +// of patent rights can be found in the PATENTS file in the same directory. + package org.rocksdb; /** @@ -9,7 +14,7 @@ package org.rocksdb; * Java logging APIs like Log4j or Slf4j without keeping * database logs in the filesystem.

*/ -public abstract class AbstractLogger extends RocksObject { +public abstract class Logger extends RocksObject { /** *

AbstractLogger constructor.

@@ -20,7 +25,7 @@ public abstract class AbstractLogger extends RocksObject { * * @param options {@link org.rocksdb.Options} instance. */ - public AbstractLogger(Options options) { + public Logger(final Options options) { createNewLoggerOptions(options.nativeHandle_); } @@ -33,7 +38,7 @@ public abstract class AbstractLogger extends RocksObject { * * @param dboptions {@link org.rocksdb.DBOptions} instance. */ - public AbstractLogger(DBOptions dboptions) { + public Logger(final DBOptions dboptions) { createNewLoggerDbOptions(dboptions.nativeHandle_); } @@ -42,7 +47,7 @@ public abstract class AbstractLogger extends RocksObject { * * @param infoLogLevel {@link org.rocksdb.InfoLogLevel} instance. */ - public void setInfoLogLevel(InfoLogLevel infoLogLevel) { + public void setInfoLogLevel(final InfoLogLevel infoLogLevel) { setInfoLogLevel(nativeHandle_, infoLogLevel.getValue()); } diff --git a/java/src/main/java/org/rocksdb/Options.java b/java/src/main/java/org/rocksdb/Options.java index 8d946e5a5..164856501 100644 --- a/java/src/main/java/org/rocksdb/Options.java +++ b/java/src/main/java/org/rocksdb/Options.java @@ -639,7 +639,7 @@ public class Options extends RocksObject } @Override - public Options setLogger(final AbstractLogger logger) { + public Options setLogger(final Logger logger) { assert(isInitialized()); setLogger(nativeHandle_, logger.nativeHandle_); return this; diff --git a/java/src/test/java/org/rocksdb/AbstractLoggerTest.java b/java/src/test/java/org/rocksdb/LoggerTest.java similarity index 85% rename from java/src/test/java/org/rocksdb/AbstractLoggerTest.java rename to java/src/test/java/org/rocksdb/LoggerTest.java index 7b6b1db37..2eff3191a 100644 --- a/java/src/test/java/org/rocksdb/AbstractLoggerTest.java +++ b/java/src/test/java/org/rocksdb/LoggerTest.java @@ -11,7 +11,7 @@ import java.util.concurrent.atomic.AtomicInteger; import static org.assertj.core.api.Assertions.assertThat; -public class AbstractLoggerTest { +public class LoggerTest { @ClassRule public static final RocksMemoryResource rocksMemoryResource = new RocksMemoryResource(); @@ -33,7 +33,7 @@ public class AbstractLoggerTest { setCreateIfMissing(true); // Create new logger with max log level passed by options - AbstractLogger abstractLogger = new AbstractLogger(options) { + Logger logger = new Logger(options) { @Override protected void log(InfoLogLevel infoLogLevel, String logMsg) { assertThat(logMsg).isNotNull(); @@ -43,7 +43,7 @@ public class AbstractLoggerTest { }; // Set custom logger to options - options.setLogger(abstractLogger); + options.setLogger(logger); db = RocksDB.open(options, dbFolder.getRoot().getAbsolutePath()); @@ -71,7 +71,7 @@ public class AbstractLoggerTest { setCreateIfMissing(true); // Create new logger with max log level passed by options - AbstractLogger abstractLogger = new AbstractLogger(options) { + Logger logger = new Logger(options) { @Override protected void log(InfoLogLevel infoLogLevel, String logMsg) { assertThat(logMsg).isNotNull(); @@ -81,7 +81,7 @@ public class AbstractLoggerTest { }; // Set custom logger to options - options.setLogger(abstractLogger); + options.setLogger(logger); db = RocksDB.open(options, dbFolder.getRoot().getAbsolutePath()); @@ -99,7 +99,7 @@ public class AbstractLoggerTest { @Test public void dbOptionsLogger() throws RocksDBException { RocksDB db = null; - AbstractLogger abstractLogger = null; + Logger logger = null; List cfHandles = new ArrayList<>(); List cfDescriptors = new ArrayList<>(); cfDescriptors.add(new ColumnFamilyDescriptor(RocksDB.DEFAULT_COLUMN_FAMILY)); @@ -112,7 +112,7 @@ public class AbstractLoggerTest { setCreateIfMissing(true); // Create new logger with max log level passed by options - abstractLogger = new AbstractLogger(options) { + logger = new Logger(options) { @Override protected void log(InfoLogLevel infoLogLevel, String logMsg) { assertThat(logMsg).isNotNull(); @@ -122,7 +122,7 @@ public class AbstractLoggerTest { }; // Set custom logger to options - options.setLogger(abstractLogger); + options.setLogger(logger); db = RocksDB.open(options, dbFolder.getRoot().getAbsolutePath(), cfDescriptors, cfHandles); // there should be zero messages @@ -136,15 +136,15 @@ public class AbstractLoggerTest { if (db != null) { db.close(); } - if (abstractLogger != null) { - abstractLogger.dispose(); + if (logger != null) { + logger.dispose(); } } } @Test public void setInfoLogLevel() { - AbstractLogger abstractLogger = null; + Logger logger = null; try { // Setup options final Options options = new Options(). @@ -152,7 +152,7 @@ public class AbstractLoggerTest { setCreateIfMissing(true); // Create new logger with max log level passed by options - abstractLogger = new AbstractLogger(options) { + logger = new Logger(options) { @Override protected void log(InfoLogLevel infoLogLevel, String logMsg) { assertThat(logMsg).isNotNull(); @@ -160,14 +160,14 @@ public class AbstractLoggerTest { logMessageCounter.incrementAndGet(); } }; - assertThat(abstractLogger.infoLogLevel()). + assertThat(logger.infoLogLevel()). isEqualTo(InfoLogLevel.FATAL_LEVEL); - abstractLogger.setInfoLogLevel(InfoLogLevel.DEBUG_LEVEL); - assertThat(abstractLogger.infoLogLevel()). + logger.setInfoLogLevel(InfoLogLevel.DEBUG_LEVEL); + assertThat(logger.infoLogLevel()). isEqualTo(InfoLogLevel.DEBUG_LEVEL); } finally { - if (abstractLogger != null) { - abstractLogger.dispose(); + if (logger != null) { + logger.dispose(); } } } @@ -184,7 +184,7 @@ public class AbstractLoggerTest { setCreateIfMissing(true); // Create new logger with max log level passed by options - AbstractLogger abstractLogger = new AbstractLogger(options) { + Logger logger = new Logger(options) { @Override protected void log(InfoLogLevel infoLogLevel, String logMsg) { assertThat(logMsg).isNotNull(); @@ -194,7 +194,7 @@ public class AbstractLoggerTest { }; // Set custom logger to options - options.setLogger(abstractLogger); + options.setLogger(logger); db = RocksDB.open(options, dbFolder.getRoot().getAbsolutePath()); // there should be zero messages @@ -202,7 +202,7 @@ public class AbstractLoggerTest { assertThat(logMessageCounter.get()).isEqualTo(0); // change log level to debug level - abstractLogger.setInfoLogLevel(InfoLogLevel.DEBUG_LEVEL); + logger.setInfoLogLevel(InfoLogLevel.DEBUG_LEVEL); db.put("key".getBytes(), "value".getBytes()); db.flush(new FlushOptions().setWaitForFlush(true));