weaviate/weaviate · error · ErrIllegalState
%w: level(%d) is too high for height(%d)
Error message
%w: level(%d) is too high for height(%d)
What it means
Returned by LevelDiff, wrapping ErrIllegalState, when the requested level exceeds the hashtree's height. The traversal is trying to read a level deeper than the tree has leaves, which indicates the caller's height math or the tree construction is inconsistent.
Source
Thrown at usecases/replica/hashtree/aggregated_hashtree.go:50
NewRangeReader(discriminant *Bitset) (AggregatedHashTreeRangeReader, error)
Serialize(w io.Writer) (n int64, err error)
}
type AggregatedHashTreeRangeReader interface {
Next() (uint64, uint64, error)
}
// LevelDiff compares level-l digests1 and digests2, clearing matched bits in
// discriminant. For l < height it returns a level-(l+1) discriminant with
// the children of mismatched nodes set; at l == height it returns nil.
func LevelDiff(l, height int, discriminant *Bitset, digests1, digests2 []Digest) (nextDiscriminant *Bitset, levelDiffCount int, err error) {
if l < 0 {
return nil, 0, fmt.Errorf("%w: invalid level(%d)", ErrIllegalArguments, l)
}
if l > height {
return nil, 0, fmt.Errorf("%w: level(%d) is too high for height(%d)", ErrIllegalState, l, height)
}
if discriminant == nil {
return nil, 0, fmt.Errorf("%w: nil discriminant provided", ErrIllegalArguments)
}
expected := nodesAtLevel(l)
if discriminant.Size() != expected {
return nil, 0, fmt.Errorf("%w: discriminant size %d, expected %d for level %d",
ErrIllegalArguments, discriminant.Size(), expected, l)
}
// digests1/digests2 hold one entry per set bit, not per Size().
setCount := discriminant.SetCount()
if len(digests1) < setCount || len(digests2) < setCount {
return nil, 0, fmt.Errorf("%w: digests slice too short for level %d (have %d/%d, need >= %d)",
ErrIllegalArguments, l, len(digests1), len(digests2), setCount)
}
View on GitHub (pinned to 75aa4b6d11)
Solutions
- Pass a level no greater than the hashtree height
- Recompute height from the same tree instance used for the diff
- Verify the tree was built with the capacity/height the caller assumes
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at usecases/replica/hashtree/aggregated_hashtree.go:50 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of weaviate/weaviate@75aa4b6d11 (2026-09-04).
Data as JSON: /api/errors/8257d32e94ed3948.
Report an issue: GitHub.