mirror of
https://github.com/telemt/telemt.git
synced 2026-11-02 22:02:00 +03:00
Proxy Shared User Drafts
This commit is contained in:
@@ -41,8 +41,9 @@ impl MePool {
|
||||
coordinator: &crate::transport::middle_proxy::pool::ReinitCoordinatorState,
|
||||
) -> Result<WriterContour> {
|
||||
let endpoint_is_current = self
|
||||
.preferred_endpoints_by_dc
|
||||
.endpoint_snapshot
|
||||
.load()
|
||||
.preferred_endpoints_by_dc
|
||||
.get(&writer.writer_dc)
|
||||
.is_some_and(|endpoints| endpoints.contains(&writer.addr));
|
||||
if !endpoint_is_current {
|
||||
@@ -61,6 +62,7 @@ impl MePool {
|
||||
&& coordinator.pending.is_some_and(|pending| {
|
||||
pending.generation == writer.generation
|
||||
&& pending.map_hash == coordinator.desired_map_hash
|
||||
&& pending.endpoint_revision == coordinator.endpoint_revision
|
||||
})
|
||||
{
|
||||
return Ok(WriterContour::Warm);
|
||||
@@ -92,7 +94,8 @@ impl MePool {
|
||||
if intent == WriterOpenIntent::Replacement || contour == WriterContour::Draining {
|
||||
return Ok(());
|
||||
}
|
||||
let preferred = self.preferred_endpoints_by_dc.load();
|
||||
let endpoint_snapshot = self.endpoint_snapshot.load();
|
||||
let preferred = &endpoint_snapshot.preferred_endpoints_by_dc;
|
||||
let Some(endpoints) = preferred.get(&writer.writer_dc) else {
|
||||
return Err(ProxyError::Proxy(
|
||||
"ME writer target changed before publication".into(),
|
||||
|
||||
@@ -85,7 +85,8 @@ impl MePool {
|
||||
"ME floor rebalance lost active-generation authority".into(),
|
||||
));
|
||||
}
|
||||
let preferred = self.preferred_endpoints_by_dc.load();
|
||||
let endpoint_snapshot = self.endpoint_snapshot.load();
|
||||
let preferred = &endpoint_snapshot.preferred_endpoints_by_dc;
|
||||
let donor_count = writers
|
||||
.iter()
|
||||
.filter(|candidate| {
|
||||
@@ -265,8 +266,11 @@ mod tests {
|
||||
async fn replacement_commit_publishes_successor_before_draining_victim() {
|
||||
let pool = make_pool().await;
|
||||
let addr = endpoint(1);
|
||||
pool.preferred_endpoints_by_dc
|
||||
.store(Arc::new(HashMap::from([(2, vec![addr])])));
|
||||
pool.update_proxy_maps(
|
||||
HashMap::from([(2, vec![(addr.ip(), addr.port())])]),
|
||||
None,
|
||||
)
|
||||
.await;
|
||||
let victim = install_writer(&pool, 1001, 2, addr).await;
|
||||
let expected_role = WriterRole::from_writer(&victim);
|
||||
let mut reservation = pool
|
||||
@@ -305,8 +309,11 @@ mod tests {
|
||||
async fn cancelled_replacement_waiting_for_publication_restores_all_reservations() {
|
||||
let pool = make_pool().await;
|
||||
let addr = endpoint(2);
|
||||
pool.preferred_endpoints_by_dc
|
||||
.store(Arc::new(HashMap::from([(2, vec![addr])])));
|
||||
pool.update_proxy_maps(
|
||||
HashMap::from([(2, vec![(addr.ip(), addr.port())])]),
|
||||
None,
|
||||
)
|
||||
.await;
|
||||
let victim = install_writer(&pool, 2001, 2, addr).await;
|
||||
let expected_role = WriterRole::from_writer(&victim);
|
||||
let mut reservation = pool
|
||||
@@ -342,10 +349,14 @@ mod tests {
|
||||
let pool = make_pool().await;
|
||||
let donor_addr = endpoint(3);
|
||||
let receiver_addr = endpoint(4);
|
||||
pool.preferred_endpoints_by_dc.store(Arc::new(HashMap::from([
|
||||
(1, vec![donor_addr]),
|
||||
(2, vec![receiver_addr]),
|
||||
])));
|
||||
pool.update_proxy_maps(
|
||||
HashMap::from([
|
||||
(1, vec![(donor_addr.ip(), donor_addr.port())]),
|
||||
(2, vec![(receiver_addr.ip(), receiver_addr.port())]),
|
||||
]),
|
||||
None,
|
||||
)
|
||||
.await;
|
||||
let victim = install_writer(&pool, 3001, 1, donor_addr).await;
|
||||
let expected_role = WriterRole::from_writer(&victim);
|
||||
let mut reservation = pool
|
||||
|
||||
Reference in New Issue
Block a user