Skip to content

Commit

Permalink
Remove datacenters from phoenix (#1098)
Browse files Browse the repository at this point in the history
  • Loading branch information
Jake-Shadle authored Feb 6, 2025
1 parent 956024d commit 12897fa
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 2 deletions.
35 changes: 34 additions & 1 deletion src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
//! Quilkin configuration.
use std::{
net::IpAddr,
net::{IpAddr, SocketAddr},
sync::{
atomic::{AtomicU64, Ordering::Relaxed},
Arc,
Expand Down Expand Up @@ -447,6 +447,8 @@ impl Config {
datacenters.modify(|wg| {
let remote_addr = remote_addr.map(|ra| ra.ip().to_canonical());

wg.remove(removed_resources);

for res in resources {
let Some(resource) = res.resource else {
eyre::bail!("a datacenter resource could not be applied because it didn't contain an actual payload");
Expand Down Expand Up @@ -595,6 +597,8 @@ impl Config {
#[derive(Default, Debug, Deserialize, Serialize)]
pub struct DatacenterMap {
map: dashmap::DashMap<IpAddr, Datacenter>,
#[serde(skip)]
removed: parking_lot::Mutex<Vec<SocketAddr>>,
version: AtomicU64,
}

Expand Down Expand Up @@ -630,6 +634,34 @@ impl DatacenterMap {
pub fn iter(&self) -> dashmap::iter::Iter<IpAddr, Datacenter> {
self.map.iter()
}

#[inline]
pub fn remove(&self, removed: &[String]) {
if removed.is_empty() {
return;
}

let mut lock = self.removed.lock();
let mut version = 0;
for addr in removed {
let Ok(ip) = addr.parse() else {
continue;
};
let Some((_k, v)) = self.map.remove(&ip) else {
continue;
};

lock.push((ip, v.qcmp_port).into());
version += 1;
}

self.version.fetch_add(version, Relaxed);
}

#[inline]
pub fn removed(&self) -> Vec<SocketAddr> {
std::mem::take(&mut self.removed.lock())
}
}

impl Clone for DatacenterMap {
Expand All @@ -638,6 +670,7 @@ impl Clone for DatacenterMap {
Self {
map,
version: <_>::default(),
removed: Default::default(),
}
}
}
Expand Down
9 changes: 8 additions & 1 deletion src/net/phoenix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -450,7 +450,14 @@ impl<M: Measurement + 'static> Phoenix<M> {
let crate::config::DatacenterConfig::NonAgent { datacenters } = &config.datacenter else {
unreachable!("this shouldn't be called by an agent")
};
for entry in datacenters.write().iter() {

let dcs = datacenters.write();

for removed in dcs.removed() {
self.nodes.remove(&removed);
}

for entry in dcs.iter() {
let addr = (*entry.key(), entry.value().qcmp_port).into();
self.add_node_if_not_exists(addr, entry.value().icao_code);
}
Expand Down

0 comments on commit 12897fa

Please sign in to comment.