in write.go [147:199]
func (w *writer) Run() (bool, reason) {
var (
err reason
done bool
cmd command
buf [1024]writeMsg
)
for {
cmd, done = w.nextCommand(buf[:])
if done {
return done, nil
}
traceln("writer message: ", cmd.n, cmd.fsync != nil, done)
// TODO: use vector IO if possible (linux: pwritev)
msgs := buf[:cmd.n]
sort.Slice(msgs, func(i, j int) bool {
return msgs[i].id < msgs[j].id
})
for _, msg := range msgs {
const op = "txfile/write-page"
if err == nil {
// execute actual write on the page it's file offset:
off := uint64(msg.id) * uint64(w.pageSize)
tracef("write at(id=%v, off=%v, len=%v)\n", msg.id, off, len(msg.buf))
err = writeAt(op, w.target, msg.buf, int64(off))
}
msg.sync.err = err
msg.sync.Release()
}
// execute pending fsync:
if fsync := cmd.fsync; fsync != nil {
if err == nil {
err = w.execSync(cmd)
}
fsync.err = err
traceln("done fsync")
fsync.Release()
resetErr := cmd.syncFlags.Test(syncResetErr)
if resetErr {
err = nil
}
}
}
}