proxy we also exercise Slice and DirectSlicemain
parent
5e25274110
commit
c63494fb61
@ -0,0 +1,166 @@ |
|||||||
|
// Copyright (c) 2014, 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.test; |
||||||
|
|
||||||
|
import org.rocksdb.*; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.nio.file.*; |
||||||
|
import java.nio.file.attribute.BasicFileAttributes; |
||||||
|
import java.util.Random; |
||||||
|
|
||||||
|
import static org.rocksdb.test.Types.byteToInt; |
||||||
|
import static org.rocksdb.test.Types.intToByte; |
||||||
|
|
||||||
|
/** |
||||||
|
* Abstract tests for both Comparator and DirectComparator |
||||||
|
*/ |
||||||
|
public abstract class AbstractComparatorTest { |
||||||
|
|
||||||
|
/** |
||||||
|
* Get a comparator which will expect Integer keys |
||||||
|
* and determine an ascending order |
||||||
|
* |
||||||
|
* @return An integer ascending order key comparator |
||||||
|
*/ |
||||||
|
public abstract AbstractComparator getAscendingIntKeyComparator(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Test which stores random keys into 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 |
||||||
|
*/ |
||||||
|
public void testRoundtrip(final Path db_path) throws IOException { |
||||||
|
|
||||||
|
Options opt = null; |
||||||
|
RocksDB db = null; |
||||||
|
|
||||||
|
try { |
||||||
|
opt = new Options(); |
||||||
|
opt.setCreateIfMissing(true); |
||||||
|
opt.setComparator(getAscendingIntKeyComparator()); |
||||||
|
|
||||||
|
// store 10,000 random integer keys
|
||||||
|
final int ITERATIONS = 10000; |
||||||
|
|
||||||
|
db = RocksDB.open(opt, db_path.toString()); |
||||||
|
final Random random = new Random(); |
||||||
|
for(int i = 0; i < ITERATIONS; i++) { |
||||||
|
final byte key[] = intToByte(random.nextInt()); |
||||||
|
if(i > 0 && db.get(key) != null) { // does key already exist (avoid duplicates)
|
||||||
|
i--; // generate a different key
|
||||||
|
} else { |
||||||
|
db.put(key, "value".getBytes()); |
||||||
|
} |
||||||
|
} |
||||||
|
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()); |
||||||
|
final RocksIterator it = db.newIterator(); |
||||||
|
it.seekToFirst(); |
||||||
|
int lastKey = Integer.MIN_VALUE; |
||||||
|
int count = 0; |
||||||
|
for(it.seekToFirst(); it.isValid(); it.next()) { |
||||||
|
final int thisKey = byteToInt(it.key()); |
||||||
|
assert(thisKey > lastKey); |
||||||
|
lastKey = thisKey; |
||||||
|
count++; |
||||||
|
} |
||||||
|
db.close(); |
||||||
|
|
||||||
|
assert(count == ITERATIONS); |
||||||
|
|
||||||
|
} catch (final RocksDBException e) { |
||||||
|
System.err.format("[ERROR]: %s%n", e); |
||||||
|
e.printStackTrace(); |
||||||
|
} finally { |
||||||
|
if(db != null) { |
||||||
|
db.close(); |
||||||
|
} |
||||||
|
|
||||||
|
if(opt != null) { |
||||||
|
opt.dispose(); |
||||||
|
} |
||||||
|
|
||||||
|
removeDb(db_path); // cleanup after ourselves!
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Compares integer keys |
||||||
|
* so that they are in ascending order |
||||||
|
* |
||||||
|
* @param a 4-bytes representing an integer key |
||||||
|
* @param b 4-bytes representing an integer key |
||||||
|
* |
||||||
|
* @return negative if a < b, 0 if a == b, positive otherwise |
||||||
|
*/ |
||||||
|
protected final int compareIntKeys(final byte[] a, final byte[] b) { |
||||||
|
|
||||||
|
final int iA = byteToInt(a); |
||||||
|
final int iB = byteToInt(b); |
||||||
|
|
||||||
|
// protect against int key calculation overflow
|
||||||
|
final double diff = (double)iA - iB; |
||||||
|
final int result; |
||||||
|
if(diff < Integer.MIN_VALUE) { |
||||||
|
result = Integer.MIN_VALUE; |
||||||
|
} else if(diff > Integer.MAX_VALUE) { |
||||||
|
result = Integer.MAX_VALUE; |
||||||
|
} else { |
||||||
|
result = (int)diff; |
||||||
|
} |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Utility method for deleting database files |
||||||
|
* |
||||||
|
* @param db_path The path to the database to remove |
||||||
|
* from the filesystem |
||||||
|
*/ |
||||||
|
private static void removeDb(final Path db_path) throws IOException { |
||||||
|
Files.walkFileTree(db_path, new SimpleFileVisitor<Path>() { |
||||||
|
@Override |
||||||
|
public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) |
||||||
|
throws IOException { |
||||||
|
Files.delete(file); |
||||||
|
return FileVisitResult.CONTINUE; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public FileVisitResult visitFileFailed(final Path file, IOException exc) |
||||||
|
throws IOException { |
||||||
|
// try to delete the file anyway, even if its attributes
|
||||||
|
// could not be read, since delete-only access is
|
||||||
|
// theoretically possible
|
||||||
|
Files.delete(file); |
||||||
|
return FileVisitResult.CONTINUE; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public FileVisitResult postVisitDirectory(final Path dir, IOException exc) |
||||||
|
throws IOException { |
||||||
|
if (exc == null) { |
||||||
|
Files.delete(dir); |
||||||
|
return FileVisitResult.CONTINUE; |
||||||
|
} else { |
||||||
|
// directory iteration failed; propagate exception
|
||||||
|
throw exc; |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
// Copyright (c) 2014, 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.test; |
||||||
|
|
||||||
|
import org.rocksdb.ComparatorOptions; |
||||||
|
import org.rocksdb.RocksDB; |
||||||
|
|
||||||
|
import java.util.Random; |
||||||
|
|
||||||
|
public class ComparatorOptionsTest { |
||||||
|
|
||||||
|
static { |
||||||
|
RocksDB.loadLibrary(); |
||||||
|
} |
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
final ComparatorOptions copt = new ComparatorOptions(); |
||||||
|
Random rand = new Random(); |
||||||
|
|
||||||
|
{ // UseAdaptiveMutex test
|
||||||
|
copt.setUseAdaptiveMutex(true); |
||||||
|
assert(copt.useAdaptiveMutex() == true); |
||||||
|
|
||||||
|
copt.setUseAdaptiveMutex(false); |
||||||
|
assert(copt.useAdaptiveMutex() == false); |
||||||
|
} |
||||||
|
|
||||||
|
copt.dispose(); |
||||||
|
System.out.println("Passed ComparatorOptionsTest"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
// Copyright (c) 2014, 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.test; |
||||||
|
|
||||||
|
import org.rocksdb.*; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.nio.file.FileSystems; |
||||||
|
|
||||||
|
public class ComparatorTest { |
||||||
|
private static final String db_path = "/tmp/comparator_db"; |
||||||
|
|
||||||
|
static { |
||||||
|
RocksDB.loadLibrary(); |
||||||
|
} |
||||||
|
|
||||||
|
public static void main(String[] args) throws IOException { |
||||||
|
|
||||||
|
final AbstractComparatorTest comparatorTest = new AbstractComparatorTest() { |
||||||
|
@Override |
||||||
|
public AbstractComparator getAscendingIntKeyComparator() { |
||||||
|
return new Comparator(new ComparatorOptions()) { |
||||||
|
|
||||||
|
@Override |
||||||
|
public String name() { |
||||||
|
return "test.AscendingIntKeyComparator"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int compare(final Slice a, final Slice b) { |
||||||
|
return compareIntKeys(a.data(), b.data()); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
// test the round-tripability of keys written and read with the Comparator
|
||||||
|
comparatorTest.testRoundtrip(FileSystems.getDefault().getPath(db_path)); |
||||||
|
|
||||||
|
System.out.println("Passed ComparatorTest"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
// Copyright (c) 2014, 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.test; |
||||||
|
|
||||||
|
import org.rocksdb.*; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.nio.file.FileSystems; |
||||||
|
|
||||||
|
public class DirectComparatorTest { |
||||||
|
private static final String db_path = "/tmp/direct_comparator_db"; |
||||||
|
|
||||||
|
static { |
||||||
|
RocksDB.loadLibrary(); |
||||||
|
} |
||||||
|
|
||||||
|
public static void main(String[] args) throws IOException { |
||||||
|
|
||||||
|
final AbstractComparatorTest comparatorTest = new AbstractComparatorTest() { |
||||||
|
@Override |
||||||
|
public AbstractComparator getAscendingIntKeyComparator() { |
||||||
|
return new DirectComparator(new ComparatorOptions()) { |
||||||
|
|
||||||
|
@Override |
||||||
|
public String name() { |
||||||
|
return "test.AscendingIntKeyDirectComparator"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int compare(final DirectSlice a, final DirectSlice b) { |
||||||
|
final byte ax[] = new byte[4], bx[] = new byte[4]; |
||||||
|
a.data().get(ax); |
||||||
|
b.data().get(bx); |
||||||
|
return compareIntKeys(ax, bx); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
// test the round-tripability of keys written and read with the DirectComparator
|
||||||
|
comparatorTest.testRoundtrip(FileSystems.getDefault().getPath(db_path)); |
||||||
|
|
||||||
|
System.out.println("Passed DirectComparatorTest"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,43 @@ |
|||||||
|
// Copyright (c) 2014, 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.test; |
||||||
|
|
||||||
|
/** |
||||||
|
* Simple type conversion methods |
||||||
|
* for use in tests |
||||||
|
*/ |
||||||
|
public class Types { |
||||||
|
|
||||||
|
/** |
||||||
|
* Convert first 4 bytes of a byte array to an int |
||||||
|
* |
||||||
|
* @param data The byte array |
||||||
|
* |
||||||
|
* @return An integer |
||||||
|
*/ |
||||||
|
public static int byteToInt(final byte data[]) { |
||||||
|
return (data[0] & 0xff) | |
||||||
|
((data[1] & 0xff) << 8) | |
||||||
|
((data[2] & 0xff) << 16) | |
||||||
|
((data[3] & 0xff) << 24); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Convert an int to 4 bytes |
||||||
|
* |
||||||
|
* @param v The int |
||||||
|
* |
||||||
|
* @return A byte array containing 4 bytes |
||||||
|
*/ |
||||||
|
public static byte[] intToByte(final int v) { |
||||||
|
return new byte[] { |
||||||
|
(byte)((v >>> 0) & 0xff), |
||||||
|
(byte)((v >>> 8) & 0xff), |
||||||
|
(byte)((v >>> 16) & 0xff), |
||||||
|
(byte)((v >>> 24) & 0xff) |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue