Skip to content

Commit c83b1cd

Browse files
Add channelmanager::Persist trait
And implement it for the FilesystemPersister.
1 parent ba5f9c8 commit c83b1cd

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

lightning-persister/src/lib.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,20 @@ extern crate bitcoin;
55
extern crate libc;
66

77
use bitcoin::hashes::hex::ToHex;
8+
use crate::utils::DiskWriteable;
9+
use lightning::chain;
10+
use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
811
use lightning::chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate, ChannelMonitorUpdateErr};
912
use lightning::chain::channelmonitor;
10-
use lightning::chain::keysinterface::ChannelKeys;
13+
use lightning::chain::keysinterface::{ChannelKeys, KeysInterface};
1114
use lightning::chain::transaction::OutPoint;
15+
use lightning::ln::channelmanager;
16+
use lightning::ln::channelmanager::ChannelManager;
17+
use lightning::util::logger::Logger;
1218
use lightning::util::ser::{Writeable, Readable};
1319
use std::fs;
1420
use std::io::Error;
15-
use crate::utils::DiskWriteable;
21+
use std::sync::Arc;
1622

1723
#[cfg(test)]
1824
use {
@@ -44,6 +50,12 @@ impl<ChanSigner: ChannelKeys + Writeable> DiskWriteable for ChannelMonitor<ChanS
4450
}
4551
}
4652

53+
impl<ChanSigner: ChannelKeys + Writeable, M: chain::Watch<Keys=ChanSigner>, T: BroadcasterInterface, K: KeysInterface<ChanKeySigner=ChanSigner>, F: FeeEstimator, L: Logger> DiskWriteable for Arc<ChannelManager<ChanSigner, Arc<M>, Arc<T>, Arc<K>, Arc<F>, Arc<L>>> {
54+
fn write_to_file(&self, writer: &mut fs::File) -> Result<(), std::io::Error> {
55+
self.write(writer)
56+
}
57+
}
58+
4759
impl FilesystemPersister {
4860
/// Initialize a new FilesystemPersister and set the path to the individual channels'
4961
/// files.
@@ -102,6 +114,12 @@ impl<ChanSigner: ChannelKeys + Readable + Writeable + Send + Sync> channelmonito
102114
}
103115
}
104116

117+
impl<ChanSigner: 'static + ChannelKeys + Writeable, M: 'static + chain::Watch<Keys=ChanSigner>, T: 'static + BroadcasterInterface, K: 'static + KeysInterface<ChanKeySigner=ChanSigner>, F: 'static + FeeEstimator, L: 'static + Logger> channelmanager::Persist<ChanSigner, M, T, K, F, L> for FilesystemPersister {
118+
fn persist_manager(&self, data: Arc<ChannelManager<ChanSigner, Arc<M>, Arc<T>, Arc<K>, Arc<F>, Arc<L>>>) -> Result<(), std::io::Error> {
119+
utils::write_to_file(self.path_to_channel_data.clone(), "manager".to_string(), &data)
120+
}
121+
}
122+
105123
#[cfg(test)]
106124
mod tests {
107125
extern crate lightning;

lightning/src/ln/channelmanager.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3535,6 +3535,24 @@ impl<ChanSigner: ChannelKeys, M: Deref + Sync + Send, T: Deref + Sync + Send, K:
35353535
}
35363536
}
35373537

3538+
/// `Persist` defines behavior for persisting the ChannelManager: this could mean writing once to
3539+
/// disk, and/or uploading to one or more backup services. This persistence should probably happen
3540+
/// in a background thread for running an efficient node, rather than in real time as updates occur.
3541+
/// See [`block_until_needs_persist`] for more details.
3542+
/// Note that restoring an outdated ChannelManager from disk runs the risk of force-closing
3543+
/// channels.
3544+
///
3545+
///[`ChannelManager::block_until_needs_persist`]: struct.ChannelManager.html#method.block_until_needs_persist
3546+
pub trait Persist<ChanSigner: 'static + ChannelKeys + Writeable, M: 'static + chain::Watch<Keys=ChanSigner>, T: 'static + BroadcasterInterface, K: 'static + KeysInterface<ChanKeySigner=ChanSigner>, F: 'static + FeeEstimator, L: 'static + Logger>: Send + Sync {
3547+
/// Persist a `ChannelManager`. [`ChannelManager::block_until_needs_persist`] will signal you when
3548+
/// this method should be invoked. See [`ChannelManager::write`] for writing out a
3549+
/// `ChannelManager`.
3550+
///
3551+
///[`ChannelManager::block_until_needs_persist`]: struct.ChannelManager.html#method.block_until_needs_persist
3552+
///[`ChannelManager::write`]: struct.ChannelManager.html#method.write
3553+
fn persist_manager(&self, data: Arc<ChannelManager<ChanSigner, Arc<M>, Arc<T>, Arc<K>, Arc<F>, Arc<L>>>) -> Result<(), std::io::Error>;
3554+
}
3555+
35383556
const SERIALIZATION_VERSION: u8 = 1;
35393557
const MIN_SERIALIZATION_VERSION: u8 = 1;
35403558

0 commit comments

Comments
 (0)