From 0700dfa0bc26d0758df898101bb595d3ec8d7def Mon Sep 17 00:00:00 2001 From: Ekaterina Dimitrova Date: Tue, 13 Oct 2020 15:42:51 +0100 Subject: [PATCH] Check SSTables for latest version before dropping compact storage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit patch by Ekaterina Dimitrova; reviewed by Andrés de la Peña and Sylvain Lebresne for CASSANDRA-16063 --- CHANGES.txt | 1 + .../cassandra/cql3/statements/AlterTableStatement.java | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/CHANGES.txt b/CHANGES.txt index 1dd52c2dfd..0f9694e41f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.23: + * Check SSTables for latest version before dropping compact storage (CASSANDRA-16063) * Handle unexpected columns due to schema races (CASSANDRA-15899) * Avoid failing compactions with very large partitions (CASSANDRA-15164) * Use IF NOT EXISTS for index and UDT create statements in snapshot schema files (CASSANDRA-13935) diff --git a/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java b/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java index 193c24c5e7..31c8e8f73d 100644 --- a/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java @@ -34,6 +34,7 @@ import org.apache.cassandra.db.marshal.BytesType; import org.apache.cassandra.db.marshal.EmptyType; import org.apache.cassandra.db.view.View; import org.apache.cassandra.exceptions.*; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.schema.IndexMetadata; import org.apache.cassandra.schema.Indexes; import org.apache.cassandra.schema.TableParams; @@ -277,6 +278,14 @@ public class AlterTableStatement extends SchemaAlteringStatement if (!meta.isCompactTable()) throw new InvalidRequestException("Cannot DROP COMPACT STORAGE on table without COMPACT STORAGE"); + // TODO: Global check of the sstables to be added as part of CASSANDRA-15897. + // Currently this is only a local check of the SSTables versions + for (SSTableReader ssTableReader : Keyspace.open(keyspace()).getColumnFamilyStore(columnFamily()).getLiveSSTables()) + { + if (!ssTableReader.descriptor.version.isLatestVersion()) + throw new InvalidRequestException("Cannot DROP COMPACT STORAGE until all SSTables are upgraded, please run `nodetool upgradesstables` first."); + } + cfm = meta.asNonCompact(); break; case OPTS: