You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by mm...@apache.org on 2019/03/25 19:22:24 UTC

[accumulo] branch 1.9 updated: Fix RecoveryLogReader error on failed file. Closes #961 (#1048)

This is an automated email from the ASF dual-hosted git repository.

mmiller pushed a commit to branch 1.9
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/1.9 by this push:
     new 995a952  Fix RecoveryLogReader error on failed file. Closes #961 (#1048)
995a952 is described below

commit 995a952b24c11887f5864dd101eae3847b2128f5
Author: Mike Miller <mm...@apache.org>
AuthorDate: Mon Mar 25 15:22:19 2019 -0400

    Fix RecoveryLogReader error on failed file. Closes #961 (#1048)
    
    * Made RecoveryLogReader ignore a failed file so it can recovery properly
    * Added test to RecoveryLogReaderTest
---
 .../accumulo/tserver/log/RecoveryLogReader.java    |  3 +++
 .../tserver/log/RecoveryLogsReaderTest.java        | 25 ++++++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/log/RecoveryLogReader.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/log/RecoveryLogReader.java
index 718fa98..b892c51 100644
--- a/server/tserver/src/main/java/org/apache/accumulo/tserver/log/RecoveryLogReader.java
+++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/log/RecoveryLogReader.java
@@ -127,6 +127,9 @@ public class RecoveryLogReader implements CloseableIterator<Entry<LogFileKey,Log
         foundFinish = true;
         continue;
       }
+      if (SortedLogState.FAILED.getMarker().equals(child.getPath().getName())) {
+        continue;
+      }
       FileSystem ns = fs.getVolumeByPath(child.getPath()).getFileSystem();
       heap.add(new Index(new Reader(ns.makeQualified(child.getPath()), ns.getConf())));
     }
diff --git a/server/tserver/src/test/java/org/apache/accumulo/tserver/log/RecoveryLogsReaderTest.java b/server/tserver/src/test/java/org/apache/accumulo/tserver/log/RecoveryLogsReaderTest.java
index 37feafd..2bf806f 100644
--- a/server/tserver/src/test/java/org/apache/accumulo/tserver/log/RecoveryLogsReaderTest.java
+++ b/server/tserver/src/test/java/org/apache/accumulo/tserver/log/RecoveryLogsReaderTest.java
@@ -29,6 +29,7 @@ import java.util.Map.Entry;
 
 import org.apache.accumulo.server.fs.VolumeManager;
 import org.apache.accumulo.server.fs.VolumeManagerImpl;
+import org.apache.accumulo.server.log.SortedLogState;
 import org.apache.accumulo.tserver.log.RecoveryLogReader.SortCheckIterator;
 import org.apache.accumulo.tserver.logger.LogEvents;
 import org.apache.accumulo.tserver.logger.LogFileKey;
@@ -177,4 +178,28 @@ public class RecoveryLogsReaderTest {
     }
   }
 
+  /**
+   * Test a failed marker doesn't cause issues. See Github issue
+   * https://github.com/apache/accumulo/issues/961
+   */
+  @Test
+  public void testFailed() throws Exception {
+    Path manyMaps = new Path("file://" + root.getRoot().getAbsolutePath() + "/manyMaps");
+    fs.create(new Path(manyMaps, SortedLogState.FAILED.getMarker())).close();
+
+    RecoveryLogReader reader = new RecoveryLogReader(fs, manyMaps);
+    IntWritable key = new IntWritable();
+    BytesWritable value = new BytesWritable();
+
+    for (int i = 0; i < 1000; i++) {
+      if (i == 10)
+        continue;
+      assertTrue(reader.next(key, value));
+      assertEquals(i, key.get());
+    }
+    reader.close();
+
+    assertTrue(fs.delete(new Path(manyMaps, SortedLogState.FAILED.getMarker())));
+  }
+
 }