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
use std::sync::{Arc, Mutex};
use crate::config::CoprReadPoolConfig;
use crate::storage::kv::{destroy_tls_engine, set_tls_engine};
use crate::storage::{Engine, FlowStatsReporter};
use file_system::{set_io_type, IOType};
use tikv_util::yatp_pool::{Config, DefaultTicker, FuturePool, PoolTicker, YatpPoolBuilder};
use super::metrics::*;
#[derive(Clone)]
struct FuturePoolTicker<R: FlowStatsReporter> {
pub reporter: R,
}
impl<R: FlowStatsReporter> PoolTicker for FuturePoolTicker<R> {
fn on_tick(&mut self) {
tls_flush(&self.reporter);
}
}
pub fn build_read_pool<E: Engine, R: FlowStatsReporter>(
config: &CoprReadPoolConfig,
reporter: R,
engine: E,
) -> Vec<FuturePool> {
let names = vec!["cop-low", "cop-normal", "cop-high"];
let configs: Vec<Config> = config.to_yatp_pool_configs();
assert_eq!(configs.len(), 3);
configs
.into_iter()
.zip(names)
.map(|(config, name)| {
let reporter = reporter.clone();
let engine = Arc::new(Mutex::new(engine.clone()));
YatpPoolBuilder::new(FuturePoolTicker { reporter })
.config(config)
.name_prefix(name)
.after_start(move || {
set_tls_engine(engine.lock().unwrap().clone());
set_io_type(IOType::ForegroundRead);
})
.before_stop(move || unsafe {
destroy_tls_engine::<E>();
})
.build_future_pool()
})
.collect()
}
pub fn build_read_pool_for_test<E: Engine>(
config: &CoprReadPoolConfig,
engine: E,
) -> Vec<FuturePool> {
let configs: Vec<Config> = config.to_yatp_pool_configs();
assert_eq!(configs.len(), 3);
configs
.into_iter()
.map(|config| {
let engine = Arc::new(Mutex::new(engine.clone()));
YatpPoolBuilder::new(DefaultTicker::default())
.config(config)
.after_start(move || {
set_tls_engine(engine.lock().unwrap().clone());
set_io_type(IOType::ForegroundRead);
})
.before_stop(|| unsafe { destroy_tls_engine::<E>() })
.build_future_pool()
})
.collect()
}