|
11 | 11 |
|
12 | 12 | use crate::events::{Event, EventQueue}; |
13 | 13 | use crate::lsps0::ser::{ |
14 | | - LSPSMessage, ProtocolMessageHandler, RequestId, ResponseError, LSPS0_CLIENT_REJECTED_ERROR_CODE, |
| 14 | + LSPSMessage, ProtocolMessageHandler, RequestId, ResponseError, |
| 15 | + JSONRPC_INTERNAL_ERROR_ERROR_CODE, JSONRPC_INTERNAL_ERROR_ERROR_MESSAGE, |
| 16 | + LSPS0_CLIENT_REJECTED_ERROR_CODE, |
15 | 17 | }; |
16 | 18 | use crate::lsps2::event::LSPS2ServiceEvent; |
17 | 19 | use crate::lsps2::payment_queue::{InterceptedHTLC, PaymentQueue}; |
18 | 20 | use crate::lsps2::utils::{ |
19 | 21 | compute_opening_fee, is_expired_opening_fee_params, is_valid_opening_fee_params, |
20 | 22 | }; |
21 | 23 | use crate::message_queue::MessageQueue; |
| 24 | +use crate::prelude::hash_map::Entry; |
22 | 25 | use crate::prelude::{new_hash_map, HashMap, String, ToString, Vec}; |
23 | 26 | use crate::sync::{Arc, Mutex, MutexGuard, RwLock}; |
24 | 27 |
|
@@ -47,6 +50,7 @@ use crate::lsps2::msgs::{ |
47 | 50 |
|
48 | 51 | const MAX_PENDING_REQUESTS_PER_PEER: usize = 10; |
49 | 52 | const MAX_TOTAL_PENDING_REQUESTS: usize = 1000; |
| 53 | +const MAX_TOTAL_PEERS: usize = 100000; |
50 | 54 |
|
51 | 55 | /// Server-side configuration options for JIT channels. |
52 | 56 | #[derive(Clone, Debug)] |
@@ -511,6 +515,40 @@ impl PeerState { |
511 | 515 | } |
512 | 516 | } |
513 | 517 |
|
| 518 | +macro_rules! get_or_insert_peer_state_entry { |
| 519 | + ($self: ident, $outer_state_lock: expr, $counterparty_node_id: expr) => {{ |
| 520 | + // Return an internal error and abort if we hit the maximum allowed number of total peers. |
| 521 | + let is_limited_by_max_total_peers = $outer_state_lock.len() >= MAX_TOTAL_PEERS; |
| 522 | + match $outer_state_lock.entry(*$counterparty_node_id) { |
| 523 | + Entry::Vacant(e) => { |
| 524 | + if is_limited_by_max_total_peers { |
| 525 | + let error_response = ResponseError { |
| 526 | + code: JSONRPC_INTERNAL_ERROR_ERROR_CODE, |
| 527 | + message: JSONRPC_INTERNAL_ERROR_ERROR_MESSAGE.to_string(), data: None, |
| 528 | + }; |
| 529 | + |
| 530 | + let msg = LSPSMessage::Invalid(error_response); |
| 531 | + drop($outer_state_lock); |
| 532 | + $self.pending_messages.enqueue($counterparty_node_id, msg); |
| 533 | + |
| 534 | + let err = format!( |
| 535 | + "Dropping request from peer {} due to reaching maximally allowed number of total peers: {}", |
| 536 | + $counterparty_node_id, MAX_TOTAL_PEERS |
| 537 | + ); |
| 538 | + |
| 539 | + return Err(LightningError { err, action: ErrorAction::IgnoreAndLog(Level::Error) }); |
| 540 | + } else { |
| 541 | + e.insert(Mutex::new(PeerState::new())) |
| 542 | + } |
| 543 | + } |
| 544 | + Entry::Occupied(e) => { |
| 545 | + e.into_mut() |
| 546 | + } |
| 547 | + } |
| 548 | + |
| 549 | + }} |
| 550 | +} |
| 551 | + |
514 | 552 | /// The main object allowing to send and receive LSPS2 messages. |
515 | 553 | pub struct LSPS2ServiceHandler<CM: Deref + Clone> |
516 | 554 | where |
@@ -1042,9 +1080,8 @@ where |
1042 | 1080 | ) -> Result<(), LightningError> { |
1043 | 1081 | let (result, response) = { |
1044 | 1082 | let mut outer_state_lock = self.per_peer_state.write().unwrap(); |
1045 | | - let inner_state_lock: &mut Mutex<PeerState> = outer_state_lock |
1046 | | - .entry(*counterparty_node_id) |
1047 | | - .or_insert(Mutex::new(PeerState::new())); |
| 1083 | + let inner_state_lock = |
| 1084 | + get_or_insert_peer_state_entry!(self, outer_state_lock, counterparty_node_id); |
1048 | 1085 | let mut peer_state_lock = inner_state_lock.lock().unwrap(); |
1049 | 1086 | let request = LSPS2Request::GetInfo(params.clone()); |
1050 | 1087 | match self.insert_pending_request( |
@@ -1161,9 +1198,8 @@ where |
1161 | 1198 |
|
1162 | 1199 | let (result, response) = { |
1163 | 1200 | let mut outer_state_lock = self.per_peer_state.write().unwrap(); |
1164 | | - let inner_state_lock = outer_state_lock |
1165 | | - .entry(*counterparty_node_id) |
1166 | | - .or_insert(Mutex::new(PeerState::new())); |
| 1201 | + let inner_state_lock = |
| 1202 | + get_or_insert_peer_state_entry!(self, outer_state_lock, counterparty_node_id); |
1167 | 1203 | let mut peer_state_lock = inner_state_lock.lock().unwrap(); |
1168 | 1204 |
|
1169 | 1205 | let request = LSPS2Request::Buy(params.clone()); |
|
0 commit comments