{"record":{"id":"7932427f85d62db6","repo":"apache/druid","slug":"row-number-mismatch-d-vs-d","errorCode":null,"errorMessage":"Row number mismatch: [%d] vs [%d]","messagePattern":"Row number mismatch: \\[(.+?)\\] vs \\[(.+?)\\]","errorType":"validation","errorClass":"SegmentValidationException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/segment/IndexIO.java","lineNumber":188,"sourceCode":"      final Set<String> metNames2 = Sets.newHashSet(adapter2.getMetricNames());\n      if (!metNames1.equals(metNames2)) {\n        throw new SegmentValidationException(\"Metric names differ. Expected [%s] found [%s]\", metNames1, metNames2);\n      }\n    }\n    try (\n        final RowIterator it1 = adapter1.getRows();\n        final RowIterator it2 = adapter2.getRows()\n    ) {\n      long row = 0L;\n      while (it1.moveToNext()) {\n        if (!it2.moveToNext()) {\n          throw new SegmentValidationException(\"Unexpected end of second adapter\");\n        }\n        final RowPointer rp1 = it1.getPointer();\n        final RowPointer rp2 = it2.getPointer();\n        ++row;\n        if (rp1.getRowNum() != rp2.getRowNum()) {\n          throw new SegmentValidationException(\"Row number mismatch: [%d] vs [%d]\", rp1.getRowNum(), rp2.getRowNum());\n        }\n        try {\n          validateRowValues(rp1, adapter1, rp2, adapter2);\n        }\n        catch (SegmentValidationException ex) {\n          throw new SegmentValidationException(ex, \"Validation failure on row %d: [%s] vs [%s]\", row, rp1, rp2);\n        }\n      }\n      if (it2.moveToNext()) {\n        throw new SegmentValidationException(\"Unexpected end of first adapter\");\n      }\n      if (row != adapter1.getNumRows()) {\n        throw new SegmentValidationException(\n            \"Actual Row count mismatch. Expected [%d] found [%d]\",\n            row,\n            adapter1.getNumRows()\n        );\n      }","sourceCodeStart":170,"sourceCodeEnd":206,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/segment/IndexIO.java#L170-L206","documentation":"While walking rows in lockstep, validateTwoSegments checks that corresponding rows have identical row numbers (getRowNum()). This SegmentValidationException is thrown when the two adapters' row pointers diverge in position, meaning row alignment between the segments broke.","triggerScenarios":"rp1.getRowNum() != rp2.getRowNum() during the parallel iteration — the second adapter skipped or duplicated a row even though total counts matched.","commonSituations":"A custom or third-party IndexableAdapter yielding rows out of order; segment rewrite tools reordering rows differently; corrupted dimension dictionaries causing row-pointer misalignment.","solutions":["Inspect the two row numbers in the message to find where alignment diverges.","If a custom adapter is used, fix its row ordering/numbering so rows are yielded in index order with matching rowNum.","Rebuild the suspect segment from source data, then re-validate.","Compare the segments' dimension value ordering (dictionary order affects row layout) if a converter produced them."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  io.validateTwoSegments(adapter1, adapter2);\n} catch (SegmentValidationException e) {\n  if (e.getMessage().startsWith(\"Row number mismatch\")) {\n    log.error(\"Row alignment broke between adapters: %s\", e.getMessage());\n  }\n  throw e;\n}","preventionTips":["Ensure custom IndexableAdapter implementations yield rows in strict index order with correct rowNum.","Do not reorder rows when rewriting segments intended for equivalence validation.","Test custom adapters against validateTwoSegments with a known-good segment.","Rebuild segments from source when row-order inconsistencies appear."],"tags":["segment-validation","row-alignment"],"backgroundTag":"internal-invariant-violation","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}