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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
use lazy_static::lazy_static;
use prometheus::{exponential_buckets, register_histogram, Histogram};
use std::sync::atomic::{AtomicBool, AtomicU64, Ordering};
use std::sync::Arc;
lazy_static! {
pub static ref APPLY_PROPOSAL: Histogram = register_histogram!(
"tikv_raftstore_apply_proposal",
"The count of proposals sent by a region at once",
exponential_buckets(1.0, 2.0, 20).unwrap()
)
.unwrap();
}
#[derive(Default)]
pub struct StoreStat {
pub lock_cf_bytes_written: AtomicU64,
pub engine_total_bytes_written: AtomicU64,
pub engine_total_keys_written: AtomicU64,
pub is_busy: AtomicBool,
}
#[derive(Clone, Default)]
pub struct GlobalStoreStat {
pub stat: Arc<StoreStat>,
}
impl GlobalStoreStat {
#[inline]
pub fn local(&self) -> LocalStoreStat {
LocalStoreStat {
lock_cf_bytes_written: 0,
engine_total_bytes_written: 0,
engine_total_keys_written: 0,
is_busy: false,
global: self.clone(),
}
}
}
pub struct LocalStoreStat {
pub lock_cf_bytes_written: u64,
pub engine_total_bytes_written: u64,
pub engine_total_keys_written: u64,
pub is_busy: bool,
global: GlobalStoreStat,
}
impl Clone for LocalStoreStat {
#[inline]
fn clone(&self) -> LocalStoreStat {
self.global.local()
}
}
impl LocalStoreStat {
pub fn flush(&mut self) {
if self.lock_cf_bytes_written != 0 {
self.global
.stat
.lock_cf_bytes_written
.fetch_add(self.lock_cf_bytes_written, Ordering::Relaxed);
self.lock_cf_bytes_written = 0;
}
if self.engine_total_bytes_written != 0 {
self.global
.stat
.engine_total_bytes_written
.fetch_add(self.engine_total_bytes_written, Ordering::Relaxed);
self.engine_total_bytes_written = 0;
}
if self.engine_total_keys_written != 0 {
self.global
.stat
.engine_total_keys_written
.fetch_add(self.engine_total_keys_written, Ordering::Relaxed);
self.engine_total_keys_written = 0;
}
if self.is_busy {
self.global.stat.is_busy.store(true, Ordering::Relaxed);
self.is_busy = false;
}
}
}