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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#[macro_use]
extern crate log;
#[macro_use]
extern crate lazy_static;
#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate failure;
#[macro_use]
extern crate clap;
#[cfg(feature = "metrics")]
#[macro_use]
extern crate prometheus;
#[cfg(feature = "metrics")]
pub mod metrics;
use clap::App;
pub const ASTER_VERSION: &str = env!("CARGO_PKG_VERSION");
pub mod com;
pub mod protocol;
pub mod proxy;
pub(crate) mod utils;
use failure::Error;
pub fn run() -> Result<(), Error> {
env_logger::init();
let yaml = load_yaml!("cli.yml");
let matches = App::from_yaml(yaml).get_matches();
let config = matches.value_of("config").unwrap_or("default.toml");
let ip = matches.value_of("ip").map(|x| x.to_string());
info!("[aster] loading config from {}", config);
let cfg = com::Config::load(&config)?;
debug!("use config : {:?}", cfg);
assert!(
!cfg.clusters.is_empty(),
"clusters is absent of config file"
);
let mut ths = Vec::new();
for cluster in cfg.clusters.clone().into_iter() {
if cluster.servers.is_empty() {
warn!(
"fail to running cluster {} in addr {} due filed `servers` is empty",
cluster.name, cluster.listen_addr
);
continue;
}
if cluster.name.is_empty() {
warn!(
"fail to running cluster {} in addr {} due filed `name` is empty",
cluster.name, cluster.listen_addr
);
continue;
}
info!(
"starting aster cluster {} in addr {}",
cluster.name, cluster.listen_addr
);
match cluster.cache_type {
com::CacheType::RedisCluster => {
let jhs = proxy::cluster::run(cluster, ip.clone());
ths.extend(jhs);
}
_ => {
let jhs = proxy::standalone::run(cluster, ip.clone());
ths.extend(jhs);
}
}
}
#[cfg(feature = "metrics")]
{
let port_str = matches.value_of("metrics").unwrap_or("2110");
let port = port_str.parse::<usize>().unwrap_or(2110);
spwan_metrics(port);
}
for th in ths {
th.join().unwrap();
}
Ok(())
}
#[cfg(feature = "metrics")]
use std::thread;
#[cfg(feature = "metrics")]
fn spwan_metrics(port: usize) -> Vec<thread::JoinHandle<()>> {
vec![
thread::Builder::new()
.name("aster-metrics-thread".to_string())
.spawn(move || metrics::init(port).unwrap())
.unwrap(),
thread::Builder::new()
.name("aster-metrics-thread".to_string())
.spawn(move || metrics::measure_system().unwrap())
.unwrap(),
]
}