apache/cassandra · info

No local state, state is in silent shutdown, or node hasn't

Error message

No local state, state is in silent shutdown, or node hasn't joined, not announcing shutdown

What it means

During coordinated shutdown, Gossiper announces GOSSIP_SHUTDOWN to live peers only if the local node has valid endpoint state and has fully joined. If the local state is absent, already in silent shutdown, or the node never joined the ring, it warns that no shutdown announcement is sent and cancels the gossip task.

Source

Thrown at src/java/org/apache/cassandra/gms/Gossiper.java:1944

    public void stop()
    {
        EndpointState mystate = endpointStateMap.get(getBroadcastAddressAndPort());
        if (mystate != null && !isSilentShutdownState(mystate) && StorageService.instance.isJoined())
        {
            logger.info("Announcing shutdown");
            shutdownAnnounced.set(true);

            addLocalApplicationState(ApplicationState.STATUS_WITH_PORT, StorageService.instance.valueFactory.shutdown(true));
            addLocalApplicationState(ApplicationState.STATUS, StorageService.instance.valueFactory.shutdown(true));
            // clone endpointstate to avoid it changing between serializedSize and serialize calls
            EndpointState clone = new EndpointState(mystate);
            Message<GossipShutdown> message = Message.out(Verb.GOSSIP_SHUTDOWN, new GossipShutdown(clone));
            for (InetAddressAndPort ep : liveEndpoints)
                MessagingService.instance().send(message, ep);
            Uninterruptibles.sleepUninterruptibly(SHUTDOWN_ANNOUNCE_DELAY_IN_MS.getInt(), TimeUnit.MILLISECONDS);
        }
        else
            logger.warn("No local state, state is in silent shutdown, or node hasn't joined, not announcing shutdown");
        if (scheduledGossipTask != null)
            scheduledGossipTask.cancel(false);
    }

    public boolean isEnabled()
    {
        ScheduledFuture<?> scheduledGossipTask = this.scheduledGossipTask;
        return (scheduledGossipTask != null) && (!scheduledGossipTask.isCancelled());
    }

    @VisibleForTesting
    public void initializeNodeUnsafe(InetAddressAndPort addr, UUID uuid, int generationNbr)
    {
        initializeNodeUnsafe(addr, uuid, MessagingService.current_version, generationNbr);
    }

    @VisibleForTesting
    public void initializeNodeUnsafe(InetAddressAndPort addr, UUID uuid, int netVersion, int generationNbr)

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Confirm the node actually joined (nodetool status/statusbinary) before expecting a clean shutdown announcement.
  2. If shutting down a never-joined node, treat this as expected; the warning is harmless.
  3. Avoid repeated drain/stop calls; check shutdown scripts for idempotency.
  4. If state is stuck, wipe gossip state (data/system folder only per recovery docs) and re-bootstrap a fresh node.

Example fix

// before: draining a node that never joined
nodetool drain   # warns, not fully joined
// after: verify join state first
nodetool status  # ensure node is UN before drain/decommission
Defensive patterns

Strategy: validation

Validate before calling

if (StorageService.instance.getOperationMode().equals("NORMAL") && Gossiper.instance.getEndpointStateForEndpoint(FBUtilities.getBroadcastAddressAndPort()) != null) { gossiper.sendShutdown(); }

Type guard

boolean joined = "NORMAL".equals(StorageService.instance.getOperationMode());

Prevention

When it happens

Trigger: Calling Gossiper.sendShutdown (via stopGossiping/drain) when the node's own endpoint state is null, isSilentShutdownState is true, or StorageService operation mode indicates the node never completed joining.

Common situations: Stopping a node that failed during bootstrap/Join; double drain or repeated shutdown scripts; node started but never joined the ring being stopped again; state corruption after crash mid-join.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10). Data as JSON: /api/errors/51a21ac3b1d8c35d. Report an issue: GitHub.