apache/druid · warning

Asked to remove timeline entry

Error message

Asked to remove timeline entry[interval: %s, version: %s] that doesn't exist

What it means

serverRemovedSegment removes the segment's partition from the VersionedIntervalTimeline; when the timeline lookup returns null (entry for that interval/version already absent), it logs this warning. The removal is a no-op and no serverSegmentRemoved callback fires.

Solutions

  1. Treat transient occurrences as benign noise; confirm they are not correlated with incorrect replica counts
  2. Ensure the segment add event was processed first (check server inventory sync logs)
  3. Check for double-registered server inventory views or replayed ZK watch events
  4. If persistent, restart the affected coordinator/broker to rebuild the timeline from scratch
Defensive patterns

Strategy: validation

Validate before calling

// only remove if the timeline still lists the segment
if (timeline.findEntry(segment.getInterval(), segment.getVersion()) == null) { skip(); }

Prevention

When it happens

Trigger: serverRemovedSegment called for a segment whose (interval, version) partition was already removed from the timeline, or never added, on this DruidServer.

Common situations: Duplicate removal events, out-of-order inventory updates during historical restart or coordinator failover, segments overshadowed and pruned before removal notification arrives.

Understand the failure class

Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.

Related errors


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

Appendix: source

Thrown at server/src/main/java/org/apache/druid/client/CoordinatorServerView.java:253

      if (segmentLoadInfo.removeServer(server)) {
        // server segment removed notification
        runTimelineCallbacks(callback -> callback.serverSegmentRemoved(server, segment));
      }

      if (segmentLoadInfo.isEmpty()) {
        VersionedIntervalTimeline<String, SegmentLoadInfo> timeline = timelines.get(segment.getDataSource());
        segmentLoadInfos.remove(segmentId);

        final PartitionChunk<SegmentLoadInfo> removedPartition = timeline.remove(
            segment.getInterval(), segment.getVersion(), segment.getShardSpec().createChunk(
                new SegmentLoadInfo(
                    segment
                )
            )
        );

        if (removedPartition == null) {
          log.warn(
              "Asked to remove timeline entry[interval: %s, version: %s] that doesn't exist",
              segment.getInterval(),
              segment.getVersion()
          );
        } else {
          // segment removed notification
          runTimelineCallbacks(callback -> callback.segmentRemoved(segment));
        }
      }
    }
  }

  public void registerTimelineCallback(final Executor exec, final TimelineCallback callback)
  {
    timelineCallbacks.put(callback, exec);
  }

  private void runTimelineCallbacks(final Function<TimelineCallback, ServerView.CallbackAction> function)

View on GitHub (pinned to 9b90983fd2)