1
0
mirror of https://github.com/taigrr/bitcask synced 2025-01-18 04:03:17 -08:00

Improved read/write performance by another ~2x by not calling Stat() on every read/write

This commit is contained in:
James Mills
2019-03-16 08:15:07 +10:00
parent 2585222830
commit c0f178c4f7
3 changed files with 54 additions and 65 deletions

View File

@@ -28,28 +28,29 @@ type Encoder struct {
// Encode takes any proto.Message and streams it to the underlying writer.
// Messages are framed with a length prefix.
func (e *Encoder) Encode(msg proto.Message) error {
func (e *Encoder) Encode(msg proto.Message) (int64, error) {
prefixBuf := make([]byte, prefixSize)
buf, err := proto.Marshal(msg)
if err != nil {
return err
return 0, err
}
binary.BigEndian.PutUint64(prefixBuf, uint64(len(buf)))
if _, err := e.w.Write(prefixBuf); err != nil {
return errors.Wrap(err, "failed writing length prefix")
return 0, errors.Wrap(err, "failed writing length prefix")
}
if _, err = e.w.Write(buf); err != nil {
return errors.Wrap(err, "failed writing marshaled data")
n, err := e.w.Write(buf)
if err != nil {
return 0, errors.Wrap(err, "failed writing marshaled data")
}
if err = e.w.Flush(); err != nil {
return errors.Wrap(err, "failed flushing data")
return 0, errors.Wrap(err, "failed flushing data")
}
return nil
return int64(n + prefixSize), nil
}
// NewDecoder creates a streaming protobuf decoder.