Skip to content

Commit 1da5c78

Browse files
fix(storage): include snapshot data in db backup export
backup_to_directory used Snapshot::export_to_directory, which only copied the .snapshot JSON and omitted {name}_data, producing tiny archives unsuitable for sync-from-snapshot. Route backup through SnapshotManager::export_snapshot instead. Fix restore_from_directory to import_snapshot then load_snapshot, and fix import_snapshot to resolve *_data using the original snapshot name before rename. Remove the stub Snapshot export/import helpers to avoid a second code path. Made-with: Cursor
1 parent 9759845 commit 1da5c78

2 files changed

Lines changed: 17 additions & 48 deletions

File tree

crates/catalyst-storage/src/manager.rs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -505,12 +505,12 @@ impl StorageManager {
505505
std::fs::create_dir_all(backup_dir)
506506
.map_err(StorageError::from)?;
507507

508-
// Create a snapshot first
508+
// Create a snapshot first, then export metadata + `{name}_data` (not just the `.snapshot` file).
509509
let snapshot_name = format!("backup_{}", current_timestamp());
510-
let snapshot = self.create_snapshot(&snapshot_name).await?;
511-
512-
// Copy snapshot data to backup directory
513-
snapshot.export_to_directory(backup_dir).await?;
510+
self.create_snapshot(&snapshot_name).await?;
511+
self.snapshot_manager
512+
.export_snapshot(&snapshot_name, backup_dir)
513+
.await?;
514514

515515
log_info!(LogCategory::Storage, "Database backed up to {:?}", backup_dir);
516516
Ok(())
@@ -522,12 +522,14 @@ impl StorageManager {
522522
return Err(StorageError::config(format!("Backup directory {:?} does not exist", backup_dir)));
523523
}
524524

525-
// Import snapshot from backup directory
526-
let snapshot_name = format!("restore_{}", current_timestamp());
527-
let snapshot = Snapshot::import_from_directory(&snapshot_name, backup_dir).await?;
528-
529-
// Load the snapshot
530-
self.load_snapshot(&snapshot_name).await?;
525+
// Register files from `backup_dir` into this node's snapshot dir, then load into the open DB.
526+
let imported_name = self
527+
.snapshot_manager
528+
.import_snapshot(backup_dir, None)
529+
.await?;
530+
self.snapshot_manager
531+
.load_snapshot(&imported_name)
532+
.await?;
531533

532534
// Recompute state root
533535
self.compute_state_root().await?;

crates/catalyst-storage/src/snapshot.rs

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,8 @@ impl SnapshotManager {
558558

559559
// Load snapshot metadata
560560
let mut snapshot = self.load_snapshot_metadata(&metadata_file).await?;
561-
561+
let orig_name = snapshot.name.clone();
562+
562563
// Use new name if provided
563564
let final_name = new_name.unwrap_or_else(|| {
564565
format!("{}_imported_{}", snapshot.name, current_timestamp())
@@ -576,8 +577,8 @@ impl SnapshotManager {
576577
std::fs::copy(&metadata_file, &snapshot.file_path)
577578
.map_err(StorageError::from)?;
578579

579-
// Copy data directory if it exists
580-
let data_src = import_dir.join(format!("{}_data", snapshot.name));
580+
// Copy data directory if it exists (on-disk folder uses `orig_name`, not renamed `final_name`)
581+
let data_src = import_dir.join(format!("{}_data", orig_name));
581582
let data_dest = self.snapshot_dir.join(format!("{}_data", final_name));
582583

583584
if data_src.exists() {
@@ -679,40 +680,6 @@ impl Snapshot {
679680
pub fn metadata(&self) -> &SnapshotMetadata {
680681
&self.metadata
681682
}
682-
683-
/// Export to directory (convenience method)
684-
pub async fn export_to_directory(&self, export_dir: &Path) -> StorageResult<()> {
685-
// Create export directory
686-
std::fs::create_dir_all(export_dir)
687-
.map_err(StorageError::from)?;
688-
689-
// Copy metadata file
690-
let metadata_dest = export_dir.join(format!("{}.snapshot", self.name));
691-
std::fs::copy(&self.file_path, &metadata_dest)
692-
.map_err(StorageError::from)?;
693-
694-
// Note: In a full implementation, you'd also copy the data directory
695-
// This is simplified for the example
696-
697-
Ok(())
698-
}
699-
700-
/// Import from directory (static constructor)
701-
pub async fn import_from_directory(name: &str, import_dir: &Path) -> StorageResult<Snapshot> {
702-
let metadata_file = import_dir.join(format!("{}.snapshot", name));
703-
704-
if !metadata_file.exists() {
705-
return Err(StorageError::snapshot(format!("Snapshot metadata file not found: {:?}", metadata_file)));
706-
}
707-
708-
let content = std::fs::read_to_string(&metadata_file)
709-
.map_err(StorageError::from)?;
710-
711-
let snapshot: Snapshot = serde_json::from_str(&content)
712-
.map_err(|e| StorageError::serialization(format!("Failed to parse snapshot metadata: {}", e)))?;
713-
714-
Ok(snapshot)
715-
}
716683
}
717684

718685
#[cfg(test)]

0 commit comments

Comments
 (0)