needle_read_tail.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package needle
  2. import (
  3. "errors"
  4. "github.com/seaweedfs/seaweedfs/weed/stats"
  5. . "github.com/seaweedfs/seaweedfs/weed/storage/types"
  6. "github.com/seaweedfs/seaweedfs/weed/util"
  7. )
  8. func (n *Needle) readNeedleTail(needleBody []byte, version Version) error {
  9. // for all versions, we need to read the checksum
  10. if len(n.Data) > 0 {
  11. expectedChecksum := CRC(util.BytesToUint32(needleBody[0:NeedleChecksumSize]))
  12. dataChecksum := NewCRC(n.Data)
  13. if expectedChecksum != dataChecksum {
  14. // the crc.Value() function is to be deprecated. this double checking is for backward compatibility
  15. // with seaweed version using crc.Value() instead of uint32(crc), which appears in commit 056c480eb
  16. // and switch appeared in version 3.09.
  17. stats.VolumeServerHandlerCounter.WithLabelValues(stats.ErrorCRC).Inc()
  18. return errors.New("CRC error! Data On Disk Corrupted")
  19. }
  20. n.Checksum = dataChecksum
  21. } else {
  22. // when data is skipped from reading, just read the checksum
  23. n.Checksum = CRC(util.BytesToUint32(needleBody[0:NeedleChecksumSize]))
  24. }
  25. if version == Version3 {
  26. tsOffset := NeedleChecksumSize
  27. n.AppendAtNs = util.BytesToUint64(needleBody[tsOffset : tsOffset+TimestampSize])
  28. }
  29. return nil
  30. }
  31. func PaddingLength(needleSize Size, version Version) Size {
  32. if version == Version3 {
  33. // this is same value as version2, but just listed here for clarity
  34. return NeedlePaddingSize - ((NeedleHeaderSize + needleSize + NeedleChecksumSize + TimestampSize) % NeedlePaddingSize)
  35. }
  36. return NeedlePaddingSize - ((NeedleHeaderSize + needleSize + NeedleChecksumSize) % NeedlePaddingSize)
  37. }
  38. func NeedleBodyLength(needleSize Size, version Version) int64 {
  39. if version == Version3 {
  40. return int64(needleSize) + NeedleChecksumSize + TimestampSize + int64(PaddingLength(needleSize, version))
  41. }
  42. return int64(needleSize) + NeedleChecksumSize + int64(PaddingLength(needleSize, version))
  43. }