[Java] Add Java support for cache sharding.

Summary:
Add setCacheNumShardBits() and cacheNumShardBits() to Options.  This allows
developers to control the number of shards for the block cache.

Test Plan:
make rocksdbjava
cd java
make db_bench
./jdb_bench.sh --cache_size=1048576 --cache_numshardbits=6

Reviewers: sdong, ljin, ankgup87

Reviewed By: ankgup87

Subscribers: leveldb

Differential Revision: https://reviews.facebook.net/D19347
This commit is contained in:
Yueh-Hsuan Chiang 2014-07-22 09:48:37 -07:00
parent ae7743f226
commit d19aa25594
5 changed files with 49 additions and 5 deletions

View File

@ -44,6 +44,7 @@ public class RocksDBSample {
.setBlockSize(64 * SizeUnit.KB) .setBlockSize(64 * SizeUnit.KB)
.setMaxBackgroundCompactions(10) .setMaxBackgroundCompactions(10)
.setFilter(filter) .setFilter(filter)
.setCacheNumShardBits(6)
.setCompressionType(CompressionType.SNAPPY_COMPRESSION); .setCompressionType(CompressionType.SNAPPY_COMPRESSION);
Statistics stats = options.statisticsPtr(); Statistics stats = options.statisticsPtr();
@ -53,6 +54,7 @@ public class RocksDBSample {
assert(options.disableSeekCompaction() == true); assert(options.disableSeekCompaction() == true);
assert(options.blockSize() == 64 * SizeUnit.KB); assert(options.blockSize() == 64 * SizeUnit.KB);
assert(options.maxBackgroundCompactions() == 10); assert(options.maxBackgroundCompactions() == 10);
assert(options.cacheNumShardBits() == 6);
assert(options.compressionType() == CompressionType.SNAPPY_COMPRESSION); assert(options.compressionType() == CompressionType.SNAPPY_COMPRESSION);
assert(options.memTableFactoryName().equals("SkipListFactory")); assert(options.memTableFactoryName().equals("SkipListFactory"));

View File

@ -14,6 +14,7 @@ package org.rocksdb;
*/ */
public class Options extends RocksObject { public class Options extends RocksObject {
static final long DEFAULT_CACHE_SIZE = 8 << 20; static final long DEFAULT_CACHE_SIZE = 8 << 20;
static final int DEFAULT_NUM_SHARD_BITS = -1;
/** /**
* Construct options for opening a RocksDB. * Construct options for opening a RocksDB.
* *
@ -23,6 +24,7 @@ public class Options extends RocksObject {
public Options() { public Options() {
super(); super();
cacheSize_ = DEFAULT_CACHE_SIZE; cacheSize_ = DEFAULT_CACHE_SIZE;
numShardBits_ = DEFAULT_NUM_SHARD_BITS;
newOptions(); newOptions();
env_ = RocksEnv.getDefault(); env_ = RocksEnv.getDefault();
} }
@ -215,6 +217,7 @@ public class Options extends RocksObject {
* If cacheSize is non-positive, then cache will not be used. * If cacheSize is non-positive, then cache will not be used.
* *
* DEFAULT: 8M * DEFAULT: 8M
* @see setCacheNumShardBits()
*/ */
public Options setCacheSize(long cacheSize) { public Options setCacheSize(long cacheSize) {
cacheSize_ = cacheSize; cacheSize_ = cacheSize;
@ -223,11 +226,42 @@ public class Options extends RocksObject {
/** /**
* @return the amount of cache in bytes that will be used by RocksDB. * @return the amount of cache in bytes that will be used by RocksDB.
*
* @see cacheNumShardBits()
*/ */
public long cacheSize() { public long cacheSize() {
return cacheSize_; return cacheSize_;
} }
/**
* Controls the number of shards for the block cache.
* This is applied only if cacheSize is set to non-negative.
*
* @param numShardBits the number of shard bits. The resulting
* number of shards would be 2 ^ numShardBits. Any negative
* number means use default settings."
* @return the reference to the current option.
*
* @see setCacheSize()
*/
public Options setCacheNumShardBits(int numShardBits) {
numShardBits_ = numShardBits;
return this;
}
/**
* Returns the number of shard bits used in the block cache.
* The resulting number of shards would be 2 ^ (returned value).
* Any negative number means use default settings.
*
* @return the number of shard bits used in the block cache.
*
* @see cacheSize()
*/
public int cacheNumShardBits() {
return numShardBits_;
}
/** /**
* If true, an error will be thrown during RocksDB.open() if the * If true, an error will be thrown during RocksDB.open() if the
* database already exists. * database already exists.
@ -2397,6 +2431,7 @@ public class Options extends RocksObject {
long handle, int prefixLength); long handle, int prefixLength);
long cacheSize_; long cacheSize_;
int numShardBits_;
Filter filter_; Filter filter_;
RocksEnv env_; RocksEnv env_;
} }

View File

@ -106,7 +106,8 @@ public class RocksDB extends RocksObject {
// in RocksDB can prevent Java to GC during the life-time of // in RocksDB can prevent Java to GC during the life-time of
// the currently-created RocksDB. // the currently-created RocksDB.
RocksDB db = new RocksDB(); RocksDB db = new RocksDB();
db.open(options.nativeHandle_, options.cacheSize_, path); db.open(options.nativeHandle_, options.cacheSize_,
options.numShardBits_, path);
db.transferCppRawPointersOwnershipFrom(options); db.transferCppRawPointersOwnershipFrom(options);
return db; return db;
} }
@ -330,7 +331,8 @@ public class RocksDB extends RocksObject {
// native methods // native methods
protected native void open( protected native void open(
long optionsHandle, long cacheSize, String path) throws RocksDBException; long optionsHandle, long cacheSize, int numShardBits,
String path) throws RocksDBException;
protected native void put( protected native void put(
long handle, byte[] key, int keyLen, long handle, byte[] key, int keyLen,
byte[] value, int valueLen) throws RocksDBException; byte[] value, int valueLen) throws RocksDBException;

View File

@ -534,6 +534,8 @@ public class DbBenchmark {
(Integer)flags_.get(Flag.max_background_flushes)); (Integer)flags_.get(Flag.max_background_flushes));
options.setCacheSize( options.setCacheSize(
(Long)flags_.get(Flag.cache_size)); (Long)flags_.get(Flag.cache_size));
options.setCacheNumShardBits(
(Integer)flags_.get(Flag.cache_numshardbits));
options.setBlockSize( options.setBlockSize(
(Long)flags_.get(Flag.block_size)); (Long)flags_.get(Flag.block_size));
options.setMaxOpenFiles( options.setMaxOpenFiles(
@ -616,7 +618,6 @@ public class DbBenchmark {
options.setCompressionLevel((Integer)flags_.get(Flag.compression_level)); options.setCompressionLevel((Integer)flags_.get(Flag.compression_level));
options.setMinLevelToCompress((Integer)flags_.get(Flag.min_level_to_compress)); options.setMinLevelToCompress((Integer)flags_.get(Flag.min_level_to_compress));
options.setHdfs((String)flags_.get(Flag.hdfs)); // env options.setHdfs((String)flags_.get(Flag.hdfs)); // env
options.setCacheNumshardbits((Integer)flags_.get(Flag.cache_numshardbits));
options.setStatistics((Boolean)flags_.get(Flag.statistics)); options.setStatistics((Boolean)flags_.get(Flag.statistics));
options.setUniversalSizeRatio( options.setUniversalSizeRatio(
(Integer)flags_.get(Flag.universal_size_ratio)); (Integer)flags_.get(Flag.universal_size_ratio));

View File

@ -27,11 +27,15 @@
*/ */
void Java_org_rocksdb_RocksDB_open( void Java_org_rocksdb_RocksDB_open(
JNIEnv* env, jobject jdb, jlong jopt_handle, JNIEnv* env, jobject jdb, jlong jopt_handle,
jlong jcache_size, jstring jdb_path) { jlong jcache_size, jint jnum_shardbits, jstring jdb_path) {
auto opt = reinterpret_cast<rocksdb::Options*>(jopt_handle); auto opt = reinterpret_cast<rocksdb::Options*>(jopt_handle);
if (jcache_size > 0) { if (jcache_size > 0) {
opt->no_block_cache = false; opt->no_block_cache = false;
opt->block_cache = rocksdb::NewLRUCache(jcache_size); if (jnum_shardbits >= 1) {
opt->block_cache = rocksdb::NewLRUCache(jcache_size, jnum_shardbits);
} else {
opt->block_cache = rocksdb::NewLRUCache(jcache_size);
}
} else { } else {
opt->no_block_cache = true; opt->no_block_cache = true;
opt->block_cache = nullptr; opt->block_cache = nullptr;