Skip to content

Commit c0c9606

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 f2e5bb0 commit c0c9606

File tree

1 file changed

+50
-2
lines changed

1 file changed

+50
-2
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2122,7 +2122,7 @@ where
21222122
entropy_source: ES,
21232123
node_signer: NS,
21242124
signer_provider: SP,
2125-
2125+
peer_storage: Mutex<HashMap<PublicKey, Vec<u8>>>,
21262126
logger: L,
21272127
}
21282128

@@ -2901,7 +2901,7 @@ where
29012901
entropy_source,
29022902
node_signer,
29032903
signer_provider,
2904-
2904+
peer_storage: Mutex::new(new_hash_map()),
29052905
logger,
29062906
}
29072907
}
@@ -7172,6 +7172,25 @@ where
71727172
}
71737173
}
71747174

7175+
fn internal_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::PeerStorageMessage) {
7176+
let per_peer_state = self.per_peer_state.write().unwrap();
7177+
let peer_state_mutex = match per_peer_state.get(counterparty_node_id) {
7178+
Some(peer_state_mutex) => peer_state_mutex,
7179+
None => return,
7180+
};
7181+
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
7182+
let peer_state = &mut *peer_state_lock;
7183+
let logger = WithContext::from(&self.logger, Some(*counterparty_node_id), None);
7184+
7185+
// Check if we have any channels with the peer (Currently we only provide the servie to peers we have a channel with).
7186+
if peer_state.total_channel_count() == 0 {
7187+
log_debug!(logger, "We do not have any channel with {}", log_pubkey!(counterparty_node_id));
7188+
return;
7189+
}
7190+
log_trace!(logger, "Received Peer Storage from {}", log_pubkey!(counterparty_node_id));
7191+
self.peer_storage.lock().unwrap().insert(*counterparty_node_id, msg.data.clone());
7192+
}
7193+
71757194
fn internal_funding_signed(&self, counterparty_node_id: &PublicKey, msg: &msgs::FundingSigned) -> Result<(), MsgHandleErrInternal> {
71767195
let best_block = *self.best_block.read().unwrap();
71777196
let per_peer_state = self.per_peer_state.read().unwrap();
@@ -9672,6 +9691,8 @@ where
96729691
}
96739692

96749693
fn handle_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::PeerStorageMessage) {
9694+
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
9695+
self.internal_peer_storage(counterparty_node_id, msg);
96759696
}
96769697

96779698
fn handle_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
@@ -10025,6 +10046,17 @@ where
1002510046
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
1002610047
let peer_state = &mut *peer_state_lock;
1002710048
let pending_msg_events = &mut peer_state.pending_msg_events;
10049+
let peer_storage = self.peer_storage.lock().unwrap().get(counterparty_node_id).unwrap_or(&Vec::<u8>::new()).clone();
10050+
10051+
if peer_storage.len() > 0 {
10052+
pending_msg_events.push(events::MessageSendEvent::SendYourPeerStorageMessage {
10053+
node_id: counterparty_node_id.clone(),
10054+
msg: msgs::YourPeerStorageMessage {
10055+
data: peer_storage
10056+
},
10057+
});
10058+
}
10059+
1002810060

1002910061
for (_, phase) in peer_state.channel_by_id.iter_mut() {
1003010062
match phase {
@@ -11034,6 +11066,13 @@ where
1103411066
pending_payment.write(writer)?;
1103511067
}
1103611068

11069+
let peer_storage = self.peer_storage.lock().unwrap();
11070+
(peer_storage.len() as u64).write(writer)?;
11071+
for (node_id, peer_data) in peer_storage.iter() {
11072+
node_id.write(writer)?;
11073+
peer_data.write(writer)?;
11074+
}
11075+
1103711076
// For backwards compat, write the session privs and their total length.
1103811077
let mut num_pending_outbounds_compat: u64 = 0;
1103911078
for (_, outbound) in pending_outbound_payments.iter() {
@@ -11539,6 +11578,14 @@ where
1153911578
}
1154011579
}
1154111580

11581+
let peer_storage_count: u64 = Readable::read(reader)?;
11582+
let mut peer_storage: HashMap<PublicKey, Vec<u8>> = hash_map_with_capacity(cmp::min(peer_storage_count as usize, MAX_ALLOC_SIZE/(3*32)));
11583+
for _ in 0..peer_storage_count {
11584+
if peer_storage.insert(Readable::read(reader)?, Readable::read(reader)?).is_some() {
11585+
return Err(DecodeError::InvalidValue);
11586+
}
11587+
}
11588+
1154211589
let pending_outbound_payments_count_compat: u64 = Readable::read(reader)?;
1154311590
let mut pending_outbound_payments_compat: HashMap<PaymentId, PendingOutboundPayment> =
1154411591
hash_map_with_capacity(cmp::min(pending_outbound_payments_count_compat as usize, MAX_ALLOC_SIZE/32));
@@ -12168,6 +12215,7 @@ where
1216812215

1216912216
last_days_feerates: Mutex::new(VecDeque::new()),
1217012217

12218+
peer_storage: Mutex::new(peer_storage),
1217112219
logger: args.logger,
1217212220
default_configuration: args.default_config,
1217312221
};

0 commit comments

Comments
 (0)