wp
This commit is contained in:
@@ -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
|
||||
//}
|
||||
//}
|
||||
|
||||
Reference in New Issue
Block a user