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))
							 | 
						|
								}
							 |