Skip to content

Commit a6ac8d3

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

File tree

3 files changed

+65
-11
lines changed

3 files changed

+65
-11
lines changed

lightning-liquidity/src/lsps5/service.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,14 +151,17 @@ where
151151
{
152152
/// Constructs a `LSPS5ServiceHandler` using the given time provider.
153153
pub(crate) fn new_with_time_provider(
154-
event_queue: Arc<EventQueue>, pending_messages: Arc<MessageQueue>, channel_manager: CM,
154+
peer_states: Vec<(PublicKey, PeerState)>, event_queue: Arc<EventQueue>,
155+
pending_messages: Arc<MessageQueue>, channel_manager: CM,
155156
kv_store: Arc<dyn KVStore + Send + Sync>, node_signer: NS, config: LSPS5ServiceConfig,
156157
time_provider: TP,
157158
) -> Self {
158159
assert!(config.max_webhooks_per_client > 0, "`max_webhooks_per_client` must be > 0");
160+
let per_peer_state =
161+
RwLock::new(peer_states.into_iter().collect::<HashMap<PublicKey, PeerState>>());
159162
Self {
160163
config,
161-
per_peer_state: RwLock::new(new_hash_map()),
164+
per_peer_state,
162165
event_queue,
163166
pending_messages,
164167
time_provider,
@@ -641,7 +644,7 @@ where
641644
}
642645

643646
#[derive(Debug, Default)]
644-
struct PeerState {
647+
pub(crate) struct PeerState {
645648
webhooks: Vec<(LSPS5AppName, Webhook)>,
646649
}
647650

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;
@@ -388,25 +388,31 @@ where
388388
})
389389
});
390390

391-
let lsps5_service_handler = service_config.as_ref().and_then(|config| {
392-
config.lsps5_service_config.as_ref().map(|config| {
391+
let lsps5_service_handler = if let Some(service_config) = service_config.as_ref() {
392+
if let Some(lsps5_service_config) = service_config.lsps5_service_config.as_ref() {
393393
if let Some(number) =
394394
<LSPS5ServiceHandler<CM, NS, TP> as LSPSProtocolMessageHandler>::PROTOCOL_NUMBER
395395
{
396396
supported_protocols.push(number);
397397
}
398398

399-
LSPS5ServiceHandler::new_with_time_provider(
399+
let peer_states = read_lsps5_service_peer_states(kv_store.clone()).await?;
400+
Some(LSPS5ServiceHandler::new_with_time_provider(
401+
peer_states,
400402
Arc::clone(&pending_events),
401403
Arc::clone(&pending_messages),
402404
channel_manager.clone(),
403405
Arc::clone(&kv_store),
404406
node_signer,
405-
config.clone(),
407+
lsps5_service_config.clone(),
406408
time_provider,
407-
)
408-
})
409-
});
409+
))
410+
} else {
411+
None
412+
}
413+
} else {
414+
None
415+
};
410416

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

0 commit comments

Comments
 (0)