Fix checksum logging
This commit is contained in:
45
db.go
45
db.go
@@ -1319,34 +1319,27 @@ func (db *DB) Restore(ctx context.Context, opt RestoreOptions) error {
|
|||||||
tmpPath := outputPath + ".tmp"
|
tmpPath := outputPath + ".tmp"
|
||||||
|
|
||||||
// Copy snapshot to output path.
|
// Copy snapshot to output path.
|
||||||
log.Printf("%s(%s): restoring snapshot %s/%08x to %s", db.path, r.Name(), generation, minWALIndex, tmpPath)
|
var chksum uint64
|
||||||
if !opt.DryRun {
|
if !opt.DryRun {
|
||||||
if err := db.restoreSnapshot(ctx, r, pos.Generation, pos.Index, tmpPath); err != nil {
|
if err := db.restoreSnapshot(ctx, r, pos.Generation, pos.Index, tmpPath); err != nil {
|
||||||
return fmt.Errorf("cannot restore snapshot: %w", err)
|
return fmt.Errorf("cannot restore snapshot: %w", err)
|
||||||
}
|
}
|
||||||
|
chksum, _ = checksumFile(tmpPath)
|
||||||
chksum, err := checksumFile(tmpPath)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("%s(%s): cannot checksum snapshot: %s", db.path, r.Name(), err)
|
|
||||||
} else {
|
|
||||||
log.Printf("%s(%s): restored snapshot checksum: %016x", db.path, r.Name(), chksum)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
log.Printf("%s(%s): restoring snapshot %s/%08x to %s, checksum=%016x", db.path, r.Name(), generation, minWALIndex, tmpPath, chksum)
|
||||||
|
|
||||||
// Restore each WAL file until we reach our maximum index.
|
// Restore each WAL file until we reach our maximum index.
|
||||||
for index := minWALIndex; index <= maxWALIndex; index++ {
|
for index := minWALIndex; index <= maxWALIndex; index++ {
|
||||||
log.Printf("%s(%s): restoring wal %s/%08x", db.path, r.Name(), generation, index)
|
if !opt.DryRun {
|
||||||
if opt.DryRun {
|
if chksum, err = db.restoreWAL(ctx, r, generation, index, tmpPath); os.IsNotExist(err) && index == minWALIndex && index == maxWALIndex {
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := db.restoreWAL(ctx, r, generation, index, tmpPath); os.IsNotExist(err) && index == minWALIndex && index == maxWALIndex {
|
|
||||||
log.Printf("%s(%s): no wal available, snapshot only", db.path, r.Name())
|
log.Printf("%s(%s): no wal available, snapshot only", db.path, r.Name())
|
||||||
break // snapshot file only, ignore error
|
break // snapshot file only, ignore error
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
return fmt.Errorf("cannot restore wal: %w", err)
|
return fmt.Errorf("cannot restore wal: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
log.Printf("%s(%s): restored wal %s/%08x, checksum=%016x", db.path, r.Name(), generation, index, chksum)
|
||||||
|
}
|
||||||
|
|
||||||
// Copy file to final location.
|
// Copy file to final location.
|
||||||
log.Printf("%s(%s): renaming database from temporary location", db.path, r.Name())
|
log.Printf("%s(%s): renaming database from temporary location", db.path, r.Name())
|
||||||
@@ -1459,49 +1452,45 @@ func (db *DB) restoreSnapshot(ctx context.Context, r Replica, generation string,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// restoreWAL copies a WAL file from the replica to the local WAL and forces checkpoint.
|
// restoreWAL copies a WAL file from the replica to the local WAL and forces checkpoint.
|
||||||
func (db *DB) restoreWAL(ctx context.Context, r Replica, generation string, index int, dbPath string) error {
|
func (db *DB) restoreWAL(ctx context.Context, r Replica, generation string, index int, dbPath string) (uint64, error) {
|
||||||
// Open WAL file from replica.
|
// Open WAL file from replica.
|
||||||
rd, err := r.WALReader(ctx, generation, index)
|
rd, err := r.WALReader(ctx, generation, index)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return 0, err
|
||||||
}
|
}
|
||||||
defer rd.Close()
|
defer rd.Close()
|
||||||
|
|
||||||
// Open handle to destination WAL path.
|
// Open handle to destination WAL path.
|
||||||
f, err := createFile(dbPath+"-wal", db.uid, db.gid)
|
f, err := createFile(dbPath+"-wal", db.uid, db.gid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return 0, err
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
// Copy WAL to target path.
|
// Copy WAL to target path.
|
||||||
if _, err := io.Copy(f, rd); err != nil {
|
if _, err := io.Copy(f, rd); err != nil {
|
||||||
return err
|
return 0, err
|
||||||
} else if err := f.Close(); err != nil {
|
} else if err := f.Close(); err != nil {
|
||||||
return err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
chksum, err := checksumFile(dbPath + "-wal")
|
chksum, _ := checksumFile(dbPath + "-wal")
|
||||||
if err != nil {
|
|
||||||
log.Printf("%s(%s): cannot checksum wal: %s", db.path, r.Name(), err)
|
|
||||||
} else {
|
|
||||||
log.Printf("%s(%s): restored wal checksum: %016x", db.path, r.Name(), chksum)
|
log.Printf("%s(%s): restored wal checksum: %016x", db.path, r.Name(), chksum)
|
||||||
}
|
|
||||||
|
|
||||||
// Open SQLite database and force a truncating checkpoint.
|
// Open SQLite database and force a truncating checkpoint.
|
||||||
d, err := sql.Open("sqlite3", dbPath)
|
d, err := sql.Open("sqlite3", dbPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return 0, err
|
||||||
}
|
}
|
||||||
defer d.Close()
|
defer d.Close()
|
||||||
|
|
||||||
if _, err := d.Exec(`PRAGMA wal_checkpoint(TRUNCATE);`); err != nil {
|
if _, err := d.Exec(`PRAGMA wal_checkpoint(TRUNCATE);`); err != nil {
|
||||||
return err
|
return 0, err
|
||||||
} else if err := d.Close(); err != nil {
|
} else if err := d.Close(); err != nil {
|
||||||
return err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return chksum, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CRC64 returns a CRC-64 ISO checksum of the database and its current position.
|
// CRC64 returns a CRC-64 ISO checksum of the database and its current position.
|
||||||
|
|||||||
@@ -988,8 +988,6 @@ func compressFile(src, dst string, uid, gid int) error {
|
|||||||
func ValidateReplica(ctx context.Context, r Replica) error {
|
func ValidateReplica(ctx context.Context, r Replica) error {
|
||||||
db := r.DB()
|
db := r.DB()
|
||||||
|
|
||||||
log.Printf("%s(%s): computing primary checksum", db.Path(), r.Name())
|
|
||||||
|
|
||||||
// Compute checksum of primary database under lock. This prevents a
|
// Compute checksum of primary database under lock. This prevents a
|
||||||
// sync from occurring and the database will not be written.
|
// sync from occurring and the database will not be written.
|
||||||
chksum0, pos, err := db.CRC64()
|
chksum0, pos, err := db.CRC64()
|
||||||
@@ -1003,7 +1001,6 @@ func ValidateReplica(ctx context.Context, r Replica) error {
|
|||||||
if err := waitForReplica(ctx, r, pos); err != nil {
|
if err := waitForReplica(ctx, r, pos); err != nil {
|
||||||
return fmt.Errorf("cannot wait for replica: %w", err)
|
return fmt.Errorf("cannot wait for replica: %w", err)
|
||||||
}
|
}
|
||||||
log.Printf("%s(%s): replica ready, restoring", db.Path(), r.Name())
|
|
||||||
|
|
||||||
// Restore replica to a temporary directory.
|
// Restore replica to a temporary directory.
|
||||||
tmpdir, err := ioutil.TempDir("", "*-litestream")
|
tmpdir, err := ioutil.TempDir("", "*-litestream")
|
||||||
@@ -1023,8 +1020,6 @@ func ValidateReplica(ctx context.Context, r Replica) error {
|
|||||||
return fmt.Errorf("cannot restore: %w", err)
|
return fmt.Errorf("cannot restore: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("%s(%s): restore complete, computing checksum", db.Path(), r.Name())
|
|
||||||
|
|
||||||
// Open file handle for restored database.
|
// Open file handle for restored database.
|
||||||
f, err := os.Open(db.Path())
|
f, err := os.Open(db.Path())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -1039,7 +1034,7 @@ func ValidateReplica(ctx context.Context, r Replica) error {
|
|||||||
}
|
}
|
||||||
chksum1 := h.Sum64()
|
chksum1 := h.Sum64()
|
||||||
|
|
||||||
log.Printf("%s(%s): replica checksum computed: %016x", db.Path(), r.Name(), chksum1)
|
log.Printf("%s(%s): restore complete, replica checksum=%016x", db.Path(), r.Name(), chksum1)
|
||||||
|
|
||||||
// Validate checksums match.
|
// Validate checksums match.
|
||||||
if chksum0 != chksum1 {
|
if chksum0 != chksum1 {
|
||||||
|
|||||||
Reference in New Issue
Block a user