{"record":{"id":"d11ade865a397e1b","repo":"apache/druid","slug":"cannot-find-kernel-corresponding-to-stage-s-in","errorCode":null,"errorMessage":"Cannot find kernel corresponding to stage [%s] in query [%s]","messagePattern":"Cannot find kernel corresponding to stage \\[(.+?)\\] in query \\[(.+?)\\]","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"multi-stage-query/src/main/java/org/apache/druid/msq/kernel/controller/ControllerQueryKernel.java","lineNumber":702,"sourceCode":"  public IntSet getAllParticipatingWorkers()\n  {\n    final IntSet retVal = new IntAVLTreeSet();\n\n    for (final ControllerStageTracker tracker : stageTrackers.values()) {\n      retVal.addAll(tracker.getWorkerInputs().workers());\n    }\n\n    return retVal;\n  }\n\n  /**\n   * Fetches and returns the stage kernel corresponding to the provided stage id, else throws {@link IAE}\n   */\n  private ControllerStageTracker getStageTrackerOrThrow(StageId stageId)\n  {\n    ControllerStageTracker stageTracker = stageTrackers.get(stageId);\n    if (stageTracker == null) {\n      throw new IAE(\"Cannot find kernel corresponding to stage [%s] in query [%s]\", stageId, queryDef.getQueryId());\n    }\n    return stageTracker;\n  }\n\n  private WorkOrder getWorkOrder(int workerNumber, StageId stageId)\n  {\n    Int2ObjectMap<WorkOrder> stageWorkOrder = stageWorkOrders.get(stageId);\n\n    if (stageWorkOrder == null) {\n      throw new ISE(\"Stage[%d] work orders not found\", stageId.getStageNumber());\n    }\n\n    WorkOrder workOrder = stageWorkOrder.get(workerNumber);\n    if (workOrder == null) {\n      throw new ISE(\"Work order for worker[%d] not found for stage[%d]\", workerNumber, stageId.getStageNumber());\n    }\n    return workOrder;\n  }","sourceCodeStart":684,"sourceCodeEnd":720,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/multi-stage-query/src/main/java/org/apache/druid/msq/kernel/controller/ControllerQueryKernel.java#L684-L720","documentation":"Thrown by ControllerQueryKernel.getStageTrackerOrThrow as an IllegalArgumentException when stageTrackers has no ControllerStageTracker for the requested StageId. The trackers are fixed at kernel creation from the QueryDefinition, so this indicates the stage id does not belong to this query.","triggerScenarios":"Querying a StageId from a different query (mismatched queryId) or a stage number >= the query's stage count; calling getStagePhase, stageKernel, doesStageHaveResultPartitions, getResultPartitionsForStage, getWorkersToSendPartitionBoundaries, or getResultPartitionBoundariesForStage with a stale or fabricated stage id after kernel recreation from a new QueryDefinition.","commonSituations":"Worker/controller messages arriving for a query whose kernel was rebuilt with a different stage layout; version changes to the query definition that renumber stages; bugs where a StageId is built from the wrong queryId and stage number pair.","solutions":["Confirm the StageId's queryId matches the kernel's query (queryDef.getQueryId()) before lookup","Verify the stage number exists in the current QueryDefinition's stage count","After a controller restart or kernel reload, use the stage ids from the reloaded kernel, not cached ones from before","Handle IAE in the caller and re-fetch or re-register the kernel for the correct query id"],"exampleFix":"// before\nControllerStageKernel kernel = queryKernel.stageKernel(stageId);\n\n// after\nif (!queryKernel.isStageKnown(stageId) || !stageId.getQueryId().equals(queryDef.getQueryId())) {\n  throw new ISE(\"Stage %s does not belong to query %s\", stageId, queryDef.getQueryId());\n}\nControllerStageKernel kernel = queryKernel.stageKernel(stageId);","handlingStrategy":"type-guard","validationCode":"if (queryKernel.isStageKnown(stageId) && stageId.getQueryId().equals(queryDef.getQueryId())) {\n  Object phase = queryKernel.getStagePhase(stageId);\n}","typeGuard":"boolean stageBelongsToQuery(StageId stageId, ControllerQueryKernel kernel) {\n  try {\n    kernel.getStagePhase(stageId);\n    return true;\n  } catch (IllegalArgumentException e) {\n    return false;\n  }\n}","tryCatchPattern":"try {\n  return queryKernel.getStagePhase(stageId);\n} catch (IllegalArgumentException e) {\n  LOG.warn(e, \"No tracker for stage %s in query %s\", stageId, queryId);\n  return null;\n}","preventionTips":["Build StageIds only from the current QueryDefinition's stage list","Never cache StageIds across controller restarts or kernel reloads","Validate stage number against the query's stage count before lookups","Route all kernel access through a single helper that checks query id first"],"tags":["msq","stage-id","lookup"],"backgroundTag":"record-not-found","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"}