diff --git a/CHANGES.txt b/CHANGES.txt index 9acd89ea2e..eb73da2b59 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.9 + * 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 b95e88dbb7..f34a2d5b27 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -581,6 +581,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean public static void scrubDataDirectories(CFMetaData metadata) { Directories directories = new Directories(metadata, initialDirectories); + Set cleanedDirectories = new HashSet<>(); // clear ephemeral snapshots that were not properly cleared last session (CASSANDRA-7357) clearEphemeralSnapshots(directories); @@ -594,10 +595,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)