diff --git a/substrate/network-libp2p/src/network_state.rs b/substrate/network-libp2p/src/network_state.rs index 789482554d12d..549f62e9a623f 100644 --- a/substrate/network-libp2p/src/network_state.rs +++ b/substrate/network-libp2p/src/network_state.rs @@ -34,6 +34,7 @@ use std::fs; use std::io::{Error as IoError, ErrorKind as IoErrorKind, Read, Write}; use std::path::Path; use std::sync::atomic; +use std::{thread, time}; use std::time::{Duration, Instant}; // File where the peers are stored. @@ -180,8 +181,21 @@ impl NetworkState { PeersStorage::Json(peerstore) } else { warn!(target: "sub-libp2p", "Failed to open peer storage {:?} \ - ; peers won't be saved", path); - PeersStorage::Memory(MemoryPeerstore::empty()) + ; peers file will be reset", path); + fs::remove_file(&path).unwrap(); + while Path::new(&path).exists() { + debug!("Waiting for effective deletion of invalid/outdate \ + peers.json"); + thread::sleep(time::Duration::from_millis(5)); + } + if let Ok(peerstore) = JsonPeerstore::new(path.clone()) { + debug!("peers.json reset"); + PeersStorage::Json(peerstore) + } else { + warn!(target: "sub-libp2p", "Failed to reset peer storage\ + {:?}; peers change will not be saved", path); + PeersStorage::Memory(MemoryPeerstore::empty()) + } } } else { debug!(target: "sub-libp2p", "No peers file configured ; peers \ @@ -559,7 +573,7 @@ impl NetworkState { /// You must pass an `UnboundedSender` which will be used by the `send` /// method. Actually sending the data is not covered by this code. /// - /// The various methods of the `NetworkState` that close a connection do + /// The various methods of the `NetworkState` that close a connection do /// so by dropping this sender. pub fn custom_proto( &self, @@ -826,7 +840,7 @@ fn parse_and_add_to_peerstore(addr_str: &str, peerstore: &PeersStorage) .peer_or_create(&peer_id) .add_addr(addr, Duration::from_secs(100000 * 365 * 24 * 3600)), } - + Ok(peer_id) }