Skip to content

Commit 71f1fc0

Browse files
DSP-24600 & CASSANDRA-20485 Fixes & test additions for handling of UDTs across versions
All big formats now have implicitly frozen tuples. Originally this was only an issue up to `me`, but C*'s `na` and `nb` formats are also implicitly frozen, are compatibility against them is required. Fix language around hasExplicitlyFrozenTuples versus hasImplicitlyFrozenTuples in TrieIndexFormat. Extends SSTableHeaderFix to only run when dropped multi-cell columns are detected. Add a StartupCheck preventing upgrades from <3.0.25 and <3.11.11, only used by HCD, to reduce the liklihood of unfixed sstable headers being introduced into a running cluster (it is best if the operator manually fixes these headers before the upgrade to HCD 1.x (CC4 / C* 4.0 based). Additional DSE tries legacy sstable data has been added in addition to the backport described below. Backport of CASSANDRA-20485, as follows: Add LegacySSTableTest data for past sstable formats Also add test method testVerifyOldTupleSSTables for frozen tuples and dropping of them. The test data also adds different versions of me format sstables from C* version 3.0.25 and 3.11.11 as they do (unfortunately) differ. Test sstable files have had their sequence generation ids changed to represent the server version used to create them, while this shouldn't be necessary it is for debug purposes when sstable formats have changed between versions. patch by Roxana Neophytou, Mick Semb Wever; reviewed by Dmitry Konstantinov for CASSANDRA-20485 Co-authored-by: mck <[email protected]>
1 parent c68d2bf commit 71f1fc0

File tree

607 files changed

+419
-98
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

607 files changed

+419
-98
lines changed

src/java/org/apache/cassandra/io/sstable/SSTableHeaderFix.java

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.nio.file.Files;
2424
import java.nio.file.Path;
2525
import java.util.ArrayList;
26+
import java.util.Collection;
2627
import java.util.EnumSet;
2728
import java.util.LinkedHashMap;
2829
import java.util.List;
@@ -50,13 +51,16 @@
5051
import org.apache.cassandra.db.marshal.DynamicCompositeType;
5152
import org.apache.cassandra.db.marshal.ListType;
5253
import org.apache.cassandra.db.marshal.MapType;
54+
import org.apache.cassandra.db.marshal.MultiCellCapableType;
5355
import org.apache.cassandra.db.marshal.SetType;
5456
import org.apache.cassandra.db.marshal.TupleType;
5557
import org.apache.cassandra.db.marshal.UserType;
5658
import org.apache.cassandra.io.sstable.metadata.MetadataComponent;
5759
import org.apache.cassandra.io.sstable.metadata.MetadataType;
5860
import org.apache.cassandra.io.util.File;
5961
import org.apache.cassandra.schema.ColumnMetadata;
62+
import org.apache.cassandra.schema.DroppedColumn;
63+
import org.apache.cassandra.schema.KeyspaceMetadata;
6064
import org.apache.cassandra.schema.IndexMetadata;
6165
import org.apache.cassandra.schema.Schema;
6266
import org.apache.cassandra.schema.SchemaConstants;
@@ -84,7 +88,19 @@ public static void fixNonFrozenUDTIfUpgradeFrom30()
8488
CassandraVersion previousVersion = new CassandraVersion(previousVersionString);
8589
if (previousVersion.major != 3 || previousVersion.minor > 0)
8690
{
87-
// Not an upgrade from 3.0 to 3.x, nothing to do here
91+
// Not an upgrade from 3.0, nothing to do here
92+
return;
93+
}
94+
95+
boolean hasDroppedFrozenColumn = false;
96+
for (KeyspaceMetadata keyspace : Schema.instance.getUserKeyspaces())
97+
for (TableMetadata tableMetadata : keyspace.tablesAndViews())
98+
if (!tableMetadata.isIndex() && !tableMetadata.isView() && !tableMetadata.isVirtual())
99+
hasDroppedFrozenColumn |= hasDroppedFrozenColumn(tableMetadata.droppedColumns.values());
100+
101+
if (!hasDroppedFrozenColumn)
102+
{
103+
logger.info("No dropped frozen columns found - NOT fixing sstable metadata serialization-headers");
88104
return;
89105
}
90106

@@ -313,6 +329,16 @@ private static Stream<Path> maybeExpandDirectory(Path path)
313329
.map(File::toPath);
314330
}
315331

