Allow removing snapshots of no-longer-existing CFs patch by Lyuben Todorov and Mikhail Stepura for CASSANDRA-6418
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/b5c9b498 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/b5c9b498 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/b5c9b498 Branch: refs/heads/trunk Commit: b5c9b498fec1b71bc51afb3e45f828f4014baaff Parents: 142e13f Author: Jonathan Ellis <jbel...@apache.org> Authored: Sat Dec 21 00:36:30 2013 -0600 Committer: Jonathan Ellis <jbel...@apache.org> Committed: Sat Dec 21 00:36:30 2013 -0600 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../apache/cassandra/db/ColumnFamilyStore.java | 9 +++++- .../org/apache/cassandra/db/Directories.java | 34 ++++++++++++++++++-- src/java/org/apache/cassandra/db/Keyspace.java | 6 ++-- 4 files changed, 43 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/b5c9b498/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 916ed7d..b80c821 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.0.4 + * Allow removing snapshots of no-longer-existing CFs (CASSANDRA-6418) * add StorageService.stopDaemon() (CASSANDRA-4268) * add IRE for invalid CF supplied to get_count (CASSANDRA-5701) * add client encryption support to sstableloader (CASSANDRA-6378) http://git-wip-us.apache.org/repos/asf/cassandra/blob/b5c9b498/src/java/org/apache/cassandra/db/ColumnFamilyStore.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index d585407..a04c9e2 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -1825,9 +1825,16 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean return directories.snapshotCreationTime(snapshotName); } + /** + * Clear all the snapshots for a given column family. + * + * @param snapshotName the user supplied snapshot name. If left empty, + * all the snapshots will be cleaned. + */ public void clearSnapshot(String snapshotName) { - directories.clearSnapshot(snapshotName); + List<File> snapshotDirs = directories.getCFDirectories(); + Directories.clearSnapshot(snapshotName, snapshotDirs); } public boolean hasUnreclaimedSpace() http://git-wip-us.apache.org/repos/asf/cassandra/blob/b5c9b498/src/java/org/apache/cassandra/db/Directories.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/Directories.java b/src/java/org/apache/cassandra/db/Directories.java index b006c71..2db4d9b 100644 --- a/src/java/org/apache/cassandra/db/Directories.java +++ b/src/java/org/apache/cassandra/db/Directories.java @@ -402,11 +402,11 @@ public class Directories return false; } - public void clearSnapshot(String snapshotName) + public static void clearSnapshot(String snapshotName, List<File> snapshotDirectories) { // If snapshotName is empty or null, we will delete the entire snapshot directory String tag = snapshotName == null ? "" : snapshotName; - for (File dir : sstableDirectories) + for (File dir : snapshotDirectories) { File snapshotDir = new File(dir, join(SNAPSHOT_SUBDIR, tag)); if (snapshotDir.exists()) @@ -430,6 +430,36 @@ public class Directories throw new RuntimeException("Snapshot " + snapshotName + " doesn't exist"); } + // Recursively finds all the sub directories in the KS directory. + public static List<File> getKSChildDirectories(String ksName) + { + List<File> result = new ArrayList<File>(); + for (DataDirectory dataDirectory : dataFileLocations) + { + File ksDir = new File(dataDirectory.location, ksName); + File[] cfDirs = ksDir.listFiles(); + if (cfDirs == null) + continue; + for (File cfDir : cfDirs) + { + if (cfDir.isDirectory()) + result.add(cfDir); + } + } + return result; + } + + public List<File> getCFDirectories() + { + List<File> result = new ArrayList<File>(); + for (File dataDirectory : sstableDirectories) + { + if (dataDirectory.isDirectory()) + result.add(dataDirectory); + } + return result; + } + private static File getOrCreate(File base, String... subdirs) { File dir = subdirs == null || subdirs.length == 0 ? base : new File(base, join(subdirs)); http://git-wip-us.apache.org/repos/asf/cassandra/blob/b5c9b498/src/java/org/apache/cassandra/db/Keyspace.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/Keyspace.java b/src/java/org/apache/cassandra/db/Keyspace.java index 0280ed2..36789e2 100644 --- a/src/java/org/apache/cassandra/db/Keyspace.java +++ b/src/java/org/apache/cassandra/db/Keyspace.java @@ -239,10 +239,8 @@ public class Keyspace */ public void clearSnapshot(String snapshotName) { - for (ColumnFamilyStore cfStore : columnFamilyStores.values()) - { - cfStore.clearSnapshot(snapshotName); - } + List<File> snapshotDirs = Directories.getKSChildDirectories(getName()); + Directories.clearSnapshot(snapshotName, snapshotDirs); } /**