apache/cassandra · error · IOException

throw new IOException(e)

Error message

throw new IOException(e)

What it means

This is NodeProbe's catch-all wrapper for exceptions raised during an assistted/bootstrap-related operation (assassinate/removal flows that register a JMX notification listener `monitor`). Any failure in the proxied operation or in the notification-listener registration is rethrown as an IOException with the original exception as cause. The finally block also detaches the listener.

Source

Thrown at src/java/org/apache/cassandra/tools/NodeProbe.java:2459

        {
            if (jmxc != null)
                jmxc.addConnectionNotificationListener(monitor, null, null);
            ssProxy.addNotificationListener(monitor, null, null);
            if (ssProxy.resumeBootstrap())
            {
                out.println("Resuming bootstrap");
                monitor.awaitCompletion();
                if (monitor.getError() != null)
                    throw monitor.getError();
            }
            else
            {
                out.println("Node is already bootstrapped.");
            }
        }
        catch (Exception e)
        {
            throw new IOException(e);
        }
        finally
        {
            try
            {
                ssProxy.removeNotificationListener(monitor);
                if (jmxc != null)
                    jmxc.removeConnectionNotificationListener(monitor);
            }
            catch (Throwable e)
            {
                out.println("Exception occurred during clean-up. " + e);
            }
        }
    }

    public Map<String, List<Integer>> getMaximumPoolSizes(List<String> stageNames)
    {

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Read the wrapped cause (e.getCause()) to identify the server-side failure.
  2. Check the target node's system.log for the underlying operation error.
  3. Verify JMX connectivity and that the node is in the expected state (e.g. not already bootstrapped, as printed by the tool).
  4. Retry the command once the node state/JMX connection is healthy.

Example fix

// before (opaque failure)
nodetool decommission
// after (inspect cause first)
# tail -f /var/log/cassandra/system.log while re-running the nodetool command
Defensive patterns

Strategy: try-catch

Try / catch

try { probe.decommission(); }
catch (IOException e) { Throwable cause = e.getCause(); log.error("Operation failed: {}", cause == null ? e : cause); }

Prevention

When it happens

Trigger: Invoking a NodeProbe method (e.g. decommission/assassinate/move style operations around this try block) when the remote node throws, or when JMX notification listener add/remove fails.

Common situations: Running `nodetool decommission`/bootstrap-related commands against an unhealthy node; node already bootstrapped; JMX connection dropped mid-operation; server-side storage service exception.

Understand the failure class

Background: "API request failed": what wrapped HTTP errors from external APIs mean and how to find the real cause — this error's family across 29 libraries.

Related errors


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