From 800ef4faf27abebbce8a553763d6e60662fde997 Mon Sep 17 00:00:00 2001 From: tv Date: Sun, 8 Nov 2026 09:49:26 +0000 Subject: sync: a member refused as a whole, synced with again once it changed document A node refusing a member as a whole sent it nothing, and lifted that only when a change of the member's was taken again. But a member that dropped what was refused (REFUSALS) starts its sync sessions over, and a fresh session sends no changes until the other side answers: the two waited for each other, and the member stayed refused. The refusal now notes the member's run and epoch_seq when it began; a member with another document since (it dropped what was refused, or rejoined) is synced with again. --- src/access/screen.rs | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/access/screen.rs') diff --git a/src/access/screen.rs b/src/access/screen.rs index 44d96ec..be4bb9c 100644 --- a/src/access/screen.rs +++ b/src/access/screen.rs @@ -145,6 +145,14 @@ impl Screening { self.refusing.get(node) } + /// `node` refused as a whole no more: it has another document since, without what + /// was refused, or it would build on it (`swarm::sync`). + pub(crate) fn forgive(&mut self, node: &str) { + if self.refusing.remove(node).is_some() { + tracing::info!(node = %node, "A member refused as a whole has another document since: refused no longer"); + } + } + /// The members refused as a whole and taken again of `screened`, logged. fn judge_members(&mut self, screened: &Screened) { for node in &screened.taken_from { -- cgit v1.3.1