diff --git a/CHANGES.txt b/CHANGES.txt index aa1e60427a..0e6554c1ab 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.29 + * Fix the ordering of sstables when running sstableupgrade tool (CASSANDRA-18143) * Fix default file system error handler for disk_failure_policy die (CASSANDRA-18294) * Introduce check for names of test classes (CASSANDRA-17964) * Suppress CVE-2022-41915 (CASSANDRA-18147) diff --git a/src/java/org/apache/cassandra/db/Directories.java b/src/java/org/apache/cassandra/db/Directories.java index d169428c1e..7ee7579f0b 100644 --- a/src/java/org/apache/cassandra/db/Directories.java +++ b/src/java/org/apache/cassandra/db/Directories.java @@ -671,6 +671,18 @@ public class Directories return ImmutableMap.copyOf(components); } + /** + * Returns a sorted version of the {@code list} method. + * Descriptors are sorted by generation. + * @return a List of descriptors to their components. + */ + public List>> sortedList() + { + List>> sortedEntries = new ArrayList<>(list().entrySet()); + sortedEntries.sort(Comparator.comparingInt(e -> e.getKey().generation)); + return sortedEntries; + } + public List listFiles() { filter(); diff --git a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java index f2a922b398..50f7331674 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java +++ b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java @@ -72,8 +72,8 @@ public class StandaloneUpgrader Collection readers = new ArrayList<>(); - // Upgrade sstables - for (Map.Entry> entry : lister.list().entrySet()) + // Upgrade sstables in id order + for (Map.Entry> entry : lister.sortedList()) { Set components = entry.getValue(); if (!components.contains(Component.DATA) || !components.contains(Component.PRIMARY_INDEX))