You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2012/12/10 20:40:01 UTC

[3/4] git commit: Fallback to old manifest if most recent is unparseable patch by Carl Yeksigian; reviewed by jbellis for CASSANDRA-5041

Fallback to old manifest if most recent is unparseable
patch by Carl Yeksigian; reviewed by jbellis for CASSANDRA-5041


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/9b61606a
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/9b61606a
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/9b61606a

Branch: refs/heads/trunk
Commit: 9b61606a5d450df15261cc2f04c006323ae2881e
Parents: 8752bfa
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Dec 10 13:36:20 2012 -0600
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Dec 10 13:37:50 2012 -0600

----------------------------------------------------------------------
 CHANGES.txt                                        |    1 +
 .../cassandra/db/compaction/LeveledManifest.java   |   56 ++++++++++-----
 2 files changed, 38 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b61606a/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index c7559a3..eb1c3a8 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 1.2.1
+ * Fall back to old manifest if most recent is unparseable (CASSANDRA-5041)
  * pool [Compressed]RandomAccessReader objects on the partitioned read path
    (CASSANDRA-4942)
  * Add debug logging to list filenames processed by Directories.migrateFile 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b61606a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java b/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
index a992d11..c1d831b 100644
--- a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
+++ b/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
@@ -107,33 +107,51 @@ public class LeveledManifest
         if (manifestFile == null)
             return;
 
-        ObjectMapper m = new ObjectMapper();
         try
         {
-            JsonNode rootNode = m.readValue(manifestFile, JsonNode.class);
-            JsonNode generations = rootNode.get("generations");
-            assert generations.isArray();
-            for (JsonNode generation : generations)
+            parseManifest(manifest, sstables, manifestFile);
+        }
+        catch (Exception e)
+        {
+            logger.debug("Error parsing manifest", e);
+            File oldFile = new File(manifestFile.getPath().replace(EXTENSION, "-old.json"));
+            if (oldFile.exists())
             {
-                int level = generation.get("generation").getIntValue();
-                JsonNode generationValues = generation.get("members");
-                for (JsonNode generationValue : generationValues)
+                try
                 {
-                    for (SSTableReader ssTableReader : sstables)
-                    {
-                        if (ssTableReader.descriptor.generation == generationValue.getIntValue())
-                        {
-                            logger.debug("Loading {} at L{}", ssTableReader, level);
-                            manifest.add(ssTableReader, level);
-                        }
-                    }
+                    parseManifest(manifest, sstables, oldFile);
+                    return;
+                }
+                catch (Exception old)
+                {
+                    logger.debug("Old manifest present but corrupt", old);
                 }
             }
+            logger.warn("Manifest present but corrupt. Cassandra will re-level {} from scratch", cfs.columnFamily);
         }
-        catch (Exception e)
+    }
+
+    private static void parseManifest(LeveledManifest manifest, Iterable<SSTableReader> sstables, File manifestFile) throws IOException
+    {
+        ObjectMapper m = new ObjectMapper();
+        JsonNode rootNode = m.readValue(manifestFile, JsonNode.class);
+        JsonNode generations = rootNode.get("generations");
+        assert generations.isArray();
+        for (JsonNode generation : generations)
         {
-            // TODO try to recover -old first
-            logger.error("Manifest present but corrupt. Cassandra will compact levels from scratch", e);
+            int level = generation.get("generation").getIntValue();
+            JsonNode generationValues = generation.get("members");
+            for (JsonNode generationValue : generationValues)
+            {
+                for (SSTableReader ssTableReader : sstables)
+                {
+                    if (ssTableReader.descriptor.generation == generationValue.getIntValue())
+                    {
+                        logger.debug("Loading {} at L{}", ssTableReader, level);
+                        manifest.add(ssTableReader, level);
+                    }
+                }
+            }
         }
     }