| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- package needle
- import (
- "errors"
- "github.com/seaweedfs/seaweedfs/weed/stats"
- . "github.com/seaweedfs/seaweedfs/weed/storage/types"
- "github.com/seaweedfs/seaweedfs/weed/util"
- )
- func (n *Needle) readNeedleTail(needleBody []byte, version Version) error {
- // for all versions, we need to read the checksum
- if len(n.Data) > 0 {
- expectedChecksum := CRC(util.BytesToUint32(needleBody[0:NeedleChecksumSize]))
- dataChecksum := NewCRC(n.Data)
- if expectedChecksum != dataChecksum {
- // the crc.Value() function is to be deprecated. this double checking is for backward compatibility
- // with seaweed version using crc.Value() instead of uint32(crc), which appears in commit 056c480eb
- // and switch appeared in version 3.09.
- stats.VolumeServerHandlerCounter.WithLabelValues(stats.ErrorCRC).Inc()
- return errors.New("CRC error! Data On Disk Corrupted")
- }
- n.Checksum = dataChecksum
- } else {
- // when data is skipped from reading, just read the checksum
- n.Checksum = CRC(util.BytesToUint32(needleBody[0:NeedleChecksumSize]))
- }
- if version == Version3 {
- tsOffset := NeedleChecksumSize
- n.AppendAtNs = util.BytesToUint64(needleBody[tsOffset : tsOffset+TimestampSize])
- }
- return nil
- }
- func PaddingLength(needleSize Size, version Version) Size {
- if version == Version3 {
- // this is same value as version2, but just listed here for clarity
- return NeedlePaddingSize - ((NeedleHeaderSize + needleSize + NeedleChecksumSize + TimestampSize) % NeedlePaddingSize)
- }
- return NeedlePaddingSize - ((NeedleHeaderSize + needleSize + NeedleChecksumSize) % NeedlePaddingSize)
- }
- func NeedleBodyLength(needleSize Size, version Version) int64 {
- if version == Version3 {
- return int64(needleSize) + NeedleChecksumSize + TimestampSize + int64(PaddingLength(needleSize, version))
- }
- return int64(needleSize) + NeedleChecksumSize + int64(PaddingLength(needleSize, version))
- }
|