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);
             }


Reply via email to