Skip to content

Commit f2c34dc

Browse files
Aditya SharmaAditya Sharma
authored andcommitted
lightning: Handle peer storage message, it's persistance and send it to the respective peer upon reconnection.
1 parent 9c0e13c commit f2c34dc

File tree

1 file changed

+46
-2
lines changed

1 file changed

+46
-2
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2303,7 +2303,7 @@ where
23032303
entropy_source: ES,
23042304
node_signer: NS,
23052305
signer_provider: SP,
2306-
2306+
peer_storage: Mutex<HashMap<PublicKey, Vec<u8>>>,
23072307
logger: L,
23082308
}
23092309

@@ -3108,7 +3108,7 @@ where
31083108
entropy_source,
31093109
node_signer,
31103110
signer_provider,
3111-
3111+
peer_storage: Mutex::new(new_hash_map()),
31123112
logger,
31133113
}
31143114
}
@@ -7621,6 +7621,26 @@ where
76217621
}
76227622
}
76237623

7624+
fn internal_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::PeerStorageMessage) {
7625+
let per_peer_state = self.per_peer_state.read().unwrap();
7626+
let peer_state_mutex = match per_peer_state.get(counterparty_node_id) {
7627+
Some(peer_state_mutex) => peer_state_mutex,
7628+
None => return,
7629+
};
7630+
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
7631+
let peer_state = &mut *peer_state_lock;
7632+
let logger = WithContext::from(&self.logger, Some(*counterparty_node_id), None);
7633+
7634+
// Check if we have any channels with the peer (Currently we only provide the servie to peers we have a channel with).
7635+
if !peer_state.channel_by_id.values().any(|phase| matches!(phase, ChannelPhase::Funded(_))) {
7636+
log_debug!(logger, "We do not have any channel with {}", log_pubkey!(counterparty_node_id));
7637+
return;
7638+
}
7639+
7640+
log_trace!(logger, "Received Peer Storage from {}", log_pubkey!(counterparty_node_id));
7641+
self.peer_storage.lock().unwrap().insert(*counterparty_node_id, msg.data.clone());
7642+
}
7643+
76247644
fn internal_funding_signed(&self, counterparty_node_id: &PublicKey, msg: &msgs::FundingSigned) -> Result<(), MsgHandleErrInternal> {
76257645
let best_block = *self.best_block.read().unwrap();
76267646
let per_peer_state = self.per_peer_state.read().unwrap();
@@ -10203,6 +10223,8 @@ where
1020310223
}
1020410224

1020510225
fn handle_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::PeerStorageMessage) {
10226+
let _persistence_guard = PersistenceNotifierGuard::optionally_notify(self, || NotifyOption::SkipPersistNoEvents);
10227+
self.internal_peer_storage(counterparty_node_id, msg);
1020610228
}
1020710229

1020810230
fn handle_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
@@ -10557,6 +10579,16 @@ where
1055710579
let peer_state = &mut *peer_state_lock;
1055810580
let pending_msg_events = &mut peer_state.pending_msg_events;
1055910581

10582+
if let Some(peer_storage) = self.peer_storage.lock().unwrap().get(counterparty_node_id) {
10583+
pending_msg_events.push(events::MessageSendEvent::SendYourPeerStorageMessage {
10584+
node_id: counterparty_node_id.clone(),
10585+
msg: msgs::YourPeerStorageMessage {
10586+
data: peer_storage.clone()
10587+
},
10588+
});
10589+
}
10590+
10591+
1056010592
for (_, phase) in peer_state.channel_by_id.iter_mut() {
1056110593
match phase {
1056210594
ChannelPhase::Funded(chan) => {
@@ -11614,6 +11646,13 @@ where
1161411646
pending_payment.write(writer)?;
1161511647
}
1161611648

11649+
let mut peer_storage = None;
11650+
let peer_storage_dir = self.peer_storage.lock().unwrap();
11651+
11652+
if !peer_storage_dir.is_empty() {
11653+
peer_storage = Some(peer_storage_dir);
11654+
}
11655+
1161711656
// For backwards compat, write the session privs and their total length.
1161811657
let mut num_pending_outbounds_compat: u64 = 0;
1161911658
for (_, outbound) in pending_outbound_payments.iter() {
@@ -11686,6 +11725,7 @@ where
1168611725
(11, self.probing_cookie_secret, required),
1168711726
(13, htlc_onion_fields, optional_vec),
1168811727
(14, decode_update_add_htlcs_opt, option),
11728+
(16, peer_storage, option),
1168911729
});
1169011730

1169111731
Ok(())
@@ -12146,6 +12186,7 @@ where
1214612186
let mut events_override = None;
1214712187
let mut in_flight_monitor_updates: Option<HashMap<(PublicKey, OutPoint), Vec<ChannelMonitorUpdate>>> = None;
1214812188
let mut decode_update_add_htlcs: Option<HashMap<u64, Vec<msgs::UpdateAddHTLC>>> = None;
12189+
let mut peer_storage: Option<HashMap<PublicKey, Vec<u8>>> = None;
1214912190
read_tlv_fields!(reader, {
1215012191
(1, pending_outbound_payments_no_retry, option),
1215112192
(2, pending_intercepted_htlcs, option),
@@ -12160,7 +12201,9 @@ where
1216012201
(11, probing_cookie_secret, option),
1216112202
(13, claimable_htlc_onion_fields, optional_vec),
1216212203
(14, decode_update_add_htlcs, option),
12204+
(16, peer_storage, option),
1216312205
});
12206+
let peer_storage = peer_storage.unwrap_or_else(|| new_hash_map());
1216412207
let mut decode_update_add_htlcs = decode_update_add_htlcs.unwrap_or_else(|| new_hash_map());
1216512208
if fake_scid_rand_bytes.is_none() {
1216612209
fake_scid_rand_bytes = Some(args.entropy_source.get_secure_random_bytes());
@@ -12753,6 +12796,7 @@ where
1275312796

1275412797
last_days_feerates: Mutex::new(VecDeque::new()),
1275512798

12799+
peer_storage: Mutex::new(peer_storage),
1275612800
logger: args.logger,
1275712801
default_configuration: args.default_config,
1275812802
};

0 commit comments

Comments
 (0)