提交 a247617e 编写于 作者: B Ben Clay 提交者: Facebook Github Bot

Java: Add copy constructors for various option classes

Summary:
Add Java-side copy constructors for:
- Options
- DBOptions
- ColumnFamilyOptions
- WriteOptions

along with unit tests to assert the copy worked.

NOTE: Unit tests are failing in travis but it looks like a global timeout issue. These tests pass.
Closes https://github.com/facebook/rocksdb/pull/3450

Differential Revision: D6874425

Pulled By: sagar0

fbshipit-source-id: 5bde68ea5b5225e071faea2628bf8bbf10bd65ab
上级 6e5b341e
...@@ -59,6 +59,18 @@ jlong Java_org_rocksdb_Options_newOptions__JJ(JNIEnv* env, jclass jcls, ...@@ -59,6 +59,18 @@ jlong Java_org_rocksdb_Options_newOptions__JJ(JNIEnv* env, jclass jcls,
return reinterpret_cast<jlong>(op); return reinterpret_cast<jlong>(op);
} }
/*
* Class: org_rocksdb_Options
* Method: copyOptions
* Signature: (J)J
*/
jlong Java_org_rocksdb_Options_copyOptions(JNIEnv* env, jclass jcls,
jlong jhandle) {
auto new_opt = new rocksdb::Options(
*(reinterpret_cast<rocksdb::Options*>(jhandle)));
return reinterpret_cast<jlong>(new_opt);
}
/* /*
* Class: org_rocksdb_Options * Class: org_rocksdb_Options
* Method: disposeInternal * Method: disposeInternal
...@@ -2848,6 +2860,18 @@ jlong Java_org_rocksdb_ColumnFamilyOptions_newColumnFamilyOptions( ...@@ -2848,6 +2860,18 @@ jlong Java_org_rocksdb_ColumnFamilyOptions_newColumnFamilyOptions(
return reinterpret_cast<jlong>(op); return reinterpret_cast<jlong>(op);
} }
/*
* Class: org_rocksdb_ColumnFamilyOptions
* Method: copyColumnFamilyOptions
* Signature: (J)J
*/
jlong Java_org_rocksdb_ColumnFamilyOptions_copyColumnFamilyOptions(
JNIEnv* env, jclass jcls, jlong jhandle) {
auto new_opt = new rocksdb::ColumnFamilyOptions(
*(reinterpret_cast<rocksdb::ColumnFamilyOptions*>(jhandle)));
return reinterpret_cast<jlong>(new_opt);
}
/* /*
* Class: org_rocksdb_ColumnFamilyOptions * Class: org_rocksdb_ColumnFamilyOptions
* Method: getColumnFamilyOptionsFromProps * Method: getColumnFamilyOptionsFromProps
...@@ -4161,6 +4185,18 @@ jlong Java_org_rocksdb_DBOptions_newDBOptions(JNIEnv* env, ...@@ -4161,6 +4185,18 @@ jlong Java_org_rocksdb_DBOptions_newDBOptions(JNIEnv* env,
return reinterpret_cast<jlong>(dbop); return reinterpret_cast<jlong>(dbop);
} }
/*
* Class: org_rocksdb_DBOptions
* Method: copyDBOptions
* Signature: (J)J
*/
jlong Java_org_rocksdb_DBOptions_copyDBOptions(JNIEnv* env, jclass jcls,
jlong jhandle) {
auto new_opt = new rocksdb::DBOptions(
*(reinterpret_cast<rocksdb::DBOptions*>(jhandle)));
return reinterpret_cast<jlong>(new_opt);
}
/* /*
* Class: org_rocksdb_DBOptions * Class: org_rocksdb_DBOptions
* Method: getDBOptionsFromProps * Method: getDBOptionsFromProps
...@@ -5690,6 +5726,18 @@ jlong Java_org_rocksdb_WriteOptions_newWriteOptions( ...@@ -5690,6 +5726,18 @@ jlong Java_org_rocksdb_WriteOptions_newWriteOptions(
return reinterpret_cast<jlong>(op); return reinterpret_cast<jlong>(op);
} }
/*
* Class: org_rocksdb_WriteOptions
* Method: copyWriteOptions
* Signature: (J)J
*/
jlong Java_org_rocksdb_WriteOptions_copyWriteOptions(
JNIEnv* env, jclass jcls, jlong jhandle) {
auto new_opt = new rocksdb::WriteOptions(
*(reinterpret_cast<rocksdb::WriteOptions*>(jhandle)));
return reinterpret_cast<jlong>(new_opt);
}
/* /*
* Class: org_rocksdb_WriteOptions * Class: org_rocksdb_WriteOptions
* Method: disposeInternal * Method: disposeInternal
...@@ -5808,10 +5856,9 @@ jlong Java_org_rocksdb_ReadOptions_newReadOptions( ...@@ -5808,10 +5856,9 @@ jlong Java_org_rocksdb_ReadOptions_newReadOptions(
*/ */
jlong Java_org_rocksdb_ReadOptions_copyReadOptions( jlong Java_org_rocksdb_ReadOptions_copyReadOptions(
JNIEnv* env, jclass jcls, jlong jhandle) { JNIEnv* env, jclass jcls, jlong jhandle) {
auto old_read_opt = reinterpret_cast<rocksdb::ReadOptions*>(jhandle); auto new_opt = new rocksdb::ReadOptions(
auto new_read_opt = new rocksdb::ReadOptions(); *(reinterpret_cast<rocksdb::ReadOptions*>(jhandle)));
*new_read_opt = *old_read_opt; return reinterpret_cast<jlong>(new_opt);
return reinterpret_cast<jlong>(new_read_opt);
} }
/* /*
......
...@@ -27,12 +27,32 @@ public class ColumnFamilyOptions extends RocksObject ...@@ -27,12 +27,32 @@ public class ColumnFamilyOptions extends RocksObject
* Construct ColumnFamilyOptions. * Construct ColumnFamilyOptions.
* *
* This constructor will create (by allocating a block of memory) * This constructor will create (by allocating a block of memory)
* an {@code rocksdb::DBOptions} in the c++ side. * an {@code rocksdb::ColumnFamilyOptions} in the c++ side.
*/ */
public ColumnFamilyOptions() { public ColumnFamilyOptions() {
super(newColumnFamilyOptions()); super(newColumnFamilyOptions());
} }
/**
* Copy constructor for ColumnFamilyOptions.
*
* NOTE: This does a shallow copy, which means comparator, merge_operator, compaction_filter,
* compaction_filter_factory and other pointers will be cloned!
*
* @param other The ColumnFamilyOptions to copy.
*/
public ColumnFamilyOptions(ColumnFamilyOptions other) {
super(copyColumnFamilyOptions(other.nativeHandle_));
this.memTableConfig_ = other.memTableConfig_;
this.tableFormatConfig_ = other.tableFormatConfig_;
this.comparator_ = other.comparator_;
this.compactionFilter_ = other.compactionFilter_;
this.compactionFilterFactory_ = other.compactionFilterFactory_;
this.compactionOptionsUniversal_ = other.compactionOptionsUniversal_;
this.compactionOptionsFIFO_ = other.compactionOptionsFIFO_;
this.compressionOptions_ = other.compressionOptions_;
}
/** /**
* <p>Method to get a options instance by using pre-configured * <p>Method to get a options instance by using pre-configured
* property values. If one or many values are undefined in * property values. If one or many values are undefined in
...@@ -783,6 +803,7 @@ public class ColumnFamilyOptions extends RocksObject ...@@ -783,6 +803,7 @@ public class ColumnFamilyOptions extends RocksObject
String optString); String optString);
private static native long newColumnFamilyOptions(); private static native long newColumnFamilyOptions();
private static native long copyColumnFamilyOptions(long handle);
@Override protected final native void disposeInternal(final long handle); @Override protected final native void disposeInternal(final long handle);
private native void optimizeForSmallDb(final long handle); private native void optimizeForSmallDb(final long handle);
...@@ -934,6 +955,7 @@ public class ColumnFamilyOptions extends RocksObject ...@@ -934,6 +955,7 @@ public class ColumnFamilyOptions extends RocksObject
private native boolean forceConsistencyChecks(final long handle); private native boolean forceConsistencyChecks(final long handle);
// instance variables // instance variables
// NOTE: If you add new member variables, please update the copy constructor above!
private MemTableConfig memTableConfig_; private MemTableConfig memTableConfig_;
private TableFormatConfig tableFormatConfig_; private TableFormatConfig tableFormatConfig_;
private AbstractComparator<? extends AbstractSlice<?>> comparator_; private AbstractComparator<? extends AbstractSlice<?>> comparator_;
......
...@@ -32,6 +32,22 @@ public class DBOptions ...@@ -32,6 +32,22 @@ public class DBOptions
numShardBits_ = DEFAULT_NUM_SHARD_BITS; numShardBits_ = DEFAULT_NUM_SHARD_BITS;
} }
/**
* Copy constructor for DBOptions.
*
* NOTE: This does a shallow copy, which means env, rate_limiter, sst_file_manager,
* info_log and other pointers will be cloned!
*
* @param other The DBOptions to copy.
*/
public DBOptions(DBOptions other) {
super(copyDBOptions(other.nativeHandle_));
this.env_ = other.env_;
this.numShardBits_ = other.numShardBits_;
this.rateLimiter_ = other.rateLimiter_;
this.rowCache_ = other.rowCache_;
}
/** /**
* <p>Method to get a options instance by using pre-configured * <p>Method to get a options instance by using pre-configured
* property values. If one or many values are undefined in * property values. If one or many values are undefined in
...@@ -954,6 +970,7 @@ public class DBOptions ...@@ -954,6 +970,7 @@ public class DBOptions
String optString); String optString);
private native static long newDBOptions(); private native static long newDBOptions();
private native static long copyDBOptions(long handle);
@Override protected final native void disposeInternal(final long handle); @Override protected final native void disposeInternal(final long handle);
private native void optimizeForSmallDb(final long handle); private native void optimizeForSmallDb(final long handle);
...@@ -1127,6 +1144,7 @@ public class DBOptions ...@@ -1127,6 +1144,7 @@ public class DBOptions
private native boolean avoidFlushDuringShutdown(final long handle); private native boolean avoidFlushDuringShutdown(final long handle);
// instance variables // instance variables
// NOTE: If you add new member variables, please update the copy constructor above!
private Env env_; private Env env_;
private int numShardBits_; private int numShardBits_;
private RateLimiter rateLimiter_; private RateLimiter rateLimiter_;
......
...@@ -51,6 +51,27 @@ public class Options extends RocksObject ...@@ -51,6 +51,27 @@ public class Options extends RocksObject
env_ = Env.getDefault(); env_ = Env.getDefault();
} }
/**
* Copy constructor for ColumnFamilyOptions.
*
* NOTE: This does a shallow copy, which means comparator, merge_operator
* and other pointers will be cloned!
*
* @param other The Options to copy.
*/
public Options(Options other) {
super(copyOptions(other.nativeHandle_));
this.env_ = other.env_;
this.memTableConfig_ = other.memTableConfig_;
this.tableFormatConfig_ = other.tableFormatConfig_;
this.rateLimiter_ = other.rateLimiter_;
this.comparator_ = other.comparator_;
this.compactionOptionsUniversal_ = other.compactionOptionsUniversal_;
this.compactionOptionsFIFO_ = other.compactionOptionsFIFO_;
this.compressionOptions_ = other.compressionOptions_;
this.rowCache_ = other.rowCache_;
}
@Override @Override
public Options setIncreaseParallelism(final int totalThreads) { public Options setIncreaseParallelism(final int totalThreads) {
assert(isOwningHandle()); assert(isOwningHandle());
...@@ -1548,6 +1569,7 @@ public class Options extends RocksObject ...@@ -1548,6 +1569,7 @@ public class Options extends RocksObject
private native static long newOptions(); private native static long newOptions();
private native static long newOptions(long dbOptHandle, private native static long newOptions(long dbOptHandle,
long cfOptHandle); long cfOptHandle);
private native static long copyOptions(long handle);
@Override protected final native void disposeInternal(final long handle); @Override protected final native void disposeInternal(final long handle);
private native void setEnv(long optHandle, long envHandle); private native void setEnv(long optHandle, long envHandle);
private native void prepareForBulkLoad(long handle); private native void prepareForBulkLoad(long handle);
...@@ -1868,6 +1890,7 @@ public class Options extends RocksObject ...@@ -1868,6 +1890,7 @@ public class Options extends RocksObject
private native boolean forceConsistencyChecks(final long handle); private native boolean forceConsistencyChecks(final long handle);
// instance variables // instance variables
// NOTE: If you add new member variables, please update the copy constructor above!
private Env env_; private Env env_;
private MemTableConfig memTableConfig_; private MemTableConfig memTableConfig_;
private TableFormatConfig tableFormatConfig_; private TableFormatConfig tableFormatConfig_;
......
...@@ -423,6 +423,9 @@ public class ReadOptions extends RocksObject { ...@@ -423,6 +423,9 @@ public class ReadOptions extends RocksObject {
return null; return null;
} }
// instance variables
// NOTE: If you add new member variables, please update the copy constructor above!
//
// Hold a reference to any iterate upper bound that was set on this object // Hold a reference to any iterate upper bound that was set on this object
// until we're destroyed or it's overwritten. That way the caller can freely // until we're destroyed or it's overwritten. That way the caller can freely
// leave scope without us losing the Java Slice object, which during close() // leave scope without us losing the Java Slice object, which during close()
......
...@@ -20,6 +20,19 @@ public class WriteOptions extends RocksObject { ...@@ -20,6 +20,19 @@ public class WriteOptions extends RocksObject {
} }
/**
* Copy constructor for WriteOptions.
*
* NOTE: This does a shallow copy, which means comparator, merge_operator, compaction_filter,
* compaction_filter_factory and other pointers will be cloned!
*
* @param other The ColumnFamilyOptions to copy.
*/
public WriteOptions(WriteOptions other) {
super(copyWriteOptions(other.nativeHandle_));
}
/** /**
* If true, the write will be flushed from the operating system * If true, the write will be flushed from the operating system
* buffer cache (by calling WritableFile::Sync()) before the write * buffer cache (by calling WritableFile::Sync()) before the write
...@@ -145,6 +158,7 @@ public class WriteOptions extends RocksObject { ...@@ -145,6 +158,7 @@ public class WriteOptions extends RocksObject {
} }
private native static long newWriteOptions(); private native static long newWriteOptions();
private native static long copyWriteOptions(long handle);
private native void setSync(long handle, boolean flag); private native void setSync(long handle, boolean flag);
private native boolean sync(long handle); private native boolean sync(long handle);
private native void setDisableWAL(long handle, boolean flag); private native void setDisableWAL(long handle, boolean flag);
......
...@@ -24,6 +24,18 @@ public class ColumnFamilyOptionsTest { ...@@ -24,6 +24,18 @@ public class ColumnFamilyOptionsTest {
public static final Random rand = PlatformRandomHelper. public static final Random rand = PlatformRandomHelper.
getPlatformSpecificRandomFactory(); getPlatformSpecificRandomFactory();
@Test
public void copyConstructor() {
ColumnFamilyOptions origOpts = new ColumnFamilyOptions();
origOpts.setNumLevels(rand.nextInt(8));
origOpts.setTargetFileSizeMultiplier(rand.nextInt(100));
origOpts.setLevel0StopWritesTrigger(rand.nextInt(50));
ColumnFamilyOptions copyOpts = new ColumnFamilyOptions(origOpts);
assertThat(origOpts.numLevels()).isEqualTo(copyOpts.numLevels());
assertThat(origOpts.targetFileSizeMultiplier()).isEqualTo(copyOpts.targetFileSizeMultiplier());
assertThat(origOpts.level0StopWritesTrigger()).isEqualTo(copyOpts.level0StopWritesTrigger());
}
@Test @Test
public void getColumnFamilyOptionsFromProps() { public void getColumnFamilyOptionsFromProps() {
Properties properties = new Properties(); Properties properties = new Properties();
......
...@@ -22,6 +22,19 @@ public class DBOptionsTest { ...@@ -22,6 +22,19 @@ public class DBOptionsTest {
public static final Random rand = PlatformRandomHelper. public static final Random rand = PlatformRandomHelper.
getPlatformSpecificRandomFactory(); getPlatformSpecificRandomFactory();
@Test
public void copyConstructor() {
DBOptions origOpts = new DBOptions();
origOpts.setCreateIfMissing(rand.nextBoolean());
origOpts.setAllow2pc(rand.nextBoolean());
origOpts.setBaseBackgroundCompactions(rand.nextInt(10));
DBOptions copyOpts = new DBOptions(origOpts);
assertThat(origOpts.createIfMissing()).isEqualTo(copyOpts.createIfMissing());
assertThat(origOpts.allow2pc()).isEqualTo(copyOpts.allow2pc());
assertThat(origOpts.baseBackgroundCompactions()).isEqualTo(
copyOpts.baseBackgroundCompactions());
}
@Test @Test
public void getDBOptionsFromProps() { public void getDBOptionsFromProps() {
// setup sample properties // setup sample properties
......
...@@ -26,6 +26,18 @@ public class OptionsTest { ...@@ -26,6 +26,18 @@ public class OptionsTest {
public static final Random rand = PlatformRandomHelper. public static final Random rand = PlatformRandomHelper.
getPlatformSpecificRandomFactory(); getPlatformSpecificRandomFactory();
@Test
public void copyConstructor() {
Options origOpts = new Options();
origOpts.setNumLevels(rand.nextInt(8));
origOpts.setTargetFileSizeMultiplier(rand.nextInt(100));
origOpts.setLevel0StopWritesTrigger(rand.nextInt(50));
Options copyOpts = new Options(origOpts);
assertThat(origOpts.numLevels()).isEqualTo(copyOpts.numLevels());
assertThat(origOpts.targetFileSizeMultiplier()).isEqualTo(copyOpts.targetFileSizeMultiplier());
assertThat(origOpts.level0StopWritesTrigger()).isEqualTo(copyOpts.level0StopWritesTrigger());
}
@Test @Test
public void setIncreaseParallelism() { public void setIncreaseParallelism() {
try (final Options opt = new Options()) { try (final Options opt = new Options()) {
......
...@@ -8,6 +8,8 @@ package org.rocksdb; ...@@ -8,6 +8,8 @@ package org.rocksdb;
import org.junit.ClassRule; import org.junit.ClassRule;
import org.junit.Test; import org.junit.Test;
import java.util.Random;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
public class WriteOptionsTest { public class WriteOptionsTest {
...@@ -16,6 +18,9 @@ public class WriteOptionsTest { ...@@ -16,6 +18,9 @@ public class WriteOptionsTest {
public static final RocksMemoryResource rocksMemoryResource = public static final RocksMemoryResource rocksMemoryResource =
new RocksMemoryResource(); new RocksMemoryResource();
public static final Random rand = PlatformRandomHelper.
getPlatformSpecificRandomFactory();
@Test @Test
public void writeOptions() { public void writeOptions() {
try (final WriteOptions writeOptions = new WriteOptions()) { try (final WriteOptions writeOptions = new WriteOptions()) {
...@@ -42,4 +47,18 @@ public class WriteOptionsTest { ...@@ -42,4 +47,18 @@ public class WriteOptionsTest {
assertThat(writeOptions.noSlowdown()).isFalse(); assertThat(writeOptions.noSlowdown()).isFalse();
} }
} }
@Test
public void copyConstructor() {
WriteOptions origOpts = new WriteOptions();
origOpts.setDisableWAL(rand.nextBoolean());
origOpts.setIgnoreMissingColumnFamilies(rand.nextBoolean());
origOpts.setSync(rand.nextBoolean());
WriteOptions copyOpts = new WriteOptions(origOpts);
assertThat(origOpts.disableWAL()).isEqualTo(copyOpts.disableWAL());
assertThat(origOpts.ignoreMissingColumnFamilies()).isEqualTo(
copyOpts.ignoreMissingColumnFamilies());
assertThat(origOpts.sync()).isEqualTo(copyOpts.sync());
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册