Skip to content

Commit 73ed082

Browse files
committed
Read persisted LSPS5 service state in LiquidityManager::new
We read any previously-persisted state upon construction of `LiquidityManager`.
1 parent 8610242 commit 73ed082

File tree

3 files changed

+66
-12
lines changed

3 files changed

+66
-12
lines changed

lightning-liquidity/src/lsps5/service.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,13 +153,16 @@ where
153153
{
154154
/// Constructs a `LSPS5ServiceHandler` using the given time provider.
155155
pub(crate) fn new_with_time_provider(
156-
event_queue: Arc<EventQueue<K>>, pending_messages: Arc<MessageQueue>, channel_manager: CM,
157-
kv_store: K, node_signer: NS, config: LSPS5ServiceConfig, time_provider: TP,
156+
peer_states: Vec<(PublicKey, PeerState)>, event_queue: Arc<EventQueue<K>>,
157+
pending_messages: Arc<MessageQueue>, channel_manager: CM, kv_store: K, node_signer: NS,
158+
config: LSPS5ServiceConfig, time_provider: TP,
158159
) -> Self {
159160
assert!(config.max_webhooks_per_client > 0, "`max_webhooks_per_client` must be > 0");
161+
let per_peer_state =
162+
RwLock::new(peer_states.into_iter().collect::<HashMap<PublicKey, PeerState>>());
160163
Self {
161164
config,
162-
per_peer_state: RwLock::new(new_hash_map()),
165+
per_peer_state,
163166
event_queue,
164167
pending_messages,
165168
time_provider,
@@ -644,7 +647,7 @@ where
644647
}
645648

646649
#[derive(Debug, Default)]
647-
struct PeerState {
650+
pub(crate) struct PeerState {
648651
webhooks: Vec<(LSPS5AppName, Webhook)>,
649652
}
650653

lightning-liquidity/src/manager.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use crate::lsps5::client::{LSPS5ClientConfig, LSPS5ClientHandler};
2424
use crate::lsps5::msgs::LSPS5Message;
2525
use crate::lsps5::service::{LSPS5ServiceConfig, LSPS5ServiceHandler};
2626
use crate::message_queue::MessageQueue;
27-
use crate::persist::read_lsps2_service_peer_states;
27+
use crate::persist::{read_lsps2_service_peer_states, read_lsps5_service_peer_states};
2828

2929
use crate::lsps1::client::{LSPS1ClientConfig, LSPS1ClientHandler};
3030
use crate::lsps1::msgs::LSPS1Message;
@@ -435,25 +435,31 @@ where
435435
})
436436
});
437437

438-
let lsps5_service_handler = service_config.as_ref().and_then(|config| {
439-
config.lsps5_service_config.as_ref().map(|config| {
438+
let lsps5_service_handler = if let Some(service_config) = service_config.as_ref() {
439+
if let Some(lsps5_service_config) = service_config.lsps5_service_config.as_ref() {
440440
if let Some(number) =
441441
<LSPS5ServiceHandler<CM, NS, K, TP> as LSPSProtocolMessageHandler>::PROTOCOL_NUMBER
442442
{
443443
supported_protocols.push(number);
444444
}
445445

446-
LSPS5ServiceHandler::new_with_time_provider(
446+
let peer_states = read_lsps5_service_peer_states(kv_store.clone()).await?;
447+
Some(LSPS5ServiceHandler::new_with_time_provider(
448+
peer_states,
447449
Arc::clone(&pending_events),
448450
Arc::clone(&pending_messages),
449451
channel_manager.clone(),
450452
kv_store.clone(),
451453
node_signer,
452-
config.clone(),
454+
lsps5_service_config.clone(),
453455
time_provider,
454-
)
455-
})
456-
});
456+
))
457+
} else {
458+
None
459+
}
460+
} else {
461+
None
462+
};
457463

458464
let lsps1_client_handler = client_config.as_ref().and_then(|config| {
459465
config.lsps1_client_config.as_ref().map(|config| {

lightning-liquidity/src/persist.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
//! Types and utils for persistence.
1111
1212
use crate::lsps2::service::PeerState as LSPS2ServicePeerState;
13+
use crate::lsps5::service::PeerState as LSPS5ServicePeerState;
1314

1415
use lightning::io::Cursor;
1516
use lightning::util::persist::KVStore;
@@ -90,3 +91,47 @@ where
9091
}
9192
Ok(res)
9293
}
94+
95+
pub(crate) async fn read_lsps5_service_peer_states<K: Deref>(
96+
kv_store: K,
97+
) -> Result<Vec<(PublicKey, LSPS5ServicePeerState)>, lightning::io::Error>
98+
where
99+
K::Target: KVStore,
100+
{
101+
let mut res = Vec::new();
102+
103+
for stored_key in kv_store
104+
.list(
105+
LIQUIDITY_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE,
106+
LSPS5_SERVICE_PERSISTENCE_SECONDARY_NAMESPACE,
107+
)
108+
.await?
109+
{
110+
let mut reader = Cursor::new(
111+
kv_store
112+
.read(
113+
LIQUIDITY_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE,
114+
LSPS5_SERVICE_PERSISTENCE_SECONDARY_NAMESPACE,
115+
&stored_key,
116+
)
117+
.await?,
118+
);
119+
120+
let peer_state = LSPS5ServicePeerState::read(&mut reader).map_err(|_| {
121+
lightning::io::Error::new(
122+
lightning::io::ErrorKind::InvalidData,
123+
"Failed to deserialize LSPS5 peer state",
124+
)
125+
})?;
126+
127+
let key = PublicKey::from_str(&stored_key).map_err(|_| {
128+
lightning::io::Error::new(
129+
lightning::io::ErrorKind::InvalidData,
130+
"Failed to deserialize stored key entry",
131+
)
132+
})?;
133+
134+
res.push((key, peer_state));
135+
}
136+
Ok(res)
137+
}

0 commit comments

Comments
 (0)