apache/cassandra · error · IORuntimeException

Unsupported record version

Error message

Unsupported record version [${version}] - highest supported version is [${CURRENT_VERSION}]

What it means

Dump.dump reads each record in a full-query-log wire file and first checks the VERSION field against FullQueryLogger.CURRENT_VERSION. A higher version means the file was written by a newer Cassandra than the tool, and parsing it is unsafe, so an IORuntimeException is thrown.

Solutions

  1. Upgrade fqltool to a version whose CURRENT_VERSION >= the log's version
  2. Re-capture the log with the current Cassandra version
  3. Check the log version first to plan the upgrade path
Defensive patterns

Strategy: try-catch

Try / catch

try { dump(logFile); } catch (IORuntimeException e) { if (e.getMessage().startsWith("Unsupported record version")) { exitWith("log written by newer Cassandra; upgrade fqltool"); } else throw e; }

Prevention

When it happens

Trigger: Running fqltool dump on a binlog whose per-record VERSION int16 exceeds the tool's CURRENT_VERSION.

Common situations: Logs copied from a cluster running a newer Cassandra; downgrading the fqltool binary while keeping newer logs; mixed-version environments.

Understand the failure class

Background: "is not a compatible type" / "cannot merge" errors: when a value's type doesn't match what the library requires — this error's family across 65 libraries.

Related errors


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

Appendix: source

Thrown at tools/fqltool/src/org/apache/cassandra/fqltool/commands/Dump.java:85

    private boolean follow = false;

    @Override
    public void run()
    {
        dump(arguments, rollCycle, follow);
    }

    public static void dump(List<String> arguments, String rollCycle, boolean follow)
    {
        StringBuilder sb = new StringBuilder();
        ReadMarshallable reader = wireIn ->
        {
            sb.setLength(0);

            int version = wireIn.read(BinLog.VERSION).int16();
            if (version > FullQueryLogger.CURRENT_VERSION)
            {
                throw new IORuntimeException("Unsupported record version [" + version
                                             + "] - highest supported version is [" + FullQueryLogger.CURRENT_VERSION + ']');
            }

            String type = wireIn.read(BinLog.TYPE).text();
            if (!FullQueryLogger.SINGLE_QUERY.equals((type)) && !FullQueryLogger.BATCH.equals((type)))
            {
                throw new IORuntimeException("Unsupported record type field [" + type
                                             + "] - supported record types are [" + FullQueryLogger.SINGLE_QUERY + ", " + FullQueryLogger.BATCH + ']');
            }

            sb.append("Type: ")
              .append(type)
              .append(System.lineSeparator());

            long queryStartTime = wireIn.read(FullQueryLogger.QUERY_START_TIME).int64();
            sb.append("Query start time: ")
              .append(queryStartTime)
              .append(System.lineSeparator());

View on GitHub (pinned to 88fd0f6a0e)