Skip to content

Commit e0bbd59

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 ea23aa0 commit e0bbd59

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
@@ -2206,7 +2206,7 @@ where
22062206
entropy_source: ES,
22072207
node_signer: NS,
22082208
signer_provider: SP,
2209-
2209+
peer_storage: Mutex<HashMap<PublicKey, Vec<u8>>>,
22102210
logger: L,
22112211
}
22122212

@@ -2985,7 +2985,7 @@ where
29852985
entropy_source,
29862986
node_signer,
29872987
signer_provider,
2988-
2988+
peer_storage: Mutex::new(new_hash_map()),
29892989
logger,
29902990
}
29912991
}
@@ -7395,6 +7395,25 @@ where
73957395
}
73967396
}
73977397

7398+
fn internal_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::PeerStorageMessage) {
7399+
let per_peer_state = self.per_peer_state.write().unwrap();
7400+
let peer_state_mutex = match per_peer_state.get(counterparty_node_id) {
7401+
Some(peer_state_mutex) => peer_state_mutex,
7402+
None => return,
7403+
};
7404+
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
7405+
let peer_state = &mut *peer_state_lock;
7406+
let logger = WithContext::from(&self.logger, Some(*counterparty_node_id), None);
7407+
7408+
// Check if we have any channels with the peer (Currently we only provide the servie to peers we have a channel with).
7409+
if peer_state.total_channel_count() == 0 {
7410+
log_debug!(logger, "We do not have any channel with {}", log_pubkey!(counterparty_node_id));
7411+
return;
7412+
}
7413+
log_trace!(logger, "Received Peer Storage from {}", log_pubkey!(counterparty_node_id));
7414+
self.peer_storage.lock().unwrap().insert(*counterparty_node_id, msg.data.clone());
7415+
}
7416+
73987417
fn internal_funding_signed(&self, counterparty_node_id: &PublicKey, msg: &msgs::FundingSigned) -> Result<(), MsgHandleErrInternal> {
73997418
let best_block = *self.best_block.read().unwrap();
74007419
let per_peer_state = self.per_peer_state.read().unwrap();
@@ -9942,6 +9961,8 @@ where
99429961
}
99439962

99449963
fn handle_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::PeerStorageMessage) {
9964+
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
9965+
self.internal_peer_storage(counterparty_node_id, msg);
99459966
}
99469967

99479968
fn handle_your_peer_storage(&self, counterparty_node_id: &PublicKey, msg: &msgs::YourPeerStorageMessage) {
@@ -10295,6 +10316,17 @@ where
1029510316
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
1029610317
let peer_state = &mut *peer_state_lock;
1029710318
let pending_msg_events = &mut peer_state.pending_msg_events;
10319+
let peer_storage = self.peer_storage.lock().unwrap().get(counterparty_node_id).unwrap_or(&Vec::<u8>::new()).clone();
10320+
10321+
if peer_storage.len() > 0 {
10322+
pending_msg_events.push(events::MessageSendEvent::SendYourPeerStorageMessage {
10323+
node_id: counterparty_node_id.clone(),
10324+
msg: msgs::YourPeerStorageMessage {
10325+
data: peer_storage
10326+
},
10327+
});
10328+
}
10329+
1029810330

1029910331
for (_, phase) in peer_state.channel_by_id.iter_mut() {
1030010332
match phase {
@@ -11323,6 +11355,13 @@ where
1132311355
pending_payment.write(writer)?;
1132411356
}
1132511357

11358+
let peer_storage = self.peer_storage.lock().unwrap();
11359+
(peer_storage.len() as u64).write(writer)?;
11360+
for (node_id, peer_data) in peer_storage.iter() {
11361+
node_id.write(writer)?;
11362+
peer_data.write(writer)?;
11363+
}
11364+
1132611365
// For backwards compat, write the session privs and their total length.
1132711366
let mut num_pending_outbounds_compat: u64 = 0;
1132811367
for (_, outbound) in pending_outbound_payments.iter() {
@@ -11828,6 +11867,14 @@ where
1182811867
}
1182911868
}
1183011869

11870+
let peer_storage_count: u64 = Readable::read(reader)?;
11871+
let mut peer_storage: HashMap<PublicKey, Vec<u8>> = hash_map_with_capacity(cmp::min(peer_storage_count as usize, MAX_ALLOC_SIZE/(3*32)));
11872+
for _ in 0..peer_storage_count {
11873+
if peer_storage.insert(Readable::read(reader)?, Readable::read(reader)?).is_some() {
11874+
return Err(DecodeError::InvalidValue);
11875+
}
11876+
}
11877+
1183111878
let pending_outbound_payments_count_compat: u64 = Readable::read(reader)?;
1183211879
let mut pending_outbound_payments_compat: HashMap<PaymentId, PendingOutboundPayment> =
1183311880
hash_map_with_capacity(cmp::min(pending_outbound_payments_count_compat as usize, MAX_ALLOC_SIZE/32));
@@ -12462,6 +12509,7 @@ where
1246212509

1246312510
last_days_feerates: Mutex::new(VecDeque::new()),
1246412511

12512+
peer_storage: Mutex::new(peer_storage),
1246512513
logger: args.logger,
1246612514
default_configuration: args.default_config,
1246712515
};

0 commit comments

Comments
 (0)