You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2018/12/14 13:48:24 UTC

[1/2] jena git commit: JENA-1651: Specific counter for tracking active transactions.

Repository: jena
Updated Branches:
  refs/heads/master 2f224de72 -> 1c5b8b541


JENA-1651: Specific counter for tracking active transactions.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/124c7c63
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/124c7c63
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/124c7c63

Branch: refs/heads/master
Commit: 124c7c631dd6b668b79d8628269aae8a56122b4b
Parents: c05f129
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Dec 14 12:16:13 2018 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri Dec 14 12:16:13 2018 +0000

----------------------------------------------------------------------
 .../tdb/transaction/TransactionManager.java     | 51 ++++++++++++--------
 1 file changed, 31 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/124c7c63/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/TransactionManager.java
----------------------------------------------------------------------
diff --git a/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/TransactionManager.java b/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/TransactionManager.java
index 2e3c5ba..207d156 100644
--- a/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/TransactionManager.java
+++ b/jena-tdb/src/main/java/org/apache/jena/tdb/transaction/TransactionManager.java
@@ -54,8 +54,7 @@ public class TransactionManager
     private static boolean checking = true ;
     
     private static Logger log = LoggerFactory.getLogger(TransactionManager.class) ;
-    private Set<Transaction> activeTransactions = ConcurrentHashMap.newKeySet();
-    synchronized public boolean activeTransactions() { return !activeTransactions.isEmpty() ; }
+    private Set<Transaction> currentActiveTransactions = ConcurrentHashMap.newKeySet();
     
     // Setting this true cause the TransactionManager to keep lists of transactions
     // and what has happened.  Nothing is thrown away, but eventually it will
@@ -118,11 +117,16 @@ public class TransactionManager
     // Set on each commit.
     private AtomicLong version = new AtomicLong(0) ;
     
+    // This counter is 0 when quiet, else >0 
+    private AtomicLong activeTransactions = new AtomicLong(0) ;
+    // Not based on activeTransactionsSet.isEmpty() which does a count
+    public boolean activeTransactions()     { return activeTransactions.get() != 0; }
+
     // Accessed by SysTxnState
-    // These must be AtomicLong
+    // Because there are two counters, these can be slightly out of step.
+    // The test (activeReaders==0 & activeWriters==0) isn't atomic overall.
     /*package*/ AtomicLong activeReaders = new AtomicLong(0) ; 
     /*package*/ AtomicLong activeWriters = new AtomicLong(0) ; // 0 or 1
-    
     public long getCountActiveReaders()     { return activeReaders.get() ; }
     public long getCountActiveWriters()     { return activeWriters.get() ; }
     
@@ -205,26 +209,32 @@ public class TransactionManager
         @Override public void readerStarts(Transaction txn)         { logInternal("start",  txn) ; }
         @Override public void readerFinishes(Transaction txn)       { logInternal("finish", txn) ; }
         @Override public void transactionPromotes(Transaction txnOld, Transaction txnNew)
