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
- Upgrade fqltool to a version whose CURRENT_VERSION >= the log's version
- Re-capture the log with the current Cassandra version
- 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
- Record the writing Cassandra version alongside captured logs
- Upgrade fqltool before replaying logs from newer clusters
- Run version-compatibility checks in CI for log tooling
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
- Unsupported record version
- Attempted to use message version " + messagingVersion + "…
- Expected version 0 for unversioned serializer
- Unhandled record type
- Unknown version: " + version
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)