Do not delete empty tx before commit/rollback

Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/5eecd871
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/5eecd871
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/5eecd871

Branch: refs/heads/refactor-openwire
Commit: 5eecd8710673a626dd1bd3edf42b187e2b4ae66c
Parents: d499e4d
Author: Martyn Taylor <[email protected]>
Authored: Thu Feb 4 13:56:40 2016 +0000
Committer: Martyn Taylor <[email protected]>
Committed: Thu Feb 4 16:24:47 2016 +0000

----------------------------------------------------------------------
 .../artemis/jdbc/store/journal/JDBCJournalImpl.java   | 14 ++++++++++----
 .../jdbc/store/journal/JDBCJournalReaderCallback.java | 10 +++++++---
 .../artemis/jdbc/store/journal/TransactionHolder.java |  2 ++
 3 files changed, 19 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/5eecd871/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalImpl.java
----------------------------------------------------------------------
diff --git 
a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalImpl.java
 
b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalImpl.java
index 82053d4..2f56add 100644
--- 
a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalImpl.java
+++ 
b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalImpl.java
@@ -149,8 +149,9 @@ public class JDBCJournalImpl implements Journal {
       List<JDBCJournalRecord> recordRef = records;
       records = new ArrayList<JDBCJournalRecord>();
 
-      // We keep a list of deleted records (used for cleaning up old 
transaction data).
+      // We keep a list of deleted records and committed tx (used for cleaning 
up old transaction data).
       List<Long> deletedRecords = new ArrayList<>();
+      List<Long> committedTransactions = new ArrayList<>();
 
       TransactionHolder holder;
 
@@ -180,6 +181,7 @@ public class JDBCJournalImpl implements Journal {
                      deleteJournalRecords.addBatch();
                   }
                   record.writeRecord(insertJournalRecords);
+                  committedTransactions.add(record.getTxId());
                   break;
                default:
                   // Default we add a new record to the DB
@@ -202,7 +204,7 @@ public class JDBCJournalImpl implements Journal {
 
          connection.commit();
 
-         cleanupTxRecords(deletedRecords);
+         cleanupTxRecords(deletedRecords, committedTransactions);
          success = true;
       }
       catch (SQLException e) {
@@ -215,12 +217,16 @@ public class JDBCJournalImpl implements Journal {
 
    /* We store Transaction reference in memory (once all records associated 
with a Tranascation are Deleted,
       we remove the Tx Records (i.e. PREPARE, COMMIT). */
-   private void cleanupTxRecords(List<Long> deletedRecords) throws 
SQLException {
+   private void cleanupTxRecords(List<Long> deletedRecords, List<Long> 
committedTx) throws SQLException {
 
       List<RecordInfo> iterableCopy;
       List<TransactionHolder> iterableCopyTx = new ArrayList<>();
       iterableCopyTx.addAll(transactions.values());
 
+      for (Long txId : committedTx) {
+         transactions.get(txId).committed = true;
+      }
+
       // TODO (mtaylor) perhaps we could store a reverse mapping of IDs to 
prevent this O(n) loop
       for (TransactionHolder h : iterableCopyTx) {
 
@@ -233,7 +239,7 @@ public class JDBCJournalImpl implements Journal {
             }
          }
 
-         if (h.recordInfos.isEmpty()) {
+         if (h.recordInfos.isEmpty() && h.committed) {
             deleteJournalTxRecords.setLong(1, h.transactionID);
             deleteJournalTxRecords.addBatch();
             transactions.remove(h.transactionID);

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/5eecd871/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalReaderCallback.java
----------------------------------------------------------------------
diff --git 
a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalReaderCallback.java
 
b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalReaderCallback.java
index 844fd4a..a7c765e 100644
--- 
a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalReaderCallback.java
+++ 
b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalReaderCallback.java
@@ -90,7 +90,11 @@ public class JDBCJournalReaderCallback implements 
JournalReaderCallback {
 
    public void onReadCommitRecord(final long transactionID, final int 
numberOfRecords) throws Exception {
       // It is possible that the TX could be null, since deletes could have 
happened in the journal.
-      TransactionHolder tx = loadTransactions.remove(transactionID);
+
+      TransactionHolder tx = loadTransactions.get(transactionID);
+      tx.committed = true;
+
+      // We can remove local Tx without associated records
       if (tx != null) {
          for (RecordInfo txRecord : tx.recordInfos) {
             if (txRecord.isUpdate) {
@@ -117,11 +121,11 @@ public class JDBCJournalReaderCallback implements 
JournalReaderCallback {
 
    public void checkPreparedTx() {
       for (TransactionHolder transaction : loadTransactions.values()) {
-         if (!transaction.prepared || transaction.invalid) {
+         if ((!transaction.prepared && !transaction.committed) || 
transaction.invalid) {
             
ActiveMQJournalLogger.LOGGER.uncomittedTxFound(transaction.transactionID);
             loadManager.failedTransaction(transaction.transactionID, 
transaction.recordInfos, transaction.recordsToDelete);
          }
-         else {
+         else if (!transaction.committed) {
             PreparedTransactionInfo info = new 
PreparedTransactionInfo(transaction.transactionID, transaction.extraData);
             info.getRecords().addAll(transaction.recordInfos);
             info.getRecordsToDelete().addAll(transaction.recordsToDelete);

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/5eecd871/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/TransactionHolder.java
----------------------------------------------------------------------
diff --git 
a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/TransactionHolder.java
 
b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/TransactionHolder.java
index 4c3cd84..c03e747 100644
--- 
a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/TransactionHolder.java
+++ 
b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/TransactionHolder.java
@@ -39,4 +39,6 @@ final class TransactionHolder {
    public boolean invalid;
 
    public byte[] extraData;
+
+   public boolean committed;
 }

Reply via email to