-        { logInternal("promote(old)", txnOld) ; logInternal("promote(new)", txnNew) ; }  
+        { logInternal("promote(old)", txnOld) ; logInternal("promote(new)", txnNew) ; }
         @Override public void writerStarts(Transaction txn)         { logInternal("begin",  txn) ; }
         @Override public void writerCommits(Transaction txn)        { logInternal("commit", txn) ; }
         @Override public void writerAborts(Transaction txn)         { logInternal("abort",  txn) ; }
     }
     
     class TSM_Counters implements TSM {
+        // activeTransactions must be in read/writer ending operation, not transactionFinishes
+        // because the check in checkReplaySafe happens after readerFinishes/writerCommits/writerAborts
+        // but before transactionFinishes.
         TSM_Counters() {}
-        @Override public void transactionStarts(Transaction txn)    { activeTransactions.add(txn) ; }
-        @Override public void transactionFinishes(Transaction txn)  { activeTransactions.remove(txn) ; }
+        @Override public void transactionStarts(Transaction txn)    { currentActiveTransactions.add(txn) ; }
+        @Override public void transactionFinishes(Transaction txn)  { currentActiveTransactions.remove(txn) ; }
         @Override public void transactionCloses(Transaction txn)    { }
-        @Override public void readerStarts(Transaction txn)         { inc(activeReaders) ; }
-        @Override public void readerFinishes(Transaction txn)       { dec(activeReaders) ; inc(finishedReaders); }
+        @Override public void readerStarts(Transaction txn)         { inc(activeTransactions); inc(activeReaders) ; }
+        @Override public void readerFinishes(Transaction txn)       { dec(activeReaders) ; inc(finishedReaders); dec(activeTransactions); }
         
-        @Override public void transactionPromotes(Transaction txnOld, Transaction txnNew)
-        { dec(activeReaders) ; inc(finishedReaders); inc(activeWriters); }
+        @Override public void transactionPromotes(Transaction txnOld, Transaction txnNew) {
+            // Add first so the set is not momentarily empty.
+            currentActiveTransactions.add(txnNew); currentActiveTransactions.remove(txnOld) ;
+            dec(activeReaders) ; inc(finishedReaders); inc(activeWriters);
+        }
         
-        @Override public void writerStarts(Transaction txn)         { inc(activeWriters) ; }
-        @Override public void writerCommits(Transaction txn)        { dec(activeWriters) ; inc(committedWriters) ; }
-        @Override public void writerAborts(Transaction txn)         { dec(activeWriters) ; inc(abortedWriters) ; }
+        @Override public void writerStarts(Transaction txn)         { inc(activeTransactions); inc(activeWriters) ; }
+        @Override public void writerCommits(Transaction txn)        { dec(activeWriters) ; inc(committedWriters) ; dec(activeTransactions); }
+        @Override public void writerAborts(Transaction txn)         { dec(activeWriters) ; inc(abortedWriters) ; dec(activeTransactions); }
     }
     
     // Short name: x++
@@ -523,7 +533,7 @@ public class TransactionManager
     /*package*/ void notifyCommit(Transaction transaction) {
         boolean excessiveQueue = false ;
         synchronized(this) {
-            if ( ! activeTransactions.contains(transaction) )
+            if ( ! currentActiveTransactions.contains(transaction) )
                 SystemTDB.errlog.warn("Transaction not active: "+transaction.getTxnId()) ;
 
             noteTxnCommit(transaction) ;
@@ -561,7 +571,7 @@ public class TransactionManager
     synchronized
     /*package*/ void notifyAbort(Transaction transaction) {
         // Transaction has done the abort on all the transactional elements.
-        if ( ! activeTransactions.contains(transaction) )
+        if ( ! currentActiveTransactions.contains(transaction) )
             SystemTDB.errlog.warn("Transaction not active: "+transaction.getTxnId()) ;
         
         noteTxnAbort(transaction) ;
@@ -852,10 +862,13 @@ public class TransactionManager
     private void checkReplaySafe() {
         if ( ! checking ) 
             return ;
+        long x = activeTransactions.get();
+        if ( x == 0 )
+            return ;
+        // Not a consistent view.
         long r = activeReaders.get();
         long w = activeWriters.get();
-        if ( r != 0 || w != 0 )
-            FmtLog.error(log, "checkReplaySafe: There are currently active transactions. R=%d, W=%d", r, w) ;
+        FmtLog.error(log, "checkReplaySafe: There are currently active transactions. C=%d (R=%d, W=%d)", x, r, w) ;
     }
     
     private void noteTxnStart(Transaction transaction) {
@@ -868,8 +881,6 @@ public class TransactionManager
     }
 
     private void noteTxnPromote(Transaction transaction, Transaction transaction2) {
-        activeTransactions.remove(transaction);
-        activeTransactions.add(transaction2);
         transactionPromotes(transaction, transaction2) ;
     }
 


[2/2] jena git commit: JENA-1651: Merge commit 'refs/pull/509/head' of https://github.com/apache/jena

Posted by an...@apache.org.
JENA-1651: Merge commit 'refs/pull/509/head' of https://github.com/apache/jena

This closes #509.


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/1c5b8b54
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/1c5b8b54
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/1c5b8b54

Branch: refs/heads/master
Commit: 1c5b8b541b8556e5474f14222f541cd2e0b87a52
Parents: 2f224de 124c7c6
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Dec 14 13:33:21 2018 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri Dec 14 13:33:21 2018 +0000

----------------------------------------------------------------------
 .../tdb/transaction/TransactionManager.java     | 51 ++++++++++++--------
 1 file changed, 31 insertions(+), 20 deletions(-)
----------------------------------------------------------------------