Skip to content

Commit 5e6a1f6

Browse files
committed
gossip-memory: replace LruCache with IndexMap to preserve order of relays
Signed-off-by: Yuki Kishimoto <[email protected]>
1 parent f9c1ebf commit 5e6a1f6

File tree

3 files changed

+71
-31
lines changed

3 files changed

+71
-31
lines changed

Cargo.lock

Lines changed: 30 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gossip/nostr-gossip-memory/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ rust-version.workspace = true
1212
keywords = ["nostr", "gossip", "in-memory"]
1313

1414
[dependencies]
15+
indexmap = "2.11"
1516
lru.workspace = true
1617
nostr = { workspace = true, features = ["std"] }
1718
nostr-gossip.workspace = true

gossip/nostr-gossip-memory/src/store.rs

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
33
use std::cmp::Ordering;
44
use std::collections::HashSet;
5-
use std::num::NonZeroUsize;
65
use std::sync::Arc;
76

7+
use indexmap::IndexMap;
88
use lru::LruCache;
99
use nostr::nips::nip17;
1010
use nostr::nips::nip65::{self, RelayMetadata};
@@ -27,15 +27,15 @@ struct PkRelayData {
2727
struct PkData {
2828
last_nip17_update: Option<Timestamp>,
2929
last_nip65_update: Option<Timestamp>,
30-
relays: LruCache<RelayUrl, PkRelayData>,
30+
relays: IndexMap<RelayUrl, PkRelayData>,
3131
}
3232

3333
impl Default for PkData {
3434
fn default() -> Self {
3535
Self {
3636
last_nip17_update: None,
3737
last_nip65_update: None,
38-
relays: LruCache::new(NonZeroUsize::new(25).expect("Invalid cache size")),
38+
relays: IndexMap::new(),
3939
}
4040
}
4141
}
@@ -86,13 +86,19 @@ impl NostrGossipMemory {
8686
let mut read_write_mask: Flags = Flags::READ;
8787
read_write_mask.add(Flags::WRITE);
8888

89-
let relay_data = pk_data
90-
.relays
91-
.get_or_insert_mut(relay_url.clone(), PkRelayData::default);
89+
match pk_data.relays.get_mut(relay_url) {
90+
Some(relay_data) => {
91+
// Update the bitflag: remove the previous READ and WRITE values and apply the new bitflag (preserves any other flag)
92+
relay_data.bitflags.remove(read_write_mask);
93+
relay_data.bitflags.add(bitflag);
94+
}
95+
None => {
96+
let mut relay_data = PkRelayData::default();
97+
relay_data.bitflags.add(bitflag);
9298

93-
// Update the bitflag: remove the previous READ and WRITE values and apply the new bitflag (preserves any other flag)
94-
relay_data.bitflags.remove(read_write_mask);
95-
relay_data.bitflags.add(bitflag);
99+
pk_data.relays.insert(relay_url.clone(), relay_data);
100+
}
101+
}
96102
}
97103
}
98104
// Extract NIP-17 relays
@@ -101,11 +107,17 @@ impl NostrGossipMemory {
101107
public_keys.get_or_insert_mut(event.pubkey, PkData::default);
102108

103109
for relay_url in nip17::extract_relay_list(event).take(MAX_NIP17_SIZE) {
104-
let relay_data = pk_data
105-
.relays
106-
.get_or_insert_mut(relay_url.clone(), PkRelayData::default);
110+
match pk_data.relays.get_mut(relay_url) {
111+
Some(relay_data) => {
112+
relay_data.bitflags.add(Flags::PRIVATE_MESSAGE);
113+
}
114+
None => {
115+
let mut relay_data = PkRelayData::default();
116+
relay_data.bitflags.add(Flags::PRIVATE_MESSAGE);
107117

108-
relay_data.bitflags.add(Flags::PRIVATE_MESSAGE);
118+
pk_data.relays.insert(relay_url.clone(), relay_data);
119+
}
120+
}
109121
}
110122
}
111123
// Extract hints
@@ -300,13 +312,22 @@ impl NostrGossipMemory {
300312

301313
/// Add relay per user or update the received events and bitflags.
302314
fn update_relay_per_user(pk_data: &mut PkData, relay_url: RelayUrl, flags: Flags) {
303-
let relay_data = pk_data
304-
.relays
305-
.get_or_insert_mut(relay_url, PkRelayData::default);
315+
match pk_data.relays.get_mut(&relay_url) {
316+
Some(relay_data) => {
317+
relay_data.bitflags.add(flags);
318+
relay_data.received_events = relay_data.received_events.saturating_add(1);
319+
relay_data.last_received_event = Some(Timestamp::now());
320+
}
321+
None => {
322+
let mut relay_data = PkRelayData::default();
306323

307-
relay_data.bitflags.add(flags);
308-
relay_data.received_events = relay_data.received_events.saturating_add(1);
309-
relay_data.last_received_event = Some(Timestamp::now());
324+
relay_data.bitflags.add(flags);
325+
relay_data.received_events = relay_data.received_events.saturating_add(1);
326+
relay_data.last_received_event = Some(Timestamp::now());
327+
328+
pk_data.relays.insert(relay_url, relay_data);
329+
}
330+
}
310331
}
311332

312333
impl NostrGossip for NostrGossipMemory {

0 commit comments

Comments
 (0)