{"record":{"id":"97e10c6bb508cbae","repo":"apache/cassandra","slug":"read-repair-must-be-set-to-none-for-transiently-97e10c","errorCode":null,"errorMessage":"read_repair must be set to 'NONE' for transiently replicated keyspaces","messagePattern":"read_repair must be set to 'NONE' for transiently replicated keyspaces","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/statements/schema/CreateTableStatement.java","lineNumber":182,"sourceCode":"        UserFunctions.Builder ufBuilder = UserFunctions.builder().add();\n        for (KeyspaceMetadata ksm : schema)\n            ufBuilder.add(ksm.userFunctions);\n\n        TableMetadata.Builder builder = builder(keyspace.types, ufBuilder.build()).epoch(metadata.nextEpoch());\n\n        // We do not want to set table ID here just yet, since we are using CQL for serialising a fully expanded CREATE TABLE statement.\n        expandedCql = builder.build().toCqlString(false, attrs.hasProperty(TableAttributes.ID), ifNotExists);\n        verifyExpandedCql(expandedCql);\n\n        if (!attrs.hasProperty(TableAttributes.ID))\n            builder.id(TableId.get(metadata));\n        TableMetadata table = builder.build();\n        table.validate();\n\n        if (keyspace.replicationStrategy.hasTransientReplicas()\n            && table.params.readRepair != ReadRepairStrategy.NONE)\n        {\n            throw ire(\"read_repair must be set to 'NONE' for transiently replicated keyspaces\");\n        }\n\n        if (!table.params.compression.isEnabled() && !SchemaConstants.isSystemKeyspace(table.keyspace))\n            Guardrails.uncompressedTablesEnabled.ensureEnabled(state);\n\n        if (table.params.transactionalMode.accordIsEnabled && SchemaConstants.isSystemKeyspace(keyspaceName))\n            throw ire(\"Cannot enable accord on system tables (%s.%s)\", keyspaceName, tableName);\n\n        if (table.params.transactionalMode.accordIsEnabled && !DatabaseDescriptor.getAccordTransactionsEnabled())\n            throw ire(format(\"Cannot create table %s.%s with transactional mode %s with accord.enabled set to false\",\n                             keyspaceName, tableName, table.params.transactionalMode));\n\n        if (table.params.transactionalMigrationFrom.isMigrating())\n            throw ire(\"Cannot set transactional migration on new tables (%s.%s), %s\", keyspaceName, tableName, table.params.transactionalMigrationFrom);\n\n        return schema.withAddedOrUpdated(keyspace.withSwapped(keyspace.tables.with(table)));\n    }\n","sourceCodeStart":164,"sourceCodeEnd":200,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/statements/schema/CreateTableStatement.java#L164-L200","documentation":"Tables in keyspaces that use transient replication (any DC with transient_replication > 0) must disable read repair, because read repair cannot reconcile transiently-repaired data correctly. Creating such a table with read_repair set to anything other than NONE is rejected.","triggerScenarios":"`CREATE TABLE ks.t (...) WITH read_repair = 'BLOCKING'` (or 'PARALLEL'/default NONBLOCKING) inside a keyspace whose replication strategy hasTransientReplicas() — checked in apply() after table validation.","commonSituations":"Adopting transient replication for storage savings while keeping legacy table defaults; copying table options from non-transient keyspaces; older scripts that explicitly set read_repair.","solutions":["Set read_repair = 'NONE' in the table options: CREATE TABLE ks.t (...) WITH read_repair = 'NONE';","Remove transient replication from the keyspace if read repair is required: recreate keyspace with full RF per DC.","Update schema-migration templates to emit read_repair = 'NONE' for transiently replicated keyspaces."],"exampleFix":"// before\nCREATE TABLE ks.t (id int PRIMARY KEY) WITH read_repair = 'BLOCKING';\n\n// after\nCREATE TABLE ks.t (id int PRIMARY KEY) WITH read_repair = 'NONE';","handlingStrategy":"validation","validationCode":"if (keyspaceUsesTransientReplication(ks) && tableOptions.getOrDefault(\"read_repair\", \"NONE\") != \"NONE\") throw new IllegalArgumentException(\"Set read_repair = 'NONE' for transient keyspaces\");","typeGuard":null,"tryCatchPattern":"try { session.execute(ddl); } catch (InvalidQueryException e) { if (e.getMessage().contains(\"read_repair must be set to 'NONE'\")) { /* add WITH read_repair = 'NONE' or drop transient replication */ } else throw e; }","preventionTips":["When enabling transient replication, audit all table options for read_repair","Keep table-option templates per keyspace replication profile","Test schema migrations against a transient-replication cluster"],"tags":["cassandra","cql","table","replication","read-repair"],"backgroundTag":"conflicting-config-options","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}