// flush flush writer buffer. func (b *SuperBlock) flush(force bool) (err error) { var ( fd uintptr offset int64 size int64 ) if b.write++; !force && b.write < b.conf.Block.SyncWrite { return } b.write = 0 offset = needle.BlockOffset(b.syncOffset) size = needle.BlockOffset(b.Offset - b.syncOffset) fd = b.w.Fd() if b.conf.Block.Syncfilerange { if err = myos.Syncfilerange(fd, offset, size, myos.SYNC_FILE_RANGE_WRITE); err != nil { log.Errorf("block: %s Syncfilerange() error(%v)", b.File, err) b.LastErr = err return } } else { if err = myos.Fdatasync(fd); err != nil { log.Errorf("block: %s Fdatasync() error(%v)", b.File, err) b.LastErr = err return } } if err = myos.Fadvise(fd, offset, size, myos.POSIX_FADV_DONTNEED); err == nil { b.syncOffset = b.Offset } else { log.Errorf("block: %s Fadvise() error(%v)", b.File, err) b.LastErr = err } return }
// flush the in-memory data flush to disk. func (i *Indexer) flush(force bool) (err error) { var ( fd uintptr offset int64 size int64 ) if i.write++; !force && i.write < i.conf.Index.SyncWrite { return } if _, err = i.f.Write(i.buf[:i.bn]); err != nil { i.LastErr = err log.Errorf("index: %s Write() error(%v)", i.File, err) return } i.Offset += int64(i.bn) i.bn = 0 i.write = 0 offset = i.syncOffset size = i.Offset - i.syncOffset fd = i.f.Fd() if i.conf.Index.Syncfilerange { if err = myos.Syncfilerange(fd, offset, size, myos.SYNC_FILE_RANGE_WRITE); err != nil { i.LastErr = err log.Errorf("index: %s Syncfilerange() error(%v)", i.File, err) return } } else { if err = myos.Fdatasync(fd); err != nil { i.LastErr = err log.Errorf("index: %s Fdatasync() error(%v)", i.File, err) return } } if err = myos.Fadvise(fd, offset, size, myos.POSIX_FADV_DONTNEED); err == nil { i.syncOffset = i.Offset } else { log.Errorf("index: %s Fadvise() error(%v)", i.File, err) i.LastErr = err } return }