{"record":{"id":"b2856813bded4826","repo":"apache/cassandra","slug":"got-no-response-for-shadow-round","errorCode":null,"errorMessage":"Got no response for shadow round","messagePattern":"Got no response for shadow round","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/java/org/apache/cassandra/gms/NewGossiper.java","lineNumber":88,"sourceCode":"            return GossipHelper.storedEpstate();\n\n        ShadowRoundHandler shadowRoundHandler = new ShadowRoundHandler(peers);\n        handler = shadowRoundHandler;\n\n        int tries = 0;\n        int maxTries = CassandraRelevantProperties.TCM_SHADOW_ROUND_MAX_ATTEMPTS.getInt();\n        long timeout = CassandraRelevantProperties.TCM_SHADOW_ROUND_TIMEOUT.getLong();\n        while (true)\n        {\n            try\n            {\n                return shadowRoundHandler.doShadowRound().get(timeout, TimeUnit.MILLISECONDS);\n            }\n            catch (InterruptedException | ExecutionException | TimeoutException e)\n            {\n                if (++tries >= maxTries)\n                    break;\n                logger.warn(\"Got no response for shadow round\");\n            }\n        }\n        logger.warn(\"Not able to construct initial cluster metadata from gossip, using system tables instead\");\n        // Mark done here so that future gossip messages don't get routed to the shadow round handler (see\n        // GossipDigestSynVerbHandler & GossipDigestAckVerbHandler)\n        handler.markDone();\n        return GossipHelper.storedEpstate();\n    }\n\n    public boolean isInShadowRound()\n    {\n        ShadowRoundHandler srh = handler;\n        return srh != null && !srh.isDone();\n    }\n\n    void onAck(InetAddressAndPort from, Map<InetAddressAndPort, EndpointState> epStateMap)\n    {\n        ShadowRoundHandler srh = handler;","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/gms/NewGossiper.java#L70-L106","documentation":"NewGossiper's shadow round asks existing cluster members for gossip state to bootstrap initial cluster metadata. If the shadow round request times out or fails repeatedly and maxTries is exhausted, it warns for each failed attempt and then falls back to constructing metadata from system tables (local disk), marking the handler done so live gossip proceeds.","triggerScenarios":"doShadowRound's future does not complete within the timeout for maxTries consecutive attempts (InterruptedException/ExecutionException/TimeoutException), typically when no configured seeds are reachable.","commonSituations":"Bootstrapping a node when all seed hosts are down or firewalled (gossip port 7000 blocked); wrong seed list in cassandra.yaml; starting a node while the entire cluster is down; network partition during startup.","solutions":["Verify seeds are reachable: check cassandra.yaml seeds, ping/telnet seed host on the gossip port (default 7000).","Fix firewall/security-group rules to allow gossip traffic from the new node to seeds.","Retry startup once the cluster/seeds are up; the fallback to system tables may leave stale ring data.","If this is a fresh first node, ensure it is its own seed so no shadow round against others is needed."],"exampleFix":"// before\ntelnet 10.0.0.1 7000   # connection refused — seed down/firewalled\n// after\n# fix security group to allow 7000/tcp, correct seeds in cassandra.yaml, restart\nseed_provider:\n  - seeds: \"10.0.0.1,10.0.0.2\"","handlingStrategy":"retry","validationCode":"// before starting the node\nfor (String seed : seeds) { Socket s = new Socket(); try { s.connect(new InetSocketAddress(seed, 7000), 3000); s.close(); } catch (IOException e) { throw new IllegalStateException(\"Seed unreachable: \" + seed); } }","typeGuard":null,"tryCatchPattern":"try { shadowRound.doShadowRound().get(timeoutMs, MILLISECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { /* retry up to maxTries, then fall back to system tables */ }","preventionTips":["Open gossip port (7000) between new nodes and all seeds in firewalls/security groups.","Keep seed lists accurate and seeds highly available.","For the first node in a new cluster, make it its own seed.","Re-run bootstrap after transient startup failures rather than trusting stale system-table fallback."],"tags":["cassandra","gossip","shadow-round","network","bootstrap"],"backgroundTag":"request-timeout","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}