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 theView on GitHub (pinned to 9b90983fd2)
Solutions
- Remove segment IDs of superseded (older) versions; keep only the latest version per interval.
- Regenerate the segment list from the current timeline/metadata so only winning versions are included.
- 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
- Derive segment ID lists from the current timeline, not stale snapshots.
- Exclude overshadowed (older-version) segments when enumerating IDs.
- Prefer 'interval' selection when version consistency cannot be guaranteed.
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
- Already started.
- Cannot execute query with orderBy %s
- written out already
- written out already
- written out already
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/feada387aadbe15a.
Report an issue: GitHub.