{"record":{"id":"dc3cb16d44675dca","repo":"apache/druid","slug":"could-not-find-interval-for-timestamp-s-dc3cb1","errorCode":null,"errorMessage":"Could not find interval for timestamp [%s]","messagePattern":"Could not find interval for timestamp \\[(.+?)\\]","errorType":"exception","errorClass":"ISE","httpStatus":null,"severity":"error","filePath":"indexing-service/src/main/java/org/apache/druid/indexing/common/task/LocalSegmentAllocator.java","lineNumber":64,"sourceCode":"class LocalSegmentAllocator implements SegmentAllocatorForBatch\n{\n  private final SegmentAllocator internalAllocator;\n  private final SequenceNameFunction sequenceNameFunction;\n\n  LocalSegmentAllocator(TaskToolbox toolbox, String taskId, String dataSource, GranularitySpec granularitySpec) throws IOException\n  {\n    final Map<Interval, String> intervalToVersion = toolbox\n        .getTaskActionClient()\n        .submit(new LockListAction())\n        .stream()\n        .collect(Collectors.toMap(TaskLock::getInterval, TaskLock::getVersion));\n    final Map<Interval, MutableInt> counters = Maps.newHashMapWithExpectedSize(intervalToVersion.size());\n\n    internalAllocator = (row, sequenceName, previousSegmentId, skipSegmentLineageCheck) -> {\n      final DateTime timestamp = row.getTimestamp();\n      Optional<Interval> maybeInterval = granularitySpec.bucketInterval(timestamp);\n      if (!maybeInterval.isPresent()) {\n        throw new ISE(\"Could not find interval for timestamp [%s]\", timestamp);\n      }\n\n      final Interval interval = maybeInterval.get();\n      final String version = intervalToVersion\n          .entrySet()\n          .stream()\n          .filter(entry -> entry.getKey().contains(interval))\n          .map(Entry::getValue)\n          .findFirst()\n          .orElseThrow(() -> new ISE(\"Cannot find a version for interval[%s]\", interval));\n\n      final int partitionId = counters.computeIfAbsent(interval, x -> new MutableInt()).getAndIncrement();\n      return new SegmentIdWithShardSpec(\n          dataSource,\n          interval,\n          version,\n          new BuildingNumberedShardSpec(partitionId)\n      );","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/indexing-service/src/main/java/org/apache/druid/indexing/common/task/LocalSegmentAllocator.java#L46-L82","documentation":"LocalSegmentAllocator assigns each ingested row to a segment bucket based on the granularitySpec's interval-to-version mapping. When a row's timestamp falls outside all configured bucket intervals, bucketInterval returns empty and the allocator throws instead of silently dropping the row.","triggerScenarios":"Ingesting (or replaying) a row whose timestamp is outside the intervals enumerated in intervalToVersion — typically a late-arriving row older than the task's covered window, or a future-dated row.","commonSituations":"Re-running/replaying an ingestion task for a fixed interval with source data containing rows outside that interval; late data beyond the configured windowPeriod; clock-skewed producer emitting future timestamps; missing shardSpecs for the row's interval.","solutions":["Widen the task's granularitySpec.intervals to include all expected timestamps","Increase windowPeriod to absorb late-arriving data, or pre-filter/transform out-of-window rows","Ensure shardSpecs cover every interval in the configured ranges when using a local allocator in tests/local runs"],"exampleFix":"// before\n\"granularitySpec\": {\"intervals\": [\"2024-01-01/2024-01-02\"], \"windowPeriod\": \"PT30M\"}\n// after\n\"granularitySpec\": {\"intervals\": [\"2023-12-31/2024-01-03\"], \"windowPeriod\": \"PT24H\"}","handlingStrategy":"validation","validationCode":"if (!intervals.stream().anyMatch(i -> i.contains(row.getTimestamp()))) { dropOrRoute(row); }","typeGuard":null,"tryCatchPattern":"try { allocator.allocate(row, seq, prevId, false); } catch (ISE e) { if (e.getMessage().startsWith(\"Could not find interval\")) { logAndSkip(e, row); } else { throw e; } }","preventionTips":["Set granularitySpec.intervals to fully cover source data time range","Increase windowPeriod for late-arriving data","Filter or clamp out-of-range timestamps in an ingestTransform"],"tags":["druid","segment-allocation","timestamps","ingestion"],"backgroundTag":"value-out-of-range","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}