encoder.go 832 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package wal
  2. import (
  3. "bufio"
  4. "encoding/binary"
  5. "hash"
  6. "io"
  7. "github.com/coreos/etcd/crc"
  8. "github.com/coreos/etcd/wal/walpb"
  9. )
  10. type encoder struct {
  11. bw *bufio.Writer
  12. crc hash.Hash32
  13. }
  14. func newEncoder(w io.Writer, prevCrc uint32) *encoder {
  15. return &encoder{
  16. bw: bufio.NewWriter(w),
  17. crc: crc.New(prevCrc, crcTable),
  18. }
  19. }
  20. func (e *encoder) encode(rec *walpb.Record) error {
  21. e.crc.Write(rec.Data)
  22. rec.Crc = e.crc.Sum32()
  23. data, err := rec.Marshal()
  24. if err != nil {
  25. return err
  26. }
  27. if err := writeInt64(e.bw, int64(len(data))); err != nil {
  28. return err
  29. }
  30. _, err = e.bw.Write(data)
  31. return err
  32. }
  33. func (e *encoder) flush() error {
  34. return e.bw.Flush()
  35. }
  36. func (e *encoder) buffered() int {
  37. return e.bw.Buffered()
  38. }
  39. func writeInt64(w io.Writer, n int64) error {
  40. return binary.Write(w, binary.LittleEndian, n)
  41. }