[RocksJava] Adjusted RateLimiter to 3.10.0 (#1368)
Summary: - Deprecated RateLimiterConfig and GenericRateLimiterConfig - Introduced RateLimiter It is now possible to use all C++ related methods also in RocksJava. A noteable method is setBytesPerSecond which can change the allowed number of bytes per second at runtime. Test Plan: make rocksdbjava make jtest Reviewers: adamretter, yhchiang, ankgup87 Subscribers: dhruba Differential Revision: https://reviews.facebook.net/D35715main
parent
37737c3a6b
commit
5cd28833a2
@ -0,0 +1,119 @@ |
|||||||
|
// Copyright (c) 2015, 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; |
||||||
|
|
||||||
|
/** |
||||||
|
* RateLimiter, which is used to control write rate of flush and |
||||||
|
* compaction. |
||||||
|
* |
||||||
|
* @since 3.10.0 |
||||||
|
*/ |
||||||
|
public class RateLimiter extends RocksObject { |
||||||
|
private static final long DEFAULT_REFILL_PERIOD_MICROS = (100 * 1000); |
||||||
|
private static final int DEFAULT_FAIRNESS = 10; |
||||||
|
|
||||||
|
/** |
||||||
|
* RateLimiter constructor |
||||||
|
* |
||||||
|
* @param rateBytesPerSecond this is the only parameter you want to set |
||||||
|
* most of the time. It controls the total write rate of compaction |
||||||
|
* and flush in bytes per second. Currently, RocksDB does not enforce |
||||||
|
* rate limit for anything other than flush and compaction, e.g. write to WAL. |
||||||
|
* @param refillPeriodMicros this controls how often tokens are refilled. For example, |
||||||
|
* when rate_bytes_per_sec is set to 10MB/s and refill_period_us is set to |
||||||
|
* 100ms, then 1MB is refilled every 100ms internally. Larger value can lead to |
||||||
|
* burstier writes while smaller value introduces more CPU overhead. |
||||||
|
* The default should work for most cases. |
||||||
|
* @param fairness RateLimiter accepts high-pri requests and low-pri requests. |
||||||
|
* A low-pri request is usually blocked in favor of hi-pri request. Currently, |
||||||
|
* RocksDB assigns low-pri to request from compaction and high-pri to request |
||||||
|
* from flush. Low-pri requests can get blocked if flush requests come in |
||||||
|
* continuously. This fairness parameter grants low-pri requests permission by |
||||||
|
* fairness chance even though high-pri requests exist to avoid starvation. |
||||||
|
* You should be good by leaving it at default 10. |
||||||
|
*/ |
||||||
|
public RateLimiter(final long rateBytesPerSecond, |
||||||
|
final long refillPeriodMicros, final int fairness) { |
||||||
|
super(newRateLimiterHandle(rateBytesPerSecond, |
||||||
|
refillPeriodMicros, fairness)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* RateLimiter constructor |
||||||
|
* |
||||||
|
* @param rateBytesPerSecond this is the only parameter you want to set |
||||||
|
* most of the time. It controls the total write rate of compaction |
||||||
|
* and flush in bytes per second. Currently, RocksDB does not enforce |
||||||
|
* rate limit for anything other than flush and compaction, e.g. write to WAL. |
||||||
|
*/ |
||||||
|
public RateLimiter(final long rateBytesPerSecond) { |
||||||
|
this(rateBytesPerSecond, DEFAULT_REFILL_PERIOD_MICROS, DEFAULT_FAIRNESS); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* <p>This API allows user to dynamically change rate limiter's bytes per second. |
||||||
|
* REQUIRED: bytes_per_second > 0</p> |
||||||
|
* |
||||||
|
* @param bytesPerSecond bytes per second. |
||||||
|
*/ |
||||||
|
public void setBytesPerSecond(final long bytesPerSecond) { |
||||||
|
assert(isOwningHandle()); |
||||||
|
setBytesPerSecond(nativeHandle_, bytesPerSecond); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* <p>Request for token to write bytes. If this request can not be satisfied, |
||||||
|
* the call is blocked. Caller is responsible to make sure |
||||||
|
* {@code bytes < GetSingleBurstBytes()}.</p> |
||||||
|
* |
||||||
|
* @param bytes requested bytes. |
||||||
|
*/ |
||||||
|
public void request(final long bytes) { |
||||||
|
assert(isOwningHandle()); |
||||||
|
request(nativeHandle_, bytes); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* <p>Max bytes can be granted in a single burst.</p> |
||||||
|
* |
||||||
|
* @return max bytes can be granted in a single burst. |
||||||
|
*/ |
||||||
|
public long getSingleBurstBytes() { |
||||||
|
assert(isOwningHandle()); |
||||||
|
return getSingleBurstBytes(nativeHandle_); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* <p>Total bytes that go though rate limiter.</p> |
||||||
|
* |
||||||
|
* @return total bytes that go though rate limiter. |
||||||
|
*/ |
||||||
|
public long getTotalBytesThrough() { |
||||||
|
assert(isOwningHandle()); |
||||||
|
return getTotalBytesThrough(nativeHandle_); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* <p>Total # of requests that go though rate limiter.</p> |
||||||
|
* |
||||||
|
* @return total # of requests that go though rate limiter. |
||||||
|
*/ |
||||||
|
public long getTotalRequests() { |
||||||
|
assert(isOwningHandle()); |
||||||
|
return getTotalRequests(nativeHandle_); |
||||||
|
} |
||||||
|
|
||||||
|
private static native long newRateLimiterHandle(final long rateBytesPerSecond, |
||||||
|
final long refillPeriodMicros, final int fairness); |
||||||
|
@Override protected final native void disposeInternal(final long handle); |
||||||
|
|
||||||
|
private native void setBytesPerSecond(final long handle, |
||||||
|
final long bytesPerSecond); |
||||||
|
private native void request(final long handle, final long bytes); |
||||||
|
private native long getSingleBurstBytes(final long handle); |
||||||
|
private native long getTotalBytesThrough(final long handle); |
||||||
|
private native long getTotalRequests(final long handle); |
||||||
|
} |
Loading…
Reference in new issue