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.
		
		
		
		
		
			
		
			
				
					
					
						
							29 lines
						
					
					
						
							996 B
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							29 lines
						
					
					
						
							996 B
						
					
					
				
								package idx
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/storage/types"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								// FirstInvalidIndex find the first index the failed lessThanOrEqualToFn function's requirement.
							 | 
						|
								func FirstInvalidIndex(bytes []byte, lessThanOrEqualToFn func(key types.NeedleId, offset types.Offset, size types.Size) (bool, error)) (int, error) {
							 | 
						|
									left, right := 0, len(bytes)/types.NeedleMapEntrySize-1
							 | 
						|
									index := right + 1
							 | 
						|
									for left <= right {
							 | 
						|
										mid := left + (right-left)>>1
							 | 
						|
										loc := mid * types.NeedleMapEntrySize
							 | 
						|
										key := types.BytesToNeedleId(bytes[loc : loc+types.NeedleIdSize])
							 | 
						|
										offset := types.BytesToOffset(bytes[loc+types.NeedleIdSize : loc+types.NeedleIdSize+types.OffsetSize])
							 | 
						|
										size := types.BytesToSize(bytes[loc+types.NeedleIdSize+types.OffsetSize : loc+types.NeedleIdSize+types.OffsetSize+types.SizeSize])
							 | 
						|
										res, err := lessThanOrEqualToFn(key, offset, size)
							 | 
						|
										if err != nil {
							 | 
						|
											return -1, err
							 | 
						|
										}
							 | 
						|
										if res {
							 | 
						|
											left = mid + 1
							 | 
						|
										} else {
							 | 
						|
											index = mid
							 | 
						|
											right = mid - 1
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return index, nil
							 | 
						|
								}
							 |