Skip to content

Commit 1c0b501

Browse files
committed
Improve logging on persistence failure
1 parent 29da33a commit 1c0b501

File tree

7 files changed

+295
-107
lines changed

7 files changed

+295
-107
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ libc = "0.2"
5858
electrsd = { version = "0.22.0", features = ["legacy", "esplora_a33e97e1", "bitcoind_23_0"] }
5959
electrum-client = "0.12.0"
6060
proptest = "1.0.0"
61+
regex = "1.5.6"
6162

6263
[profile.release]
6364
panic = "abort"

src/event.rs

Lines changed: 53 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -82,30 +82,33 @@ impl_writeable_tlv_based_enum!(Event,
8282
};
8383
);
8484

85-
pub struct EventQueue<K: Deref>
85+
pub struct EventQueue<K: Deref, L: Deref>
8686
where
8787
K::Target: KVStore,
88+
L::Target: Logger,
8889
{
8990
queue: Mutex<VecDeque<Event>>,
9091
notifier: Condvar,
9192
kv_store: K,
93+
logger: L,
9294
}
9395

94-
impl<K: Deref> EventQueue<K>
96+
impl<K: Deref, L: Deref> EventQueue<K, L>
9597
where
9698
K::Target: KVStore,
99+
L::Target: Logger,
97100
{
98-
pub(crate) fn new(kv_store: K) -> Self {
101+
pub(crate) fn new(kv_store: K, logger: L) -> Self {
99102
let queue: Mutex<VecDeque<Event>> = Mutex::new(VecDeque::new());
100103
let notifier = Condvar::new();
101-
Self { queue, notifier, kv_store }
104+
Self { queue, notifier, kv_store, logger }
102105
}
103106

104107
pub(crate) fn add_event(&self, event: Event) -> Result<(), Error> {
105108
{
106109
let mut locked_queue = self.queue.lock().unwrap();
107110
locked_queue.push_back(event);
108-
self.persist_queue(&locked_queue)?;
111+
self.write_queue_and_commit(&locked_queue)?;
109112
}
110113

111114
self.notifier.notify_one();
@@ -122,37 +125,64 @@ where
122125
{
123126
let mut locked_queue = self.queue.lock().unwrap();
124127
locked_queue.pop_front();
125-
self.persist_queue(&locked_queue)?;
128+
self.write_queue_and_commit(&locked_queue)?;
126129
}
127130
self.notifier.notify_one();
128131
Ok(())
129132
}
130133

131-
fn persist_queue(&self, locked_queue: &VecDeque<Event>) -> Result<(), Error> {
134+
fn write_queue_and_commit(&self, locked_queue: &VecDeque<Event>) -> Result<(), Error> {
132135
let mut writer = self
133136
.kv_store
134137
.write(EVENT_QUEUE_PERSISTENCE_NAMESPACE, EVENT_QUEUE_PERSISTENCE_KEY)
135-
.map_err(|_| Error::PersistenceFailed)?;
136-
EventQueueSerWrapper(locked_queue)
137-
.write(&mut writer)
138-
.map_err(|_| Error::PersistenceFailed)?;
139-
writer.commit().map_err(|_| Error::PersistenceFailed)?;
138+
.map_err(|e| {
139+
log_error!(
140+
self.logger,
141+
"Getting writer for key {}/{} failed due to: {}",
142+
EVENT_QUEUE_PERSISTENCE_NAMESPACE,
143+
EVENT_QUEUE_PERSISTENCE_KEY,
144+
e
145+
);
146+
Error::PersistenceFailed
147+
})?;
148+
EventQueueSerWrapper(locked_queue).write(&mut writer).map_err(|e| {
149+
log_error!(
150+
self.logger,
151+
"Writing event queue data to key {}/{} failed due to: {}",
152+
EVENT_QUEUE_PERSISTENCE_NAMESPACE,
153+
EVENT_QUEUE_PERSISTENCE_KEY,
154+
e
155+
);
156+
Error::PersistenceFailed
157+
})?;
158+
writer.commit().map_err(|e| {
159+
log_error!(
160+
self.logger,
161+
"Committing event queue data to key {}/{} failed due to: {}",
162+
EVENT_QUEUE_PERSISTENCE_NAMESPACE,
163+
EVENT_QUEUE_PERSISTENCE_KEY,
164+
e
165+
);
166+
Error::PersistenceFailed
167+
})?;
140168
Ok(())
141169
}
142170
}
143171

144-
impl<K: Deref> ReadableArgs<K> for EventQueue<K>
172+
impl<K: Deref, L: Deref> ReadableArgs<(K, L)> for EventQueue<K, L>
145173
where
146174
K::Target: KVStore,
175+
L::Target: Logger,
147176
{
148177
#[inline]
149178
fn read<R: lightning::io::Read>(
150-
reader: &mut R, kv_store: K,
179+
reader: &mut R, args: (K, L),
151180
) -> Result<Self, lightning::ln::msgs::DecodeError> {
181+
let (kv_store, logger) = args;
152182
let read_queue: EventQueueDeserWrapper = Readable::read(reader)?;
153183
let queue: Mutex<VecDeque<Event>> = Mutex::new(read_queue.0);
154184
let notifier = Condvar::new();
155-
Ok(Self { queue, notifier, kv_store })
185+
Ok(Self { queue, notifier, kv_store, logger })
156186
}
157187
}
158188

@@ -189,11 +219,11 @@ where
189219
L::Target: Logger,
190220
{
191221
wallet: Arc<Wallet<bdk::database::SqliteDatabase>>,
192-
event_queue: Arc<EventQueue<K>>,
222+
event_queue: Arc<EventQueue<K, L>>,
193223
channel_manager: Arc<ChannelManager>,
194224
network_graph: Arc<NetworkGraph>,
195225
keys_manager: Arc<KeysManager>,
196-
payment_store: Arc<PaymentInfoStorage<K>>,
226+
payment_store: Arc<PaymentInfoStorage<K, L>>,
197227
tokio_runtime: Arc<tokio::runtime::Runtime>,
198228
logger: L,
199229
_config: Arc<Config>,
@@ -205,9 +235,9 @@ where
205235
L::Target: Logger,
206236
{
207237
pub fn new(
208-
wallet: Arc<Wallet<bdk::database::SqliteDatabase>>, event_queue: Arc<EventQueue<K>>,
238+
wallet: Arc<Wallet<bdk::database::SqliteDatabase>>, event_queue: Arc<EventQueue<K, L>>,
209239
channel_manager: Arc<ChannelManager>, network_graph: Arc<NetworkGraph>,
210-
keys_manager: Arc<KeysManager>, payment_store: Arc<PaymentInfoStorage<K>>,
240+
keys_manager: Arc<KeysManager>, payment_store: Arc<PaymentInfoStorage<K, L>>,
211241
tokio_runtime: Arc<tokio::runtime::Runtime>, logger: L, _config: Arc<Config>,
212242
) -> Self {
213243
Self {
@@ -555,12 +585,13 @@ where
555585
#[cfg(test)]
556586
mod tests {
557587
use super::*;
558-
use crate::test::utils::TestStore;
588+
use crate::test::utils::{TestLogger, TestStore};
559589

560590
#[test]
561591
fn event_queue_persistence() {
562592
let store = Arc::new(TestStore::new());
563-
let event_queue = EventQueue::new(Arc::clone(&store));
593+
let logger = Arc::new(TestLogger::new());
594+
let event_queue = EventQueue::new(Arc::clone(&store), Arc::clone(&logger));
564595

565596
let expected_event = Event::ChannelReady { channel_id: [23u8; 32], user_channel_id: 2323 };
566597
event_queue.add_event(expected_event.clone()).unwrap();
@@ -577,7 +608,7 @@ mod tests {
577608
.get_persisted_bytes(EVENT_QUEUE_PERSISTENCE_NAMESPACE, EVENT_QUEUE_PERSISTENCE_KEY)
578609
.unwrap();
579610
let deser_event_queue =
580-
EventQueue::read(&mut &persisted_bytes[..], Arc::clone(&store)).unwrap();
611+
EventQueue::read(&mut &persisted_bytes[..], (Arc::clone(&store), logger)).unwrap();
581612
assert_eq!(deser_event_queue.next_event(), expected_event);
582613
assert!(!store.get_and_clear_did_persist());
583614

src/io/utils.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,25 +124,31 @@ where
124124
}
125125

126126
/// Read previously persisted events from the store.
127-
pub(crate) fn read_event_queue<K: Deref>(kv_store: K) -> Result<EventQueue<K>, std::io::Error>
127+
pub(crate) fn read_event_queue<K: Deref, L: Deref>(
128+
kv_store: K, logger: L,
129+
) -> Result<EventQueue<K, L>, std::io::Error>
128130
where
129131
K::Target: KVStore,
132+
L::Target: Logger,
130133
{
131134
let mut reader =
132135
kv_store.read(EVENT_QUEUE_PERSISTENCE_NAMESPACE, EVENT_QUEUE_PERSISTENCE_KEY)?;
133-
let event_queue = EventQueue::read(&mut reader, kv_store).map_err(|_| {
136+
let event_queue = EventQueue::read(&mut reader, (kv_store, logger)).map_err(|_| {
134137
std::io::Error::new(std::io::ErrorKind::InvalidData, "Failed to deserialize EventQueue")
135138
})?;
136139
Ok(event_queue)
137140
}
138141

139142
/// Read previously persisted peer info from the store.
140-
pub(crate) fn read_peer_info<K: Deref>(kv_store: K) -> Result<PeerInfoStorage<K>, std::io::Error>
143+
pub(crate) fn read_peer_info<K: Deref, L: Deref>(
144+
kv_store: K, logger: L,
145+
) -> Result<PeerInfoStorage<K, L>, std::io::Error>
141146
where
142147
K::Target: KVStore,
148+
L::Target: Logger,
143149
{
144150
let mut reader = kv_store.read(PEER_INFO_PERSISTENCE_NAMESPACE, PEER_INFO_PERSISTENCE_KEY)?;
145-
let peer_info = PeerInfoStorage::read(&mut reader, kv_store).map_err(|_| {
151+
let peer_info = PeerInfoStorage::read(&mut reader, (kv_store, logger)).map_err(|_| {
146152
std::io::Error::new(
147153
std::io::ErrorKind::InvalidData,
148154
"Failed to deserialize PeerInfoStorage",

src/lib.rs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -503,32 +503,36 @@ impl Builder {
503503

504504
// Init payment info storage
505505
let payment_store = match io::utils::read_payment_info(Arc::clone(&kv_store)) {
506-
Ok(payments) => {
507-
Arc::new(PaymentInfoStorage::from_payments(payments, Arc::clone(&kv_store)))
508-
}
506+
Ok(payments) => Arc::new(PaymentInfoStorage::from_payments(
507+
payments,
508+
Arc::clone(&kv_store),
509+
Arc::clone(&logger),
510+
)),
509511
Err(e) => {
510512
log_error!(logger, "Failed to read payment information: {}", e.to_string());
511513
panic!("Failed to read payment information: {}", e.to_string());
512514
}
513515
};
514516

515-
let event_queue = match io::utils::read_event_queue(Arc::clone(&kv_store)) {
516-
Ok(event_queue) => Arc::new(event_queue),
517-
Err(e) => {
518-
if e.kind() == std::io::ErrorKind::NotFound {
519-
Arc::new(EventQueue::new(Arc::clone(&kv_store)))
520-
} else {
521-
log_error!(logger, "Failed to read event queue: {}", e.to_string());
522-
panic!("Failed to read event queue: {}", e.to_string());
517+
let event_queue =
518+
match io::utils::read_event_queue(Arc::clone(&kv_store), Arc::clone(&logger)) {
519+
Ok(event_queue) => Arc::new(event_queue),
520+
Err(e) => {
521+
if e.kind() == std::io::ErrorKind::NotFound {
522+
Arc::new(EventQueue::new(Arc::clone(&kv_store), Arc::clone(&logger)))
523+
} else {
524+
log_error!(logger, "Failed to read event queue: {}", e.to_string());
525+
panic!("Failed to read event queue: {}", e.to_string());
526+
}
523527
}
524-
}
525-
};
528+
};
526529

527-
let peer_store = match io::utils::read_peer_info(Arc::clone(&kv_store)) {
530+
let peer_store = match io::utils::read_peer_info(Arc::clone(&kv_store), Arc::clone(&logger))
531+
{
528532
Ok(peer_store) => Arc::new(peer_store),
529533
Err(e) => {
530534
if e.kind() == std::io::ErrorKind::NotFound {
531-
Arc::new(PeerInfoStorage::new(Arc::clone(&kv_store)))
535+
Arc::new(PeerInfoStorage::new(Arc::clone(&kv_store), Arc::clone(&logger)))
532536
} else {
533537
log_error!(logger, "Failed to read peer store: {}", e.to_string());
534538
panic!("Failed to read peer store: {}", e.to_string());
@@ -576,7 +580,7 @@ pub struct Node {
576580
config: Arc<Config>,
577581
wallet: Arc<Wallet<bdk::database::SqliteDatabase>>,
578582
tx_sync: Arc<EsploraSyncClient<Arc<FilesystemLogger>>>,
579-
event_queue: Arc<EventQueue<Arc<FilesystemStore>>>,
583+
event_queue: Arc<EventQueue<Arc<FilesystemStore>, Arc<FilesystemLogger>>>,
580584
channel_manager: Arc<ChannelManager>,
581585
chain_monitor: Arc<ChainMonitor>,
582586
peer_manager: Arc<PeerManager>,
@@ -586,8 +590,8 @@ pub struct Node {
586590
kv_store: Arc<FilesystemStore>,
587591
logger: Arc<FilesystemLogger>,
588592
scorer: Arc<Mutex<Scorer>>,
589-
peer_store: Arc<PeerInfoStorage<Arc<FilesystemStore>>>,
590-
payment_store: Arc<PaymentInfoStorage<Arc<FilesystemStore>>>,
593+
peer_store: Arc<PeerInfoStorage<Arc<FilesystemStore>, Arc<FilesystemLogger>>>,
594+
payment_store: Arc<PaymentInfoStorage<Arc<FilesystemStore>, Arc<FilesystemLogger>>>,
591595
}
592596

593597
impl Node {

0 commit comments

Comments
 (0)