create an index for the log file

pull/269/head
John Shahid 2014-02-13 13:19:24 -05:00
parent 7605782bac
commit 0a5fd2c829
1 changed files with 53 additions and 0 deletions

53
src/wal/index.go Normal file
View File

@ -0,0 +1,53 @@
package wal
import (
"sort"
)
type indexEntry struct {
startRequestNumber uint32 // first request number in the block
size uint32 // number of requests in the block
startOffset uint64 // the offset of the first request
}
type index struct {
entries []*indexEntry
}
func (self *index) addEntry(entry *indexEntry) {
self.entries = append(self.entries, entry)
}
func (self *index) findOffsetBlock(requestNumber uint32) func(int) bool {
return func(i int) bool {
// The returned function must satisfy `f(i) => f(i+1)`, meaning if
// for index i f returns true, then it must return true for every
// index greater than i. sort.Search will return the smallest
// index satisfying f
if self.entries[i].startRequestNumber > requestNumber {
return true
}
return false
}
}
func (self *index) requestOffset(requestNumber uint32) uint64 {
numberOfEntries := len(self.entries)
index := sort.Search(numberOfEntries, self.findOffsetBlock(requestNumber))
if index != numberOfEntries {
return self.entries[index-1].startOffset
}
if requestNumber >= self.entries[0].startRequestNumber {
return self.entries[0].startOffset
}
lastEntry := self.entries[len(self.entries)-1]
lastRequestNumber := lastEntry.startRequestNumber + lastEntry.size
if requestNumber > lastRequestNumber {
return lastEntry.startOffset
}
return 0
}