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

  1. Pass a level no greater than the hashtree height
  2. Recompute height from the same tree instance used for the diff
  3. 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.