{"record":{"id":"00586178c8c7ef45","repo":"apache/druid","slug":"invalid-table-size-s","errorCode":null,"errorMessage":"Invalid table size[%s]","messagePattern":"Invalid table size\\[(.+?)\\]","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/segment/data/TableLongEncodingReader.java","lineNumber":40,"sourceCode":"import org.apache.druid.java.util.common.IAE;\n\nimport java.nio.ByteBuffer;\n\npublic class TableLongEncodingReader implements CompressionFactory.LongEncodingReader\n{\n  private final long[] table;\n  private final int bitsPerValue;\n  private final ByteBuffer buffer;\n  private VSizeLongSerde.LongDeserializer deserializer;\n\n  public TableLongEncodingReader(ByteBuffer fromBuffer)\n  {\n    this.buffer = fromBuffer.asReadOnlyBuffer();\n    byte version = buffer.get();\n    if (version == CompressionFactory.TABLE_ENCODING_VERSION) {\n      int tableSize = buffer.getInt();\n      if (tableSize < 0 || tableSize > CompressionFactory.MAX_TABLE_SIZE) {\n        throw new IAE(\"Invalid table size[%s]\", tableSize);\n      }\n      bitsPerValue = VSizeLongSerde.getBitsForMax(tableSize);\n      table = new long[tableSize];\n      for (int i = 0; i < tableSize; i++) {\n        table[i] = buffer.getLong();\n      }\n      fromBuffer.position(buffer.position());\n      deserializer = VSizeLongSerde.getDeserializer(bitsPerValue, buffer, buffer.position());\n    } else {\n      throw new IAE(\"Unknown version[%s]\", version);\n    }\n  }\n\n  private TableLongEncodingReader(ByteBuffer buffer, long[] table, int bitsPerValue)\n  {\n    this.buffer = buffer;\n    this.table = table;\n    this.bitsPerValue = bitsPerValue;","sourceCodeStart":22,"sourceCodeEnd":58,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/segment/data/TableLongEncodingReader.java#L22-L58","documentation":"TableLongEncodingReader decodes a table-encoded long column from a ByteBuffer. The header's tableSize must be between 0 and CompressionFactory.MAX_TABLE_SIZE; anything else indicates corrupt or malformed segment data, so the constructor fails fast with this IAE instead of allocating an unbounded array.","triggerScenarios":"Reading a column whose serialized header contains a tableSize < 0 or > MAX_TABLE_SIZE, typically from a corrupted segment file, truncated/misaligned buffer, or data written by an incompatible writer.","commonSituations":"Segments corrupted on disk or in deep storage; hand-editing or mis-parsing column buffers; loading a foreign/garbage file as a Druid segment.","solutions":["Re-download / reload the affected segment (delete from segment cache so it is re-fetched)","Verify segment integrity and re-ingest the datasource if corruption persists","Check the buffer alignment/version of whatever produced the ByteBuffer being read","Confirm the writer and reader Druid versions are compatible"],"exampleFix":"// before\nColumnHolder holder = segmentLoader.getColumnator().read(file); // throws on corrupt segment\n// after\n// validate & re-fetch the segment:\nsegmentManager.dropSegment(descriptor);\n// then allow the loader to re-download a fresh copy before retrying reads","handlingStrategy":"try-catch","validationCode":"// validate the header before constructing:\nint tableSize = buf.duplicate().position(pos+1).getInt();\nif (tableSize < 0 || tableSize > CompressionFactory.MAX_TABLE_SIZE) { reloadSegment(); }","typeGuard":null,"tryCatchPattern":"try { new TableLongEncodingReader(buf); } catch (IAE e) { log.error(\"corrupt table-encoded column, reloading segment\"); reloadAndRetry(); }","preventionTips":["Verify segment checksums on download","Reload the segment cache entry on parse failure","Keep writer/reader Druid versions aligned"],"tags":["druid","segment","corruption"],"backgroundTag":"invalid-argument-value","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}