apache/druid · error · org.apache.druid.java.util.common.RE
Unknown version
Error message
Unknown version
What it means
ScalarStringColumnAndIndexSupplier.read() supports only the nested string-column versions it implements (V1). A version byte in the segment that matches none of them triggers this generic String throw, since the reader cannot interpret the unknown on-disk layout.
Solutions
- Upgrade the reading Druid processes to a version that supports the segment's column format
- Rebuild the segment by re-ingesting or re-compacting the affected data with the current Druid version
- Replace the segment with an intact replica if the version byte appears corrupted
- Keep writer and reader druid-processing versions consistent across the cluster
Defensive patterns
Strategy: try-catch
Validate before calling
// Gate segment loading on writer-version compatibility metadata
if (compareVersions(segmentMetadata.getVersion(), maxSupportedReaderVersion) > 0) {
throw new IllegalStateException("Refusing to load segment " + segmentId
+ ": writer version " + segmentMetadata.getVersion() + " unsupported by reader");
} Try / catch
try {
// load segment / nested string column
} catch (RuntimeException e) {
if (e.getMessage() != null && e.getMessage().startsWith("Unknown version")) {
LOG.warn(e, "Unknown column version in %s; scheduling re-ingest", segmentId);
coordinatorClient.requestReingest(segmentId);
} else {
throw e;
}
} Prevention
- Run rolling upgrades reader-first: upgrade historicals/brokers before middle managers
- Never run a downgraded reader against segments written after the upgrade without re-ingesting
- Add automated checks comparing segment writer versions with cluster reader versions at load time
- Alert on version-mismatch log lines to catch skew before it reaches user queries
When it happens
Trigger: Reading a segment whose nested string column version byte is newer than the running Druid supports, or a corrupted file whose version byte is invalid (e.g. wrong file boundary/truncation landing on the wrong offset).
Common situations: Version skew in rolling upgrades (segments written by newer historicals, read by older ones); downgrades that leave behind segments in a newer format; corrupt segment files served from cache.
Related errors
- Unknown version
- Unknown version
- Failed to deserialize V
- Failed to deserialize V
- Dictionary not serialized, cannot open value serializer
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/6451f50efff152f6.
Report an issue: GitHub.
Appendix: source
Thrown at processing/src/main/java/org/apache/druid/segment/nested/ScalarStringColumnAndIndexSupplier.java:112
ColumnSerializerUtils.BITMAP_INDEX_FILE_NAME
);
GenericIndexed<ImmutableBitmap> valueIndexes = GenericIndexed.read(
valueIndexBuffer,
bitmapSerdeFactory.getObjectStrategy(),
columnBuilder.getFileMapper()
);
return new ScalarStringColumnAndIndexSupplier(
dictionarySupplier,
ints,
valueIndexes,
bitmapSerdeFactory
);
}
catch (IOException ex) {
throw new RE(ex, "Failed to deserialize V%s column.", version);
}
} else {
throw new RE("Unknown version " + version);
}
}
private final Supplier<? extends Indexed<ByteBuffer>> dictionarySupplier;
private final Supplier<ColumnarInts> encodedColumnSupplier;
private final GenericIndexed<ImmutableBitmap> valueIndexes;
private final ColumnIndexSupplier stringIndexSupplier;
private final BitmapSerdeFactory serdeFactory;
private ScalarStringColumnAndIndexSupplier(
Supplier<? extends Indexed<ByteBuffer>> dictionarySupplier,
Supplier<ColumnarInts> encodedColumnSupplier,
GenericIndexed<ImmutableBitmap> valueIndexes,
BitmapSerdeFactory serdeFactory
)
{
this.dictionarySupplier = dictionarySupplier;View on GitHub (pinned to 9b90983fd2)