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

  1. Re-download or re-copy the affected segment files from deep storage and reload the segment.
  2. Re-run the affected ingestion task or re-index the affected time chunk to regenerate the segment.
  3. Verify filesystem/deep-storage health (disk space, mount, permissions) for the segment's segmentDir.
  4. 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

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


AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07). Data as JSON: /api/errors/88f2e40b58c06101. Report an issue: GitHub.