This commit is contained in:
2026-06-14 07:57:01 +03:00
parent 685c48f94f
commit 181031a753
14 changed files with 626 additions and 591 deletions

View File

@@ -10,6 +10,7 @@ import (
"gordenko.dev/dima/qb"
"gordenko.dev/dima/qb/freelist"
"gordenko.dev/dima/qb/storage"
"gordenko.dev/dima/qb/worker"
)
// Result зберігає результати для обох типів файлів
@@ -110,7 +111,6 @@ func resolveRecoveryFiles(dir string) (_ RecoveryFiles, err error) {
}
type RecoveryReport struct {
//Metrics []
SnapshotNumber int
WAL string
IndexFreeList *freelist.FreeList
@@ -118,32 +118,38 @@ type RecoveryReport struct {
}
func Recovery(dir string, databaseName string) (_ RecoveryReport, err error) {
files, err := resolveRecoveryFiles(dir)
recoveryFiles, err := resolveRecoveryFiles(dir)
if err != nil {
return
}
var (
freeIndexPages []uint32
freeDataPages []uint32
frozenIndexPageCount int
frozenDataPageCount int
freeIndexPages []uint32
freeDataPages []uint32
metrics map[uint32]*storage.ReplayMetric
)
if files.Snapshot != "" {
var out storage.ReadSnapshotOut
out, err = storage.ReadSnapshot(files.Snapshot)
if recoveryFiles.Snapshot != "" {
var snapshot worker.ReadSnapshotOut
snapshot, err = worker.ReadSnapshot(recoveryFiles.Snapshot)
if err != nil {
return
}
//
freeIndexPages = out.IndexPageNumbers
freeDataPages = out.DataPageNumbers
frozenIndexPageCount = snapshot.FrozenIndexPagesCount
frozenDataPageCount = snapshot.FrozenDataPagesCount
freeIndexPages = snapshot.IndexPageNumbers
freeDataPages = snapshot.DataPageNumbers
metrics = snapshot.Metrics
}
if files.WAL != "" {
if recoveryFiles.WAL != "" {
var (
walReader *storage.WALReader
walReplayer *storage.WALReplayer
)
walReader, err = storage.NewWALReader(storage.WALReaderOptions{
//FileName: JoinWALFileName(s.dir, files.WAL),
FileName: recoveryFiles.WAL,
BufferSize: 8 * 1024 * 1024,
})
if err != nil {
@@ -152,7 +158,7 @@ func Recovery(dir string, databaseName string) (_ RecoveryReport, err error) {
walReplayer, err = storage.NewWALReplayer(storage.WALReplayerOptions{
WALReader: walReader,
Metrics: snapshot.Metrics,
Metrics: metrics,
FreeIndexPages: freeIndexPages,
FreeDataPages: freeDataPages,
})
@@ -170,7 +176,7 @@ func Recovery(dir string, databaseName string) (_ RecoveryReport, err error) {
if err != nil {
return
}
err = storage.WriteDataPages(dataFile, walReplayer.DataPages())
err = storage.WriteDataPages(dataFile, walReplayer.DataPagesToRewrite())
if err != nil {
return
}
@@ -183,7 +189,7 @@ func Recovery(dir string, databaseName string) (_ RecoveryReport, err error) {
if err != nil {
return
}
err = storage.WriteIndexPages(indexFile, walReplayer.IndexPages())
err = storage.WriteIndexPages(indexFile, walReplayer.IndexPagesToRewrite())
if err != nil {
return
}
@@ -191,31 +197,31 @@ func Recovery(dir string, databaseName string) (_ RecoveryReport, err error) {
if err != nil {
return
}
freeIndexPages = walReplayer.FreeIndexPages()
freeDataPages = walReplayer.FreeDataPages()
}
indexFreeList, err := freelist.New(freelist.Options{
PageSize: 2048,
BaseFilePath: filepath.Join(dir, databaseName+".free_index"),
DeltaFilePath: filepath.Join(dir, databaseName+".free_index_delta"),
PageSize: 2048,
BaseFilePath: qb.GetIndexFreeListFilePath(dir, databaseName),
DeltaFilePath: qb.GetIndexFreeListDeltaFilePath(dir, databaseName),
FrozenPageCount: frozenIndexPageCount,
})
indexFreeList.AddPageNumbers(freeIndexPages)
// FIX free pages sync
dataFreeList, err := freelist.New(freelist.Options{
PageSize: 2048,
BaseFilePath: filepath.Join(dir, databaseName+".free_data"),
DeltaFilePath: filepath.Join(dir, databaseName+".free_data_delta"),
PageSize: 2048,
BaseFilePath: qb.GetDataFreeListFilePath(dir, databaseName),
DeltaFilePath: qb.GetDataFreeListDeltaFilePath(dir, databaseName),
FrozenPageCount: frozenDataPageCount,
})
dataFreeList.AddPageNumbers(freeDataPages)
return RecoveryReport{
SnapshotNumber: files.SnapshotNumber,
WAL: files.WAL,
SnapshotNumber: recoveryFiles.SnapshotNumber,
WAL: recoveryFiles.WAL,
IndexFreeList: indexFreeList,
DataFreeList: dataFreeList,
}, nil
}
//func (s *Database) relayMetricsToMetrics(replayMetrics map[uint32]*ReplayMetric) {
//for metricID, x := range replayMetrics {
//s.metrics[metricID] = x.ToMetric() FIX
//}
//}