force index creation on close

pull/269/head
John Shahid 2014-02-13 16:20:28 -05:00
parent 68e73e983e
commit 4e62287ac9
1 changed files with 15 additions and 0 deletions

View File

@ -37,6 +37,7 @@ func newLog(file *os.File, indexBlockSize, flushSize, bookmarkSize int) (*log, e
l := &log{ l := &log{
entries: make(chan *entry, 10), entries: make(chan *entry, 10),
bookmarkChan: make(chan *bookmarkEvent), bookmarkChan: make(chan *bookmarkEvent),
indexChan: make(chan struct{}),
file: file, file: file,
state: newState(), state: newState(),
fileSize: size, fileSize: size,
@ -54,6 +55,12 @@ func newLog(file *os.File, indexBlockSize, flushSize, bookmarkSize int) (*log, e
} }
func (self *log) internalIndex() error { func (self *log) internalIndex() error {
// don't do anything if the number of requests writtern since the
// last index update is 0
if self.state.RequestsSinceLastIndex == 0 {
return nil
}
startRequestNumber := self.state.CurrentRequestNumber - uint32(self.state.RequestsSinceLastIndex) startRequestNumber := self.state.CurrentRequestNumber - uint32(self.state.RequestsSinceLastIndex)
logger.Info("Creating new index entry [%d,%d]", startRequestNumber, self.state.RequestsSinceLastBookmark) logger.Info("Creating new index entry [%d,%d]", startRequestNumber, self.state.RequestsSinceLastBookmark)
self.state.Index.addEntry(startRequestNumber, self.state.RequestsSinceLastIndex, self.fileSize) self.state.Index.addEntry(startRequestNumber, self.state.RequestsSinceLastIndex, self.fileSize)
@ -77,6 +84,7 @@ func (self *log) closeWithoutBookmark() error {
} }
func (self *log) close() error { func (self *log) close() error {
self.forceIndex()
self.forceBookmark(true) self.forceBookmark(true)
self.internalFlush() self.internalFlush()
return self.file.Close() return self.file.Close()
@ -158,6 +166,8 @@ func (self *log) processEntries() {
select { select {
case x := <-self.entries: case x := <-self.entries:
self.internalAppendRequest(x) self.internalAppendRequest(x)
case _ = <-self.indexChan:
self.internalIndex()
case x := <-self.bookmarkChan: case x := <-self.bookmarkChan:
err := self.internalFlush() err := self.internalFlush()
// only if we could flush successfully create a bookmark // only if we could flush successfully create a bookmark
@ -341,6 +351,11 @@ func (self *log) forceBookmark(shutdown bool) error {
return confirmation.err return confirmation.err
} }
func (self *log) forceIndex() error {
self.indexChan <- struct{}{}
return nil
}
func (self *log) internalBookmark() error { func (self *log) internalBookmark() error {
logger.Info("Creating bookmark at file offset %d", self.fileSize) logger.Info("Creating bookmark at file offset %d", self.fileSize)
dir := filepath.Dir(self.file.Name()) dir := filepath.Dir(self.file.Name())