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