Skip to content

Commit d4c61a6

Browse files
committed
Read persisted LSPS1ServiceHandler state on startup
.. we read the persisted state in `LiquidityManager::new`
1 parent cd32333 commit d4c61a6

File tree

5 files changed

+76
-19
lines changed

5 files changed

+76
-19
lines changed

lightning-liquidity/src/lsps1/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ pub mod client;
1313
pub mod event;
1414
pub mod msgs;
1515
#[cfg(lsps1_service)]
16-
mod peer_state;
16+
pub(crate) mod peer_state;
1717
#[cfg(lsps1_service)]
1818
pub mod service;

lightning-liquidity/src/lsps1/peer_state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use lightning::util::hash_tables::new_hash_map;
2323
use core::fmt;
2424

2525
#[derive(Default)]
26-
pub(super) struct PeerState {
26+
pub(crate) struct PeerState {
2727
outbound_channels_by_order_id: HashMap<LSPS1OrderId, ChannelOrder>,
2828
pending_requests: HashMap<LSPSRequestId, LSPS1Request>,
2929
needs_persist: bool,

lightning-liquidity/src/lsps1/service.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use crate::persist::{
3636
LIQUIDITY_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE, LSPS1_SERVICE_PERSISTENCE_SECONDARY_NAMESPACE,
3737
};
3838
use crate::prelude::hash_map::Entry;
39-
use crate::prelude::{new_hash_map, HashMap};
39+
use crate::prelude::HashMap;
4040
use crate::sync::{Arc, Mutex, RwLock};
4141
use crate::utils;
4242
use crate::utils::async_poll::dummy_waker;
@@ -90,17 +90,17 @@ where
9090
{
9191
/// Constructs a `LSPS1ServiceHandler`.
9292
pub(crate) fn new(
93-
entropy_source: ES, pending_messages: Arc<MessageQueue>,
94-
pending_events: Arc<EventQueue<K>>, channel_manager: CM, kv_store: K, time_provider: TP,
95-
config: LSPS1ServiceConfig,
93+
per_peer_state: HashMap<PublicKey, Mutex<PeerState>>, entropy_source: ES,
94+
pending_messages: Arc<MessageQueue>, pending_events: Arc<EventQueue<K>>,
95+
channel_manager: CM, kv_store: K, time_provider: TP, config: LSPS1ServiceConfig,
9696
) -> Self {
9797
Self {
9898
entropy_source,
9999
_channel_manager: channel_manager,
100100
kv_store,
101101
pending_messages,
102102
pending_events,
103-
per_peer_state: RwLock::new(new_hash_map()),
103+
per_peer_state: RwLock::new(per_peer_state),
104104
persistence_in_flight: AtomicUsize::new(0),
105105
time_provider,
106106
config,

lightning-liquidity/src/manager.rs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ use crate::lsps5::client::{LSPS5ClientConfig, LSPS5ClientHandler};
2323
use crate::lsps5::msgs::LSPS5Message;
2424
use crate::lsps5::service::{LSPS5ServiceConfig, LSPS5ServiceHandler};
2525
use crate::message_queue::MessageQueue;
26+
#[cfg(lsps1_service)]
27+
use crate::persist::read_lsps1_service_peer_states;
2628
use crate::persist::{
2729
read_event_queue, read_lsps2_service_peer_states, read_lsps5_service_peer_states,
2830
};
@@ -475,24 +477,32 @@ where
475477
});
476478

477479
#[cfg(lsps1_service)]
478-
let lsps1_service_handler = service_config.as_ref().and_then(|config| {
479-
if let Some(number) =
480-
<LSPS1ServiceHandler<ES, CM, K, TP> as LSPSProtocolMessageHandler>::PROTOCOL_NUMBER
481-
{
482-
supported_protocols.push(number);
483-
}
484-
config.lsps1_service_config.as_ref().map(|config| {
485-
LSPS1ServiceHandler::new(
480+
let lsps1_service_handler = if let Some(service_config) = service_config.as_ref() {
481+
if let Some(lsps1_service_config) = service_config.lsps1_service_config.as_ref() {
482+
if let Some(number) =
483+
<LSPS1ServiceHandler<ES, CM, K, TP> as LSPSProtocolMessageHandler>::PROTOCOL_NUMBER
484+
{
485+
supported_protocols.push(number);
486+
}
487+
488+
let peer_states = read_lsps1_service_peer_states(kv_store.clone()).await?;
489+
490+
Some(LSPS1ServiceHandler::new(
491+
peer_states,
486492
entropy_source.clone(),
487493
Arc::clone(&pending_messages),
488494
Arc::clone(&pending_events),
489495
channel_manager.clone(),
490496
kv_store.clone(),
491497
time_provider,
492-
config.clone(),
493-
)
494-
})
495-
});
498+
lsps1_service_config.clone(),
499+
))
500+
} else {
501+
None
502+
}
503+
} else {
504+
None
505+
};
496506

497507
let lsps0_client_handler = LSPS0ClientHandler::new(
498508
entropy_source.clone(),

lightning-liquidity/src/persist.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
//! Types and utils for persistence.
1111
1212
use crate::events::{EventQueueDeserWrapper, LiquidityEvent};
13+
#[cfg(lsps1_service)]
14+
use crate::lsps1::peer_state::PeerState as LSPS1ServicePeerState;
1315
use crate::lsps2::service::PeerState as LSPS2ServicePeerState;
1416
use crate::lsps5::service::PeerState as LSPS5ServicePeerState;
1517
use crate::prelude::{new_hash_map, HashMap};
@@ -90,6 +92,51 @@ where
9092
Ok(Some(queue.0))
9193
}
9294

95+
#[cfg(lsps1_service)]
96+
pub(crate) async fn read_lsps1_service_peer_states<K: Deref>(
97+
kv_store: K,
98+
) -> Result<HashMap<PublicKey, Mutex<LSPS1ServicePeerState>>, lightning::io::Error>
99+
where
100+
K::Target: KVStore,
101+
{
102+
let mut res = new_hash_map();
103+
104+
for stored_key in kv_store
105+
.list(
106+
LIQUIDITY_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE,
107+
LSPS1_SERVICE_PERSISTENCE_SECONDARY_NAMESPACE,
108+
)
109+
.await?
110+
{
111+
let mut reader = Cursor::new(
112+
kv_store
113+
.read(
114+
LIQUIDITY_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE,
115+
LSPS1_SERVICE_PERSISTENCE_SECONDARY_NAMESPACE,
116+
&stored_key,
117+
)
118+
.await?,
119+
);
120+
121+
let peer_state = LSPS1ServicePeerState::read(&mut reader).map_err(|_| {
122+
lightning::io::Error::new(
123+
lightning::io::ErrorKind::InvalidData,
124+
"Failed to deserialize LSPS1 peer state",
125+
)
126+
})?;
127+
128+
let key = PublicKey::from_str(&stored_key).map_err(|_| {
129+
lightning::io::Error::new(
130+
lightning::io::ErrorKind::InvalidData,
131+
"Failed to deserialize stored key entry",
132+
)
133+
})?;
134+
135+
res.insert(key, Mutex::new(peer_state));
136+
}
137+
Ok(res)
138+
}
139+
93140
pub(crate) async fn read_lsps2_service_peer_states<K: Deref>(
94141
kv_store: K,
95142
) -> Result<HashMap<PublicKey, Mutex<LSPS2ServicePeerState>>, lightning::io::Error>

0 commit comments

Comments
 (0)