130 lines
2.8 KiB
Go
130 lines
2.8 KiB
Go
package mdb
|
|
|
|
/*
|
|
func (db *Database) openSecondary() (err error) {
|
|
if db.shouldLoadFromPrimary() {
|
|
if err := db.loadFromPrimary(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
log.Printf("Opening page-file...")
|
|
|
|
pFile, err := openPageFileAndReplayWAL(db.rootDir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer pFile.Close()
|
|
|
|
pfHeader, err := pFile.ReadHeader()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
log.Printf("Building page-file index...")
|
|
|
|
pIndex, err := pagefile.NewIndex(pFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
tx := db.Snapshot()
|
|
tx.seqNum = pfHeader.SeqNum
|
|
tx.updatedAt = pfHeader.UpdatedAt
|
|
|
|
log.Printf("Loading data into memory...")
|
|
|
|
err = pFile.IterateAllocated(pIndex, func(cID, iID uint64, data []byte) error {
|
|
return db.loadItem(tx, cID, iID, data)
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
log.Printf("Creating writer...")
|
|
|
|
w, err := cswal.OpenWriter(db.walRootDir, &cswal.WriterConfig{
|
|
SegMinCount: db.conf.WALSegMinCount,
|
|
SegMaxAgeSec: db.conf.WALSegMaxAgeSec,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
db.done.Add(1)
|
|
go (&walFollower{
|
|
Stop: db.stop,
|
|
Done: db.done,
|
|
W: w,
|
|
Client: NewClient(db.conf.PrimaryURL, db.conf.ReplicationPSK, db.conf.NetTimeout),
|
|
}).Run()
|
|
|
|
db.done.Add(1)
|
|
go (&follower{
|
|
Stop: db.stop,
|
|
Done: db.done,
|
|
WALRootDir: db.walRootDir,
|
|
SeqNum: pfHeader.SeqNum,
|
|
ApplyChanges: db.applyChanges,
|
|
}).Run()
|
|
|
|
db.done.Add(1)
|
|
go (&fileWriter{
|
|
Stop: db.stop,
|
|
Done: db.done,
|
|
PageFilePath: db.pageFilePath,
|
|
WALRootDir: db.walRootDir,
|
|
}).Run()
|
|
|
|
return nil
|
|
}
|
|
|
|
func (db *Database) shouldLoadFromPrimary() bool {
|
|
if _, err := os.Stat(db.walRootDir); os.IsNotExist(err) {
|
|
log.Printf("WAL doesn't exist.")
|
|
return true
|
|
}
|
|
if _, err := os.Stat(db.pageFilePath); os.IsNotExist(err) {
|
|
log.Printf("Page-file doesn't exist.")
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (db *Database) loadFromPrimary() error {
|
|
client := NewClient(db.conf.PrimaryURL, db.conf.ReplicationPSK, db.conf.NetTimeout)
|
|
defer client.Disconnect()
|
|
|
|
log.Printf("Loading data from primary...")
|
|
|
|
if err := os.RemoveAll(db.pageFilePath); err != nil {
|
|
log.Printf("Failed to remove page-file: %s", err)
|
|
return errs.IO.WithErr(err) // Caller can retry.
|
|
}
|
|
|
|
if err := os.RemoveAll(db.walRootDir); err != nil {
|
|
log.Printf("Failed to remove WAL: %s", err)
|
|
return errs.IO.WithErr(err) // Caller can retry.
|
|
}
|
|
|
|
err := client.DownloadPageFile(db.pageFilePath+".tmp", db.pageFilePath)
|
|
if err != nil {
|
|
log.Printf("Failed to get page-file from primary: %s", err)
|
|
return err // Caller can retry.
|
|
}
|
|
|
|
pfHeader, err := pagefile.ReadHeader(db.pageFilePath)
|
|
if err != nil {
|
|
log.Printf("Failed to read page-file sequence number: %s", err)
|
|
return err // Caller can retry.
|
|
}
|
|
|
|
if err = cswal.CreateEx(db.walRootDir, pfHeader.SeqNum+1); err != nil {
|
|
log.Printf("Failed to initialize WAL: %s", err)
|
|
return err // Caller can retry.
|
|
}
|
|
|
|
return nil
|
|
}
|
|
*/
|