|
|
|
@ -9,7 +9,8 @@ import org.rocksdb.*; |
|
|
|
|
|
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.nio.file.*; |
|
|
|
|
import java.nio.file.attribute.BasicFileAttributes; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Random; |
|
|
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat; |
|
|
|
@ -40,7 +41,7 @@ public abstract class AbstractComparatorTest { |
|
|
|
|
* |
|
|
|
|
* @throws java.io.IOException if IO error happens. |
|
|
|
|
*/ |
|
|
|
|
public void testRoundtrip(final Path db_path) throws IOException { |
|
|
|
|
public void testRoundtrip(final Path db_path) throws IOException, RocksDBException { |
|
|
|
|
|
|
|
|
|
Options opt = null; |
|
|
|
|
RocksDB db = null; |
|
|
|
@ -65,7 +66,6 @@ public abstract class AbstractComparatorTest { |
|
|
|
|
} |
|
|
|
|
db.close(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// re-open db and read from start to end
|
|
|
|
|
// integer keys should be in ascending
|
|
|
|
|
// order as defined by SimpleIntComparator
|
|
|
|
@ -84,9 +84,6 @@ public abstract class AbstractComparatorTest { |
|
|
|
|
|
|
|
|
|
assertThat(count).isEqualTo(ITERATIONS); |
|
|
|
|
|
|
|
|
|
} catch (final RocksDBException e) { |
|
|
|
|
System.err.format("[ERROR]: %s%n", e); |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} finally { |
|
|
|
|
if (db != null) { |
|
|
|
|
db.close(); |
|
|
|
@ -98,6 +95,96 @@ public abstract class AbstractComparatorTest { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Test which stores random keys into a column family |
|
|
|
|
* in the database |
|
|
|
|
* using an @see getAscendingIntKeyComparator |
|
|
|
|
* it then checks that these keys are read back in |
|
|
|
|
* ascending order |
|
|
|
|
* |
|
|
|
|
* @param db_path A path where we can store database |
|
|
|
|
* files temporarily |
|
|
|
|
* |
|
|
|
|
* @throws java.io.IOException if IO error happens. |
|
|
|
|
*/ |
|
|
|
|
public void testRoundtripCf(final Path db_path) throws IOException, |
|
|
|
|
RocksDBException { |
|
|
|
|
|
|
|
|
|
DBOptions opt = null; |
|
|
|
|
RocksDB db = null; |
|
|
|
|
List<ColumnFamilyDescriptor> cfDescriptors = |
|
|
|
|
new ArrayList<>(); |
|
|
|
|
cfDescriptors.add(new ColumnFamilyDescriptor( |
|
|
|
|
RocksDB.DEFAULT_COLUMN_FAMILY)); |
|
|
|
|
cfDescriptors.add(new ColumnFamilyDescriptor("new_cf", |
|
|
|
|
new ColumnFamilyOptions().setComparator( |
|
|
|
|
getAscendingIntKeyComparator()))); |
|
|
|
|
List<ColumnFamilyHandle> cfHandles = new ArrayList<>(); |
|
|
|
|
try { |
|
|
|
|
opt = new DBOptions(). |
|
|
|
|
setCreateIfMissing(true). |
|
|
|
|
setCreateMissingColumnFamilies(true); |
|
|
|
|
|
|
|
|
|
// store 10,000 random integer keys
|
|
|
|
|
final int ITERATIONS = 10000; |
|
|
|
|
|
|
|
|
|
db = RocksDB.open(opt, db_path.toString(), cfDescriptors, cfHandles); |
|
|
|
|
assertThat(cfDescriptors.size()).isEqualTo(2); |
|
|
|
|
assertThat(cfHandles.size()).isEqualTo(2); |
|
|
|
|
|
|
|
|
|
final Random random = new Random(); |
|
|
|
|
for (int i = 0; i < ITERATIONS; i++) { |
|
|
|
|
final byte key[] = intToByte(random.nextInt()); |
|
|
|
|
if (i > 0 && db.get(cfHandles.get(1), key) != null) { // does key already exist (avoid duplicates)
|
|
|
|
|
i--; // generate a different key
|
|
|
|
|
} else { |
|
|
|
|
db.put(cfHandles.get(1), key, "value".getBytes()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for (ColumnFamilyHandle handle : cfHandles) { |
|
|
|
|
handle.dispose(); |
|
|
|
|
} |
|
|
|
|
cfHandles.clear(); |
|
|
|
|
db.close(); |
|
|
|
|
|
|
|
|
|
// re-open db and read from start to end
|
|
|
|
|
// integer keys should be in ascending
|
|
|
|
|
// order as defined by SimpleIntComparator
|
|
|
|
|
db = RocksDB.open(opt, db_path.toString(), cfDescriptors, cfHandles); |
|
|
|
|
assertThat(cfDescriptors.size()).isEqualTo(2); |
|
|
|
|
assertThat(cfHandles.size()).isEqualTo(2); |
|
|
|
|
final RocksIterator it = db.newIterator(cfHandles.get(1)); |
|
|
|
|
it.seekToFirst(); |
|
|
|
|
int lastKey = Integer.MIN_VALUE; |
|
|
|
|
int count = 0; |
|
|
|
|
for (it.seekToFirst(); it.isValid(); it.next()) { |
|
|
|
|
final int thisKey = byteToInt(it.key()); |
|
|
|
|
assertThat(thisKey).isGreaterThan(lastKey); |
|
|
|
|
lastKey = thisKey; |
|
|
|
|
count++; |
|
|
|
|
} |
|
|
|
|
for (ColumnFamilyHandle handle : cfHandles) { |
|
|
|
|
handle.dispose(); |
|
|
|
|
} |
|
|
|
|
cfHandles.clear(); |
|
|
|
|
db.close(); |
|
|
|
|
assertThat(count).isEqualTo(ITERATIONS); |
|
|
|
|
|
|
|
|
|
} finally { |
|
|
|
|
for (ColumnFamilyHandle handle : cfHandles) { |
|
|
|
|
handle.dispose(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (db != null) { |
|
|
|
|
db.close(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (opt != null) { |
|
|
|
|
opt.dispose(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Compares integer keys |
|
|
|
|
* so that they are in ascending order |
|
|
|
|