{"record":{"id":"0163e9e660da970e","repo":"apache/druid","slug":"registration-already-in-progress-for-serviceid-s","errorCode":null,"errorMessage":"Registration already in progress for serviceId [%s]","messagePattern":"Registration already in progress for serviceId \\[(.+?)\\]","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"extensions-contrib/consul-extensions/src/main/java/org/apache/druid/consul/discovery/ConsulDruidNodeAnnouncer.java","lineNumber":152,"sourceCode":"      }\n    }\n\n    announcedNodes.clear();\n    lifecycleLock.exitStop();\n  }\n\n  @Override\n  public void announce(DiscoveryDruidNode discoveryDruidNode)\n  {\n    if (!lifecycleLock.awaitStarted(1, TimeUnit.SECONDS)) {\n      throw new ISE(\"Announcer not started\");\n    }\n\n    String serviceId = ConsulServiceIds.serviceId(config, discoveryDruidNode);\n\n    // Prevent concurrent duplicate registrations for the same serviceId\n    if (!registeringNodes.add(serviceId)) {\n      LOGGER.warn(\"Registration already in progress for serviceId [%s]\", serviceId);\n      return;\n    }\n\n    try {\n      // If already announced, skip duplicate registration\n      if (announcedNodes.containsKey(serviceId)) {\n        LOGGER.warn(\"ServiceId [%s] already announced, skipping\", serviceId);\n        return;\n      }\n\n      long registerStart = System.nanoTime();\n\n      // Register in Consul, then track locally atomically in this block\n      registerServiceWithRetry(serviceId, discoveryDruidNode);\n      announcedNodes.put(serviceId, discoveryDruidNode);\n\n      long registerLatency = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - registerStart);\n      ConsulMetrics.emitTimer(emitter, \"consul/register/latency\", registerLatency,","sourceCodeStart":134,"sourceCodeEnd":170,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/extensions-contrib/consul-extensions/src/main/java/org/apache/druid/consul/discovery/ConsulDruidNodeAnnouncer.java#L134-L170","documentation":"Emitted in ConsulDruidNodeAnnouncer.announce when a concurrent announce() call for the same serviceId is already underway. A set of in-flight registrations (registeringNodes) guards against duplicate concurrent registrations; if add() returns false, this call is skipped and the in-flight one will complete registration.","triggerScenarios":"Two threads calling announce() nearly simultaneously for the same DiscoveryDruidNode/serviceId — e.g. Druid lifecycle racing with a leadership change or repeated announcer start.","commonSituations":"Concurrent lifecycle events (leader election, task restart) triggering announce on overlapping threads; announcer start() racing an external announce call.","solutions":["Usually no action needed: the concurrent call completes the registration; verify the service appears in Consul.","If seen persistently, find the duplicate caller and serialize lifecycle start of the announcer.","Ensure the code path that triggers announce isn't invoked both by lifecycle start and a listener callback."],"exampleFix":"// before: announce called from two paths simultaneously\nleaderListener.becomeLeader() -> announce(...)\nlifecycle.start()           -> announce(...)\n// after: guard with lifecycle\nif (lifecycleStage == STARTED) { announce(...); } // single entry point only","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  announcer.announce(node);\n} catch (RuntimeException e) {\n  // treat 'already in progress' as benign; log and continue\n}","preventionTips":["Trigger announce from a single lifecycle path only","Avoid announcing the same node concurrently from leader callbacks and lifecycle start","Treat this warning as benign unless registrations never complete"],"tags":["consul","concurrency","registration","duplicate"],"backgroundTag":"duplicate-registration-attempt","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"}