Adding read/write/db/compaction options (#442)
parent
bc07d0cd28
commit
890ef81fc2
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,177 @@ |
||||
// Copyright 2020 Tran Tuan Linh
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
use libc::{c_char, c_int, c_uchar, c_void}; |
||||
use std::ffi::CStr; |
||||
|
||||
use crate::ffi; |
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq)] |
||||
#[repr(i32)] |
||||
pub enum PerfStatsLevel { |
||||
/// Unknown settings
|
||||
Uninitialized = 0, |
||||
/// Disable perf stats
|
||||
Disable, |
||||
/// Enables only count stats
|
||||
EnableCount, |
||||
/// Count stats and enable time stats except for mutexes
|
||||
EnableTimeExceptForMutex, |
||||
/// Other than time, also measure CPU time counters. Still don't measure
|
||||
/// time (neither wall time nor CPU time) for mutexes
|
||||
EnableTimeAndCPUTimeExceptForMutex, |
||||
/// Enables count and time stats
|
||||
EnableTime, |
||||
/// N.B must always be the last value!
|
||||
OutOfBound, |
||||
} |
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq)] |
||||
#[non_exhaustive] |
||||
#[repr(i32)] |
||||
pub enum PerfMetric { |
||||
UserKeyComparisonCount = 0, |
||||
BlockCacheHitCount = 1, |
||||
BlockReadCount = 2, |
||||
BlockReadByte = 3, |
||||
BlockReadTime = 4, |
||||
BlockChecksumTime = 5, |
||||
BlockDecompressTime = 6, |
||||
GetReadBytes = 7, |
||||
MultigetReadBytes = 8, |
||||
IterReadBytes = 9, |
||||
InternalKeySkippedCount = 10, |
||||
InternalDeleteSkippedCount = 11, |
||||
InternalRecentSkippedCount = 12, |
||||
InternalMergeCount = 13, |
||||
GetSnapshotTime = 14, |
||||
GetFromMemtableTime = 15, |
||||
GetFromMemtableCount = 16, |
||||
GetPostProcessTime = 17, |
||||
GetFromOutputFilesTime = 18, |
||||
SeekOnMemtableTime = 19, |
||||
SeekOnMemtableCount = 20, |
||||
NextOnMemtableCount = 21, |
||||
PrevOnMemtableCount = 22, |
||||
SeekChildSeekTime = 23, |
||||
SeekChildSeekCount = 24, |
||||
SeekMinHeapTime = 25, |
||||
SeekMaxHeapTime = 26, |
||||
SeekInternalSeekTime = 27, |
||||
FindNextUserEntryTime = 28, |
||||
WriteWalTime = 29, |
||||
WriteMemtableTime = 30, |
||||
WriteDelayTime = 31, |
||||
WritePreAndPostProcessTime = 32, |
||||
DbMutexLockNanos = 33, |
||||
DbConditionWaitNanos = 34, |
||||
MergeOperatorTimeNanos = 35, |
||||
ReadIndexBlockNanos = 36, |
||||
ReadFilterBlockNanos = 37, |
||||
NewTableBlockIterNanos = 38, |
||||
NewTableIteratorNanos = 39, |
||||
BlockSeekNanos = 40, |
||||
FindTableNanos = 41, |
||||
BloomMemtableHitCount = 42, |
||||
BloomMemtableMissCount = 43, |
||||
BloomSstHitCount = 44, |
||||
BloomSstMissCount = 45, |
||||
KeyLockWaitTime = 46, |
||||
KeyLockWaitCount = 47, |
||||
EnvNewSequentialFileNanos = 48, |
||||
EnvNewRandomAccessFileNanos = 49, |
||||
EnvNewWritableFileNanos = 50, |
||||
EnvReuseWritableFileNanos = 51, |
||||
EnvNewRandomRwFileNanos = 52, |
||||
EnvNewDirectoryNanos = 53, |
||||
EnvFileExistsNanos = 54, |
||||
EnvGetChildrenNanos = 55, |
||||
EnvGetChildrenFileAttributesNanos = 56, |
||||
EnvDeleteFileNanos = 57, |
||||
EnvCreateDirNanos = 58, |
||||
EnvCreateDirIfMissingNanos = 59, |
||||
EnvDeleteDirNanos = 60, |
||||
EnvGetFileSizeNanos = 61, |
||||
EnvGetFileModificationTimeNanos = 62, |
||||
EnvRenameFileNanos = 63, |
||||
EnvLinkFileNanos = 64, |
||||
EnvLockFileNanos = 65, |
||||
EnvUnlockFileNanos = 66, |
||||
EnvNewLoggerNanos = 67, |
||||
TotalMetricCount = 68, |
||||
} |
||||
|
||||
/// Sets the perf stats level for current thread.
|
||||
pub fn set_perf_stats(lvl: PerfStatsLevel) { |
||||
unsafe { |
||||
ffi::rocksdb_set_perf_level(lvl as c_int); |
||||
} |
||||
} |
||||
|
||||
/// Thread local context for gathering performance counter efficiently
|
||||
/// and transparently.
|
||||
pub struct PerfContext { |
||||
pub(crate) inner: *mut ffi::rocksdb_perfcontext_t, |
||||
} |
||||
|
||||
impl Default for PerfContext { |
||||
fn default() -> PerfContext { |
||||
let ctx = unsafe { ffi::rocksdb_perfcontext_create() }; |
||||
if ctx.is_null() { |
||||
panic!("Could not create Perf Context"); |
||||
} |
||||
PerfContext { inner: ctx } |
||||
} |
||||
} |
||||
|
||||
impl Drop for PerfContext { |
||||
fn drop(&mut self) { |
||||
unsafe { |
||||
ffi::rocksdb_perfcontext_destroy(self.inner); |
||||
} |
||||
} |
||||
} |
||||
|
||||
fn convert(ptr: *const c_char) -> String { |
||||
let cstr = unsafe { CStr::from_ptr(ptr as *const _) }; |
||||
let s = String::from_utf8_lossy(cstr.to_bytes()).into_owned(); |
||||
unsafe { |
||||
libc::free(ptr as *mut c_void); |
||||
} |
||||
s |
||||
} |
||||
|
||||
impl PerfContext { |
||||
/// Reset context
|
||||
pub fn reset(&mut self) { |
||||
unsafe { |
||||
ffi::rocksdb_perfcontext_reset(self.inner); |
||||
} |
||||
} |
||||
|
||||
/// Get the report on perf
|
||||
pub fn report(&self, exclude_zero_counters: bool) -> String { |
||||
unsafe { |
||||
convert(ffi::rocksdb_perfcontext_report( |
||||
self.inner, |
||||
exclude_zero_counters as c_uchar, |
||||
)) |
||||
} |
||||
} |
||||
|
||||
/// Returns value of a metric
|
||||
pub fn metric(&self, id: PerfMetric) -> u64 { |
||||
unsafe { ffi::rocksdb_perfcontext_metric(self.inner, id as c_int) } |
||||
} |
||||
} |
Loading…
Reference in new issue