Skip to content

Commit 0c4e18b

Browse files
committed
f Switch to use KVStore everywhere
1 parent 7d7e572 commit 0c4e18b

File tree

5 files changed

+278
-116
lines changed

5 files changed

+278
-116
lines changed

src/event.rs

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::{
33
PaymentInfo, PaymentInfoStorage, PaymentStatus, Wallet,
44
};
55

6-
use crate::io::{KVStoreUnpersister, EVENT_QUEUE_PERSISTENCE_KEY};
6+
use crate::io::{KVStore, EVENT_QUEUE_PERSISTENCE_KEY, EVENT_QUEUE_PERSISTENCE_NAMESPACE};
77
use crate::logger::{log_error, log_info, Logger};
88

99
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
@@ -14,7 +14,6 @@ use lightning::util::errors::APIError;
1414
use lightning::util::events::Event as LdkEvent;
1515
use lightning::util::events::EventHandler as LdkEventHandler;
1616
use lightning::util::events::PaymentPurpose;
17-
use lightning::util::persist::KVStorePersister;
1817
use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
1918

2019
use bitcoin::secp256k1::Secp256k1;
@@ -85,21 +84,21 @@ impl_writeable_tlv_based_enum!(Event,
8584

8685
pub struct EventQueue<K: Deref>
8786
where
88-
K::Target: KVStorePersister,
87+
K::Target: KVStore,
8988
{
9089
queue: Mutex<VecDeque<Event>>,
9190
notifier: Condvar,
92-
persister: K,
91+
kv_store: K,
9392
}
9493

9594
impl<K: Deref> EventQueue<K>
9695
where
97-
K::Target: KVStorePersister,
96+
K::Target: KVStore,
9897
{
99-
pub(crate) fn new(persister: K) -> Self {
98+
pub(crate) fn new(kv_store: K) -> Self {
10099
let queue: Mutex<VecDeque<Event>> = Mutex::new(VecDeque::new());
101100
let notifier = Condvar::new();
102-
Self { queue, notifier, persister }
101+
Self { queue, notifier, kv_store }
103102
}
104103

105104
pub(crate) fn add_event(&self, event: Event) -> Result<(), Error> {
@@ -130,25 +129,30 @@ where
130129
}
131130

132131
fn persist_queue(&self, locked_queue: &VecDeque<Event>) -> Result<(), Error> {
133-
self.persister
134-
.persist(EVENT_QUEUE_PERSISTENCE_KEY, &EventQueueSerWrapper(locked_queue))
132+
let mut writer = self
133+
.kv_store
134+
.write(EVENT_QUEUE_PERSISTENCE_NAMESPACE, EVENT_QUEUE_PERSISTENCE_KEY)
135135
.map_err(|_| Error::PersistenceFailed)?;
136+
EventQueueSerWrapper(locked_queue)
137+
.write(&mut writer)
138+
.map_err(|_| Error::PersistenceFailed)?;
139+
writer.commit().map_err(|_| Error::PersistenceFailed)?;
136140
Ok(())
137141
}
138142
}
139143

140144
impl<K: Deref> ReadableArgs<K> for EventQueue<K>
141145
where
142-
K::Target: KVStorePersister,
146+
K::Target: KVStore,
143147
{
144148
#[inline]
145149
fn read<R: lightning::io::Read>(
146-
reader: &mut R, persister: K,
150+
reader: &mut R, kv_store: K,
147151
) -> Result<Self, lightning::ln::msgs::DecodeError> {
148152
let read_queue: EventQueueDeserWrapper = Readable::read(reader)?;
149153
let queue: Mutex<VecDeque<Event>> = Mutex::new(read_queue.0);
150154
let notifier = Condvar::new();
151-
Ok(Self { queue, notifier, persister })
155+
Ok(Self { queue, notifier, kv_store })
152156
}
153157
}
154158

@@ -181,7 +185,7 @@ impl Writeable for EventQueueSerWrapper<'_> {
181185

182186
pub(crate) struct EventHandler<K: Deref + Clone, L: Deref>
183187
where
184-
K::Target: KVStorePersister + KVStoreUnpersister,
188+
K::Target: KVStore,
185189
L::Target: Logger,
186190
{
187191
wallet: Arc<Wallet<bdk::database::SqliteDatabase>>,
@@ -197,7 +201,7 @@ where
197201

198202
impl<K: Deref + Clone, L: Deref> EventHandler<K, L>
199203
where
200-
K::Target: KVStorePersister + KVStoreUnpersister,
204+
K::Target: KVStore,
201205
L::Target: Logger,
202206
{
203207
pub fn new(
@@ -222,7 +226,7 @@ where
222226

223227
impl<K: Deref + Clone, L: Deref> LdkEventHandler for EventHandler<K, L>
224228
where
225-
K::Target: KVStorePersister + KVStoreUnpersister,
229+
K::Target: KVStore,
226230
L::Target: Logger,
227231
{
228232
fn handle_event(&self, event: LdkEvent) {
@@ -551,33 +555,35 @@ where
551555
#[cfg(test)]
552556
mod tests {
553557
use super::*;
554-
use crate::test::utils::TestPersister;
558+
use crate::test::utils::TestStore;
555559

556560
#[test]
557561
fn event_queue_persistence() {
558-
let persister = Arc::new(TestPersister::new());
559-
let event_queue = EventQueue::new(Arc::clone(&persister));
562+
let store = Arc::new(TestStore::new());
563+
let event_queue = EventQueue::new(Arc::clone(&store));
560564

561565
let expected_event = Event::ChannelReady { channel_id: [23u8; 32], user_channel_id: 2323 };
562566
event_queue.add_event(expected_event.clone()).unwrap();
563-
assert!(persister.get_and_clear_did_persist());
567+
assert!(store.get_and_clear_did_persist());
564568

565569
// Check we get the expected event and that it is returned until we mark it handled.
566570
for _ in 0..5 {
567571
assert_eq!(event_queue.next_event(), expected_event);
568-
assert_eq!(false, persister.get_and_clear_did_persist());
572+
assert_eq!(false, store.get_and_clear_did_persist());
569573
}
570574

571575
// Check we can read back what we persisted.
572-
let persisted_bytes = persister.get_persisted_bytes(EVENT_QUEUE_PERSISTENCE_KEY).unwrap();
576+
let persisted_bytes = store
577+
.get_persisted_bytes(EVENT_QUEUE_PERSISTENCE_NAMESPACE, EVENT_QUEUE_PERSISTENCE_KEY)
578+
.unwrap();
573579
let deser_event_queue =
574-
EventQueue::read(&mut &persisted_bytes[..], Arc::clone(&persister)).unwrap();
580+
EventQueue::read(&mut &persisted_bytes[..], Arc::clone(&store)).unwrap();
575581
assert_eq!(deser_event_queue.next_event(), expected_event);
576-
assert!(!persister.get_and_clear_did_persist());
582+
assert!(!store.get_and_clear_did_persist());
577583

578584
// Check we persisted on `event_handled()`
579585
event_queue.event_handled().unwrap();
580586

581-
assert!(persister.get_and_clear_did_persist());
587+
assert!(store.get_and_clear_did_persist());
582588
}
583589
}

src/io/mod.rs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,29 @@ pub(crate) const PAYMENT_INFO_PERSISTENCE_NAMESPACE: &str = "payments";
3636
/// Keys and namespaces are required to be valid ASCII strings and the empty namespace (`""`) is
3737
/// assumed to be valid namespace.
3838
pub trait KVStore {
39-
/// Returns a [`Read`] for the given `key` from which [`Readable`]s may be read.
39+
/// Returns a [`Read`] for the given `namespace` and `key` from which [`Readable`]s may be
40+
/// read.
41+
///
42+
/// Returns an `Err` if the given `key` could not be found in the given `namespace`.
4043
///
4144
/// [`Readable`]: lightning::util::ser::Readable
4245
fn read(&self, namespace: &str, key: &str) -> std::io::Result<Box<dyn Read>>;
4346
/// Returns a [`TransactionalWrite`] for the given `key` to which [`Writeable`]s may be written.
4447
///
48+
/// Will create the given `namespace` if not already present in the store.
49+
///
4550
/// Note that [`TransactionalWrite::commit`] MUST be called to commit the written data, otherwise
4651
/// the changes won't be persisted.
4752
///
4853
/// [`Writeable`]: lightning::util::ser::Writeable
4954
fn write(&self, namespace: &str, key: &str) -> std::io::Result<Box<dyn TransactionalWrite>>;
5055
/// Removes any data that had previously been persisted under the given `key`.
5156
///
52-
/// Returns `true` if the key was present, and `false` otherwise.
57+
/// Returns `true` if the `key` was present in the given `namespace`, and `false` otherwise.
5358
fn remove(&self, namespace: &str, key: &str) -> std::io::Result<bool>;
5459
/// Returns a list of keys that are stored under the given `namespace`.
60+
///
61+
/// Will return an empty list if the `namespace` is unknown.
5562
fn list(&self, namespace: &str) -> std::io::Result<Vec<String>>;
5663
}
5764

@@ -63,6 +70,32 @@ pub trait TransactionalWrite: Write {
6370
fn commit(&mut self) -> std::io::Result<()>;
6471
}
6572

73+
// TODO: Use this generic impl once we have Node<K>
74+
//impl<T> KVStorePersister for T
75+
//where T: KVStore
76+
//{
77+
// fn persist<W: Writeable>(&self, prefixed_key: &str, object: &W) -> lightning::io::Result<()> {
78+
// let msg = format!("Could not persist data for key {}.", prefixed_key);
79+
// let dest_file = PathBuf::from_str(prefixed_key).map_err(|_| {
80+
// lightning::io::Error::new(lightning::io::ErrorKind::InvalidInput, msg.clone())
81+
// })?;
82+
//
83+
// let parent_directory = dest_file.parent().ok_or(lightning::io::Error::new(
84+
// lightning::io::ErrorKind::InvalidInput,
85+
// msg.clone(),
86+
// ))?;
87+
// let namespace = parent_directory.display().to_string();
88+
//
89+
// let dest_without_namespace = dest_file
90+
// .strip_prefix(&namespace)
91+
// .map_err(|_| lightning::io::Error::new(lightning::io::ErrorKind::InvalidInput, msg))?;
92+
// let key = dest_without_namespace.display().to_string();
93+
// let mut writer = self.write(&namespace, &key)?;
94+
// object.write(&mut writer)?;
95+
// Ok(writer.commit()?)
96+
// }
97+
//}
98+
6699
/// Provides an interface that allows a previously persisted key to be unpersisted.
67100
pub trait KVStoreUnpersister {
68101
/// Unpersist (i.e., remove) the writeable previously persisted under the provided key.

0 commit comments

Comments
 (0)