volume: avoid file.stat(), file.seek() if possible during writes

This commit is contained in:
Chris Lu
2021-02-18 23:22:54 -08:00
parent 29575dadc5
commit c78409a598
2 changed files with 33 additions and 6 deletions

View File

@@ -41,6 +41,7 @@ type baseNeedleMapper struct {
indexFile *os.File
indexFileAccessLock sync.Mutex
indexFileOffset int64
}
func (nm *baseNeedleMapper) IndexFileSize() uint64 {
@@ -56,11 +57,18 @@ func (nm *baseNeedleMapper) appendToIndexFile(key NeedleId, offset Offset, size
nm.indexFileAccessLock.Lock()
defer nm.indexFileAccessLock.Unlock()
if _, err := nm.indexFile.Seek(0, 2); err != nil {
return fmt.Errorf("cannot seek end of indexfile %s: %v",
nm.indexFile.Name(), err)
if nm.indexFileOffset == 0 {
if fileSize, err := nm.indexFile.Seek(0, 2); err != nil {
return fmt.Errorf("cannot seek end of indexfile %s: %v",
nm.indexFile.Name(), err)
} else {
nm.indexFileOffset = fileSize
}
}
written, err := nm.indexFile.WriteAt(bytes, nm.indexFileOffset)
if err == nil {
nm.indexFileOffset += int64(written)
}
_, err := nm.indexFile.Write(bytes)
return err
}