Skip to content

Commit ec6a9f0

Browse files
fixup: remove bounded_map and use vec for tracking requests
1 parent 9bb8874 commit ec6a9f0

File tree

3 files changed

+106
-379
lines changed

3 files changed

+106
-379
lines changed

lightning-liquidity/src/lsps5/client.rs

Lines changed: 106 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ use crate::lsps5::msgs::{
2121
use crate::message_queue::MessageQueue;
2222
use crate::prelude::{new_hash_map, HashMap};
2323
use crate::sync::{Arc, Mutex, RwLock};
24-
use crate::utils::bounded_map::BoundedMap;
2524
use crate::utils::generate_request_id;
2625

2726
use super::msgs::{LSPS5AppName, LSPS5Error, LSPS5WebhookUrl};
@@ -32,28 +31,68 @@ use lightning::ln::msgs::{ErrorAction, LightningError};
3231
use lightning::sign::EntropySource;
3332
use lightning::util::logger::Level;
3433

34+
use alloc::collections::VecDeque;
3535
use alloc::string::String;
3636

3737
use core::ops::Deref;
3838

39+
impl PartialEq<LSPSRequestId> for (LSPSRequestId, (LSPS5AppName, LSPS5WebhookUrl)) {
40+
fn eq(&self, other: &LSPSRequestId) -> bool {
41+
&self.0 == other
42+
}
43+
}
44+
45+
impl PartialEq<LSPSRequestId> for (LSPSRequestId, LSPS5AppName) {
46+
fn eq(&self, other: &LSPSRequestId) -> bool {
47+
&self.0 == other
48+
}
49+
}
50+
3951
#[derive(Debug, Clone, Copy, Default)]
4052
/// Configuration for the LSPS5 client
4153
pub struct LSPS5ClientConfig {}
4254

4355
struct PeerState {
44-
pending_set_webhook_requests: BoundedMap<LSPSRequestId, (LSPS5AppName, LSPS5WebhookUrl)>,
45-
pending_list_webhooks_requests: BoundedMap<LSPSRequestId, ()>,
46-
pending_remove_webhook_requests: BoundedMap<LSPSRequestId, LSPS5AppName>,
56+
pending_set_webhook_requests: VecDeque<(LSPSRequestId, (LSPS5AppName, LSPS5WebhookUrl))>,
57+
pending_list_webhooks_requests: VecDeque<LSPSRequestId>,
58+
pending_remove_webhook_requests: VecDeque<(LSPSRequestId, LSPS5AppName)>,
4759
}
4860

4961
const MAX_PENDING_REQUESTS: usize = 5;
5062

5163
impl PeerState {
5264
fn new() -> Self {
5365
Self {
54-
pending_set_webhook_requests: BoundedMap::new(MAX_PENDING_REQUESTS),
55-
pending_list_webhooks_requests: BoundedMap::new(MAX_PENDING_REQUESTS),
56-
pending_remove_webhook_requests: BoundedMap::new(MAX_PENDING_REQUESTS),
66+
pending_set_webhook_requests: VecDeque::with_capacity(MAX_PENDING_REQUESTS),
67+
pending_list_webhooks_requests: VecDeque::with_capacity(MAX_PENDING_REQUESTS),
68+
pending_remove_webhook_requests: VecDeque::with_capacity(MAX_PENDING_REQUESTS),
69+
}
70+
}
71+
72+
fn add_request<T, F>(&mut self, item: T, queue_selector: F)
73+
where
74+
F: FnOnce(&mut Self) -> &mut VecDeque<T>,
75+
{
76+
let queue = queue_selector(self);
77+
if queue.len() == MAX_PENDING_REQUESTS {
78+
queue.pop_front();
79+
}
80+
queue.push_back(item);
81+
}
82+
83+
fn find_and_remove_request<T, F>(
84+
&mut self, queue_selector: F, request_id: &LSPSRequestId,
85+
) -> Option<T>
86+
where
87+
F: FnOnce(&mut Self) -> &mut VecDeque<T>,
88+
T: Clone,
89+
for<'a> &'a T: PartialEq<&'a LSPSRequestId>,
90+
{
91+
let queue = queue_selector(self);
92+
if let Some(pos) = queue.iter().position(|item| item == request_id) {
93+
queue.remove(pos)
94+
} else {
95+
None
5796
}
5897
}
5998

@@ -162,9 +201,10 @@ where
162201
let request_id = generate_request_id(&self.entropy_source);
163202

164203
self.with_peer_state(counterparty_node_id, |peer_state| {
165-
peer_state
166-
.pending_set_webhook_requests
167-
.insert(request_id.clone(), (app_name.clone(), lsps_webhook_url.clone()));
204+
peer_state.add_request(
205+
(request_id.clone(), (app_name.clone(), lsps_webhook_url.clone())),
206+
|s| &mut s.pending_set_webhook_requests,
207+
);
168208
});
169209

170210
let request =
@@ -196,7 +236,7 @@ where
196236
let request_id = generate_request_id(&self.entropy_source);
197237

198238
self.with_peer_state(counterparty_node_id, |peer_state| {
199-
peer_state.pending_list_webhooks_requests.insert(request_id.clone(), ());
239+
peer_state.add_request(request_id.clone(), |s| &mut s.pending_list_webhooks_requests);
200240
});
201241

202242
let request = LSPS5Request::ListWebhooks(ListWebhooksRequest {});
@@ -233,7 +273,9 @@ where
233273
let request_id = generate_request_id(&self.entropy_source);
234274

235275
self.with_peer_state(counterparty_node_id, |peer_state| {
236-
peer_state.pending_remove_webhook_requests.insert(request_id.clone(), app_name.clone());
276+
peer_state.add_request((request_id.clone(), app_name.clone()), |s| {
277+
&mut s.pending_remove_webhook_requests
278+
});
237279
});
238280

239281
let request = LSPS5Request::RemoveWebhook(RemoveWebhookRequest { app_name });
@@ -264,8 +306,8 @@ where
264306
});
265307
let event_queue_notifier = self.pending_events.notifier();
266308
let handle_response = |peer_state: &mut PeerState| {
267-
if let Some((app_name, webhook_url)) =
268-
peer_state.pending_set_webhook_requests.remove(&request_id)
309+
if let Some((_, (app_name, webhook_url))) = peer_state
310+
.find_and_remove_request(|s| &mut s.pending_set_webhook_requests, &request_id)
269311
{
270312
match &response {
271313
LSPS5Response::SetWebhook(r) => {
@@ -297,7 +339,9 @@ where
297339
});
298340
},
299341
}
300-
} else if peer_state.pending_list_webhooks_requests.remove(&request_id).is_some() {
342+
} else if let Some(_) = peer_state
343+
.find_and_remove_request(|s| &mut s.pending_list_webhooks_requests, &request_id)
344+
{
301345
match &response {
302346
LSPS5Response::ListWebhooks(r) => {
303347
event_queue_notifier.enqueue(LSPS5ClientEvent::WebhooksListed {
@@ -315,8 +359,8 @@ where
315359
});
316360
},
317361
}
318-
} else if let Some(app_name) =
319-
peer_state.pending_remove_webhook_requests.remove(&request_id)
362+
} else if let Some((_, app_name)) = peer_state
363+
.find_and_remove_request(|s| &mut s.pending_remove_webhook_requests, &request_id)
320364
{
321365
match &response {
322366
LSPS5Response::RemoveWebhook(_) => {
@@ -449,10 +493,16 @@ mod tests {
449493
let outer_state_lock = client.per_peer_state.read().unwrap();
450494

451495
let peer_1_state = outer_state_lock.get(&peer_1).unwrap().lock().unwrap();
452-
assert!(peer_1_state.pending_set_webhook_requests.contains_key(&req_id_1));
496+
assert!(peer_1_state
497+
.pending_set_webhook_requests
498+
.iter()
499+
.any(|(id, _)| id == &req_id_1));
453500

454501
let peer_2_state = outer_state_lock.get(&peer_2).unwrap().lock().unwrap();
455-
assert!(peer_2_state.pending_set_webhook_requests.contains_key(&req_id_2));
502+
assert!(peer_2_state
503+
.pending_set_webhook_requests
504+
.iter()
505+
.any(|(id, _)| id == &req_id_2));
456506
}
457507
}
458508

@@ -471,17 +521,21 @@ mod tests {
471521
{
472522
let outer_state_lock = client.per_peer_state.read().unwrap();
473523
let peer_state = outer_state_lock.get(&peer).unwrap().lock().unwrap();
474-
assert_eq!(
475-
peer_state.pending_set_webhook_requests.get(&set_req_id).unwrap(),
476-
&(lsps5_app_name.clone(), lsps5_webhook_url)
477-
);
524+
let set_request = peer_state
525+
.pending_set_webhook_requests
526+
.iter()
527+
.find(|(id, _)| id == &set_req_id)
528+
.unwrap();
529+
assert_eq!(&set_request.1, &(lsps5_app_name.clone(), lsps5_webhook_url));
478530

479-
assert!(peer_state.pending_list_webhooks_requests.contains_key(&list_req_id));
531+
assert!(peer_state.pending_list_webhooks_requests.contains(&list_req_id));
480532

481-
assert_eq!(
482-
peer_state.pending_remove_webhook_requests.get(&remove_req_id).unwrap(),
483-
&lsps5_app_name
484-
);
533+
let remove_request = peer_state
534+
.pending_remove_webhook_requests
535+
.iter()
536+
.find(|(id, _)| id == &remove_req_id)
537+
.unwrap();
538+
assert_eq!(&remove_request.1, &lsps5_app_name);
485539
}
486540
}
487541

@@ -523,7 +577,7 @@ mod tests {
523577
let outer_state_lock = client.per_peer_state.read().unwrap();
524578
let peer_state = outer_state_lock.get(&peer).unwrap().lock().unwrap();
525579
for req_id in &request_ids {
526-
assert!(peer_state.pending_set_webhook_requests.contains_key(req_id));
580+
assert!(peer_state.pending_set_webhook_requests.iter().any(|(id, _)| id == req_id));
527581
}
528582
assert_eq!(peer_state.pending_set_webhook_requests.len(), MAX_PENDING_REQUESTS);
529583
}
@@ -537,13 +591,19 @@ mod tests {
537591
let peer_state = outer_state_lock.get(&peer).unwrap().lock().unwrap();
538592
assert_eq!(peer_state.pending_set_webhook_requests.len(), MAX_PENDING_REQUESTS);
539593

540-
assert!(!peer_state.pending_set_webhook_requests.contains_key(&request_ids[0]));
594+
assert!(!peer_state
595+
.pending_set_webhook_requests
596+
.iter()
597+
.any(|(id, _)| id == &request_ids[0]));
541598

542599
for req_id in &request_ids[1..] {
543-
assert!(peer_state.pending_set_webhook_requests.contains_key(req_id));
600+
assert!(peer_state.pending_set_webhook_requests.iter().any(|(id, _)| id == req_id));
544601
}
545602

546-
assert!(peer_state.pending_set_webhook_requests.contains_key(&new_req_id));
603+
assert!(peer_state
604+
.pending_set_webhook_requests
605+
.iter()
606+
.any(|(id, _)| id == &new_req_id));
547607
}
548608
}
549609

@@ -561,8 +621,11 @@ mod tests {
561621
let state = client.per_peer_state.read().unwrap();
562622
assert!(state.contains_key(&peer));
563623
let peer_state = state.get(&peer).unwrap().lock().unwrap();
564-
assert!(peer_state.pending_set_webhook_requests.contains_key(&set_webhook_req_id));
565-
assert!(peer_state.pending_list_webhooks_requests.contains_key(&list_webhooks_req_id));
624+
assert!(peer_state
625+
.pending_set_webhook_requests
626+
.iter()
627+
.any(|(id, _)| id == &set_webhook_req_id));
628+
assert!(peer_state.pending_list_webhooks_requests.contains(&list_webhooks_req_id));
566629
}
567630

568631
let set_webhook_response = LSPS5Response::SetWebhook(SetWebhookResponse {
@@ -579,8 +642,11 @@ mod tests {
579642
let state = client.per_peer_state.read().unwrap();
580643
assert!(state.contains_key(&peer));
581644
let peer_state = state.get(&peer).unwrap().lock().unwrap();
582-
assert!(!peer_state.pending_set_webhook_requests.contains_key(&set_webhook_req_id));
583-
assert!(peer_state.pending_list_webhooks_requests.contains_key(&list_webhooks_req_id));
645+
assert!(!peer_state
646+
.pending_set_webhook_requests
647+
.iter()
648+
.any(|(id, _)| id == &set_webhook_req_id));
649+
assert!(peer_state.pending_list_webhooks_requests.contains(&list_webhooks_req_id));
584650
}
585651

586652
let list_webhooks_response =
@@ -607,7 +673,10 @@ mod tests {
607673
let state = client.per_peer_state.read().unwrap();
608674
assert!(state.contains_key(&peer));
609675
let peer_state = state.get(&peer).unwrap().lock().unwrap();
610-
assert!(peer_state.pending_set_webhook_requests.contains_key(&new_req_id));
676+
assert!(peer_state
677+
.pending_set_webhook_requests
678+
.iter()
679+
.any(|(id, _)| id == &new_req_id));
611680
}
612681
}
613682
}

0 commit comments

Comments
 (0)