{"record":{"id":"34826bc565767b31","repo":"apache/druid","slug":"a-realtime-appenderator-was-already-created-for-th","errorCode":null,"errorMessage":"A realtime appenderator was already created for this peon's task.","messagePattern":"A realtime appenderator was already created for this peon's task\\.","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"server/src/main/java/org/apache/druid/segment/realtime/appenderator/PeonAppenderatorsManager.java","lineNumber":93,"sourceCode":"      IndexIO indexIO,\n      IndexMerger indexMerger,\n      QueryRunnerFactoryConglomerate conglomerate,\n      DataSegmentAnnouncer segmentAnnouncer,\n      ServiceEmitter emitter,\n      QueryProcessingPool queryProcessingPool,\n      JoinableFactory joinableFactory,\n      Cache cache,\n      CacheConfig cacheConfig,\n      CachePopulatorStats cachePopulatorStats,\n      PolicyEnforcer policyEnforcer,\n      RowIngestionMeters rowIngestionMeters,\n      ParseExceptionHandler parseExceptionHandler,\n      CentralizedDatasourceSchemaConfig centralizedDatasourceSchemaConfig,\n      TaskIntervalUnlocker taskIntervalUnlocker\n  )\n  {\n    if (realtimeAppenderator != null) {\n      throw new ISE(\"A realtime appenderator was already created for this peon's task.\");\n    } else if (batchAppenderator != null) {\n      throw new ISE(\"A batch appenderator was already created for this peon's task.\");\n    } else {\n      realtimeAppenderator = Appenderators.createRealtime(\n          segmentLoaderConfig,\n          taskId,\n          schema,\n          config,\n          metrics,\n          dataSegmentPusher,\n          jsonMapper,\n          indexIO,\n          indexMerger,\n          conglomerate,\n          segmentAnnouncer,\n          emitter,\n          queryProcessingPool,\n          cache,","sourceCodeStart":75,"sourceCodeEnd":111,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/server/src/main/java/org/apache/druid/segment/realtime/appenderator/PeonAppenderatorsManager.java#L75-L111","documentation":"PeonAppenderatorsManager manages at most one appenderator per peon (task worker process). createRealtimeAppenderatorForTask throws this IllegalStateException if a realtime appenderator already exists, because the manager only supports a single realtime appenderator for the lifetime of the peon.","triggerScenarios":"Calling createRealtimeAppenderatorForTask twice within the same peon process, e.g. task restart logic re-invoking appenderator creation without first calling shutdown, or custom task code re-entering initialization after a failure.","commonSituations":"Custom indexing task implementations that retry ingestion setup; frameworks re-invoking task initialization after transient failures; double registration of the same task in an embedded peon.","solutions":["Ensure createRealtimeAppenderatorForTask is called at most once per peon; guard with an initialized flag in task code","Call the manager's shutdown/cleanup path before attempting to recreate the appenderator","Check task logs for an earlier creation call and fix duplicate initialization in task lifecycle code"],"exampleFix":"// before\nappenderatorManager.createRealtimeAppenderatorForTask(...) // called on both init and retry\n// after\nif (!initialized) {\n  appenderator = appenderatorManager.createRealtimeAppenderatorForTask(...);\n  initialized = true;\n}","handlingStrategy":"validation","validationCode":"if (peonManager.realtimeAppenderatorExists()) throw new IllegalStateException(\"appenderator already created\");","typeGuard":"boolean canCreateRealtime = manager != null && !manager.hasRealtimeAppenderator();","tryCatchPattern":"try { manager.createRealtimeAppenderatorForTask(...); } catch (ISE e) { log.warn(\"already created; reusing existing appenderator\"); }","preventionTips":["Create the appenderator exactly once in task lifecycle init","Guard creation with an idempotent initialized flag","Never recreate appenderators on retry without shutdown first"],"tags":["java","appenderator","illegal-state"],"backgroundTag":"invalid-state-transition","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"}