Skip to content

Commit 51882fe

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

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(Arc::clone(&kv_store)).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;
@@ -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)