diff --git a/CHANGES.txt b/CHANGES.txt index dc7a76ee39..2b86935c51 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -2,6 +2,7 @@ * cqlsh: Fix handling of $$-escaped strings (CASSANDRA-12189) * Fix SSL JMX requiring truststore containing server cert (CASSANDRA-12109) Merged from 3.0: + * Faster startup by only scanning each directory for temporary files once (CASSANDRA-12114) * Respond with v1/v2 protocol header when responding to driver that attempts to connect with too low of a protocol version (CASSANDRA-11464) * NullPointerExpception when reading/compacting table (CASSANDRA-11988) diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index 0a3ad52675..9088105c83 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -607,6 +607,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean public static void scrubDataDirectories(CFMetaData metadata) throws StartupException { Directories directories = new Directories(metadata, initialDirectories); + Set cleanedDirectories = new HashSet<>(); // clear ephemeral snapshots that were not properly cleared last session (CASSANDRA-7357) clearEphemeralSnapshots(directories); @@ -625,10 +626,15 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean for (Map.Entry> sstableFiles : directories.sstableLister(Directories.OnTxnErr.IGNORE).list().entrySet()) { Descriptor desc = sstableFiles.getKey(); + File directory = desc.directory; Set components = sstableFiles.getValue(); - for (File tmpFile : desc.getTemporaryFiles()) - tmpFile.delete(); + if (!cleanedDirectories.contains(directory)) + { + cleanedDirectories.add(directory); + for (File tmpFile : desc.getTemporaryFiles()) + tmpFile.delete(); + } File dataFile = new File(desc.filenameFor(Component.DATA)); if (components.contains(Component.DATA) && dataFile.length() > 0)