apache/cassandra · error · IOException

throw new IOException(e.getMessage())

Error message

throw new IOException(e.getMessage())

What it means

In the same catch block as the dictionary-table lookup, any exception whose cause is NOT an InstanceNotFoundException is rethrown as an IOException containing only the exception's message. This covers all non-'table missing' failures during dictionary operations, such as IO errors, permission problems, or serialization failures on the server side.

Source

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

    private <T> T doWithCompressionDictionaryManagerMBean(Function<CompressionDictionaryManagerMBean, T> func,
                                                          String keyspace, String table) throws IOException
    {
        try
        {
            return func.apply(getDictionaryManagerProxy(keyspace, table));
        }
        catch (Exception e)
        {
            if (e.getCause() instanceof InstanceNotFoundException)
            {
                String message = String.format("Table %s.%s does not exist or does not support dictionary compression",
                                               keyspace, table);
                throw new IllegalArgumentException(message);
            }
            else
            {
                throw new IOException(e.getMessage());
            }
        }
    }

    /**
     * Gets the compression dictionary training state for the specified table.
     * Returns an atomic snapshot of training status, progress, and failure details.
     *
     * @param keyspace the keyspace name
     * @param table the table name
     * @return the current training state
     * @throws IOException if there's an error accessing the MBean
     */
    public TrainingState getCompressionDictionaryTrainingState(String keyspace, String table) throws IOException
    {
        CompositeData compositeData = getDictionaryManagerProxy(keyspace, table).getTrainingState();
        return TrainingState.fromCompositeData(compositeData);
    }

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Check the node's system.log for the full server-side stack trace (the IOException only carries the message).
  2. If importing, validate the dictionary file is complete and was produced by a compatible training run/version.
  3. Retry after fixing disk/I-O issues on the node.
  4. Upgrade to matching nodetool/node versions to rule out serialization mismatches.

Example fix

// before
nodetool importcompressiondict ks users /path/dict.dct   // truncated file
// after
# verify file integrity, then re-run
md5sum /path/dict.dct && nodetool importcompressiondict ks users /path/dict.dct
Defensive patterns

Strategy: try-catch

Try / catch

try { probe.importCompressionDictionary(ks, tbl, file); }
catch (IOException e) { log.error("Dictionary op failed server-side; check system.log for stack: {}", e.getMessage()); }

Prevention

When it happens

Trigger: Calling a compression-dictionary nodetool command when the server-side manager throws anything other than 'MBean not found' — e.g. corrupt dictionary file on import, disk I/O failure, or a server-side Internal error.

Common situations: Importing a malformed or truncated dictionary file; insufficient disk space; node under failure; version mismatch producing message-only info (loses the stack trace).

Understand the failure class

Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.

Related errors


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