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

  1. Evict the corrupted segment from the local segment cache and let it re-download.
  2. Re-fetch the segment from deep storage and validate it (Druid segment metadata/checksums).
  3. Re-ingest the affected time chunks to rebuild columns.
  4. 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

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


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