{"record":{"id":"1554b7bae85611c4","repo":"weaviate/weaviate","slug":"q-local-hashtree-level-d-wrote-d-digests-expe","errorCode":null,"errorMessage":"%q: local hashtree level %d wrote %d digests, expected %d","messagePattern":"%q: local hashtree level (.+?) wrote (.+?) digests, expected (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"usecases/replica/finder.go","lineNumber":407,"sourceCode":"\n\t\theight := ht.Height()\n\n\t\tdiscriminant := hashtree.NewBitset(1) // nodesAtLevel(0) = 1\n\t\tdiscriminant.Set(0)                   // seed at root\n\n\t\tvar leaf *hashtree.Bitset\n\n\t\tfor l := 0; l <= height; l++ {\n\t\t\tneed := discriminant.SetCount()\n\t\t\tdigests = hashtree.SizeDigests(digests, need)\n\n\t\t\tn, err := ht.Level(l, discriminant, digests)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"%q: %w\", targetNodeAddress, err)\n\t\t\t}\n\t\t\t// a short local write would leave stale digests from a previous level or target\n\t\t\tif n != need {\n\t\t\t\treturn nil, fmt.Errorf(\"%q: local hashtree level %d wrote %d digests, expected %d\",\n\t\t\t\t\ttargetNodeAddress, l, n, need)\n\t\t\t}\n\n\t\t\tlevelDigests, err := f.client.HashTreeLevel(ctx, targetNodeAddress, f.class, shardName, l, discriminant)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"%q: %w\", targetNodeAddress, err)\n\t\t\t}\n\t\t\t// anything but one digest per set bit reads as a failed target, never as convergence\n\t\t\tif len(levelDigests) != need {\n\t\t\t\treturn nil, fmt.Errorf(\"%q: hashtree level %d returned %d digests, expected %d\",\n\t\t\t\t\ttargetNodeAddress, l, len(levelDigests), need)\n\t\t\t}\n\n\t\t\tnextDiscriminant, levelDiffCount, err := hashtree.LevelDiff(l, height, discriminant, digests, levelDigests)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"%q: %w\", targetNodeAddress, err)\n\t\t\t}\n","sourceCodeStart":389,"sourceCodeEnd":425,"githubUrl":"https://github.com/weaviate/weaviate/blob/75aa4b6d11f8818305aafd4440b4e32794f7ca04/usecases/replica/finder.go#L389-L425","documentation":"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.","triggerScenarios":"Thrown at usecases/replica/finder.go:407 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check for hashtree corruption on the local shard; consider rebuilding the hashtree","Verify the discriminant bitset was sized consistently with the tree height","Retry the shard-difference collection after the shard reloads"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"75aa4b6d11f8818305aafd4440b4e32794f7ca04","analyzedAt":"2026-09-04T14:58:20.392Z","contentChangedAt":"2026-09-04T14:58:20.392Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}