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

mblow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git

commit 5a377cff7adf015eab330fd9f8698c6ca8fcc6e0
Author: Murtadha Hubail <mhub...@apache.org>
AuthorDate: Mon Feb 8 00:07:44 2021 +0300

    [NO ISSUE][TX] Stop reading logs when an empty file is encountered
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    
    - Whenever an empty txn log file is encountered, do not
      attempt to read the next log file since an empty log
      file indicates that no more logs exist.
    - Add test case.
    
    (cherry picked from commit 1f238097fb756556628f2027f47acd4390ace36f)
    
    Change-Id: Ia7642e238dbc5f2d927a8a1d640b0586f091416b
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/9963
    Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
    Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
    Reviewed-by: Murtadha Hubail <mhub...@apache.org>
    Reviewed-by: Michael Blow <mb...@apache.org>
---
 .../org/apache/asterix/test/txn/LogManagerTest.java    |  2 +-
 .../apache/asterix/test/txn/RecoveryManagerTest.java   | 18 ++++++++++++++++++
 .../management/service/logging/LogReader.java          |  2 +-
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/LogManagerTest.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/LogManagerTest.java
index 495a967..685d983 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/LogManagerTest.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/LogManagerTest.java
@@ -201,7 +201,7 @@ public class LogManagerTest {
         return txnCtx;
     }
 
-    private static void prepareNextLogFile(LogManager logManager) throws 
Exception {
+    public static void prepareNextLogFile(LogManager logManager) throws 
Exception {
         Method ensureLastPageFlushed;
         Method prepareNextLogFile;
         String targetMethod = null;
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/RecoveryManagerTest.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/RecoveryManagerTest.java
index 65b10a0..34e48c2 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/RecoveryManagerTest.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/RecoveryManagerTest.java
@@ -22,8 +22,10 @@ import java.io.File;
 
 import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil;
 import org.apache.asterix.common.TestDataUtil;
+import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.config.StorageProperties;
 import org.apache.asterix.metadata.bootstrap.MetadataBuiltinEntities;
+import org.apache.asterix.transaction.management.service.logging.LogManager;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -104,4 +106,20 @@ public class RecoveryManagerTest {
         final long countAfterRecovery = 
TestDataUtil.getDatasetCount(datasetName);
         Assert.assertEquals(countBeforeRecovery, countAfterRecovery);
     }
+
+    @Test
+    public void recoveryWithEmptyLogFile() throws Exception {
+        String datasetName = "ds";
+        TestDataUtil.createIdOnlyDataset(datasetName);
+        TestDataUtil.upsertData(datasetName, 10);
+        final INcApplicationContext ncAppCtx = (INcApplicationContext) 
integrationUtil.ncs[0].getApplicationContext();
+        final LogManager logManager = (LogManager) 
ncAppCtx.getTransactionSubsystem().getLogManager();
+        // do ungraceful shutdown to enforce recovery
+        integrationUtil.deinit(false);
+        // create empty txn log file
+        LogManagerTest.prepareNextLogFile(logManager);
+        // ensure recovery completes
+        integrationUtil.init(false, TEST_CONFIG_FILE_PATH);
+        TestDataUtil.upsertData(datasetName, 10);
+    }
 }
diff --git 
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogReader.java
 
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogReader.java
index 30caab7..53a2897 100644
--- 
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogReader.java
+++ 
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogReader.java
@@ -163,7 +163,7 @@ public class LogReader implements ILogReader {
      */
     private boolean refillLogReadBuffer() {
         try {
-            if (readLSN % logFileSize == logFile.size()) {
+            if (logFile.size() > 0 && readLSN % logFileSize == logFile.size()) 
{
                 readLSN += logFileSize - (readLSN % logFileSize);
                 getLogFile();
             }

Reply via email to