apache/druid · critical · RE
Failed to deserialize V%s column.
Error message
Failed to deserialize V%s column.
What it means
CompressedComplexColumnSupplier.read deserializes a compressed complex (nested/typed) column from a segment on disk. If reading the column data throws an IOException (truncated/corrupt file, IO error while inflating buffers), it is wrapped in this RE reporting the column format version (V3/V4). It indicates the segment column could not be loaded, not a bug in caller code.
Source
Thrown at processing/src/main/java/org/apache/druid/segment/serde/CompressedComplexColumnSupplier.java:93
mapper
);
if (metadata.hasNulls()) {
columnBuilder.setHasNulls(true);
final ByteBuffer nullIndexBuffer = NestedCommonFormatColumnPartSerde.loadInternalFile(
mapper,
metadata.getFileNameBase(),
ColumnSerializerUtils.NULL_BITMAP_FILE_NAME
);
nullValues = metadata.getBitmapSerdeFactory().getObjectStrategy().fromByteBufferWithSize(nullIndexBuffer);
} else {
nullValues = metadata.getBitmapSerdeFactory().getBitmapFactory().makeEmptyImmutableBitmap();
}
return new CompressedComplexColumnSupplier<>(typeName, objectStrategy, compressedColumnSupplier, nullValues);
}
catch (IOException ex) {
throw new RE(ex, "Failed to deserialize V%s column.", version);
}
}
throw new RE("Unknown version " + version);
}
private final String typeName;
private final ObjectStrategy<T> objectStrategy;
private final CompressedVariableSizedBlobColumnSupplier compressedColumnSupplier;
private final ImmutableBitmap nullValues;
private CompressedComplexColumnSupplier(
String typeName,
ObjectStrategy<T> objectStrategy,
CompressedVariableSizedBlobColumnSupplier compressedColumnSupplier,
ImmutableBitmap nullValues
)
{
this.typeName = typeName;View on GitHub (pinned to 9b90983fd2)
Solutions
- Re-download or re-copy the affected segment files from deep storage and reload the segment.
- Re-run the affected ingestion task or re-index the affected time chunk to regenerate the segment.
- Verify filesystem/deep-storage health (disk space, mount, permissions) for the segment's segmentDir.
- If reproducible on freshly generated segments, upgrade Druid/extension versions to match the segment writer's format.
Defensive patterns
Strategy: try-catch
Try / catch
try {
columnHolder = segmentStorageAdapter.getColumn("myCol");
} catch (RE e) {
if (e.getCause() instanceof IOException) {
log.warn("Segment %s unreadable, triggering reload", segmentId, e);
segmentManager.dropSegment(segmentId); // let deep-storage reload repair it
} else {
throw e;
}
} Prevention
- Monitor segment load errors on historicals and automate re-download of failed segments from deep storage.
- Avoid manual file copies of segment dirs; use Druid's segment load/unload APIs.
- Ensure deep storage and local disk health checks are in place.
When it happens
Trigger: Opening a segment whose compressed complex column file is truncated, corrupted, or on unreadable storage; IOException during GenericIndexed/CompressedVariableSizedBlobColumn deserialization inside read().
Common situations: Disk corruption or partial segment writes from a crashed historical; segment files truncated during deep-storage download or manual rsync/copy; NFS/HDFS transient IO failures; running a Druid version whose read path hits unexpectedly stored data.
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.
- Unrecognized multi-value flag[%d] for version[%s]
- Input stream is null
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/88f2e40b58c06101.
Report an issue: GitHub.