[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 <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Murtadha Hubail <mhubail@apache.org>
Reviewed-by: Michael Blow <mblow@apache.org>
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 @@
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 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 @@
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 @@
*/
private boolean refillLogReadBuffer() {
try {
- if (readLSN % logFileSize == logFile.size()) {
+ if (logFile.size() > 0 && readLSN % logFileSize == logFile.size()) {
readLSN += logFileSize - (readLSN % logFileSize);
getLogFile();
}