mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-11-27 20:59:42 +08:00
added backward compatible CRC check and extra explanatory comments (#6233)
This commit is contained in:
parent
31d8907e77
commit
3003c9e17e
@ -74,7 +74,9 @@ func (n *Needle) ReadBytes(bytes []byte, offset int64, size Size, version Versio
|
|||||||
checksum := util.BytesToUint32(bytes[NeedleHeaderSize+size : NeedleHeaderSize+size+NeedleChecksumSize])
|
checksum := util.BytesToUint32(bytes[NeedleHeaderSize+size : NeedleHeaderSize+size+NeedleChecksumSize])
|
||||||
newChecksum := NewCRC(n.Data)
|
newChecksum := NewCRC(n.Data)
|
||||||
if checksum != newChecksum.Value() && checksum != uint32(newChecksum) {
|
if checksum != newChecksum.Value() && checksum != uint32(newChecksum) {
|
||||||
// the crc.Value() function is to be deprecated. this double checking is for backward compatible.
|
// 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()
|
stats.VolumeServerHandlerCounter.WithLabelValues(stats.ErrorCRC).Inc()
|
||||||
return errors.New("CRC error! Data On Disk Corrupted")
|
return errors.New("CRC error! Data On Disk Corrupted")
|
||||||
}
|
}
|
||||||
|
@ -164,7 +164,10 @@ func (v *Volume) readNeedleDataInto(n *needle.Needle, readOption *ReadOption, wr
|
|||||||
toWrite := min(count, int(offset+size-x))
|
toWrite := min(count, int(offset+size-x))
|
||||||
if toWrite > 0 {
|
if toWrite > 0 {
|
||||||
crc = crc.Update(buf[0:toWrite])
|
crc = crc.Update(buf[0:toWrite])
|
||||||
if offset == 0 && size == int64(n.DataSize) && int64(count) == size && (n.Checksum != crc) {
|
// 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.
|
||||||
|
if offset == 0 && size == int64(n.DataSize) && int64(count) == size && (n.Checksum != crc && uint32(n.Checksum) != crc.Value()) {
|
||||||
// This check works only if the buffer is big enough to hold the whole needle data
|
// This check works only if the buffer is big enough to hold the whole needle data
|
||||||
// and we ask for all needle data.
|
// and we ask for all needle data.
|
||||||
// Otherwise we cannot check the validity of partially aquired data.
|
// Otherwise we cannot check the validity of partially aquired data.
|
||||||
@ -187,7 +190,9 @@ func (v *Volume) readNeedleDataInto(n *needle.Needle, readOption *ReadOption, wr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if offset == 0 && size == int64(n.DataSize) && (n.Checksum != crc && uint32(n.Checksum) != crc.Value()) {
|
if offset == 0 && size == int64(n.DataSize) && (n.Checksum != crc && uint32(n.Checksum) != crc.Value()) {
|
||||||
// the crc.Value() function is to be deprecated. this double checking is for backward compatible.
|
// 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()
|
stats.VolumeServerHandlerCounter.WithLabelValues(stats.ErrorCRC).Inc()
|
||||||
return fmt.Errorf("ReadNeedleData checksum %v expected %v for Needle: %v,%v", crc, n.Checksum, v.Id, n)
|
return fmt.Errorf("ReadNeedleData checksum %v expected %v for Needle: %v,%v", crc, n.Checksum, v.Id, n)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user