func readValidMeta()

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
}