Skip to content

Commit 872e344

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

File tree

3 files changed

+65
-12
lines changed

3 files changed

+65
-12
lines changed

lightning-liquidity/src/lsps5/service.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,15 @@ where
150150
{
151151
/// Constructs a `LSPS5ServiceHandler` using the given time provider.
152152
pub(crate) fn new_with_time_provider(
153-
event_queue: Arc<EventQueue<K>>, pending_messages: Arc<MessageQueue>, channel_manager: CM,
154-
kv_store: K, node_signer: NS, config: LSPS5ServiceConfig, time_provider: TP,
153+
peer_states: HashMap<PublicKey, PeerState>, event_queue: Arc<EventQueue<K>>,
154+
pending_messages: Arc<MessageQueue>, channel_manager: CM, kv_store: K, node_signer: NS,
155+
config: LSPS5ServiceConfig, time_provider: TP,
155156
) -> Self {
156157
assert!(config.max_webhooks_per_client > 0, "`max_webhooks_per_client` must be > 0");
158+
let per_peer_state = RwLock::new(peer_states);
157159
Self {
158160
config,
159-
per_peer_state: RwLock::new(new_hash_map()),
161+
per_peer_state,
160162
event_queue,
161163
pending_messages,
162164
time_provider,
@@ -648,7 +650,7 @@ where
648650
}
649651

650652
#[derive(Debug, Default)]
651-
struct PeerState {
653+
pub(crate) struct PeerState {
652654
webhooks: Vec<(LSPS5AppName, Webhook)>,
653655
}
654656

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;
@@ -434,25 +434,31 @@ where
434434
})
435435
});
436436

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

445-
LSPS5ServiceHandler::new_with_time_provider(
445+
let peer_states = read_lsps5_service_peer_states(kv_store.clone()).await?;
446+
Some(LSPS5ServiceHandler::new_with_time_provider(
447+
peer_states,
446448
Arc::clone(&pending_events),
447449
Arc::clone(&pending_messages),
448450
channel_manager.clone(),
449451
kv_store.clone(),
450452
node_signer,
451-
config.clone(),
453+
lsps5_service_config.clone(),
452454
time_provider,
453-
)
454-
})
455-
});
455+
))
456+
} else {
457+
None
458+
}
459+
} else {
460+
None
461+
};
456462

457463
let lsps1_client_handler = client_config.as_ref().and_then(|config| {
458464
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
use crate::prelude::{new_hash_map, HashMap};
1415
use crate::sync::Mutex;
1516

@@ -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<HashMap<PublicKey, LSPS5ServicePeerState>, lightning::io::Error>
98+
where
99+
K::Target: KVStore,
100+
{
101+
let mut res = new_hash_map();
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.insert(key, peer_state);
135+
}
136+
Ok(res)
137+
}

0 commit comments

Comments
 (0)