use std::{io, sync::Arc};
use wedb_standalone::servers::{
garnet_server_tcp::GarnetServerTcp,
i_garnet_server::{GarnetServer as GarnetServerFace, SessionProviderFace, WireFormat},
};
pub struct GarnetServer {
servers: Vec<Arc<GarnetServerTcp>>,
}
impl GarnetServer {
pub fn new(
endpoints: &[String],
network_buffer_size: usize,
network_send_throttle_max: usize,
network_connection_limit: i32,
session_provider: Arc<dyn SessionProviderFace>,
) -> Self {
let servers = endpoints
.iter()
.map(|endpoint| {
let server = Arc::new(GarnetServerTcp::new(
endpoint,
network_buffer_size,
network_send_throttle_max,
network_connection_limit,
));
server
.register(WireFormat::Ascii, Arc::clone(&session_provider))
.expect("全新服务器的首次注册不可冲突");
server
})
.collect();
Self { servers }
}
pub fn servers(&self) -> &[Arc<GarnetServerTcp>] {
&self.servers
}
pub fn start(&self) -> io::Result<()> {
for server in &self.servers {
server.start()?;
}
Ok(())
}
pub fn dispose(&self) {
for server in &self.servers {
server.close();
}
for server in &self.servers {
server.dispose();
}
}
}
pub struct ServerSettingsManager;
pub struct MemoryLogger;
pub struct MemoryLoggerProvider;
pub struct LoggingBuilderExtensions;
#[cfg(test)]
mod tests {
use std::{net::TcpListener, sync::Arc};
use wedb_standalone::servers::i_garnet_server::{
MessageConsumerFace, ServerEnumerate, SessionProviderFace, WireFormat,
};
use super::*;
struct TestConsumer;
impl MessageConsumerFace for TestConsumer {
fn dispose(&self) {}
fn attach_server(&self, _server: Arc<dyn ServerEnumerate>) {}
}
struct TestProvider;
impl SessionProviderFace for TestProvider {
fn get_session(
&self,
_wire_format: WireFormat,
_network_sender_id: u64,
) -> Option<Arc<dyn MessageConsumerFace>> {
Some(Arc::new(TestConsumer))
}
}
fn assembly(endpoints: &[String]) -> GarnetServer {
GarnetServer::new(endpoints, 0, 8, -1, Arc::new(TestProvider))
}
#[test]
fn assembles_one_server_per_endpoint() {
let endpoints = ["127.0.0.1:0".to_string(), "127.0.0.1:0".to_string()];
let host = assembly(&endpoints);
assert_eq!(host.servers().len(), 2);
for server in host.servers() {
assert!(
server
.base()
.find_session_provider(WireFormat::Ascii)
.is_some()
);
}
}
#[test]
fn start_and_two_phase_dispose() {
let host = assembly(&["127.0.0.1:0".to_string()]);
host.start().expect("监听启动成功");
host.dispose();
for server in host.servers() {
assert!(server.base().disposed());
assert_eq!(server.base().get_conn_active(), 0);
}
host.dispose();
}
#[test]
fn start_failure_reports_error() {
let occupied = TcpListener::bind("127.0.0.1:0").expect("占用端口成功");
let addr = occupied.local_addr().expect("本地地址可得").to_string();
let host = assembly(&[addr]);
assert!(host.start().is_err());
}
}