You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							50 lines
						
					
					
						
							1.8 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							50 lines
						
					
					
						
							1.8 KiB
						
					
					
				| 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)) | |
| }
 |