diff --git a/CHANGES.txt b/CHANGES.txt index 190994165a..4f714897a5 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -18,6 +18,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 938ea32525..a71b7520fc 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -610,6 +610,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); @@ -628,10 +629,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)