From 4241c5c0c759025ea6de96b2a50eef37f5aba377 Mon Sep 17 00:00:00 2001 From: Nazar Mokrynskyi Date: Thu, 2 Feb 2023 13:17:02 +0200 Subject: [PATCH] Stop persisting locally provided records on node --- crates/subspace-service/src/dsn.rs | 3 +- .../src/dsn/node_provider_storage.rs | 33 ++++++++++++++----- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/crates/subspace-service/src/dsn.rs b/crates/subspace-service/src/dsn.rs index 0ea8c1a639..b39f3dc474 100644 --- a/crates/subspace-service/src/dsn.rs +++ b/crates/subspace-service/src/dsn.rs @@ -79,7 +79,8 @@ where Either::Right(MemoryProviderStorage::new(peer_id)) }; - let provider_storage = NodeProviderStorage::new(piece_cache.clone(), external_provider_storage); + let provider_storage = + NodeProviderStorage::new(peer_id, piece_cache.clone(), external_provider_storage); let networking_config = subspace_networking::Config { keypair: dsn_config.keypair.clone(), diff --git a/crates/subspace-service/src/dsn/node_provider_storage.rs b/crates/subspace-service/src/dsn/node_provider_storage.rs index 692b14a8ba..29acfa46bb 100644 --- a/crates/subspace-service/src/dsn/node_provider_storage.rs +++ b/crates/subspace-service/src/dsn/node_provider_storage.rs @@ -4,20 +4,34 @@ use subspace_networking::libp2p::PeerId; use subspace_networking::ProviderStorage; pub(crate) struct NodeProviderStorage { + local_peer_id: PeerId, /// Provider records from local cache implicit_provider_storage: ImplicitProviderStorage, /// External provider records persistent_provider_storage: PersistentProviderStorage, } -impl - NodeProviderStorage +impl + NodeProviderStorage +where + PersistentProviderStorage: ProviderStorage, { pub(crate) fn new( + local_peer_id: PeerId, implicit_provider_storage: ImplicitProviderStorage, - persistent_provider_storage: ExternalProviderStorage, + mut persistent_provider_storage: PersistentProviderStorage, ) -> Self { + // TODO: Transitional upgrade code, should be removed in the future; this is because we no + // longer persist locally provided records + for key in persistent_provider_storage + .provided() + .map(|provided_record| provided_record.key.clone()) + .collect::>() + { + persistent_provider_storage.remove_provider(&key, &local_peer_id); + } Self { + local_peer_id, implicit_provider_storage, persistent_provider_storage, } @@ -36,8 +50,12 @@ where &mut self, record: ProviderRecord, ) -> subspace_networking::libp2p::kad::store::Result<()> { - // only external provider records - self.persistent_provider_storage.add_provider(record) + // Local providers are implicit and should not be put into persistent storage + if record.provider != self.local_peer_id { + self.persistent_provider_storage.add_provider(record) + } else { + Ok(()) + } } fn providers(&self, key: &Key) -> Vec { @@ -50,13 +68,12 @@ where } fn provided(&self) -> Self::ProvidedIter<'_> { - // only local cached provider records + // Only provider records cached locally self.implicit_provider_storage.provided() } fn remove_provider(&mut self, key: &Key, peer_id: &PeerId) { - // only external provider records self.persistent_provider_storage - .remove_provider(key, peer_id) + .remove_provider(key, peer_id); } }