332+
private static boolean hasDroppedFrozenColumn(Collection<DroppedColumn> droppedColumns)
333+
{
334+
boolean hasDroppedFrozenColumn = false;
335+
for (DroppedColumn droppedColumn : droppedColumns)
336+
hasDroppedFrozenColumn |= droppedColumn.column.type.equals(droppedColumn.column.type.freeze())
337+
&& droppedColumn.column.type instanceof MultiCellCapableType;
338+
339+
return hasDroppedFrozenColumn;
340+
}
341+
316342
private void processSSTable(Descriptor desc)
317343
{
318344
if (desc.cfname.indexOf('.') != -1)
@@ -332,6 +358,12 @@ private void processSSTable(Descriptor desc)
332358
return;
333359
}
334360

361+
if (!hasDroppedFrozenColumn(tableMetadata.droppedColumns.values()))
362+
{
363+
info.accept(String.format("Table %s.%s has no dropped frozen columns - NOT checking sstable %s", desc.ksname, desc.cfname, desc));
364+
return;
365+
}
366+
335367
Set<Component> components = SSTable.discoverComponentsFor(desc);
336368
if (components.stream().noneMatch(c -> c.type == Component.Type.STATS))
337369
{
@@ -577,8 +609,8 @@ private AbstractType<?> fixType(Descriptor desc, ByteBuffer name, AbstractType<?
577609
info.accept(String.format("sstable %s: Column '%s' needs to be updated from type '%s' to '%s'",
578610
desc,
579611
logColumnName(name),
580-
typeInHeader.asCQL3Type(),
581-
fixedType.asCQL3Type()));
612+
typeInHeader.asCQL3Type().toSchemaString(),
613+
fixedType.asCQL3Type().toSchemaString()));
582614
return fixedType;
583615
}
584616

src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ public boolean hasMaxColumnValueLengths()
380380
@Override
381381
public boolean hasImplicitlyFrozenTuples()
382382
{
383-
return false;
383+
return true;
384384
}
385385

386386
@Override

src/java/org/apache/cassandra/io/sstable/format/trieindex/TrieIndexFormat.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ static class TrieIndexVersion extends Version
334334
private final boolean hasMaxColumnValueLengths;
335335

336336
private final int correspondingMessagingVersion;
337-
private final boolean hasExplicitlyFrozenTuples;
337+
private final boolean hasImplicitlyFrozenTuples;
338338

339339
private final ByteComparable.Version byteComparableVersion;
340340

@@ -348,7 +348,7 @@ static class TrieIndexVersion extends Version
348348
hasOriginatingHostId = version.matches("(a[d-z])|(b[b-z])") || version.compareTo("ca") >= 0;
349349
hasMaxColumnValueLengths = version.matches("b[a-z]"); // DSE only field
350350
correspondingMessagingVersion = version.compareTo("ca") >= 0 ? MessagingService.VERSION_DS_10 : MessagingService.VERSION_3014;
351-
hasExplicitlyFrozenTuples = version.compareTo("cc") < 0 || version.compareTo("da") >= 0; // we don't know if what DA is going to be eventually, but it is almost certain it will not include explicitly frozen tuples
351+
hasImplicitlyFrozenTuples = version.compareTo("cc") < 0 || version.compareTo("da") >= 0; // `da` is found in C* 5.0 and CC `main-5.0`, and both have implicitly frozen tuples
352352
byteComparableVersion = version.compareTo("ca") >= 0 ? ByteComparable.Version.OSS41 : ByteComparable.Version.LEGACY;
353353
}
354354

@@ -501,7 +501,7 @@ public boolean hasIsTransient()
501501
@Override
502502
public boolean hasImplicitlyFrozenTuples()
503503
{
504-
return hasExplicitlyFrozenTuples;
504+
return hasImplicitlyFrozenTuples;
505505
}
506506

507507
@Override

test/data/legacy-sstables/aa/legacy_tables/legacy_aa_tuple/.keep

Whitespace-only changes.

test/data/legacy-sstables/ac/legacy_tables/legacy_ac_tuple/.keep

Whitespace-only changes.

test/data/legacy-sstables/ad/legacy_tables/legacy_ad_tuple/.keep

Whitespace-only changes.

test/data/legacy-sstables/ba/legacy_tables/legacy_ba_tuple/.keep

Whitespace-only changes.
Binary file not shown.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1407325515

0 commit comments

Comments
 (0)