This commit is contained in:
2026-06-14 23:12:03 +03:00
parent 181031a753
commit b32279deaf
35 changed files with 1395 additions and 1062 deletions

View File

@@ -2,6 +2,7 @@ package recovery
import (
"errors"
"fmt"
"os"
"path/filepath"
"strconv"
@@ -113,6 +114,7 @@ func resolveRecoveryFiles(dir string) (_ RecoveryFiles, err error) {
type RecoveryReport struct {
SnapshotNumber int
WAL string
ReplayMetrics map[uint32]*storage.ReplayMetric
IndexFreeList *freelist.FreeList
DataFreeList *freelist.FreeList
}
@@ -122,6 +124,7 @@ func Recovery(dir string, databaseName string) (_ RecoveryReport, err error) {
if err != nil {
return
}
fmt.Printf("recovery files: %#v\n", recoveryFiles)
var (
frozenIndexPageCount int
frozenDataPageCount int
@@ -131,27 +134,33 @@ func Recovery(dir string, databaseName string) (_ RecoveryReport, err error) {
)
if recoveryFiles.Snapshot != "" {
var snapshot worker.ReadSnapshotOut
snapshot, err = worker.ReadSnapshot(recoveryFiles.Snapshot)
snapshot, err = worker.ReadSnapshot(filepath.Join(dir, recoveryFiles.Snapshot))
if err != nil {
return
}
//
fmt.Printf("snapshot: %#v\n", snapshot)
frozenIndexPageCount = snapshot.FrozenIndexPagesCount
frozenDataPageCount = snapshot.FrozenDataPagesCount
freeIndexPages = snapshot.IndexPageNumbers
freeDataPages = snapshot.DataPageNumbers
metrics = snapshot.Metrics
} else {
metrics = make(map[uint32]*storage.ReplayMetric)
}
if recoveryFiles.WAL != "" {
var (
wal *os.File
walReader *storage.WALReader
walReplayer *storage.WALReplayer
)
walReader, err = storage.NewWALReader(storage.WALReaderOptions{
FileName: recoveryFiles.WAL,
BufferSize: 8 * 1024 * 1024,
})
wal, err = os.Open(filepath.Join(dir, recoveryFiles.WAL))
if err != nil {
return
}
defer wal.Close()
walReader, err = storage.NewWALReader(wal)
if err != nil {
return
}
@@ -166,13 +175,15 @@ func Recovery(dir string, databaseName string) (_ RecoveryReport, err error) {
return
}
fmt.Printf("before replay\n")
err = walReplayer.Replay()
if err != nil {
return
}
fmt.Printf("after replay\n")
// перезаписую сторінки із останнього комміта
var dataFile *os.File
dataFile, err = os.OpenFile(qb.GetDataFilePath(dir, databaseName), os.O_WRONLY, 0666)
dataFile, err = os.OpenFile(qb.GetDataFilePath(dir, databaseName), os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
return
}
@@ -185,7 +196,7 @@ func Recovery(dir string, databaseName string) (_ RecoveryReport, err error) {
return
}
var indexFile *os.File
indexFile, err = os.OpenFile(qb.GetIndexFilePath(dir, databaseName), os.O_WRONLY, 0666)
indexFile, err = os.OpenFile(qb.GetIndexFilePath(dir, databaseName), os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
return
}
@@ -221,6 +232,7 @@ func Recovery(dir string, databaseName string) (_ RecoveryReport, err error) {
return RecoveryReport{
SnapshotNumber: recoveryFiles.SnapshotNumber,
WAL: recoveryFiles.WAL,
ReplayMetrics: metrics,
IndexFreeList: indexFreeList,
DataFreeList: dataFreeList,
}, nil