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