{"record":{"id":"f4065232c69cb11a","repo":"apache/druid","slug":"reset-with-skipped-offsets-is-not-supported-when-u","errorCode":null,"errorMessage":"Reset with skipped offsets is not supported when useEarliestOffset is true.","messagePattern":"Reset with skipped offsets is not supported when useEarliestOffset is true\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"indexing-service/src/main/java/org/apache/druid/indexing/overlord/supervisor/SupervisorManager.java","lineNumber":512,"sourceCode":"    SupervisorTaskAutoScaler autoscaler = autoscalers.get(id);\n    if (autoscaler != null) {\n      autoscaler.reset();\n    }\n\n    return ImmutableMap.of(\n        \"id\", id,\n        \"backfillSupervisorId\", backfillSupervisorId\n    );\n  }\n\n  private void validateResetAndBackfill(\n      String id,\n      SeekableStreamSupervisor streamSupervisor,\n      SeekableStreamSupervisorSpec streamSpec\n  )\n  {\n    if (streamSupervisor.getIoConfig().isUseEarliestSequenceNumber()) {\n      throw new IAE(\"Reset with skipped offsets is not supported when useEarliestOffset is true.\");\n    }\n\n    if (!specHasConcurrentLocks(streamSpec)) {\n      throw new IAE(\n          \"Backfill tasks require 'useConcurrentLocks' to be set to true in the supervisor context to allow concurrent writes with the main supervisor tasks\"\n      );\n    }\n\n    if (streamSupervisor.getState() != SupervisorStateManager.BasicState.RUNNING) {\n      throw new IAE(\"Supervisor[%s] must be in a RUNNING state to perform a reset and backfill\", id);\n    }\n  }\n\n  public boolean checkPointDataSourceMetadata(\n      String supervisorId,\n      int taskGroupId,\n      DataSourceMetadata previousDataSourceMetadata\n  )","sourceCodeStart":494,"sourceCodeEnd":530,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/indexing-service/src/main/java/org/apache/druid/indexing/overlord/supervisor/SupervisorManager.java#L494-L530","documentation":"SupervisorManager.validateResetAndBackfill rejects a reset-and-backfill request when the seekable stream supervisor is configured with useEarliestOffset=true. In that mode the supervisor already starts from the earliest available offsets, so an explicit reset that skips offsets is contradictory and unsupported. The check runs before any offsets are reset, so state is left unchanged.","triggerScenarios":"POST /druid/indexer/v1/supervisor/<id>/reset (with resetOffsetsAndBackfill-style API, resetToLatestAndBackfill path) on a supervisor whose ioConfig.useEarliestOffset is true.","commonSituations":"Operator created the supervisor with useEarliestOffset=true and later tries a reset-and-backfill to a specific offset; copy-pasted spec template with useEarliestOffset set; migration from an earlier behavior where the combination was tolerated.","solutions":["Set ioConfig.useEarliestOffset=false (suspend supervisor, update spec via POST /supervisor, resume) and retry the reset-and-backfill","Use the plain reset endpoint (which resets to earliest/latest per current config) instead of the skipped-offsets backfill flow","If earliest-data ingestion is what you want, drop the backfill request — data is already being read from earliest offsets"],"exampleFix":"// before\n{\"ioConfig\": {\"topic\": \"wiki\", \"useEarliestOffset\": true}}\n// after\n{\"ioConfig\": {\"topic\": \"wiki\", \"useEarliestOffset\": false}}\n// then: POST /druid/indexer/v1/supervisor/<id>/reset","handlingStrategy":"validation","validationCode":"const spec = await (await fetch(`${overlord}/druid/indexer/v1/supervisor/${id}`)).json();\nif (spec.spec.ioConfig.useEarliestOffset) throw new Error('reset-with-backfill unsupported while useEarliestOffset=true');","typeGuard":"function supportsResetBackfill(spec) { return spec?.spec?.ioConfig?.useEarliestOffset === false; }","tryCatchPattern":"try { await resetBackfill(id); } catch (e) { if (/useEarliestOffset is true/.test(e.message)) { updateSpecDisableEarliestOffset(id); } else throw e; }","preventionTips":["Decide early whether ingestion starts from earliest offsets or you need explicit reset control","Document that useEarliestOffset=true disables offset-skipping resets","Review spec templates for legacy flags"],"tags":["supervisor","kafka","configuration","druid-overlord"],"backgroundTag":"unsupported-operation","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"}