[NO ISSUE][*DB][TXN] Avoid abort log on empty txn, reduce recovery logging

Change-Id: I91c01f34e38df7d2398e5383b5d39632e64f0e7f
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/10884
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Michael Blow <mblow@apache.org>
Reviewed-by: Till Westmann <tillw@apache.org>
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/RecoveryManager.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/RecoveryManager.java
index 1461ef4..65cb36a 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/RecoveryManager.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/RecoveryManager.java
@@ -599,22 +599,19 @@
             throw new ACIDException(e);
         }
         long lastLSN = txnContext.getLastLSN();
-        if (LOGGER.isInfoEnabled()) {
-            LOGGER.info("rollbacking transaction log records from " + firstLSN + " to " + lastLSN);
-        }
+        boolean infoEnabled = LOGGER.isInfoEnabled();
         // check if the transaction actually wrote some logs.
         if (firstLSN == TransactionManagementConstants.LogManagerConstants.TERMINAL_LSN || firstLSN > lastLSN) {
-            if (LOGGER.isInfoEnabled()) {
-                LOGGER.info("no need to roll back as there were no operations by the txn " + txnContext.getTxnId());
+            if (infoEnabled) {
+                LOGGER.info("no need to rollback as there were no operations by " + txnContext.getTxnId());
             }
             return;
         }
-
-        // While reading log records from firstLsn to lastLsn, collect uncommitted txn's Lsns
-        if (LOGGER.isInfoEnabled()) {
-            LOGGER.info("collecting loser transaction's LSNs from " + firstLSN + " to " + lastLSN);
+        if (infoEnabled) {
+            LOGGER.info("rolling back transaction log records from " + firstLSN + " to " + lastLSN + " for "
+                    + txnContext.getTxnId());
         }
-
+        // While reading log records from firstLsn to lastLsn, collect uncommitted txn's Lsns
         Map<TxnEntityId, List<Long>> jobLoserEntity2LSNsMap = new HashMap<>();
         TxnEntityId tempKeyTxnEntityId = new TxnEntityId(-1, -1, -1, null, -1, false);
         int updateLogCount = 0;
@@ -722,7 +719,7 @@
                 }
             }
 
-            if (LOGGER.isInfoEnabled()) {
+            if (infoEnabled) {
                 LOGGER.info("undone loser transaction's effect");
                 LOGGER.info("[RecoveryManager's rollback log count] update/entityCommit/undo:" + updateLogCount + "/"
                         + entityCommitLogCount + "/" + undoCount);
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManager.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManager.java
index c218dec..ee65962 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManager.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManager.java
@@ -18,6 +18,8 @@
  */
 package org.apache.asterix.transaction.management.service.transaction;
 
+import static org.apache.asterix.transaction.management.service.transaction.TransactionManagementConstants.LogManagerConstants.TERMINAL_LSN;
+
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.Map;
@@ -101,10 +103,12 @@
         final ITransactionContext txnCtx = getTransactionContext(txnId);
         try {
             if (txnCtx.isWriteTxn()) {
-                LogRecord logRecord = new LogRecord();
-                TransactionUtil.formJobTerminateLogRecord(txnCtx, logRecord, false);
-                txnSubsystem.getLogManager().log(logRecord);
-                txnSubsystem.getCheckpointManager().secure(txnId);
+                if (txnCtx.getFirstLSN() != TERMINAL_LSN) {
+                    LogRecord logRecord = new LogRecord();
+                    TransactionUtil.formJobTerminateLogRecord(txnCtx, logRecord, false);
+                    txnSubsystem.getLogManager().log(logRecord);
+                    txnSubsystem.getCheckpointManager().secure(txnId);
+                }
                 txnSubsystem.getRecoveryManager().rollbackTransaction(txnCtx);
                 txnCtx.setTxnState(ITransactionManager.ABORTED);
             }