{"record":{"id":"f553a73d08fd2353","repo":"weaviate/weaviate","slug":"write-individual-node-res2-primarykey-smaller","errorCode":null,"errorMessage":"write individual node (res2.primaryKey smaller): %w","messagePattern":"write individual node \\(res2\\.primaryKey smaller\\): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"adapters/repos/db/lsmkv/compactor_replace.go","lineNumber":230,"sourceCode":"\t\t\tif !(c.cleanupTombstones && errors.Is(err1, lsmkv.Deleted)) {\n\t\t\t\tki, err := c.writeIndividualNode(f, offset, res1.primaryKey, res1.value,\n\t\t\t\t\tres1.secondaryKeys, errors.Is(err1, lsmkv.Deleted))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"write individual node (res1.primaryKey smaller): %w\", err)\n\t\t\t\t}\n\n\t\t\t\toffset = ki.ValueEnd\n\t\t\t\tc.accumulateIndexSizes(ki)\n\t\t\t\tkis = append(kis, ki)\n\t\t\t}\n\t\t\tres1, err1 = c.c1.next()\n\t\t} else {\n\t\t\t// key 2 is smaller\n\t\t\tif !(c.cleanupTombstones && errors.Is(err2, lsmkv.Deleted)) {\n\t\t\t\tki, err := c.writeIndividualNode(f, offset, res2.primaryKey, res2.value,\n\t\t\t\t\tres2.secondaryKeys, errors.Is(err2, lsmkv.Deleted))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"write individual node (res2.primaryKey smaller): %w\", err)\n\t\t\t\t}\n\n\t\t\t\toffset = ki.ValueEnd\n\t\t\t\tc.accumulateIndexSizes(ki)\n\t\t\t\tkis = append(kis, ki)\n\t\t\t}\n\t\t\tres2, err2 = c.c2.next()\n\t\t}\n\t}\n\n\treturn kis, nil\n}\n\n// TREE_KEY_STORE_OVERHEAD + len(key) is the overhead of storing a key in the index:\n//   - 4 bytes for the length of the key\n//   - len(key) bytes for the key itself\n//   - 8 bytes for the node start pos (points to matching file offset in the Strategy specific data structure)\n//   - 8 bytes for the node end pos (points to matching file offset in the Strategy specific data structure)","sourceCodeStart":212,"sourceCodeEnd":248,"githubUrl":"https://github.com/weaviate/weaviate/blob/75aa4b6d11f8818305aafd4440b4e32794f7ca04/adapters/repos/db/lsmkv/compactor_replace.go#L212-L248","documentation":"Symmetric counterpart of the res1-smaller case: when segment 2's key is the smaller one, res2's node is written via writeIndividualNode (skipped if tombstone-cleanup applies and err2 is Deleted). This error wraps any failure of that node write — I/O error on the buffered writer, value transformation failure, or secondary-index write failure.","triggerScenarios":"Segment 2 holds the smallest current key and writeIndividualNode fails: disk full/EIO, valueTransformer error on the live value, or secondary index serialization error.","commonSituations":"Disk exhaustion during compaction; storage device failure; transformer incompatibility with values written by an older segment version.","solutions":["Check the wrapped cause and address it (ENOSPC -> expand disk; transform error -> inspect values).","Re-trigger compaction after fixing storage.","Rebuild the bucket from backup if the same segment repeatedly fails.","File a bug with logs if transformation fails on regular values."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err := bucket.Compact(ctx); err != nil {\n\tif strings.Contains(err.Error(), \"write individual node\") {\n\t\t// resolve underlying cause (disk/transform) then re-trigger\n\t\tscheduleCompactionRetry(bucket)\n\t}\n}","preventionTips":["Provision disk headroom for compaction (up to ~2x segment size).","Back up buckets before changing compression settings.","Monitor for I/O errors in system logs during compactions.","Verify transformer compatibility across all segment versions in an upgrade."],"tags":["lsmkv","compaction","io"],"backgroundTag":"segment-write-failure","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"}