From 64b91c2645524956209892788ad7841e94461bd6 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Mon, 5 Apr 2021 20:33:24 +0200 Subject: Keep old data --- src/rpc/membership.rs | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'src/rpc') diff --git a/src/rpc/membership.rs b/src/rpc/membership.rs index 330c154f..f8223420 100644 --- a/src/rpc/membership.rs +++ b/src/rpc/membership.rs @@ -582,7 +582,7 @@ impl System { .map(|ip| (*ip, None)) .collect::>(); - match self.persist_status.load() { + match self.persist_status.load_async().await { Ok(peers) => { bp2.extend(peers.iter().map(|x| (x.addr, Some(x.id)))); } @@ -653,9 +653,25 @@ impl System { async fn update_status(self: &Arc, updaters: &Updaters, status: Status) { if status.hash != self.status.borrow().hash { info!("Persisting new peer list"); - let serializable_status = status.to_serializable_membership(&self); - self.persist_status.save_async(&serializable_status).await - .expect("Unable to persist peer list"); + + let mut list = status.to_serializable_membership(&self); + + // Combine with old peer list to make sure no peer is lost + match self.persist_status.load_async().await { + Ok(old_list) => { + for pp in old_list { + if !list.iter().any(|np| pp.id == np.id) { + list.push(pp); + } + } + } + _ => (), + } + + if list.len() > 0 { + self.persist_status.save_async(&list).await + .expect("Unable to persist peer list"); + } } let status = Arc::new(status); -- cgit v1.2.3