Add gossip replication between nodes
Nodes run anti-entropy over a TCP link: each advertises its version vector, the peer replies with the log entries it lacks, and ingest is idempotent so re-delivery and reconnect after a split both converge. The engine is shared behind a mutex; config gains [gossip] and [[peer]].
This commit is contained in:
parent
82e41e95b2
commit
d0556ebe8c
7 changed files with 319 additions and 20 deletions
10
src/main.rs
10
src/main.rs
|
|
@ -1,11 +1,14 @@
|
|||
mod config;
|
||||
mod engine;
|
||||
mod gossip;
|
||||
mod link;
|
||||
mod proto;
|
||||
mod services;
|
||||
|
||||
use anyhow::Result;
|
||||
use std::sync::Arc;
|
||||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
use tokio::sync::Mutex;
|
||||
|
||||
use engine::Engine;
|
||||
use proto::inspircd::InspIrcd;
|
||||
|
|
@ -39,7 +42,12 @@ async fn main() -> Result<()> {
|
|||
})];
|
||||
let mut db = engine::db::Db::open("fedserv.db.jsonl", &cfg.server.sid);
|
||||
db.scram_iterations = cfg.server.scram_iterations;
|
||||
let engine = Engine::new(services, db);
|
||||
let engine = Arc::new(Mutex::new(Engine::new(services, db)));
|
||||
|
||||
if let Some(gossip) = cfg.gossip.clone() {
|
||||
tracing::info!(peers = cfg.peer.len(), "starting gossip");
|
||||
tokio::spawn(gossip::run(engine.clone(), gossip, cfg.peer.clone(), cfg.server.sid.clone()));
|
||||
}
|
||||
|
||||
let addr = format!("{}:{}", cfg.uplink.host, cfg.uplink.port);
|
||||
tracing::info!(server = %cfg.server.name, %addr, "linking to uplink");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue