mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-11-08 16:14:46 +08:00
Some checks failed
go: build dev binaries / cleanup (push) Has been cancelled
docker: build dev containers / build-dev-containers (push) Has been cancelled
End to End / FUSE Mount (push) Has been cancelled
go: build binary / Build (push) Has been cancelled
Ceph S3 tests / Ceph S3 tests (push) Has been cancelled
go: build dev binaries / build_dev_linux_windows (amd64, linux) (push) Has been cancelled
go: build dev binaries / build_dev_linux_windows (amd64, windows) (push) Has been cancelled
go: build dev binaries / build_dev_darwin (amd64, darwin) (push) Has been cancelled
go: build dev binaries / build_dev_darwin (arm64, darwin) (push) Has been cancelled
30 lines
996 B
Go
30 lines
996 B
Go
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
|
|
}
|