1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//! RateLimiter object can be shared among RocksDB instances to
//! control write rate of flush and compaction.
use rocks_sys as ll;
use crate::to_raw::ToRaw;
/// `RateLimiter` object, which can be shared among RocksDB instances to
/// control write rate of flush and compaction.
pub struct RateLimiter {
raw: *mut ll::rocks_ratelimiter_t,
}
impl Drop for RateLimiter {
fn drop(&mut self) {
unsafe {
ll::rocks_ratelimiter_destroy(self.raw);
}
}
}
impl ToRaw<ll::rocks_ratelimiter_t> for RateLimiter {
fn raw(&self) -> *mut ll::rocks_ratelimiter_t {
self.raw
}
}
impl RateLimiter {
/// Create a RateLimiter object, which can be shared among RocksDB instances to
/// control write rate of flush and compaction.
///
/// `rate_bytes_per_sec`: 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.
///
/// `refill_period_us`: 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.
///
/// `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 compaciton and high-pri to request
/// from flush. Low-pri requests can get blocked if flush requests come in
/// continuouly. This fairness parameter grants low-pri requests permission by
/// 1/fairness chance even though high-pri requests exist to avoid starvation.
pub fn new(rate_bytes_per_sec: i64, refill_period_us: i64, fairness: i32) -> RateLimiter {
RateLimiter {
raw: unsafe {
ll::rocks_ratelimiter_create(rate_bytes_per_sec, refill_period_us, fairness)
},
}
}
}