{"record":{"id":"74520ea7cedb8d03","repo":"apache/cassandra","slug":"the-seed-provider-lists-no-seeds","errorCode":null,"errorMessage":"The seed provider lists no seeds.","messagePattern":"The seed provider lists no seeds\\.","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"critical","filePath":"src/java/org/apache/cassandra/config/DatabaseDescriptor.java","lineNumber":1678,"sourceCode":"    {\n        // load the seeds for node contact points\n        if (conf.seed_provider == null)\n        {\n            throw new ConfigurationException(\"seeds configuration is missing; a minimum of one seed is required.\", false);\n        }\n        try\n        {\n            Class<? extends SeedProvider> seedProviderClass =\n                FBUtilities.classForNameWithoutInitialization(conf.seed_provider.class_name, \"seed provider\", SeedProvider.class);\n            seedProvider = (SeedProvider) seedProviderClass.getConstructor(Map.class).newInstance(conf.seed_provider.parameters);\n        }\n        // there are about 5 checked exceptions that could be thrown here.\n        catch (Exception e)\n        {\n            throw new ConfigurationException(e.getMessage() + \"\\nFatal configuration error; unable to start server.  See log for stacktrace.\", true);\n        }\n        if (seedProvider.getSeeds().size() == 0)\n            throw new ConfigurationException(\"The seed provider lists no seeds.\", false);\n    }\n\n    @VisibleForTesting\n    static void checkForLowestAcceptedTimeouts(Config conf)\n    {\n        if (conf.read_request_timeout.toMilliseconds() < LOWEST_ACCEPTED_TIMEOUT.toMilliseconds())\n        {\n            logInfo(\"read_request_timeout\", conf.read_request_timeout, LOWEST_ACCEPTED_TIMEOUT);\n            conf.read_request_timeout = new DurationSpec.LongMillisecondsBound(\"10ms\");\n        }\n\n        if (conf.range_request_timeout.toMilliseconds() < LOWEST_ACCEPTED_TIMEOUT.toMilliseconds())\n        {\n            logInfo(\"range_request_timeout\", conf.range_request_timeout, LOWEST_ACCEPTED_TIMEOUT);\n            conf.range_request_timeout = new DurationSpec.LongMillisecondsBound(\"10ms\");\n        }\n\n        if (conf.request_timeout.toMilliseconds() < LOWEST_ACCEPTED_TIMEOUT.toMilliseconds())","sourceCodeStart":1660,"sourceCodeEnd":1696,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/config/DatabaseDescriptor.java#L1660-L1696","documentation":"After the seed provider is instantiated, applySeedProvider() validates it returns at least one seed. An empty seed list makes cluster bootstrap impossible (a joining node has no contact points), so startup is aborted with this ConfigurationException.","triggerScenarios":"applySeedProvider() called when seedProvider.getSeeds().isEmpty() — e.g. seeds parameter is an empty string, contains only whitespace, or a custom provider returns an empty set (e.g. dynamic provider with no resolvable entries).","commonSituations":"seed_provider parameters with `seeds: \"\"` produced by a templating engine with unset variables; environment-variable substitution failing at deploy time; custom seed provider (e.g. cloud-auto-discovery) returning nothing because metadata API or DNS lookup failed.","solutions":["Set a non-empty seeds list in cassandra.yaml (at least one live node address host:port)","If seeds come from a template/variable, verify the variable was actually populated in the rendered config before startup","For dynamic seed providers, fix the underlying discovery source (DNS, cloud metadata) or fall back to static seeds"],"exampleFix":"// cassandra.yaml before\nseed_provider:\n  - class_name: org.apache.cassandra.locator.SimpleSeedProvider\n    parameters:\n      - seeds: \"\"\n// after\nseed_provider:\n  - class_name: org.apache.cassandra.locator.SimpleSeedProvider\n    parameters:\n      - seeds: \"10.0.1.1:7000\"","handlingStrategy":"validation","validationCode":"if (conf.seed_provider.parameters.isEmpty() || String.valueOf(conf.seed_provider.parameters.get(\"seeds\")).isBlank())\n    throw new IllegalStateException(\"seed_provider seeds parameter must contain at least one address\");","typeGuard":null,"tryCatchPattern":"try { DatabaseDescriptor.applySeedProvider(); } catch (ConfigurationException e) { /* supply non-empty seeds */ }","preventionTips":["Fail deploys when template variables for seeds render empty","Keep at least 2-3 static seeds across DCs in the config","Ping seed hosts from new nodes as a pre-join check"],"tags":["cassandra","seeds","empty-list"],"backgroundTag":"empty-required-field","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}