Add DB::OpenAsSecondary to RocksJava (#7047)
Summary: Closes https://github.com/facebook/rocksdb/issues/5852 Pull Request resolved: https://github.com/facebook/rocksdb/pull/7047 Reviewed By: cheng-chang Differential Revision: D22335162 Pulled By: pdillinger fbshipit-source-id: 75f3c524deccea7ebc0ad288da41f1ea81406c1cmain
parent
bd77e34191
commit
899e59ecb7
@ -0,0 +1,135 @@ |
|||||||
|
// 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 java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import org.junit.ClassRule; |
||||||
|
import org.junit.Rule; |
||||||
|
import org.junit.Test; |
||||||
|
import org.junit.rules.TemporaryFolder; |
||||||
|
|
||||||
|
public class SecondaryDBTest { |
||||||
|
@ClassRule |
||||||
|
public static final RocksNativeLibraryResource ROCKS_NATIVE_LIBRARY_RESOURCE = |
||||||
|
new RocksNativeLibraryResource(); |
||||||
|
|
||||||
|
@Rule public TemporaryFolder dbFolder = new TemporaryFolder(); |
||||||
|
|
||||||
|
@Rule public TemporaryFolder secondaryDbFolder = new TemporaryFolder(); |
||||||
|
|
||||||
|
@Test |
||||||
|
public void openAsSecondary() throws RocksDBException { |
||||||
|
try (final Options options = new Options().setCreateIfMissing(true); |
||||||
|
final RocksDB db = RocksDB.open(options, dbFolder.getRoot().getAbsolutePath())) { |
||||||
|
db.put("key1".getBytes(), "value1".getBytes()); |
||||||
|
db.put("key2".getBytes(), "value2".getBytes()); |
||||||
|
db.put("key3".getBytes(), "value3".getBytes()); |
||||||
|
|
||||||
|
// open secondary
|
||||||
|
try (final Options secondaryOptions = new Options(); |
||||||
|
final RocksDB secondaryDb = |
||||||
|
RocksDB.openAsSecondary(secondaryOptions, dbFolder.getRoot().getAbsolutePath(), |
||||||
|
secondaryDbFolder.getRoot().getAbsolutePath())) { |
||||||
|
assertThat(secondaryDb.get("key1".getBytes())).isEqualTo("value1".getBytes()); |
||||||
|
assertThat(secondaryDb.get("key2".getBytes())).isEqualTo("value2".getBytes()); |
||||||
|
assertThat(secondaryDb.get("key3".getBytes())).isEqualTo("value3".getBytes()); |
||||||
|
|
||||||
|
// write to primary
|
||||||
|
db.put("key4".getBytes(), "value4".getBytes()); |
||||||
|
db.put("key5".getBytes(), "value5".getBytes()); |
||||||
|
db.put("key6".getBytes(), "value6".getBytes()); |
||||||
|
|
||||||
|
// tell secondary to catch up
|
||||||
|
secondaryDb.tryCatchUpWithPrimary(); |
||||||
|
|
||||||
|
db.put("key7".getBytes(), "value7".getBytes()); |
||||||
|
|
||||||
|
// check secondary
|
||||||
|
assertThat(secondaryDb.get("key4".getBytes())).isEqualTo("value4".getBytes()); |
||||||
|
assertThat(secondaryDb.get("key5".getBytes())).isEqualTo("value5".getBytes()); |
||||||
|
assertThat(secondaryDb.get("key6".getBytes())).isEqualTo("value6".getBytes()); |
||||||
|
|
||||||
|
assertThat(secondaryDb.get("key7".getBytes())).isNull(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void openAsSecondaryColumnFamilies() throws RocksDBException { |
||||||
|
try (final ColumnFamilyOptions cfOpts = new ColumnFamilyOptions()) { |
||||||
|
final List<ColumnFamilyDescriptor> cfDescriptors = new ArrayList<>(); |
||||||
|
cfDescriptors.add(new ColumnFamilyDescriptor(RocksDB.DEFAULT_COLUMN_FAMILY, cfOpts)); |
||||||
|
cfDescriptors.add(new ColumnFamilyDescriptor("cf1".getBytes(), cfOpts)); |
||||||
|
|
||||||
|
final List<ColumnFamilyHandle> cfHandles = new ArrayList<>(); |
||||||
|
|
||||||
|
try (final DBOptions options = |
||||||
|
new DBOptions().setCreateIfMissing(true).setCreateMissingColumnFamilies(true); |
||||||
|
final RocksDB db = RocksDB.open( |
||||||
|
options, dbFolder.getRoot().getAbsolutePath(), cfDescriptors, cfHandles)) { |
||||||
|
try { |
||||||
|
final ColumnFamilyHandle cf1 = cfHandles.get(1); |
||||||
|
|
||||||
|
db.put(cf1, "key1".getBytes(), "value1".getBytes()); |
||||||
|
db.put(cf1, "key2".getBytes(), "value2".getBytes()); |
||||||
|
db.put(cf1, "key3".getBytes(), "value3".getBytes()); |
||||||
|
|
||||||
|
final List<ColumnFamilyHandle> secondaryCfHandles = new ArrayList<>(); |
||||||
|
|
||||||
|
// open secondary
|
||||||
|
try (final DBOptions secondaryOptions = new DBOptions(); |
||||||
|
final RocksDB secondaryDb = |
||||||
|
RocksDB.openAsSecondary(secondaryOptions, dbFolder.getRoot().getAbsolutePath(), |
||||||
|
secondaryDbFolder.getRoot().getAbsolutePath(), cfDescriptors, |
||||||
|
secondaryCfHandles)) { |
||||||
|
try { |
||||||
|
final ColumnFamilyHandle secondaryCf1 = secondaryCfHandles.get(1); |
||||||
|
|
||||||
|
assertThat(secondaryDb.get(secondaryCf1, "key1".getBytes())) |
||||||
|
.isEqualTo("value1".getBytes()); |
||||||
|
assertThat(secondaryDb.get(secondaryCf1, "key2".getBytes())) |
||||||
|
.isEqualTo("value2".getBytes()); |
||||||
|
assertThat(secondaryDb.get(secondaryCf1, "key3".getBytes())) |
||||||
|
.isEqualTo("value3".getBytes()); |
||||||
|
|
||||||
|
// write to primary
|
||||||
|
db.put(cf1, "key4".getBytes(), "value4".getBytes()); |
||||||
|
db.put(cf1, "key5".getBytes(), "value5".getBytes()); |
||||||
|
db.put(cf1, "key6".getBytes(), "value6".getBytes()); |
||||||
|
|
||||||
|
// tell secondary to catch up
|
||||||
|
secondaryDb.tryCatchUpWithPrimary(); |
||||||
|
|
||||||
|
db.put(cf1, "key7".getBytes(), "value7".getBytes()); |
||||||
|
|
||||||
|
// check secondary
|
||||||
|
assertThat(secondaryDb.get(secondaryCf1, "key4".getBytes())) |
||||||
|
.isEqualTo("value4".getBytes()); |
||||||
|
assertThat(secondaryDb.get(secondaryCf1, "key5".getBytes())) |
||||||
|
.isEqualTo("value5".getBytes()); |
||||||
|
assertThat(secondaryDb.get(secondaryCf1, "key6".getBytes())) |
||||||
|
.isEqualTo("value6".getBytes()); |
||||||
|
|
||||||
|
assertThat(secondaryDb.get(secondaryCf1, "key7".getBytes())).isNull(); |
||||||
|
|
||||||
|
} finally { |
||||||
|
for (final ColumnFamilyHandle secondaryCfHandle : secondaryCfHandles) { |
||||||
|
secondaryCfHandle.close(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} finally { |
||||||
|
for (final ColumnFamilyHandle cfHandle : cfHandles) { |
||||||
|
cfHandle.close(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue