{"record":{"id":"414f35487b87c999","repo":"apache/druid","slug":"node-s-discovered-but-doesn-t-have-service-s","errorCode":null,"errorMessage":"Node[%s] discovered but doesn't have service[%s]. Ignored.","messagePattern":"Node\\[(.+?)\\] discovered but doesn't have service\\[(.+?)\\]\\. Ignored\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"server/src/main/java/org/apache/druid/discovery/DruidNodeDiscoveryProvider.java","lineNumber":185,"sourceCode":"     */\n    class FilteringUpstreamListener implements DruidNodeDiscovery.Listener\n    {\n      @Override\n      public void nodesAdded(Collection<DiscoveryDruidNode> nodesDiscovered)\n      {\n        synchronized (lock) {\n          List<DiscoveryDruidNode> nodesAdded = new ArrayList<>();\n          for (DiscoveryDruidNode node : nodesDiscovered) {\n            if (node.getServices().containsKey(service)) {\n              DiscoveryDruidNode prev = nodes.putIfAbsent(node.getDruidNode().getHostAndPortToUse(), node);\n\n              if (prev == null) {\n                nodesAdded.add(node);\n              } else {\n                log.warn(\"Node[%s] discovered but already exists [%s].\", node, prev);\n              }\n            } else {\n              log.warn(\"Node[%s] discovered but doesn't have service[%s]. Ignored.\", node, service);\n            }\n          }\n\n          if (nodesAdded.isEmpty()) {\n            // Don't bother listeners with an empty update, it doesn't make sense.\n            return;\n          }\n\n          Collection<DiscoveryDruidNode> unmodifiableNodesAdded = Collections.unmodifiableCollection(nodesAdded);\n          for (Listener listener : listeners) {\n            try {\n              listener.nodesAdded(unmodifiableNodesAdded);\n            }\n            catch (Exception ex) {\n              log.error(ex, \"Listener[%s].nodesAdded(%s) threw exception. Ignored.\", listener, nodesAdded);\n            }\n          }\n        }","sourceCodeStart":167,"sourceCodeEnd":203,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/server/src/main/java/org/apache/druid/discovery/DruidNodeDiscoveryProvider.java#L167-L203","documentation":"Log warning in DruidNodeDiscoveryProvider.NodeDiscoveryListener indicating a discovered node announcement does not contain the specific service this listener subscribed to, so the node is ignored for that listener. It is informational: the node exists but is not a match for the requested service type.","triggerScenarios":"A node announces itself but its services map lacks the service key the listener filtered on (checked via node.getServices().containsKey(service)); e.g. a broker announced while listening for 'data-server' service, or version skew changed service keys.","commonSituations":"Mixed Druid versions where service keys were renamed or consolidated (e.g. historical now announces 'data-server' instead of separate query/data services); watchers configured for a role/service combination the nodes don't provide.","solutions":["Verify the announced service keys on the node (check its ZK announcement or DiscoveryDruidNode logs) match the expected DruidNodeDiscoveryProvider.ServiceType.","Upgrade/align cluster versions so service key naming is consistent.","Point the consumer at the correct service type for the node role (e.g. data-server vs query service).","Confirm extensions providing the service are loaded on the announcing node."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Confirm the node announces the service you listen for\nif (!node.getServices().containsKey(DruidNodeDiscoveryProvider.ServiceType.DATASERVER.getBaseName())) {\n  log.warn(\"Node %s does not announce data-server; upgrade it\", node);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Align service key expectations with the cluster's Druid version (e.g. data-server vs split services)","Listen on the service type matching the node role","Upgrade old nodes still announcing legacy service keys"],"tags":["service-discovery","version-skew","configuration"],"backgroundTag":"missing-required-config-field","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"}