aboutsummaryrefslogtreecommitdiffstats
path: root/src/access/screen.rs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-11-08 09:49:26 +0000
committertv <tv@krebsco.de>2026-11-08 14:29:46 +0100
commit800ef4faf27abebbce8a553763d6e60662fde997 (patch)
tree72e60244cc9fb8e349221925cbe7ae24f28ecc45 /src/access/screen.rs
parent23f0b629e5d80f880e5a0809f2e47b2d836ee2f9 (diff)
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.
Diffstat (limited to 'src/access/screen.rs')
-rw-r--r--src/access/screen.rs8
1 files changed, 8 insertions, 0 deletions
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 {