Skip to content

Commit cfa2cf0

Browse files
committed
Use async KVStore migration for filesystem stores
Open filesystem stores through the async LDK migration helper so v1-to-v2 store migration no longer depends on the blocking KVStoreSync migration path. Co-Authored-By: HAL 9000
1 parent 65c98bc commit cfa2cf0

2 files changed

Lines changed: 29 additions & 27 deletions

File tree

src/builder.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -697,11 +697,12 @@ impl NodeBuilder {
697697
/// [`FilesystemStoreV2`]: lightning_persister::fs_store::v2::FilesystemStoreV2
698698
pub fn build_with_fs_store(&self, node_entropy: NodeEntropy) -> Result<Node, BuildError> {
699699
let logger = setup_logger(&self.log_writer_config, &self.config)?;
700+
let runtime = self.setup_runtime(&logger)?;
700701
let mut storage_dir_path: PathBuf = self.config.storage_dir_path.clone().into();
701702
storage_dir_path.push("fs_store");
702703

703-
let kv_store = open_or_migrate_fs_store(storage_dir_path)?;
704-
self.build_with_store_and_logger(node_entropy, kv_store, logger)
704+
let kv_store = runtime.block_on(open_or_migrate_fs_store(storage_dir_path))?;
705+
self.build_with_store_runtime_and_logger(node_entropy, kv_store, runtime, logger)
705706
}
706707

707708
/// Builds a [`Node`] instance with a [VSS] backend and according to the options

src/io/utils.rs

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ use lightning::routing::scoring::{
2626
ChannelLiquidities, ProbabilisticScorer, ProbabilisticScoringDecayParameters,
2727
};
2828
use lightning::util::persist::{
29-
migrate_kv_store_data, KVStore, KVSTORE_NAMESPACE_KEY_ALPHABET, KVSTORE_NAMESPACE_KEY_MAX_LEN,
30-
NETWORK_GRAPH_PERSISTENCE_KEY, NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE,
31-
NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE, OUTPUT_SWEEPER_PERSISTENCE_KEY,
32-
OUTPUT_SWEEPER_PERSISTENCE_PRIMARY_NAMESPACE, OUTPUT_SWEEPER_PERSISTENCE_SECONDARY_NAMESPACE,
33-
SCORER_PERSISTENCE_KEY, SCORER_PERSISTENCE_PRIMARY_NAMESPACE,
34-
SCORER_PERSISTENCE_SECONDARY_NAMESPACE,
29+
migrate_kv_store_data_async, KVStore, KVSTORE_NAMESPACE_KEY_ALPHABET,
30+
KVSTORE_NAMESPACE_KEY_MAX_LEN, NETWORK_GRAPH_PERSISTENCE_KEY,
31+
NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE, NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE,
32+
OUTPUT_SWEEPER_PERSISTENCE_KEY, OUTPUT_SWEEPER_PERSISTENCE_PRIMARY_NAMESPACE,
33+
OUTPUT_SWEEPER_PERSISTENCE_SECONDARY_NAMESPACE, SCORER_PERSISTENCE_KEY,
34+
SCORER_PERSISTENCE_PRIMARY_NAMESPACE, SCORER_PERSISTENCE_SECONDARY_NAMESPACE,
3535
};
3636
use lightning::util::ser::{Readable, ReadableArgs, Writeable};
3737
use lightning_persister::fs_store::v1::FilesystemStore;
@@ -631,7 +631,7 @@ pub(crate) async fn read_bdk_wallet_change_set(
631631
/// If the directory contains v1 data (files at the top level), the data is migrated to v2 format
632632
/// in a temporary directory, the original is renamed to `fs_store_v1_backup`, and the migrated
633633
/// directory is moved into place.
634-
pub(crate) fn open_or_migrate_fs_store(
634+
pub(crate) async fn open_or_migrate_fs_store(
635635
storage_dir_path: PathBuf,
636636
) -> Result<FilesystemStoreV2, BuildError> {
637637
let parent_dir = storage_dir_path.parent().ok_or(BuildError::StoragePathAccessFailed)?;
@@ -646,14 +646,15 @@ pub(crate) fn open_or_migrate_fs_store(
646646
Ok(store) => Ok(store),
647647
Err(FilesystemStoreV2Error::V1DataDetected(_)) => {
648648
// The directory contains v1 data, migrate to v2.
649-
let mut v1_store = FilesystemStore::new(storage_dir_path.clone());
649+
let v1_store = FilesystemStore::new(storage_dir_path.clone());
650650

651651
let v2_dir = fs_store_sibling_path(&storage_dir_path, "fs_store_v2_migrating");
652652
fs::create_dir_all(v2_dir.clone()).map_err(|_| BuildError::StoragePathAccessFailed)?;
653-
let mut v2_store = FilesystemStoreV2::new(v2_dir.clone())
653+
let v2_store = FilesystemStoreV2::new(v2_dir.clone())
654654
.map_err(|_| BuildError::KVStoreSetupFailed)?;
655655

656-
migrate_kv_store_data(&mut v1_store, &mut v2_store)
656+
migrate_kv_store_data_async(&v1_store, &v2_store)
657+
.await
657658
.map_err(|_| BuildError::KVStoreSetupFailed)?;
658659

659660
// Swap directories: rename v1 out of the way, move v2 into place.
@@ -738,15 +739,15 @@ mod tests {
738739
assert_eq!(expected_seed_bytes, read_seed_bytes);
739740
}
740741

741-
#[test]
742-
fn fs_store_migration_recovers_before_v1_backup_rename() {
742+
#[tokio::test]
743+
async fn fs_store_migration_recovers_before_v1_backup_rename() {
743744
let fs_store_path = fs_store_path();
744745
let mut v1_store = write_v1_test_data(&fs_store_path);
745746
let v2_migrating_path = sibling_path(&fs_store_path, "fs_store_v2_migrating");
746747
let mut v2_store = FilesystemStoreV2::new(v2_migrating_path.clone()).unwrap();
747748
migrate_kv_store_data(&mut v1_store, &mut v2_store).unwrap();
748749

749-
let migrated_store = open_or_migrate_fs_store(fs_store_path.clone()).unwrap();
750+
let migrated_store = open_or_migrate_fs_store(fs_store_path.clone()).await.unwrap();
750751
assert_eq!(
751752
KVStoreSync::read(
752753
&migrated_store,
@@ -761,8 +762,8 @@ mod tests {
761762
assert!(!v2_migrating_path.exists());
762763
}
763764

764-
#[test]
765-
fn fs_store_migration_recovers_after_v1_backup_rename() {
765+
#[tokio::test]
766+
async fn fs_store_migration_recovers_after_v1_backup_rename() {
766767
let fs_store_path = fs_store_path();
767768
let mut v1_store = write_v1_test_data(&fs_store_path);
768769
let v2_migrating_path = sibling_path(&fs_store_path, "fs_store_v2_migrating");
@@ -772,7 +773,7 @@ mod tests {
772773
let backup_path = sibling_path(&fs_store_path, "fs_store_v1_backup");
773774
fs::rename(&fs_store_path, backup_path).unwrap();
774775

775-
let migrated_store = open_or_migrate_fs_store(fs_store_path.clone()).unwrap();
776+
let migrated_store = open_or_migrate_fs_store(fs_store_path.clone()).await.unwrap();
776777
assert_eq!(
777778
KVStoreSync::read(
778779
&migrated_store,
@@ -787,8 +788,8 @@ mod tests {
787788
assert!(!v2_migrating_path.exists());
788789
}
789790

790-
#[test]
791-
fn fs_store_migration_recovers_after_v2_rename() {
791+
#[tokio::test]
792+
async fn fs_store_migration_recovers_after_v2_rename() {
792793
let fs_store_path = fs_store_path();
793794
let mut v1_store = write_v1_test_data(&fs_store_path);
794795
let v2_migrating_path = sibling_path(&fs_store_path, "fs_store_v2_migrating");
@@ -799,7 +800,7 @@ mod tests {
799800
fs::rename(&fs_store_path, &backup_path).unwrap();
800801
fs::rename(&v2_migrating_path, &fs_store_path).unwrap();
801802

802-
let migrated_store = open_or_migrate_fs_store(fs_store_path.clone()).unwrap();
803+
let migrated_store = open_or_migrate_fs_store(fs_store_path.clone()).await.unwrap();
803804
assert_eq!(
804805
KVStoreSync::read(
805806
&migrated_store,
@@ -815,15 +816,15 @@ mod tests {
815816
assert!(!v2_migrating_path.exists());
816817
}
817818

818-
#[test]
819-
fn fs_store_migration_recovers_backup_without_migrating_dir() {
819+
#[tokio::test]
820+
async fn fs_store_migration_recovers_backup_without_migrating_dir() {
820821
let fs_store_path = fs_store_path();
821822
write_v1_test_data(&fs_store_path);
822823

823824
let backup_path = sibling_path(&fs_store_path, "fs_store_v1_backup");
824825
fs::rename(&fs_store_path, backup_path).unwrap();
825826

826-
let migrated_store = open_or_migrate_fs_store(fs_store_path.clone()).unwrap();
827+
let migrated_store = open_or_migrate_fs_store(fs_store_path.clone()).await.unwrap();
827828
assert_eq!(
828829
KVStoreSync::read(
829830
&migrated_store,
@@ -838,8 +839,8 @@ mod tests {
838839
assert!(!sibling_path(&fs_store_path, "fs_store_v1_backup").exists());
839840
}
840841

841-
#[test]
842-
fn fs_store_migration_recovers_unexpected_migrating_dir_without_backup() {
842+
#[tokio::test]
843+
async fn fs_store_migration_recovers_unexpected_migrating_dir_without_backup() {
843844
let fs_store_path = fs_store_path();
844845
let v2_migrating_path = sibling_path(&fs_store_path, "fs_store_v2_migrating");
845846
let v2_store = FilesystemStoreV2::new(v2_migrating_path.clone()).unwrap();
@@ -852,7 +853,7 @@ mod tests {
852853
)
853854
.unwrap();
854855

855-
let migrated_store = open_or_migrate_fs_store(fs_store_path.clone()).unwrap();
856+
let migrated_store = open_or_migrate_fs_store(fs_store_path.clone()).await.unwrap();
856857
assert_eq!(
857858
KVStoreSync::read(
858859
&migrated_store,

0 commit comments

Comments
 (0)