Author: xedin Date: Mon Oct 17 20:38:59 2011 New Revision: 1185362 URL: http://svn.apache.org/viewvc?rev=1185362&view=rev Log: Snapshot to include manifest under LeveledCompactionStrategy patch by Pavel Yaskevich; reviewed by Jonathan Ellis for CASSANDRA-3359
Modified: cassandra/branches/cassandra-1.0/CHANGES.txt cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/ColumnFamilyStore.java cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/Table.java cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/io/util/FileUtils.java Modified: cassandra/branches/cassandra-1.0/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/CHANGES.txt?rev=1185362&r1=1185361&r2=1185362&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/CHANGES.txt (original) +++ cassandra/branches/cassandra-1.0/CHANGES.txt Mon Oct 17 20:38:59 2011 @@ -16,6 +16,7 @@ * Only count compaction as active (for throttling) when they have successfully acquired the compaction lock (CASSANDRA-3344) * Fix CLI `show schema` to include "compression_options" (CASSANDRA-3368) + * Snapshot to include manifest under LeveledCompactionStrategy (CASSANDRA-3359) 1.0.0-final * close scrubbed sstable fd before deleting it (CASSANDRA-3318) Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/ColumnFamilyStore.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=1185362&r1=1185361&r2=1185362&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/ColumnFamilyStore.java (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Mon Oct 17 20:38:59 2011 @@ -32,6 +32,7 @@ import javax.management.MBeanServer; import javax.management.ObjectName; import com.google.common.collect.Iterables; +import org.apache.cassandra.db.compaction.LeveledManifest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -1394,29 +1395,40 @@ public class ColumnFamilyStore implement for (ColumnFamilyStore cfs : concatWithIndexes()) { DataTracker.View currentView = cfs.markCurrentViewReferenced(); + try { for (SSTableReader ssTable : currentView.sstables) { - try - { - // mkdir - File dataDirectory = ssTable.descriptor.directory.getParentFile(); - String snapshotDirectoryPath = Table.getSnapshotPath(dataDirectory.getAbsolutePath(), table.name, snapshotName); - FileUtils.createDirectory(snapshotDirectoryPath); + // mkdir + File dataDirectory = ssTable.descriptor.directory.getParentFile(); + String snapshotDirectoryPath = Table.getSnapshotPath(dataDirectory.getAbsolutePath(), table.name, snapshotName); + FileUtils.createDirectory(snapshotDirectoryPath); + + // hard links + ssTable.createLinks(snapshotDirectoryPath); + if (logger.isDebugEnabled()) + logger.debug("Snapshot for " + table + " keyspace data file " + ssTable.getFilename() + + " created in " + snapshotDirectoryPath); + } - // hard links - ssTable.createLinks(snapshotDirectoryPath); - if (logger.isDebugEnabled()) - logger.debug("Snapshot for " + table + " keyspace data file " + ssTable.getFilename() + - " created in " + snapshotDirectoryPath); - } - catch (IOException e) + if (compactionStrategy instanceof LeveledCompactionStrategy) + { + File manifest = LeveledManifest.tryGetManifest(cfs); + + if (manifest != null) { - throw new IOError(e); + File snapshotDirectory = new File(Table.getSnapshotPath(manifest.getParent(), snapshotName)); + FileUtils.createDirectory(snapshotDirectory); + + CLibrary.createHardLink(manifest, new File(snapshotDirectory, manifest.getName())); } } } + catch (IOException e) + { + throw new IOError(e); + } finally { SSTableReader.releaseReferences(currentView.sstables); Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/Table.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/Table.java?rev=1185362&r1=1185361&r2=1185362&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/Table.java (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/Table.java Mon Oct 17 20:38:59 2011 @@ -589,7 +589,12 @@ public class Table public static String getSnapshotPath(String dataDirPath, String tableName, String snapshotName) { - return dataDirPath + File.separator + tableName + File.separator + SNAPSHOT_SUBDIR_NAME + File.separator + snapshotName; + return getSnapshotPath(dataDirPath + File.separator + tableName, snapshotName); + } + + public static String getSnapshotPath(String tableDirectory, String snapshotName) + { + return tableDirectory + File.separator + SNAPSHOT_SUBDIR_NAME + File.separator + snapshotName; } public static Iterable<Table> all() Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java?rev=1185362&r1=1185361&r2=1185362&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java Mon Oct 17 20:38:59 2011 @@ -47,6 +47,8 @@ public class LeveledManifest { private static final Logger logger = LoggerFactory.getLogger(LeveledCompactionStrategy.class); + public static final String EXTENSION = ".json"; + /** * limit the number of L0 sstables we do at once, because compaction bloom filter creation * uses a pessimistic estimate of how many keys overlap (none), so we risk wasting memory @@ -344,8 +346,8 @@ public class LeveledManifest File manifestFile = tryGetManifest(cfs); if (manifestFile == null) manifestFile = new File(new File(DatabaseDescriptor.getAllDataFileLocations()[0], cfs.table.name), cfs.columnFamily + ".json"); - File oldFile = new File(manifestFile.getPath().replace(".json", "-old.json")); - File tmpFile = new File(manifestFile.getPath().replace(".json", "-tmp.json")); + File oldFile = new File(manifestFile.getPath().replace(EXTENSION, "-old.json")); + File tmpFile = new File(manifestFile.getPath().replace(EXTENSION, "-tmp.json")); JsonFactory f = new JsonFactory(); try @@ -387,7 +389,7 @@ public class LeveledManifest { for (String dir : DatabaseDescriptor.getAllDataFileLocations()) { - File manifestFile = new File(new File(dir, cfs.table.name), cfs.columnFamily + ".json"); + File manifestFile = new File(new File(dir, cfs.table.name), cfs.columnFamily + EXTENSION); if (manifestFile.exists()) { logger.debug("Found manifest at {}", manifestFile); Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/io/util/FileUtils.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/io/util/FileUtils.java?rev=1185362&r1=1185361&r2=1185362&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/io/util/FileUtils.java (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/io/util/FileUtils.java Mon Oct 17 20:38:59 2011 @@ -128,10 +128,14 @@ public class FileUtils public static void createDirectory(String directory) throws IOException { - File file = new File(directory); - if (!file.exists()) + createDirectory(new File(directory)); + } + + public static void createDirectory(File directory) throws IOException + { + if (!directory.exists()) { - if (!file.mkdirs()) + if (!directory.mkdirs()) { throw new IOException("unable to mkdirs " + directory); }