use std::path::PathBuf;
use std::sync::{Arc, Mutex};
use edgestore::{EdgestoreConfig, EdgestoreError, Engine};
use crate::anti_entropy::AntiEntropyLoop;
use crate::http_server::HttpReplicationServer;
pub struct ReplicatedEngine {
engine: Arc<Mutex<Engine>>,
#[allow(dead_code)]
handles: Vec<std::thread::JoinHandle<()>>,
bound_port: Option<u16>,
}
impl ReplicatedEngine {
pub fn open_primary(
config: EdgestoreConfig,
bind_addr: &str,
) -> Result<ReplicatedEngine, EdgestoreError> {
let engine = Arc::new(Mutex::new(Engine::open(config)?));
let server = HttpReplicationServer::new(Arc::clone(&engine));
let (handle, port) = server.start(bind_addr)?;
Ok(ReplicatedEngine {
engine,
handles: vec![handle],
bound_port: Some(port),
})
}
pub fn open_replica(
config: EdgestoreConfig,
primary_url: &str,
) -> Result<ReplicatedEngine, EdgestoreError> {
let db_path: PathBuf = config.path.clone();
let engine = Arc::new(Mutex::new(Engine::open_readonly(config)?));
let peer_id = "primary".to_string();
let loop_ = AntiEntropyLoop::new(
Arc::clone(&engine),
primary_url.to_string(),
peer_id,
db_path,
);
let handle = loop_.start();
Ok(ReplicatedEngine {
engine,
handles: vec![handle],
bound_port: None,
})
}
pub fn engine(&self) -> &Arc<Mutex<Engine>> {
&self.engine
}
pub fn bound_port(&self) -> Option<u16> {
self.bound_port
}
}