From e97b8fba1180b0326c28d5223453be5cd7a5d483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20de=20la=20Pe=C3=B1a?= Date: Wed, 16 Jun 2021 17:40:08 +0100 Subject: [PATCH] Clean transaction log leftovers at the beginning of sstablelevelreset and sstableofflinerelevel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit patch by Andrés de la Peña; reviewed by Berenguer Blasi and Stefania Alborghetti for CASSANDRA-12519 --- CHANGES.txt | 1 + .../org/apache/cassandra/tools/SSTableLevelResetter.java | 7 ++++++- .../org/apache/cassandra/tools/SSTableOfflineRelevel.java | 4 ++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index c3461e3e49..102989288c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.25: + * Clean transaction log leftovers at the beginning of sstablelevelreset and sstableofflinerelevel (CASSANDRA-12519) * CQL shell should prefer newer TLS version by default (CASSANDRA-16695) * Ensure that existing empty rows are properly returned (CASSANDRA-16671) * Invalidate prepared statements on DROP COMPACT (CASSANDRA-16712) diff --git a/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java b/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java index 915edf12b7..e7d04f149d 100644 --- a/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java +++ b/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.Set; import org.apache.cassandra.config.Schema; +import org.apache.cassandra.db.lifecycle.LifecycleTransaction; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Directories; import org.apache.cassandra.db.Keyspace; @@ -75,10 +76,14 @@ public class SSTableLevelResetter System.exit(1); } + // remove any leftovers in the transaction log Keyspace keyspace = Keyspace.openWithoutSSTables(keyspaceName); ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(columnfamily); + LifecycleTransaction.removeUnfinishedLeftovers(cfs.metadata); + + Directories.SSTableLister lister = cfs.getDirectories().sstableLister(Directories.OnTxnErr.THROW).skipTemporary(true); boolean foundSSTable = false; - for (Map.Entry> sstable : cfs.getDirectories().sstableLister(Directories.OnTxnErr.THROW).list().entrySet()) + for (Map.Entry> sstable : lister.list().entrySet()) { if (sstable.getValue().contains(Component.STATS)) { diff --git a/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java b/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java index b27b07a2f0..e5eb1874ef 100644 --- a/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java +++ b/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java @@ -31,6 +31,7 @@ import java.util.Set; import com.google.common.base.Throwables; import org.apache.cassandra.config.Schema; +import org.apache.cassandra.db.lifecycle.LifecycleTransaction; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.Directories; @@ -93,8 +94,11 @@ public class SSTableOfflineRelevel keyspace, columnfamily)); + // remove any leftovers in the transaction log Keyspace ks = Keyspace.openWithoutSSTables(keyspace); ColumnFamilyStore cfs = ks.getColumnFamilyStore(columnfamily); + LifecycleTransaction.removeUnfinishedLeftovers(cfs.metadata); + Directories.SSTableLister lister = cfs.getDirectories().sstableLister(Directories.OnTxnErr.THROW).skipTemporary(true); Set sstables = new HashSet<>(); for (Map.Entry> sstable : lister.list().entrySet())