Refactor Restore()

This commit refactors out the complexity of downloading ordered WAL
files in parallel to a type called `WALDownloader`. This makes it
easier to test the restore separately from the download.
This commit is contained in:
Ben Johnson
2022-01-04 14:47:11 -07:00
parent 531e19ed6f
commit 3f0ec9fa9f
130 changed files with 2943 additions and 1254 deletions

View File

@@ -37,6 +37,7 @@ const (
var (
ErrNoGeneration = errors.New("no generation available")
ErrNoSnapshots = errors.New("no snapshots available")
ErrNoWALSegments = errors.New("no wal segments available")
ErrChecksumMismatch = errors.New("invalid replica, checksum mismatch")
)
@@ -440,6 +441,20 @@ func ParseOffset(s string) (int64, error) {
return v, nil
}
// removeDBFiles deletes the database and related files (journal, shm, wal).
func removeDBFiles(filename string) error {
if err := os.Remove(filename); err != nil && !os.IsNotExist(err) {
return fmt.Errorf("cannot delete database %q: %w", filename, err)
} else if err := os.Remove(filename + "-journal"); err != nil && !os.IsNotExist(err) {
return fmt.Errorf("cannot delete journal for %q: %w", filename, err)
} else if err := os.Remove(filename + "-shm"); err != nil && !os.IsNotExist(err) {
return fmt.Errorf("cannot delete shared memory for %q: %w", filename, err)
} else if err := os.Remove(filename + "-wal"); err != nil && !os.IsNotExist(err) {
return fmt.Errorf("cannot delete wal for %q: %w", filename, err)
}
return nil
}
// isHexChar returns true if ch is a lowercase hex character.
func isHexChar(ch rune) bool {
return (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f')