apache/cassandra · error

Error building row with data deserialized from

Error message

Error building row with data deserialized from %s

What it means

In UnfilteredSerializer.deserializeRowBody, deserialized data triggered a RuntimeException/AssertionError inside the row Builder (e.g. a builder invariant broken by corrupt bytes). The code wraps it with 'Error building row with data deserialized from %s' to preserve the corruption context rather than failing with a bare assertion.

Solutions

  1. Run nodetool scrub on the table to discard corrupted rows
  2. Repair the node so missing/corrupt data is re-streamed from healthy replicas
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at src/java/org/apache/cassandra/db/rows/UnfilteredSerializer.java:651 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at src/java/org/apache/cassandra/db/rows/UnfilteredSerializer.java:651

                columns.apply(UnfilteredSerializer::readColumn, helper);
            }
            catch (WrappedException e)
            {
                if (e.getCause() instanceof IOException)
                    throw (IOException) e.getCause();

                throw e;
            }

            return builder.build();
        }
        catch (RuntimeException | AssertionError e)
        {
            // Corrupted data could be such that it triggers an assertion in the row Builder, or break one of its assumption.
            // Of course, a bug in said builder could also trigger this, but it's impossible a priori to always make the distinction
            // between a real bug and data corrupted in just the bad way. Besides, re-throwing as an IOException doesn't hide the
            // exception, it just make we catch it properly and mark the sstable as corrupted.
            throw new IOException("Error building row with data deserialized from " + in, e);
        }
    }

    private static void readColumn(DeserializationHelper helper, ColumnMetadata column)
    {
        try
        {
            if (column.isSimple())
                readSimpleColumn(column, helper.in, helper.header, helper, helper.builder, helper.livenessInfo);
            else
                readComplexColumn(column, helper.in, helper.header, helper, helper.hasComplexDeletion, helper.builder, helper.livenessInfo);
        }
        catch (IOException e)
        {
            throw new WrappedException(e);
        }
    }

View on GitHub (pinned to 88fd0f6a0e)