apache/druid · error · IllegalStateException

Timeline segments with the same interval should have the sam

Error message

Timeline segments with the same interval should have the same version: existing version[%s] vs new segment[%s]

What it means

When building an in-memory timeline from explicitly provided segment IDs, DruidInputSource requires all segments covering the same interval to share the same version. A segment ID resolving to a different version for an existing interval throws IllegalStateException, because mixed-version chunks cannot form one timeline holder.

Source

Thrown at indexing-service/src/main/java/org/apache/druid/indexing/input/DruidInputSource.java:625

  public static List<TimelineObjectHolder<String, DataSegment>> getTimelineForSegmentIds(
      CoordinatorClient coordinatorClient,
      String dataSource,
      List<WindowedSegmentId> segmentIds
  )
  {
    final SortedMap<Interval, TimelineObjectHolder<String, DataSegment>> timeline = new TreeMap<>(
        Comparators.intervalsByStartThenEnd()
    );
    for (WindowedSegmentId windowedSegmentId : Preconditions.checkNotNull(segmentIds, "segmentIds")) {
      final DataSegment segment = FutureUtils.getUnchecked(
          coordinatorClient.fetchSegment(dataSource, windowedSegmentId.getSegmentId(), false),
          true
      );
      for (Interval interval : windowedSegmentId.getIntervals()) {
        final TimelineObjectHolder<String, DataSegment> existingHolder = timeline.get(interval);
        if (existingHolder != null) {
          if (!existingHolder.getVersion().equals(segment.getVersion())) {
            throw new ISE("Timeline segments with the same interval should have the same version: " +
                          "existing version[%s] vs new segment[%s]", existingHolder.getVersion(), segment);
          }
          existingHolder.getObject().add(segment.getShardSpec().createChunk(segment));
        } else {
          timeline.put(
              interval,
              new TimelineObjectHolder<>(
                  interval,
                  segment.getInterval(),
                  segment.getVersion(),
                  new PartitionHolder<>(segment.getShardSpec().createChunk(segment))
              )
          );
        }
      }
    }

    // Validate that none of the given windows overlaps (except for when multiple segments share exactly the

View on GitHub (pinned to 9b90983fd2)

Solutions

  1. Remove segment IDs of superseded (older) versions; keep only the latest version per interval.
  2. Regenerate the segment list from the current timeline/metadata so only winning versions are included.
  3. Switch to 'interval'-based selection so normal timeline overshadowing logic applies.

Example fix

// before
segments = ["ds_2020-01-01_2020-01-02_2020-01-03_v0_1", "ds_2020-01-01_2020-01-02_2020-01-03_v1_1"]
// after
segments = ["ds_2020-01-01_2020-01-02_2020-01-03_v1_1"]
Defensive patterns

Strategy: validation

Validate before calling

Map<Interval, String> versions = new HashMap<>();
for (String id : segmentIds) {
  DataSegment seg = loadSegment(id);
  String prev = versions.putIfAbsent(seg.getInterval(), seg.getVersion());
  if (prev != null && !prev.equals(seg.getVersion())) {
    throw new IllegalStateException("Mixed versions for " + seg.getInterval());
  }
}

Try / catch

try {
  List<DataSegment> timeline = inputSource.createTimeline();
} catch (IllegalStateException e) {
  // drop superseded-version segment ids and retry with latest versions only
}

Prevention

When it happens

Trigger: Passing a 'segments' list that mixes segment versions for the same interval — e.g. listing both an overshadowed older-version segment and its replacement with identical intervals.

Common situations: Hand-picking segment IDs from metadata after re-indexing/compaction and accidentally including superseded versions; stale segment lists captured before a compaction replaced versions.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


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