summaryrefslogtreecommitdiffstats
path: root/src/swarm/relay.rs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-26 04:20:52 +0100
committertv <tv@krebsco.de>2026-10-26 04:20:52 +0100
commit7b7dcb5a77061cb69d368de263a02b5ad26fbf51 (patch)
treed3255ce629cb60059cb55191dc206d0f64ca645e /src/swarm/relay.rs
parentd668ce2ff8f308e54c1c7a2c145cb3479cab899d (diff)
unify lock logic
Diffstat (limited to 'src/swarm/relay.rs')
-rw-r--r--src/swarm/relay.rs19
1 files changed, 5 insertions, 14 deletions
diff --git a/src/swarm/relay.rs b/src/swarm/relay.rs
index 703bc3f..5053be7 100644
--- a/src/swarm/relay.rs
+++ b/src/swarm/relay.rs
@@ -25,6 +25,7 @@ use std::time::Duration;
use tokio::time::Instant;
use tracing::debug;
+use crate::locks::MutexExt;
use crate::state::{AppState, Standing};
use crate::swarm::peer::send_ping;
use crate::swarm::sync::SyncEvent;
@@ -45,10 +46,7 @@ pub(crate) async fn announce(state: &AppState, from: &str) {
return;
}
let schedule = {
- let mut pending = state
- .announce_pending
- .lock()
- .unwrap_or_else(|poisoned| poisoned.into_inner());
+ let mut pending = state.announce_pending.lock_or_recover();
match pending.as_mut() {
Some(senders) => {
senders.insert(from.to_owned());
@@ -68,8 +66,7 @@ pub(crate) async fn announce(state: &AppState, from: &str) {
tokio::time::sleep(ANNOUNCE_DELAY).await;
let senders = state
.announce_pending
- .lock()
- .unwrap_or_else(|poisoned| poisoned.into_inner())
+ .lock_or_recover()
.take()
.unwrap_or_default();
announce_now(&state, &senders).await;
@@ -128,10 +125,7 @@ pub(crate) async fn pull_if_behind(state: &AppState, peer: &str, remote: &transp
let now = Instant::now();
{
- let mut pulling = state
- .pulling
- .lock()
- .unwrap_or_else(|poisoned| poisoned.into_inner());
+ let mut pulling = state.pulling.lock_or_recover();
let busy = matches!(
&*pulling,
Some((other, since)) if other != peer && now < *since + PULL_TIMEOUT
@@ -169,10 +163,7 @@ pub(crate) async fn pull_if_behind(state: &AppState, peer: &str, remote: &transp
/// A sync message from `peer` was applied: a pull from it is answered.
pub(crate) fn pulled(state: &AppState, peer: &str) {
- let mut pulling = state
- .pulling
- .lock()
- .unwrap_or_else(|poisoned| poisoned.into_inner());
+ let mut pulling = state.pulling.lock_or_recover();
if pulling.as_ref().is_some_and(|(p, _)| p == peer) {
*pulling = None;
}