Skip to content

Commit 8ae021f

Browse files
authored
Merge pull request #102 from EthanYuan/check-peer-connection-when-update-lnd-snapshot
check peer connection when update lnd snapshot
2 parents 461e13f + b085502 commit 8ae021f

File tree

7 files changed

+123
-26
lines changed

7 files changed

+123
-26
lines changed

Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mutiny-core/src/lib.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ mod networking;
2828
mod node;
2929
pub mod nodemanager;
3030
mod onchain;
31-
mod peermanager;
31+
pub mod peermanager;
3232
pub mod scorer;
3333
pub mod storage;
3434
mod subscription;
@@ -51,6 +51,7 @@ use crate::messagehandler::CommonLnEventCallback;
5151
use crate::nodemanager::NodeManager;
5252
use crate::nodemanager::{ChannelClosure, MutinyBip21RawMaterials};
5353
pub use crate::onchain::BroadcastTx1InMultiOut;
54+
use crate::peermanager::CONNECTED_PEER_MANAGER;
5455
use crate::storage::{get_invoice_by_hash, DEVICE_LOCK_KEY, LND_CHANNELS_SNAPSHOT_KEY};
5556
use crate::utils::{now, sleep, spawn, spawn_with_handle, StopHandle};
5657
use crate::vss::VSS_MANAGER;
@@ -847,9 +848,11 @@ impl<S: MutinyStorage> MutinyWalletBuilder<S> {
847848
};
848849

