weaviate/weaviate · error

%q: local hashtree level %d wrote %d digests, expected %d

Error message

%q: local hashtree level %d wrote %d digests, expected %d

What it means

Thrown during hashtree level traversal when the local hashtree's Level() call writes fewer digests into the buffer than the discriminant's set-bit count demands. A short write would leave stale digests from a previous level or target in the reused buffer, corrupting the comparison, so it is treated as an internal invariant violation.

Source

Thrown at usecases/replica/finder.go:407

		height := ht.Height()

		discriminant := hashtree.NewBitset(1) // nodesAtLevel(0) = 1
		discriminant.Set(0)                   // seed at root

		var leaf *hashtree.Bitset

		for l := 0; l <= height; l++ {
			need := discriminant.SetCount()
			digests = hashtree.SizeDigests(digests, need)

			n, err := ht.Level(l, discriminant, digests)
			if err != nil {
				return nil, fmt.Errorf("%q: %w", targetNodeAddress, err)
			}
			// a short local write would leave stale digests from a previous level or target
			if n != need {
				return nil, fmt.Errorf("%q: local hashtree level %d wrote %d digests, expected %d",
					targetNodeAddress, l, n, need)
			}

			levelDigests, err := f.client.HashTreeLevel(ctx, targetNodeAddress, f.class, shardName, l, discriminant)
			if err != nil {
				return nil, fmt.Errorf("%q: %w", targetNodeAddress, err)
			}
			// anything but one digest per set bit reads as a failed target, never as convergence
			if len(levelDigests) != need {
				return nil, fmt.Errorf("%q: hashtree level %d returned %d digests, expected %d",
					targetNodeAddress, l, len(levelDigests), need)
			}

			nextDiscriminant, levelDiffCount, err := hashtree.LevelDiff(l, height, discriminant, digests, levelDigests)
			if err != nil {
				return nil, fmt.Errorf("%q: %w", targetNodeAddress, err)
			}

View on GitHub (pinned to 75aa4b6d11)

Solutions

  1. Check for hashtree corruption on the local shard; consider rebuilding the hashtree
  2. Verify the discriminant bitset was sized consistently with the tree height
  3. Retry the shard-difference collection after the shard reloads
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at usecases/replica/finder.go:407 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/1554b7bae85611c4. Report an issue: GitHub.