func()

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
			}
		}
	}
}