in file.go [597:638]
func readValidMeta(f vfs.File) (metaPage, int, reason) {
var pages [2]metaPage
var metaErr [2]reason
var metaActive int
var err reason
pages[0], err = readMeta(f, 0)
if err != nil {
return metaPage{}, -1, err
}
pages[1], err = readMeta(f, int64(pages[0].pageSize.Get()))
if err != nil {
return metaPage{}, -1, err
}
metaErr[0] = pages[0].Validate()
metaErr[1] = pages[1].Validate()
switch {
case metaErr[0] != nil && metaErr[1] != nil:
return metaPage{}, -1, metaErr[0]
case metaErr[0] == nil && metaErr[1] != nil:
metaActive = 0
case metaErr[0] != nil && metaErr[1] == nil:
metaActive = 1
default:
// both meta pages valid, choose page with highest transaction number
tx0 := pages[0].txid.Get()
tx1 := pages[1].txid.Get()
if tx0 == tx1 {
panic("meta pages with same transaction id")
}
if int64(tx0-tx1) > 0 { // if tx0 > tx1
metaActive = 0
} else {
metaActive = 1
}
}
return pages[metaActive], metaActive, nil
}