|
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