# codex-dht - Codex DHT # Copyright (c) 2022 Status Research & Development GmbH # Licensed and distributed under either of # * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT). # * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0). # at your option. This file may not be copied, modified, or distributed except according to those terms. {.push raises: [Defect].} import std/sequtils import pkg/chronicles import pkg/libp2p import ../node import ../lru import ./common const MaxProvidersEntries* = 1000'u # one thousand records MaxProvidersPerEntry* = 200'u # providers per entry logScope: topics = "discv5 providers cache" type Providers* = LRUCache[PeerId, SignedPeerRecord] ItemsCache* = LRUCache[NodeId, Providers] ProvidersCache* = object disable: bool cache*: ItemsCache maxProviders*: int func add*( self: var ProvidersCache, id: NodeId, provider: SignedPeerRecord) = if self.disable: return var providers = if id notin self.cache: Providers.init(self.maxProviders.int) else: self.cache.get(id).get() let peerId = provider.data.peerId trace "Adding provider to cache", id, peerId providers.put(peerId, provider) self.cache.put(id, providers) proc get*( self: var ProvidersCache, id: NodeId, start = 0, stop = MaxProvidersPerEntry.int): seq[SignedPeerRecord] = if self.disable: return if id in self.cache: let recs = self.cache.get(id).get let providers = toSeq(recs)[start..