Skip to content

Commit 823706c

Browse files
committed
f Switch to using a HashMap for PeerInfoStore
1 parent 2e0ec29 commit 823706c

File tree

2 files changed

+36
-35
lines changed

2 files changed

+36
-35
lines changed

src/lib.rs

+13-12
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ const BDK_CLIENT_CONCURRENCY: u8 = 8;
106106
// The timeout after which we abandon retrying failed payments.
107107
const LDK_PAYMENT_RETRY_TIMEOUT: Duration = Duration::from_secs(10);
108108

109+
// The time in between peer reconnection attempts.
110+
const PEER_RECONNECTION_INTERVAL: Duration = Duration::from_secs(10);
111+
109112
#[derive(Debug, Clone)]
110113
/// Represents the configuration of an [`Node`] instance.
111114
pub struct Config {
@@ -622,12 +625,11 @@ impl Node {
622625
let connect_peer_store = Arc::clone(&self.peer_store);
623626
let stop_connect = Arc::clone(&stop_networking);
624627
tokio_runtime.spawn(async move {
625-
let mut interval = tokio::time::interval(Duration::from_secs(1));
628+
let mut interval = tokio::time::interval(PEER_RECONNECTION_INTERVAL);
626629
loop {
627630
if stop_connect.load(Ordering::Acquire) {
628631
return;
629632
}
630-
interval.tick().await;
631633
let pm_peers = connect_pm
632634
.get_peer_node_ids()
633635
.iter()
@@ -639,18 +641,17 @@ impl Node {
639641
.map(|chan| chan.counterparty.node_id)
640642
.filter(|id| !pm_peers.contains(id))
641643
{
642-
for peer_info in connect_peer_store.peers() {
643-
if peer_info.pubkey == node_id {
644-
let _ = do_connect_peer(
645-
peer_info.pubkey,
646-
peer_info.address,
647-
Arc::clone(&connect_pm),
648-
Arc::clone(&connect_logger),
649-
)
650-
.await;
651-
}
644+
if let Some(peer_info) = connect_peer_store.get_peer(&node_id) {
645+
let _ = do_connect_peer(
646+
peer_info.pubkey,
647+
peer_info.address,
648+
Arc::clone(&connect_pm),
649+
Arc::clone(&connect_logger),
650+
)
651+
.await;
652652
}
653653
}
654+
interval.tick().await;
654655
}
655656
});
656657

src/peer_store.rs

+23-23
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
66

77
use bitcoin::secp256k1::PublicKey;
88

9+
use std::collections::HashMap;
910
use std::convert::TryFrom;
1011
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, ToSocketAddrs};
1112
use std::sync::{Arc, RwLock};
@@ -14,30 +15,21 @@ use std::sync::{Arc, RwLock};
1415
pub(crate) const PEER_INFO_PERSISTENCE_KEY: &str = "peers";
1516

1617
pub(crate) struct PeerInfoStorage<K: KVStorePersister> {
17-
peers: RwLock<Vec<PeerInfo>>,
18+
peers: RwLock<HashMap<PublicKey, PeerInfo>>,
1819
persister: Arc<K>,
1920
}
2021

2122
impl<K: KVStorePersister> PeerInfoStorage<K> {
2223
pub(crate) fn new(persister: Arc<K>) -> Self {
23-
let peers = RwLock::new(Vec::new());
24+
let peers = RwLock::new(HashMap::new());
2425
Self { peers, persister }
2526
}
2627

2728
pub(crate) fn add_peer(&self, peer_info: PeerInfo) -> Result<(), Error> {
2829
let mut locked_peers = self.peers.write().unwrap();
2930

30-
// Check if we have the peer. If so, either update it or do nothing.
31-
for stored_info in locked_peers.iter_mut() {
32-
if stored_info.pubkey == peer_info.pubkey {
33-
if stored_info.address != peer_info.address {
34-
stored_info.address = peer_info.address;
35-
}
36-
return Ok(());
37-
}
38-
}
31+
locked_peers.insert(peer_info.pubkey, peer_info);
3932

40-
locked_peers.push(peer_info);
4133
self.persister
4234
.persist(PEER_INFO_PERSISTENCE_KEY, &PeerInfoStorageSerWrapper(&*locked_peers))
4335
.map_err(|_| Error::PersistenceFailed)?;
@@ -48,7 +40,7 @@ impl<K: KVStorePersister> PeerInfoStorage<K> {
4840
pub(crate) fn remove_peer(&self, peer_pubkey: &PublicKey) -> Result<(), Error> {
4941
let mut locked_peers = self.peers.write().unwrap();
5042

51-
locked_peers.retain(|info| info.pubkey != *peer_pubkey);
43+
locked_peers.remove(peer_pubkey);
5244

5345
self.persister
5446
.persist(PEER_INFO_PERSISTENCE_KEY, &PeerInfoStorageSerWrapper(&*locked_peers))
@@ -57,8 +49,12 @@ impl<K: KVStorePersister> PeerInfoStorage<K> {
5749
Ok(())
5850
}
5951

60-
pub(crate) fn peers(&self) -> Vec<PeerInfo> {
61-
self.peers.read().unwrap().clone()
52+
pub(crate) fn list_peers(&self) -> Vec<PeerInfo> {
53+
self.peers.read().unwrap().values().cloned().collect()
54+
}
55+
56+
pub(crate) fn get_peer(&self, peer_pubkey: &PublicKey) -> Option<PeerInfo> {
57+
self.peers.read().unwrap().get(peer_pubkey).cloned()
6258
}
6359
}
6460

@@ -68,34 +64,37 @@ impl<K: KVStorePersister> ReadableArgs<Arc<K>> for PeerInfoStorage<K> {
6864
reader: &mut R, persister: Arc<K>,
6965
) -> Result<Self, lightning::ln::msgs::DecodeError> {
7066
let read_peers: PeerInfoStorageDeserWrapper = Readable::read(reader)?;
71-
let peers: RwLock<Vec<PeerInfo>> = RwLock::new(read_peers.0);
67+
let peers: RwLock<HashMap<PublicKey, PeerInfo>> = RwLock::new(read_peers.0);
7268
Ok(Self { peers, persister })
7369
}
7470
}
7571

7672
#[derive(Clone, Debug, PartialEq, Eq)]
77-
pub(crate) struct PeerInfoStorageDeserWrapper(Vec<PeerInfo>);
73+
pub(crate) struct PeerInfoStorageDeserWrapper(HashMap<PublicKey, PeerInfo>);
7874

7975
impl Readable for PeerInfoStorageDeserWrapper {
8076
fn read<R: lightning::io::Read>(
8177
reader: &mut R,
8278
) -> Result<Self, lightning::ln::msgs::DecodeError> {
8379
let len: u16 = Readable::read(reader)?;
84-
let mut peers = Vec::with_capacity(len as usize);
80+
let mut peers = HashMap::with_capacity(len as usize);
8581
for _ in 0..len {
86-
peers.push(Readable::read(reader)?);
82+
let k: PublicKey = Readable::read(reader)?;
83+
let v: PeerInfo = Readable::read(reader)?;
84+
peers.insert(k, v);
8785
}
8886
Ok(Self(peers))
8987
}
9088
}
9189

92-
pub(crate) struct PeerInfoStorageSerWrapper<'a>(&'a Vec<PeerInfo>);
90+
pub(crate) struct PeerInfoStorageSerWrapper<'a>(&'a HashMap<PublicKey, PeerInfo>);
9391

9492
impl Writeable for PeerInfoStorageSerWrapper<'_> {
9593
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), lightning::io::Error> {
9694
(self.0.len() as u16).write(writer)?;
97-
for e in self.0.iter() {
98-
e.write(writer)?;
95+
for (k, v) in self.0.iter() {
96+
k.write(writer)?;
97+
v.write(writer)?;
9998
}
10099
Ok(())
101100
}
@@ -196,9 +195,10 @@ mod tests {
196195
let deser_peer_store =
197196
PeerInfoStorage::read(&mut &persisted_bytes[..], Arc::clone(&persister)).unwrap();
198197

199-
let peers = deser_peer_store.peers();
198+
let peers = deser_peer_store.list_peers();
200199
assert_eq!(peers.len(), 1);
201200
assert_eq!(peers[0], expected_peer_info);
201+
assert_eq!(deser_peer_store.get_peer(&pubkey), Some(expected_peer_info));
202202
assert!(!persister.get_and_clear_did_persist());
203203
}
204204

0 commit comments

Comments
 (0)