849850
let pending = VSS_MANAGER.get_pending_writes();
850-
if pending.is_empty()
851-
|| (pending.len() == 1 && pending.iter().any(|(key, _)| key == DEVICE_LOCK_KEY))
852-
{
851+
let only_device_lock_vss_pending =
852+
pending.len() == 1 && pending.iter().any(|(key, _)| key == DEVICE_LOCK_KEY);
853+
let can_update_snapshot = (pending.is_empty() || only_device_lock_vss_pending)
854+
&& CONNECTED_PEER_MANAGER.is_any_connected();
855+
if can_update_snapshot {
853856
let second_lnd_snapshot =
854857
match fetch_lnd_channels_snapshot(&Client::new(), lsp_url, &node_id, &logger).await
855858
{

mutiny-core/src/messagehandler.rs

+11
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use lightning::util::ser::{Writeable, Writer};
1010
use serde::{Deserialize, Serialize};
1111

1212
use crate::node::LiquidityManager;
13+
use crate::peermanager::CONNECTED_PEER_MANAGER;
1314
use crate::storage::MutinyStorage;
1415

1516
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash)]
@@ -175,6 +176,14 @@ impl<S: MutinyStorage> CustomMessageHandler for MutinyMessageHandler<S> {
175176
msg: &lightning::ln::msgs::Init,
176177
inbound: bool,
177178
) -> Result<(), ()> {
179+
CONNECTED_PEER_MANAGER.add_peer(
180+
*their_node_id,
181+
inbound,
182+
msg.remote_network_address
183+
.as_ref()
184+
.map(|addr| format!("{}", addr)),
185+
);
186+
178187
if let Some(cb) = self.ln_event_callback.clone() {
179188
let event = CommonLnEvent::OnConnect {
180189
their_node_id: their_node_id.to_string(),
@@ -190,6 +199,8 @@ impl<S: MutinyStorage> CustomMessageHandler for MutinyMessageHandler<S> {
190199
}
191200

192201
fn peer_disconnected(&self, their_node_id: &PublicKey) {
202+
CONNECTED_PEER_MANAGER.remove_peer(their_node_id);
203+
193204
if let Some(cb) = self.ln_event_callback.clone() {
194205
let event = CommonLnEvent::OnDisconnect {
195206
their_node_id: their_node_id.to_string(),

mutiny-core/src/peermanager.rs

+84
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ use lightning::routing::gossip::NodeId;
2424
use lightning::util::logger::Logger;
2525
use lightning::{ln::msgs::SocketAddress, log_warn};
2626
use lightning::{log_debug, log_error};
27+
use std::collections::HashMap;
2728
use std::sync::atomic::AtomicBool;
2829
use std::sync::Arc;
30+
use utils::Mutex;
2931

3032
#[cfg(target_arch = "wasm32")]
3133
use crate::networking::ws_socket::WsTcpSocketDescriptor;
@@ -36,6 +38,9 @@ use lightning::ln::peer_handler::SocketDescriptor as LdkSocketDescriptor;
3638
#[cfg(target_arch = "wasm32")]
3739
use crate::networking::proxy::WsProxy;
3840

41+
pub static CONNECTED_PEER_MANAGER: once_cell::sync::Lazy<ConnectedPeerManager> =
42+
once_cell::sync::Lazy::new(ConnectedPeerManager::default);
43+
3944
#[allow(dead_code)]
4045
pub trait PeerManager: Send + Sync + 'static {
4146
fn get_peer_node_ids(&self) -> Vec<PublicKey>;
@@ -581,3 +586,82 @@ fn try_parse_addr_string(addr: &str) -> (Option<std::net::SocketAddr>, Option<So
581586
});
582587
(socket_addr, net_addr)
583588
}
589+
590+
#[derive(Debug, Clone)]
591+
pub struct ConnectedPeerInfo {
592+
pub inbound: bool,
593+
pub remote_address: Option<String>,
594+
pub connected_at_timestamp: u64,
595+
}
596+
597+
pub struct ConnectedPeerManager {
598+
peers: Arc<Mutex<HashMap<PublicKey, ConnectedPeerInfo>>>,
599+
logger: Mutex<Option<Arc<MutinyLogger>>>,
600+
}
601+
602+
impl Default for ConnectedPeerManager {
603+
fn default() -> Self {
604+
Self::new()
605+
}
606+
}
607+
608+
impl ConnectedPeerManager {
609+
pub fn new() -> Self {
610+
Self {
611+
peers: Arc::new(Mutex::new(HashMap::new())),
612+
logger: Mutex::new(None),
613+
}
614+
}
615+
616+
pub fn set_logger(&self, logger: Arc<MutinyLogger>) {
617+
let mut lock = self.logger.lock().unwrap();
618+
*lock = Some(logger);
619+
}
620+
621+
pub fn add_peer(
622+
&self,
623+
their_node_id: PublicKey,
624+
inbound: bool,
625+
remote_address: Option<String>,
626+
) {
627+
let timestamp = utils::now().as_secs();
628+
629+
let info = ConnectedPeerInfo {
630+
inbound,
631+
remote_address,
632+
connected_at_timestamp: timestamp,
633+
};
634+
635+
let mut peers = self.peers.lock().unwrap();
636+
let inserted = peers.insert(their_node_id, info).is_none();
637+
let logger = {
638+
let guard = self.logger.lock().expect("Failed to lock logger");
639+
guard.clone()
640+
};
641+
if inserted {
642+
if let Some(logger) = logger {
643+
log_debug!(logger, "Connected to peer: {}", their_node_id);
644+
}
645+
}
646+
}
647+
648+
pub fn remove_peer(&self, their_node_id: &PublicKey) {
649+
let mut peers = self.peers.lock().unwrap();
650+
let removed = peers.remove(their_node_id).is_some();
651+
652+
let logger = {
653+
let guard = self.logger.lock().expect("Failed to lock logger");
654+
guard.clone()
655+
};
656+
if removed {
657+
if let Some(logger) = logger {
658+
log_debug!(logger, "Disconnected from peer: {}", their_node_id);
659+
}
660+
}
661+
}
662+
663+
pub fn is_any_connected(&self) -> bool {
664+
let lock = self.peers.lock().unwrap();
665+
!lock.is_empty()
666+
}
667+
}

mutiny-core/src/vss.rs

+17-20
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,10 @@ impl VssManager {
250250

251251
pub fn get_pending_writes(&self) -> Vec<(String, VssPendingWrite)> {
252252
self.check_timeout();
253-
let writes = self.pending_writes.lock().expect(
254-
"
255-
Failed to lock pending writes",
256-
);
253+
let writes = self
254+
.pending_writes
255+
.lock()
256+
.expect("Failed to lock pending writes");
257257
writes.iter().map(|(k, v)| (k.clone(), v.clone())).collect()
258258
}
259259

@@ -271,33 +271,30 @@ impl VssManager {
271271
}
272272

273273
pub fn on_complete_write(&self, key: String) {
274-
let mut pending_writes = self.pending_writes.lock().expect(
275-
"
276-
Failed to lock pending writes",
277-
);
274+
let mut pending_writes = self
275+
.pending_writes
276+
.lock()
277+
.expect("Failed to lock pending writes");
278278
pending_writes.remove(&key);
279279
}
280280

281281
pub fn has_in_progress(&self) -> bool {
282282
self.check_timeout();
283-
let writes = self.pending_writes.lock().expect(
284-
"
285-
Failed to lock pending writes",
286-
);
283+
let writes = self
284+
.pending_writes
285+
.lock()
286+
.expect("Failed to lock pending writes");
287287
!writes.is_empty()
288288
}
289289

290290
fn check_timeout(&self) {
291291
let current_time = utils::now().as_secs();
292-
let mut writes = self.pending_writes.lock().expect(
293-
"
294-
Failed to lock pending writes",
295-
);
292+
let mut writes = self
293+
.pending_writes
294+
.lock()
295+
.expect("Failed to lock pending writes");
296296
let logger = {
297-
let guard = self.logger.lock().expect(
298-
"
299-
Failed to lock logger",
300-
);
297+
let guard = self.logger.lock().expect("Failed to lock logger");
301298
guard.clone()
302299
};
303300
writes.retain(|key, write| {

mutiny-wasm/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ cargo-features = ["per-package-target"]
22

33
[package]
44
name = "mutiny-wasm"
5-
version = "1.14.4"
5+
version = "1.14.5"
66
edition = "2021"
77
authors = ["utxostack"]
88
forced-target = "wasm32-unknown-unknown"

mutiny-wasm/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use mutiny_core::authmanager::AuthManager;
3232
use mutiny_core::encrypt::decrypt_with_password;
3333
use mutiny_core::error::MutinyError;
3434
use mutiny_core::messagehandler::{CommonLnEvent, CommonLnEventCallback};
35+
use mutiny_core::peermanager::CONNECTED_PEER_MANAGER;
3536
use mutiny_core::storage::{DeviceLock, MutinyStorage, DEVICE_LOCK_KEY};
3637
use mutiny_core::utils::sleep;
3738
use mutiny_core::vss::{MutinyVssClient, VSS_MANAGER};
@@ -225,6 +226,7 @@ impl MutinyWallet {
225226
log_info!(logger, "Node version {version}");
226227

227228
VSS_MANAGER.set_logger(logger.clone());
229+
CONNECTED_PEER_MANAGER.set_logger(logger.clone());
228230

229231
let cipher = password
230232
.as_ref()

0 commit comments

Comments
 (0)