feat: start health supervisor
This commit is contained in:
parent
adadaff463
commit
285469ffed
722
Cargo.lock
generated
722
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
11
Cargo.toml
11
Cargo.toml
|
@ -6,9 +6,10 @@ edition = "2021"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
openraft = { version = "0.8.3", features = ["serde"]}
|
openraft = { version = "0.8.8", features = ["serde", "single-term-leader"]}
|
||||||
libmcaptcha = { branch = "master", git = "https://github.com/mCaptcha/libmcaptcha", features = ["full"]}
|
#openraft = { git = "https://github.com/drmingdrmer/openraft", tag = "v0.9.0-alpha.1", features = ["serde", "single-term-leader"]}
|
||||||
#libmcaptcha = { path="../libmcaptcha/", features = ["full"]}
|
#libmcaptcha = { branch = "master", git = "https://github.com/mCaptcha/libmcaptcha", features = ["full"]}
|
||||||
|
libmcaptcha = { path="/src/atm/code/mcaptcha/libmcaptcha", features=["full"] }
|
||||||
tracing = { version = "0.1.37", features = ["log"] }
|
tracing = { version = "0.1.37", features = ["log"] }
|
||||||
serde_json = "1.0.96"
|
serde_json = "1.0.96"
|
||||||
serde = { version = "1.0.163", features = ["derive"] }
|
serde = { version = "1.0.163", features = ["derive"] }
|
||||||
|
@ -19,10 +20,9 @@ futures-util = { version = "0.3.17", default-features = false, features = ["std"
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
pretty_env_logger = "0.4.0"
|
pretty_env_logger = "0.4.0"
|
||||||
uuid = { version = "1", features = ["v4"] }
|
uuid = { version = "1", features = ["v4"] }
|
||||||
sqlx = { version = "0.5.13", features = [ "runtime-actix-rustls", "postgres", "time", "offline" ] }
|
|
||||||
actix-web-codegen-const-routes = { version = "0.1.0", tag = "0.1.0", git = "https://github.com/realaravinth/actix-web-codegen-const-routes" }
|
actix-web-codegen-const-routes = { version = "0.1.0", tag = "0.1.0", git = "https://github.com/realaravinth/actix-web-codegen-const-routes" }
|
||||||
derive_builder = "0.11.2"
|
derive_builder = "0.11.2"
|
||||||
config = "0.11"
|
config = { version = "0.11", features = ["toml"] }
|
||||||
derive_more = "0.99.17"
|
derive_more = "0.99.17"
|
||||||
url = { version = "2.2.2", features = ["serde"]}
|
url = { version = "2.2.2", features = ["serde"]}
|
||||||
async-trait = "0.1.36"
|
async-trait = "0.1.36"
|
||||||
|
@ -35,7 +35,6 @@ actix = "0.13.0"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
sqlx = { version = "0.5.13", features = [ "runtime-actix-rustls", "postgres", "time", "offline"] }
|
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
actix-rt = "2.7.0"
|
actix-rt = "2.7.0"
|
||||||
|
|
67
src/lib.rs
67
src/lib.rs
|
@ -17,6 +17,7 @@
|
||||||
*/
|
*/
|
||||||
#![allow(clippy::uninlined_format_args)]
|
#![allow(clippy::uninlined_format_args)]
|
||||||
|
|
||||||
|
use std::io::Cursor;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use actix_web::middleware;
|
use actix_web::middleware;
|
||||||
|
@ -24,6 +25,7 @@ use actix_web::middleware::Logger;
|
||||||
use actix_web::web::Data;
|
use actix_web::web::Data;
|
||||||
use actix_web::App;
|
use actix_web::App;
|
||||||
use actix_web::HttpServer;
|
use actix_web::HttpServer;
|
||||||
|
use openraft::storage::Adaptor;
|
||||||
use openraft::BasicNode;
|
use openraft::BasicNode;
|
||||||
use openraft::Config;
|
use openraft::Config;
|
||||||
use openraft::Raft;
|
use openraft::Raft;
|
||||||
|
@ -38,7 +40,6 @@ use crate::store::DcacheResponse;
|
||||||
use crate::store::DcacheStore;
|
use crate::store::DcacheStore;
|
||||||
|
|
||||||
pub mod app;
|
pub mod app;
|
||||||
//pub mod client;
|
|
||||||
pub mod network;
|
pub mod network;
|
||||||
pub mod store;
|
pub mod store;
|
||||||
|
|
||||||
|
@ -46,10 +47,13 @@ pub type DcacheNodeId = u64;
|
||||||
|
|
||||||
openraft::declare_raft_types!(
|
openraft::declare_raft_types!(
|
||||||
/// Declare the type configuration for example K/V store.
|
/// Declare the type configuration for example K/V store.
|
||||||
pub DcacheTypeConfig: D = DcacheRequest, R = DcacheResponse, NodeId = DcacheNodeId, Node = BasicNode
|
pub DcacheTypeConfig: D = DcacheRequest, R = DcacheResponse, NodeId = DcacheNodeId, Node = BasicNode,
|
||||||
|
Entry = openraft::Entry<DcacheTypeConfig>, SnapshotData = Cursor<Vec<u8>>
|
||||||
);
|
);
|
||||||
|
|
||||||
pub type DcacheRaft = Raft<DcacheTypeConfig, DcacheNetwork, Arc<DcacheStore>>;
|
pub type LogStore = Adaptor<DcacheTypeConfig, Arc<DcacheStore>>;
|
||||||
|
pub type StateMachineStore = Adaptor<DcacheTypeConfig, Arc<DcacheStore>>;
|
||||||
|
pub type DcacheRaft = Raft<DcacheTypeConfig, Arc<DcacheNetwork>, LogStore, StateMachineStore>;
|
||||||
|
|
||||||
pub mod typ {
|
pub mod typ {
|
||||||
use openraft::BasicNode;
|
use openraft::BasicNode;
|
||||||
|
@ -73,6 +77,8 @@ pub mod typ {
|
||||||
pub async fn start_example_raft_node(
|
pub async fn start_example_raft_node(
|
||||||
node_id: DcacheNodeId,
|
node_id: DcacheNodeId,
|
||||||
http_addr: String,
|
http_addr: String,
|
||||||
|
introducer_addr: String,
|
||||||
|
introducer_id: DcacheNodeId,
|
||||||
) -> std::io::Result<()> {
|
) -> std::io::Result<()> {
|
||||||
// Create a configuration for the raft instance.
|
// Create a configuration for the raft instance.
|
||||||
let config = Config {
|
let config = Config {
|
||||||
|
@ -91,14 +97,30 @@ pub async fn start_example_raft_node(
|
||||||
// Create a instance of where the Raft data will be stored.
|
// Create a instance of where the Raft data will be stored.
|
||||||
let store = Arc::new(DcacheStore::new(salt));
|
let store = Arc::new(DcacheStore::new(salt));
|
||||||
|
|
||||||
|
let (log_store, state_machine) = Adaptor::new(store.clone());
|
||||||
|
let client = reqwest::Client::new();
|
||||||
|
|
||||||
// Create the network layer that will connect and communicate the raft instances and
|
// Create the network layer that will connect and communicate the raft instances and
|
||||||
// will be used in conjunction with the store created above.
|
// will be used in conjunction with the store created above.
|
||||||
let network = DcacheNetwork {};
|
|
||||||
|
let (manager_tx, manager_rx) = tokio::sync::mpsc::channel(1000);
|
||||||
|
// let health = Arc::new(crate::network::raft_network_impl::HealthLedger::new(manager_tx));
|
||||||
|
// let network = Arc::new(DcacheNetwork::new(health));
|
||||||
|
let network = Arc::new(DcacheNetwork::new(manager_tx, client.clone()));
|
||||||
|
|
||||||
// Create a local raft instance.
|
// Create a local raft instance.
|
||||||
let raft = Raft::new(node_id, config.clone(), network, store.clone())
|
let raft = Raft::new(
|
||||||
.await
|
node_id,
|
||||||
.unwrap();
|
config.clone(),
|
||||||
|
network.clone(),
|
||||||
|
log_store,
|
||||||
|
state_machine,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
raft.enable_heartbeat(true);
|
||||||
|
raft.enable_elect(true);
|
||||||
|
// raft.enable_tick(true);
|
||||||
|
|
||||||
// Create an application that will store all the instances created above, this will
|
// Create an application that will store all the instances created above, this will
|
||||||
// be later used on the actix-web services.
|
// be later used on the actix-web services.
|
||||||
|
@ -108,8 +130,14 @@ pub async fn start_example_raft_node(
|
||||||
raft,
|
raft,
|
||||||
store,
|
store,
|
||||||
config,
|
config,
|
||||||
|
network,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if introducer_addr == http_addr {
|
||||||
|
app.init().await.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
let app_copy = app.clone();
|
||||||
// Start the actix-web server.
|
// Start the actix-web server.
|
||||||
let server = HttpServer::new(move || {
|
let server = HttpServer::new(move || {
|
||||||
App::new()
|
App::new()
|
||||||
|
@ -129,11 +157,30 @@ pub async fn start_example_raft_node(
|
||||||
// application API
|
// application API
|
||||||
.service(api::write)
|
.service(api::write)
|
||||||
.service(api::state)
|
.service(api::state)
|
||||||
// .service(api::read)
|
.service(api::read)
|
||||||
|
.service(api::pipeline_read)
|
||||||
|
.service(api::pipeline_write)
|
||||||
// .service(api::consistent_read)
|
// .service(api::consistent_read)
|
||||||
});
|
});
|
||||||
|
|
||||||
let x = server.bind(http_addr)?;
|
let x = server.bind(&http_addr)?;
|
||||||
|
|
||||||
x.run().await
|
let server_fut = tokio::spawn(x.run());
|
||||||
|
tokio::time::sleep(std::time::Duration::new(3, 0)).await;
|
||||||
|
|
||||||
|
let req: (DcacheNodeId, String) = (node_id, http_addr);
|
||||||
|
let c = reqwest::Client::new();
|
||||||
|
c.post(format!("http://{}/add-learner", introducer_addr))
|
||||||
|
.json(&req)
|
||||||
|
.send()
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
// let health_job = tokio::spawn(DcacheApp::health_job(app_copy));
|
||||||
|
|
||||||
|
let health_metrics_handle =
|
||||||
|
crate::network::management::HealthMetrics::spawn(app_copy, 5, manager_rx).await;
|
||||||
|
server_fut.await??;
|
||||||
|
health_metrics_handle.abort();
|
||||||
|
// health_job.abort();
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue