From 258dc84079cc2741a72687bdacbe137f03b6f5e8 Mon Sep 17 00:00:00 2001 From: Eval EXEC Date: Wed, 5 Mar 2025 13:32:03 +0800 Subject: [PATCH] wasm: fix dump_to_idb lifetime issue error[E0521]: borrowed data escapes outside of closure --> network/src/services/dump_peer_store.rs:43:24 | 42 | self.network_state.with_peer_store_mut(|peer_store| { | ---------- | | | `peer_store` is a reference that is only valid in the closure body | has type `&'1 mut PeerStore` 43 | let task = peer_store.dump_to_idb(path); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | `peer_store` escapes the closure body here | argument requires that `'1` must outlive `'static` Signed-off-by: Eval EXEC --- network/src/network.rs | 1 + network/src/peer_store/mod.rs | 1 + network/src/peer_store/peer_store_db.rs | 48 +++++++++++++------------ network/src/services/dump_peer_store.rs | 4 ++- 4 files changed, 31 insertions(+), 23 deletions(-) diff --git a/network/src/network.rs b/network/src/network.rs index a4d31b4df7..853deff2f9 100644 --- a/network/src/network.rs +++ b/network/src/network.rs @@ -1538,6 +1538,7 @@ pub enum TransportType { Wss, } +#[allow(dead_code)] pub(crate) fn find_type(addr: &Multiaddr) -> TransportType { let mut iter = addr.iter(); diff --git a/network/src/peer_store/mod.rs b/network/src/peer_store/mod.rs index 1afb65f6e4..fbaa94bc13 100644 --- a/network/src/peer_store/mod.rs +++ b/network/src/peer_store/mod.rs @@ -18,6 +18,7 @@ pub mod types; pub(crate) use crate::Behaviour; pub use crate::SessionType; use p2p::multiaddr::{Multiaddr, Protocol}; +pub use peer_store_db::dump_to_idb; pub use peer_store_impl::PeerStore; pub(crate) use peer_store_impl::required_flags_filter; diff --git a/network/src/peer_store/peer_store_db.rs b/network/src/peer_store/peer_store_db.rs index c03296a4ce..81c2701af5 100644 --- a/network/src/peer_store/peer_store_db.rs +++ b/network/src/peer_store/peer_store_db.rs @@ -194,30 +194,34 @@ impl PeerStore { move_file(tmp_ban_list, path.as_ref().join(DEFAULT_BAN_LIST_DB))?; Ok(()) } +} - #[cfg(target_family = "wasm")] - pub fn dump_to_idb>(&self, path: P) -> impl std::future::Future { - use crate::peer_store::browser::get_db; - let ban_list = self.ban_list().dump_data(); - let addr_manager = self.addr_manager().dump_data(); - let addr_manager_path = path - .as_ref() - .join(DEFAULT_ADDR_MANAGER_DB) - .to_str() - .unwrap() - .to_owned(); - let ban_list_path = path - .as_ref() - .join(DEFAULT_BAN_LIST_DB) - .to_str() - .unwrap() - .to_owned(); - async { - let db = get_db(path).await; +#[cfg(target_family = "wasm")] +pub fn dump_to_idb>( + ban_list: Vec, + addr_manager: Vec, + path: P, +) -> impl std::future::Future { + use crate::peer_store::browser::get_db; + // let ban_list = self.ban_list().dump_data(); + // let addr_manager = self.addr_manager().dump_data(); + let addr_manager_path = path + .as_ref() + .join(DEFAULT_ADDR_MANAGER_DB) + .to_str() + .unwrap() + .to_owned(); + let ban_list_path = path + .as_ref() + .join(DEFAULT_BAN_LIST_DB) + .to_str() + .unwrap() + .to_owned(); + async { + let db = get_db(path).await; - let _ignore = db.put(addr_manager_path.into_bytes(), addr_manager).await; - let _ignore = db.put(ban_list_path.into_bytes(), ban_list).await; - } + let _ignore = db.put(addr_manager_path.into_bytes(), addr_manager).await; + let _ignore = db.put(ban_list_path.into_bytes(), ban_list).await; } } diff --git a/network/src/services/dump_peer_store.rs b/network/src/services/dump_peer_store.rs index c0916b8c4f..d4a16510f6 100644 --- a/network/src/services/dump_peer_store.rs +++ b/network/src/services/dump_peer_store.rs @@ -40,7 +40,9 @@ impl DumpPeerStoreService { fn dump_peer_store(&self) { let path = self.network_state.config.peer_store_path(); self.network_state.with_peer_store_mut(|peer_store| { - let task = peer_store.dump_to_idb(path); + let ban_list = peer_store.ban_list().dump_data(); + let addr_manager = peer_store.addr_manager().dump_data(); + let task = crate::peer_store::dump_to_idb(ban_list, addr_manager, path); p2p::runtime::spawn(task) }); }