apache/druid · error · RE
Failed to deserialize V%s column.
Error message
Failed to deserialize V%s column.
What it means
NestedDataColumnSupplierV4.read() deserializes V4 nested columns, including loading the column metadata (logical type, byte order, bitmap serde) then the shared dictionary state. An IOException during this read is wrapped as RE 'Failed to deserialize V%s column.', meaning the V4 column bytes on disk could not be parsed.
Source
Thrown at processing/src/main/java/org/apache/druid/segment/nested/NestedDataColumnSupplierV4.java:212
version,
metadata.getFileNameBase(),
columnConfig,
fields,
fieldInfo,
compressedRawColumnSupplier,
nullValues,
stringDictionarySupplier,
longDictionarySupplier,
doubleDictionarySupplier,
arrayDictionarySupplier,
mapper,
NestedCommonFormatColumnFormatSpec.builder().setBitmapEncoding(metadata.getBitmapSerdeFactory()).build(),
metadata.getByteOrder(),
simpleType
);
}
catch (IOException ex) {
throw new RE(ex, "Failed to deserialize V%s column.", version);
}
} else {
throw new RE("Unknown version " + version);
}
}
private final byte version;
private final String columnName;
private final ColumnConfig columnConfig;
private final Supplier<? extends Indexed<ByteBuffer>> fieldsSupplier;
private final FieldTypeInfo fieldInfo;
private final CompressedVariableSizedBlobColumnSupplier compressedRawColumnSupplier;
private final ImmutableBitmap nullValues;
private final Supplier<? extends Indexed<ByteBuffer>> stringDictionarySupplier;
private final Supplier<FixedIndexed<Long>> longDictionarySupplier;
private final Supplier<FixedIndexed<Double>> doubleDictionarySupplier;
private final Supplier<FrontCodedIntArrayIndexed> arrayDictionarySupplier;
private final SegmentFileMapper fileMapper;View on GitHub (pinned to 9b90983fd2)
Solutions
- Evict the corrupted segment from the local segment cache and let it re-download.
- Re-fetch the segment from deep storage and validate it (Druid segment metadata/checksums).
- Re-ingest the affected time chunks to rebuild columns.
- Investigate disk/storage failures if corruption repeats.
Defensive patterns
Strategy: try-catch
Validate before calling
// confirm the V4 column blob exists and is not truncated before reading
if (columnFile.length() < expectedMinSize) { triggerResyncFromDeepStorage(); } Try / catch
try {
col = supplier.get();
} catch (RE e) {
if (e.getMessage().startsWith("Failed to deserialize")) {
log.error(e, "V4 column unreadable; evict and re-download segment %s", segmentId);
} throw e;
} Prevention
- Ensure deep-storage downloads complete atomically before swapping into cache
- Run disk health checks on historical nodes
- Keep consistent Druid versions across the cluster
When it happens
Trigger: Reading a V4 nested column file that is truncated, corrupted, or otherwise unreadable while reconstructing metadata, dictionaries, or bitmaps.
Common situations: Interrupted segment push or download leaving partial files; local segment cache corruption; deep-storage object truncated.
Understand the failure class
Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.
Related errors
- Failed to deserialize V%s column.
- Failed to deserialize V%s column.
- Failed to deserialize V%s column.
- Input stream is null
- File[%s] too large[%d]
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/cd883a7f8c6b1f61.
Report an issue: GitHub.