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 2011/07/13 15:31:47 UTC

svn commit: r1146007 - in /incubator/jena/Experimental/TxTDB/trunk: src-dev/tx/ src/main/java/com/hp/hpl/jena/tdb/ src/main/java/com/hp/hpl/jena/tdb/base/recordbuffer/ src/main/java/com/hp/hpl/jena/tdb/store/ src/main/java/com/hp/hpl/jena/tdb/sys/ src/...

Author: andy
Date: Wed Jul 13 13:31:46 2011
New Revision: 1146007

URL: http://svn.apache.org/viewvc?rev=1146007&view=rev
Log: (empty)

Modified:
    incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/DevTx.java
    incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/TxMain.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/StoreConnection.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/base/recordbuffer/RecordRangeIterator.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/store/DatasetPrefixesTDB.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/sys/DatasetControlMRSW.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/BlockMgrJournal.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetBuilderTxn.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/NodeTableTrans.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/ObjectFileTrans.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Transaction.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Transactional.java
    incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/AbstractTestNodeTableTrans.java
    incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/AbstractTestObjectFileTrans.java

Modified: incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/DevTx.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/DevTx.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/DevTx.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/DevTx.java Wed Jul 13 13:31:46 2011
@@ -19,15 +19,25 @@ public class DevTx
     //   TripleTable, QuadTable, DatasetPrefixesTDB are just function-adding wrappers.
     //   Then readonly NodeTupleTable.  Remove NodeTableBuilderReadonly
     
+    // ** Remove iterator tracking - too many nested iterator structures to make it reliable.
+    //   All would have to be closeable, including every Iter anon one.  Hard to make reliable.
+    //   Remove from transaction
+    //   ??Remove from BlockMgrJournal and BlockMgr?
+    //   Rely on read/release of blocks.
+    
     // ConcurrencyPolicy -> DatasetControl
     //   .resetControl, remove .setReadMode
     
+    // ?? Journal for BlockMgrs only.
+    //  System journal is just commits/aborts.
+    
     // NodeTable journalling and recovery
     // 3/ general setup
     // Replay ==> JournalCtl.
     // warmReplay, coldReplay 
     // Dataset API
-    // DatasetGraphAPI - everything some kinds of transaction?
+    // DatasetGraphAPI - everything some kinds of transaction?    
+
     // Iterator tracking.
     //   DatasetGraphTDB.find*, prefixes, OpExecutorTDB.OpExecutorPlainTDB=>SolverLib.execute 
     //   OpExecutorTDB.OpExecutorPlainTDB

Modified: incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/TxMain.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/TxMain.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/TxMain.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/TxMain.java Wed Jul 13 13:31:46 2011
@@ -11,7 +11,6 @@ import org.openjena.atlas.lib.FileOps ;
 import org.openjena.atlas.logging.Log ;
 
 import com.hp.hpl.jena.graph.Graph ;
-import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.query.DatasetFactory ;
 import com.hp.hpl.jena.query.Query ;
 import com.hp.hpl.jena.query.QueryExecution ;
@@ -21,25 +20,14 @@ import com.hp.hpl.jena.query.Syntax ;
 import com.hp.hpl.jena.rdf.model.Model ;
 import com.hp.hpl.jena.rdf.model.ModelFactory ;
 import com.hp.hpl.jena.sparql.core.DatasetGraph ;
-import com.hp.hpl.jena.sparql.util.NodeFactory ;
 import com.hp.hpl.jena.sparql.util.QueryExecUtils ;
 import com.hp.hpl.jena.tdb.DatasetGraphTxn ;
 import com.hp.hpl.jena.tdb.ReadWrite ;
 import com.hp.hpl.jena.tdb.StoreConnection ;
-import com.hp.hpl.jena.tdb.TDBFactory ;
-import com.hp.hpl.jena.tdb.base.file.FileFactory ;
-import com.hp.hpl.jena.tdb.base.objectfile.ObjectFile ;
 import com.hp.hpl.jena.tdb.base.record.Record ;
 import com.hp.hpl.jena.tdb.base.record.RecordFactory ;
-import com.hp.hpl.jena.tdb.index.Index ;
-import com.hp.hpl.jena.tdb.index.IndexMap ;
-import com.hp.hpl.jena.tdb.nodetable.NodeTable ;
-import com.hp.hpl.jena.tdb.nodetable.NodeTableInline ;
 import com.hp.hpl.jena.tdb.setup.DatasetBuilderStd ;
 import com.hp.hpl.jena.tdb.store.DatasetGraphTDB ;
-import com.hp.hpl.jena.tdb.store.NodeId ;
-import com.hp.hpl.jena.tdb.sys.SystemTDB ;
-import com.hp.hpl.jena.tdb.transaction.NodeTableTrans ;
 import com.hp.hpl.jena.update.UpdateAction ;
 import com.hp.hpl.jena.update.UpdateFactory ;
 import com.hp.hpl.jena.update.UpdateRequest ;
@@ -67,29 +55,45 @@ public class TxMain
     
     public static void main(String... args)
     {
-        //initFS() ;
-        //** Leaving journals behind after replay.
+        initFS() ;
         StoreConnection sConn = StoreConnection.make(DBdir) ;
         
         // Take a blocking read connection.
-        DatasetGraphTxn dsgRead = sConn.begin(ReadWrite.READ) ;
-        
+        DatasetGraphTxn dsgRead = sConn.begin(ReadWrite.READ) ; // Optional label.
+
         DatasetGraphTxn dsg = sConn.begin(ReadWrite.WRITE) ;
-        load("D.ttl", dsg) ;
-        query("DSG1", "SELECT (count(*) AS ?C) { ?s ?p ?o }", dsg) ;
+        load("D.ttl", dsg) ;    // Loads 3 triples
+        query("SELECT (count(*) AS ?C) { ?s ?p ?o }", dsg) ;
+
+        dsg.commit() ;
+        dsg.close() ;
+        
+        
+        // Reader still open.
+        // At this point, there is a blocking  
+        
+        dsg = sConn.begin(ReadWrite.WRITE) ;
+        load("D1.ttl", dsg) ; // Loads 1 triples
+        
+        query("SELECT (count(*) AS ?C) { ?s ?p ?o }", dsg) ;
+        query("SELECT (count(*) AS ?C) { ?s ?p ?o }", dsgRead) ;
+        
         
-        // Either:
-        //  Cheap: lock on begin/READ.
-        //  
         dsg.commit() ;
-        dsg.close() ;   // Hmm
-//        dsg = sConn.begin(ReadWrite.READ) ;
-//        query("DSG1", "SELECT (count(*) AS ?C) { ?s ?p ?o }", dsg) ;
-//        dsg.close() ;
+        dsg.close() ;
 
-        dsgRead.close() ;   // Transaction can now write changes to the real DB.  
+        DatasetGraphTxn dsgRead2 = sConn.begin(ReadWrite.READ) ;
+        query("SELECT (count(*) AS ?C) { ?s ?p ?o }", dsgRead2) ;
+        dsgRead2.close() ;
+        
+        dsgRead.close() ;   // Transaction can now write changes to the real DB.
+        
+        // ILLEGAL!!!!
+        // query("SELECT (count(*) AS ?C) { ?s ?p ?o }", dsgRead) ;
+        
+        DatasetGraphTxn dsgRead3 = sConn.begin(ReadWrite.READ) ;
+        query("SELECT (count(*) AS ?C) { ?s ?p ?o }", dsgRead3) ;
         
-        query("DSG-R", "SELECT (count(*) AS ?C) { ?s ?p ?o }", dsgRead) ;
         exit(0) ;
     }
     
@@ -99,71 +103,6 @@ public class TxMain
         model.write(System.out, lang) ; 
     }
 
-    private static void execNT()
-    {
-        String dir = "DB" ;
-        FileOps.clearDirectory(dir) ;
-        
-        DatasetGraphTDB dsg = TDBFactory.createDatasetGraph(dir) ;
-        
-//        BPlusTree index = BPlusTree.makeMem(20, 20, SystemTDB.LenNodeHash, SystemTDB.SizeOfNodeId) ;
-        RecordFactory recordFactory = new RecordFactory(SystemTDB.LenNodeHash, SystemTDB.SizeOfNodeId) ;
-//        Index idx = index ;
-        Index idx = new IndexMap(recordFactory) ;
-            
-        //ObjectFile objectFile = FileFactory.createObjectFileMem() ;
-        ObjectFile objectFile = FileFactory.createObjectFileDisk("DB/N.jrnl") ;
-        NodeTable nt0 = dsg.getTripleTable().getNodeTupleTable().getNodeTable() ;
-
-        // Add to the base table.
-        Node node1 = NodeFactory.parseNode("<x>") ; 
-        NodeId id_1 = nt0.getAllocateNodeId(node1) ;
-
-        // Set up the trans table.
-        NodeTableTrans ntt = new NodeTableTrans(nt0, idx, objectFile) ;
-        NodeTable nt = NodeTableInline.create(ntt) ;
-        
-        ntt.begin(null) ;
-        
-        Node node2 = NodeFactory.parseNode("<y>") ;
-        NodeId id_2 = nt.getAllocateNodeId(node2) ;
-        System.out.println("==> "+id_2) ;
-
-        Node node3 = NodeFactory.parseNode("123") ;
-//      n = nt.getNodeForNodeId(id_2) ;
-//      System.out.println("2: ==> "+n) ;
-        NodeId id_3 = nt.getAllocateNodeId(node3) ;
-        System.out.println("==> "+id_3) ;
-        
-        Node n = nt.getNodeForNodeId(id_1) ;
-        System.out.println("1: ==> "+n) ;
-        n = nt.getNodeForNodeId(id_2) ;
-        System.out.println("2: ==> "+n) ;
-        n = nt.getNodeForNodeId(id_3) ;
-        System.out.println("3: ==> "+n) ;
-
-        NodeId x = nt.getNodeIdForNode(node2) ;
-        System.out.println("==> "+x) ;
-        
-        System.out.println("---- Txn") ;
-        System.out.println("Base:  "+nt0.getNodeIdForNode(node1)) ;
-        System.out.println("Trans: "+nt.getNodeIdForNode(node1)) ;
-        System.out.println("Base:  "+nt0.getNodeIdForNode(node2)) ;
-        System.out.println("Trans: "+nt.getNodeIdForNode(node2)) ;
-        System.out.println("Base:  "+nt0.getNodeIdForNode(node3)) ;
-        System.out.println("Trans: "+nt.getNodeIdForNode(node3)) ;
-        
-        ntt.commit(null) ;
-        
-        System.out.println("---- Commit") ;
-        System.out.println("Base:  "+nt0.getNodeIdForNode(node1)) ;
-        System.out.println("Trans: "+nt.getNodeIdForNode(node1)) ;
-        System.out.println("Base:  "+nt0.getNodeIdForNode(node2)) ;
-        System.out.println("Trans: "+nt.getNodeIdForNode(node2)) ;
-        System.out.println("Base:  "+nt0.getNodeIdForNode(node3)) ;
-        System.out.println("Trans: "+nt.getNodeIdForNode(node3)) ;
-    }
-
     private static void initFS()
     {
         FileOps.ensureDir(DBdir) ;
@@ -178,7 +117,13 @@ public class TxMain
         return dsg ;
     }
 
-    public static void query(String label, String queryStr, DatasetGraph dsg)
+    public static void query(String queryStr, DatasetGraphTxn dsg)
+    {
+        String x = "Query ("+dsg.getTransaction().getLabel()+")" ;
+        query(x, queryStr, dsg) ;
+    }
+    
+    public static void query(String label, String queryStr, DatasetGraphTxn dsg)
     {
         System.out.print("**** ") ;
         System.out.println(label) ;
@@ -187,8 +132,16 @@ public class TxMain
         QueryExecUtils.executeQuery(query, qExec) ;
     }
     
-    private static void load(String file, DatasetGraph dsg)
+    private static void load(String file, DatasetGraphTxn dsg)
+    {
+        String x = "Load ("+dsg.getTransaction().getLabel()+")" ;
+        load(x, file, dsg) ;
+    }
+    
+    private static void load(String label, String file, DatasetGraph dsg)
     {
+        System.out.print("**** ") ;
+        System.out.println(label) ;
         System.out.println("Load: "+file) ;
         Model m = ModelFactory.createModelForGraph(dsg.getDefaultGraph()) ;
         FileManager.get().readModel(m, file) ;

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/StoreConnection.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/StoreConnection.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/StoreConnection.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/StoreConnection.java Wed Jul 13 13:31:46 2011
@@ -28,23 +28,31 @@ import com.hp.hpl.jena.tdb.sys.TDBMaker 
 import com.hp.hpl.jena.tdb.transaction.JournalControl ;
 import com.hp.hpl.jena.tdb.transaction.TransactionManager ;
 
-/** Interface to the TDB transaction mechanism */ 
+/** Interface to the TDB transaction mechanism. */ 
 public class StoreConnection
 {
-    private TransactionManager transactionManager = new TransactionManager() ;
+    // Contains the cache.
+    // Most of the work is done in the TransactionManager
     
-    private DatasetGraphTDB baseDSG ;
+    private final TransactionManager transactionManager ;
+    private final DatasetGraphTDB baseDSG ;
 
     private StoreConnection(Location location)
     {
         baseDSG = DatasetBuilderStd.build(location.getDirectoryPath()) ;
+        transactionManager = new TransactionManager(baseDSG) ;
     }
     
     public Location getLocation() { return baseDSG.getLocation() ; }
     
     public DatasetGraphTxn begin(ReadWrite mode)
     {
-        return transactionManager.begin(baseDSG, mode) ;
+        return transactionManager.begin(mode) ;
+    }
+    
+    public DatasetGraphTxn begin(ReadWrite mode, String label)
+    {
+        return transactionManager.begin(mode, label) ;
     }
     
     // ---- statics managing the cache.
@@ -68,8 +76,5 @@ public class StoreConnection
         }
         return sConn ; 
     }
-    
-    
-    
 }
 

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/base/recordbuffer/RecordRangeIterator.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/base/recordbuffer/RecordRangeIterator.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/base/recordbuffer/RecordRangeIterator.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/base/recordbuffer/RecordRangeIterator.java Wed Jul 13 13:31:46 2011
@@ -125,7 +125,10 @@ class RecordRangeIterator implements Ite
         }
         
         if ( slot == null )
+        {
+            close() ;
             return false ;
+        }
         countRecords++ ;
         return true ;
     }

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/store/DatasetPrefixesTDB.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/store/DatasetPrefixesTDB.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/store/DatasetPrefixesTDB.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/store/DatasetPrefixesTDB.java Wed Jul 13 13:31:46 2011
@@ -129,12 +129,13 @@ public class DatasetPrefixesTDB implemen
         Node p = Node.createLiteral(prefix) ; 
         
         Iterator<Tuple<Node>> iter = nodeTupleTable.find(g, p, null) ;
-        if ( ! iter.hasNext() )
-            return null ;
-        Tuple<Node> t = iter.next() ;
-        Node uri = t.get(2) ;
-        Iter.close(iter) ;
-        return uri.getURI() ; 
+        try {
+            if ( ! iter.hasNext() )
+                return null ;
+            Tuple<Node> t = iter.next() ;
+            Node uri = t.get(2) ;
+            return uri.getURI() ;
+        } finally { Iter.close(iter) ; } 
     }
 
     @Override

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/sys/DatasetControlMRSW.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/sys/DatasetControlMRSW.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/sys/DatasetControlMRSW.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/sys/DatasetControlMRSW.java Wed Jul 13 13:31:46 2011
@@ -13,6 +13,9 @@ import java.util.Iterator ;
 import java.util.NoSuchElementException ;
 import java.util.concurrent.atomic.AtomicLong ;
 
+import org.openjena.atlas.iterator.Iter ;
+import org.openjena.atlas.lib.Closeable ;
+
 /** A policy that checks, but does not enforce, single writer or multiple writer locking policy */ 
 public class DatasetControlMRSW implements DatasetControl
 {
@@ -69,7 +72,7 @@ public class DatasetControlMRSW implemen
     @Override
     public <T> Iterator<T> iteratorControl(Iterator<T> iter) { return new IteratorCheckNotConcurrent<T>(iter, epoch) ; }
     
-    private static class IteratorCheckNotConcurrent<T> implements Iterator<T>
+    private static class IteratorCheckNotConcurrent<T> implements Iterator<T>, Closeable
     {
         private Iterator<T> iter ;
         private AtomicLong eCount ;
@@ -103,7 +106,7 @@ public class DatasetControlMRSW implemen
             checkCourrentModification() ;
             boolean b = iter.hasNext() ;
             if ( ! b )
-                finished = true ; 
+                close() ;
             return b ;
         }
 
@@ -112,8 +115,8 @@ public class DatasetControlMRSW implemen
         {
             checkCourrentModification() ;
             try { 
-            return iter.next();
-            } catch (NoSuchElementException ex) { finished = true ; throw ex ; }
+                return iter.next();
+            } catch (NoSuchElementException ex) { close() ; throw ex ; }
         }
 
         @Override
@@ -122,6 +125,13 @@ public class DatasetControlMRSW implemen
             checkCourrentModification() ;
             iter.remove() ;
         }
+
+        @Override
+        public void close()
+        {
+            finished = true ;
+            Iter.close(iter) ;
+        }
     }
 
     

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/BlockMgrJournal.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/BlockMgrJournal.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/BlockMgrJournal.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/BlockMgrJournal.java Wed Jul 13 13:31:46 2011
@@ -48,17 +48,36 @@ public class BlockMgrJournal implements 
         reset(txn, fileRef, blockMgr, journal) ;
     }
 
+    
+//    public void begin(Transaction txn) ;
+//    public void abort(Transaction txn) ;
+//    public void commitPrepare(Transaction txn) ;
+//    public void commitEnact(Transaction txn) ;
+//    public void clearup(Transaction txn) ;
+    
     @Override
-    public void commit(Transaction txn)
+    public void commitPrepare(Transaction txn)
     {
-        //log.info("Commit {} {}", fileRef.getFilename(), writeBlocks.size()) ;
         for ( Block blk : writeBlocks.values() )
             writeJournalEntry(blk) ;
     }
 
     @Override
+    public void commitEnact(Transaction txn)
+    {
+        // No-op : this is done by playing the master journal.
+    }
+
+    @Override
     public void abort(Transaction txn)
     {
+        // Do clearup of in-memory structures in clearup().
+    }
+    
+    @Override
+    public void clearup(Transaction txn)
+    {
+        // Persistent state is in the system journal.
         reset(txn) ;
     }
     

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetBuilderTxn.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetBuilderTxn.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetBuilderTxn.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetBuilderTxn.java Wed Jul 13 13:31:46 2011
@@ -36,11 +36,13 @@ import com.hp.hpl.jena.tdb.sys.SystemTDB
 
 public class DatasetBuilderTxn
 {
+    // Context for the build.
     private TransactionManager txnMgr ;
-    Map<FileRef, BlockMgr> blockMgrs ; 
-    Map<FileRef, NodeTable> nodeTables ;
-    Journal journal ;
-    Transaction txn ;
+    private Map<FileRef, BlockMgr> blockMgrs ; 
+    private Map<FileRef, NodeTable> nodeTables ;
+    private Journal journal ;
+    private Transaction txn ;
+    private DatasetGraphTDB dsg ;
 
     public DatasetBuilderTxn(TransactionManager txnMgr) { this.txnMgr = txnMgr ; }
     
@@ -49,16 +51,17 @@ public class DatasetBuilderTxn
         this.blockMgrs = dsg.getConfig().blockMgrs ;
         this.nodeTables = dsg.getConfig().nodeTables ;
         this.txn = transaction ;
+        this.dsg = dsg ;
             
         switch(mode)
         {
-            case READ : return buildReadonly(transaction, dsg) ;
-            case WRITE : return buildWritable(transaction, dsg) ;
+            case READ : return buildReadonly() ;
+            case WRITE : return buildWritable() ;
             default: return null ;  // Silly Java.
         }
     }
     
-    private DatasetGraphTxn buildReadonly(Transaction transaction, DatasetGraphTDB dsg)
+    private DatasetGraphTxn buildReadonly()
     {
         BlockMgrBuilder blockMgrBuilder = new BlockMgrBuilderReadonly() ;
         NodeTableBuilder nodeTableBuilder = new NodeTableBuilderReadonly() ;
@@ -67,7 +70,7 @@ public class DatasetBuilderTxn
         return new DatasetGraphTxn(dsg2, txn) ;
     }
 
-    private DatasetGraphTDB buildWritable(Transaction transaction, DatasetGraphTDB dsg)
+    private DatasetGraphTDB buildWritable()
     {
         BufferChannel chan ;
         if ( dsg.getLocation().isMem() )

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/NodeTableTrans.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/NodeTableTrans.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/NodeTableTrans.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/NodeTableTrans.java Wed Jul 13 13:31:46 2011
@@ -150,30 +150,43 @@ public class NodeTableTrans implements N
     }
     
     @Override
-    public void commit(Transaction txn)
+    public void commitPrepare(Transaction txn)
     {
         if ( ! inTransaction )
-            throw new TDBTransactionException("Not in a transaction for a commit to happen") ; 
+            throw new TDBTransactionException("Not in a transaction for a commit to happen") ;
+        journal.sync() ;
+    }
+    
+    @Override
+    public void commitEnact(Transaction txn)
+    {
         append() ;
-        base.sync() ;   // NodeTables shoudl do an actual sync only if they have changed.
-        clearUp() ;
+        base.sync() ;   // NodeTables should do an actual sync only if they have changed.
+        journal.reposition(0) ;
     }
 
     @Override
     public void abort(Transaction txn)
     {
-        clearUp() ;
+        journal.reposition(0) ;
     }
     
-    private void clearUp()
+    @Override
+    public void clearup(Transaction txn)
     {
+        journal.truncate(0);
         passthrough = true ;
-        //nodeIndex ;
-        journal.truncate(0) ;
-        journal.close() ;
-        nodeTableJournal = null ;
     }
-    
+
+//    private void clearUp()
+//    {
+//        passthrough = true ;
+//        //nodeIndex ;
+//        journal.truncate(0) ;
+//        journal.close() ;
+//        nodeTableJournal = null ;
+//    }
+//    
     @Override
     public Iterator<Pair<NodeId, Node>> all()
     {

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/ObjectFileTrans.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/ObjectFileTrans.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/ObjectFileTrans.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/ObjectFileTrans.java Wed Jul 13 13:31:46 2011
@@ -52,14 +52,21 @@ public class ObjectFileTrans implements 
     }
     
     @Override
-    public void commit(Transaction txn)
+    public void commitPrepare(Transaction txn)
+    {
+        if ( ! inTransaction )
+            throw new TDBTransactionException("Not in a transaction for a commit to happen") ; 
+        other.sync() ;
+    }
+
+    @Override
+    public void commitEnact(Transaction txn)
     {
         if ( ! inTransaction )
             throw new TDBTransactionException("Not in a transaction for a commit to happen") ; 
         append() ;
         base.sync() ;
         other.reposition(0) ;
-        passthrough = true ;
     }
 
     @Override
@@ -68,6 +75,13 @@ public class ObjectFileTrans implements 
         other.reposition(0) ;
     }
     
+    @Override
+    public void clearup(Transaction txn)
+    {
+        other.truncate(0) ;
+        passthrough = true ;
+    }
+
     /** Copy from the temporary file to the real file */
     public /*temporary*/ void append()
     {

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Transaction.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Transaction.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Transaction.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Transaction.java Wed Jul 13 13:31:46 2011
@@ -11,17 +11,18 @@ import java.util.Collections ;
 import java.util.Iterator ;
 import java.util.List ;
 
-
+import com.hp.hpl.jena.tdb.DatasetGraphTxn ;
 import com.hp.hpl.jena.tdb.ReadWrite ;
 import com.hp.hpl.jena.tdb.store.DatasetGraphTDB ;
 import com.hp.hpl.jena.tdb.sys.FileRef ;
 import com.hp.hpl.jena.tdb.sys.SystemTDB ;
 
-/** A transaction handle */
+/** A transaction.  Much of the work is done in the transaction manager */
 public class Transaction
 {
     // TODO split internal and external features.
     private final long id ;
+    private final String label ;
     private final TransactionManager txnMgr ;
     private final List<Iterator<?>> iterators ; 
     private Journal journal = null ;
@@ -30,14 +31,23 @@ public class Transaction
     
     private final List<NodeTableTrans> nodeTableTrans = new ArrayList<NodeTableTrans>() ;
     private final List<BlockMgrJournal> blkMgrs = new ArrayList<BlockMgrJournal>() ;
-    private DatasetGraphTDB basedsg ;
+    // The dataset this is a transaction over - may be a commited, pending dataset.
+    private DatasetGraphTDB     basedsg ;
+    private DatasetGraphTxn     activedsg ;
 
-    public Transaction(DatasetGraphTDB basedsg, ReadWrite mode, long id, TransactionManager txnMgr)
+    
+    
+    public Transaction(DatasetGraphTDB dsg, ReadWrite mode, long id, String label, TransactionManager txnMgr)
     {
         this.id = id ;
+        if (label == null )
+            label = "Txn" ;
+        label = label+"["+id+"]" ;
+        this.label = label ;
         this.txnMgr = txnMgr ;
-        this.basedsg = basedsg ;
+        this.basedsg = dsg ;
         this.mode = mode ;
+        activedsg = null ;      // Don't know yet.
         this.iterators = new ArrayList<Iterator<?>>() ;
         state = TxnState.ACTIVE ;
     }
@@ -45,13 +55,13 @@ public class Transaction
     synchronized
     public void commit()
     {
+        // Do prepare, write the COMMIT record.
+        // Enacting is left to the TransactionManager.
         if ( mode == ReadWrite.WRITE )
         {
             if ( state != TxnState.ACTIVE )
                 throw new TDBTransactionException("Transaction has already committed or aborted") ; 
 
-            prepare() ;
-
             JournalEntry entry = new JournalEntry(JournalEntryType.Commit, FileRef.Journal, null) ;
             journal.writeJournal(entry) ;
             journal.sync() ;        // Commit point.
@@ -71,9 +81,9 @@ public class Transaction
         state = TxnState.PREPARING ;
         
         for ( BlockMgrJournal x : blkMgrs )
-            x.commit(this) ;
+            x.commitPrepare(this) ;
         for ( NodeTableTrans x : nodeTableTrans )
-            x.commit(this) ;
+            x.commitPrepare(this) ;
     }
 
     /** For testing - do things but do not write the commit record */
@@ -94,14 +104,14 @@ public class Transaction
         if ( state != TxnState.ACTIVE )
             throw new TDBTransactionException("Transaction has already committed or aborted") ; 
         
-        journal.truncate(0) ;
-
         // Clearup.
         for ( BlockMgrJournal x : blkMgrs )
             x.abort(this) ;
         
         for ( NodeTableTrans x : nodeTableTrans )
             x.abort(this) ;
+        journal.truncate(0) ;
+
         state = TxnState.ABORTED ;
         txnMgr.notifyAbort(this) ;
     }
@@ -120,7 +130,7 @@ public class Transaction
                     commit() ;
                 else
                 {
-                    SystemTDB.errlog.warn("Transaction not commited or aborted") ;
+                    SystemTDB.errlog.warn("Transaction not commited or aborted: "+this) ;
                     abort() ;
                 }
                 break ;
@@ -129,13 +139,43 @@ public class Transaction
         
         state = TxnState.CLOSED ;
         txnMgr.notifyClose(this) ;
+        
+        // Imperfect : too many higher level iterators build on unclosables
+        // (e.g. anoniterators in Iter) 
+        // so close does not get passed to the base.   
+//        for ( Iterator<?> iter : iterators )
+//            Log.info(this, "Active iterator: "+iter) ;
+        
+        // Clear per-transaction temnporary state. 
+        iterators.clear() ;
     }
     
     public ReadWrite getMode()                      { return mode ; }
     public TxnState getState()                         { return state ; }
+    
+    List<NodeTableTrans> getNodeTableTrans()
+    {
+        return nodeTableTrans ;
+    }
+
+    List<BlockMgrJournal> getBlkMgrs()
+    {
+        return blkMgrs ;
+    }
+
     public long getTxnId()                          { return id ; }
-    public TransactionManager getTxnMgr()           { return txnMgr ; }
+    TransactionManager getTxnMgr()                  { return txnMgr ; }
     
+    public DatasetGraphTxn getActiveDataset()
+    {
+        return activedsg ;
+    }
+
+    public void setActiveDataset(DatasetGraphTxn activedsg)
+    {
+        this.activedsg = activedsg ;
+    }
+
     public void addIterator(Iterator<?> iter)       { iterators.add(iter) ; }
     public void removeIterator(Iterator<?> iter)    { iterators.remove(iter) ; }
     public List<Iterator<?>> iterators()            { return Collections.unmodifiableList(iterators) ; }
@@ -176,6 +216,11 @@ public class Transaction
     {
         return "Transaction: "+id+" : Mode="+mode+" : State="+state+" : "+basedsg.getLocation().getDirectoryPath() ;
     }
+    
+    public String getLabel()
+    {
+        return label ;
+    }
 }
 
 /*

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java Wed Jul 13 13:31:46 2011
@@ -20,16 +20,15 @@ import java.util.concurrent.LinkedBlocki
 import org.openjena.atlas.logging.Log ;
 import org.slf4j.Logger ;
 
-import com.hp.hpl.jena.sparql.core.DatasetGraph ;
 import com.hp.hpl.jena.tdb.DatasetGraphTxn ;
 import com.hp.hpl.jena.tdb.ReadWrite ;
-import com.hp.hpl.jena.tdb.TDBException ;
 import com.hp.hpl.jena.tdb.store.DatasetGraphTDB ;
 import com.hp.hpl.jena.tdb.sys.SystemTDB ;
 
 public class TransactionManager
 {
     // TODO Don't keep counter, keep lists.
+    // TODO Useful logging.
     
     private static Logger log = SystemTDB.syslog ;
     
@@ -37,20 +36,31 @@ public class TransactionManager
     
     // Transactions that have commit (and the journal is written) but haven't
     // writted back to the main database. 
+    
     private List<Transaction> commitedAwaitingFlush = new ArrayList<Transaction>() ;    
+    
     static long transactionId = 1 ;
     
     private int readers = 0 ; 
-    private int writers = 0 ;       // 0 or 1 
-    private int committed = 0 ;
+    private int writers = 0 ;       // 0 or 1
+    
+    // Misc stats
+    private int finishedReads = 0 ;
+    private int committedWrite = 0 ;
+    private int abortedWrite = 0 ;
 
     private BlockingQueue<Transaction> queue = new LinkedBlockingDeque<Transaction>() ;
 
     private Thread committerThread ;
+
+    private DatasetGraphTDB baseDataset ;
     
     
-    public TransactionManager()
-    { 
+    public TransactionManager(DatasetGraphTDB dsg)
+    {
+//        if ( ! ( dsg instanceof DatasetGraphTDB ) )
+//            throw new TDBException("Not a TDB-backed dataset") ;
+        this.baseDataset = dsg ; 
         // LATER
 //        Committer c = new Committer() ;
 //        this.committerThread = new Thread(c) ;
@@ -58,31 +68,28 @@ public class TransactionManager
 //        committerThread.start() ;
     }
     
-    private Transaction createTransaction(DatasetGraphTDB dsg, ReadWrite mode)
+    private Transaction createTransaction(DatasetGraphTDB dsg, ReadWrite mode, String label)
     {
-        Transaction txn = new Transaction(dsg, mode, transactionId++, this) ;
+        Transaction txn = new Transaction(dsg, mode, transactionId++, label, this) ;
         return txn ;
     }
+
+    public DatasetGraphTxn begin(ReadWrite mode)
+    {
+        return begin(mode, null) ;
+    }
     
     synchronized
-    public DatasetGraphTxn begin(DatasetGraph dsg, ReadWrite mode)
+    public DatasetGraphTxn begin(ReadWrite mode, String label)
     {
-        if ( log.isDebugEnabled() )
-            log.debug(format("begin: R={} / W={} / #={}", readers, writers,activeTransactions.size())) ;
-        
-        // If already a transaction ... 
-        // Subs transactions are a new view - commit is only commit to parent transaction.  
-        if ( dsg instanceof DatasetGraphTxn )
-        {
-            throw new TDBException("Already in transactional DatasetGraph") ;
-            // Either:
-            //   error -> implies nested
-            //   create new transaction 
-        }
-        
-        if ( ! ( dsg instanceof DatasetGraphTDB ) )
-            throw new TDBException("Not a TDB-backed dataset") ;
-
+//        // Subs transactions are a new view - commit is only commit to parent transaction.  
+//        if ( dsg instanceof DatasetGraphTxn )
+//        {
+//            throw new TDBException("Already in transactional DatasetGraph") ;
+//            // Either:
+//            //   error -> implies nested
+//            //   create new transaction 
+//        }
         switch (mode)
         {
             case READ : readers++ ; break ;
@@ -93,15 +100,18 @@ public class TransactionManager
                 break ;
         }
         
-        DatasetGraphTDB dsgtdb = (DatasetGraphTDB)dsg ;
-        // THIS IS NECESSARY BECAUSE THE DATASET MAY HAVE BEEN UPDATED AND CHANGES STILL IN CACHES.
-        // MUST WRITE OUT - BUT ALSO REUSE CACHES.
-        dsgtdb.sync() ; 
+        DatasetGraphTDB dsg = baseDataset ;
+        // *** But, if there are pending, committed transactions, use one.
+        if ( ! commitedAwaitingFlush.isEmpty() )
+            dsg = commitedAwaitingFlush.get(commitedAwaitingFlush.size()-1).getActiveDataset() ;
         
-        Transaction txn = createTransaction(dsgtdb, mode) ;
         
-        DatasetGraphTxn dsgTxn = (DatasetGraphTxn)new DatasetBuilderTxn(this).build(txn, mode, dsgtdb) ;
+        Transaction txn = createTransaction(dsg, mode, label) ;
+        DatasetGraphTxn dsgTxn = (DatasetGraphTxn)new DatasetBuilderTxn(this).build(txn, mode, dsg) ;
+        txn.setActiveDataset(dsgTxn) ;
         Iterator<Transactional> iter = dsgTxn.getTransaction().components() ;
+        
+        // Notify everyone we're starting.
         for ( ; iter.hasNext() ; )
             iter.next().begin(dsgTxn.getTransaction()) ;
 
@@ -117,8 +127,11 @@ public class TransactionManager
         if ( log.isDebugEnabled() )
             log.debug("commit: "+transaction) ;
 
+        // Transaction has done the commitPrepare - can we enact it?
+        
         if ( ! activeTransactions.contains(transaction) )
             SystemTDB.errlog.warn("Transaction not active: "+transaction.getTxnId()) ;
+        
         endTransaction(transaction) ;
         
         if ( readers == 0 && transaction.getMode() == ReadWrite.WRITE )
@@ -133,11 +146,32 @@ public class TransactionManager
         }
     }
 
+    private void commitTransaction(Transaction transaction)
+    {
+        // Really, really do it!
+        for ( BlockMgrJournal x : transaction.getBlkMgrs() )
+        {
+            x.commitEnact(transaction) ;
+            x.clearup(transaction) ;
+        }
+        
+        for ( NodeTableTrans x : transaction.getNodeTableTrans() )
+        {
+            x.commitEnact(transaction) ;
+            x.clearup(transaction) ;
+        }
+        
+        // This cleans up as well.
+        JournalControl.replay(transaction.getJournal(), transaction.getBaseDataset()) ;
+    }
+    
     synchronized
     public void notifyAbort(Transaction transaction)
     {    
+        // Transaction has done the abort on all the transactional elements.
+        // TODO Suppose the system journal has  
         if ( log.isDebugEnabled() )
-            log.info("notifyAbort: "+transaction) ;
+            log.info("abort: "+transaction) ;
         if ( ! activeTransactions.contains(transaction) )
             SystemTDB.errlog.warn("Transaction not active: "+transaction.getTxnId()) ;
         endTransaction(transaction) ;
@@ -156,6 +190,7 @@ public class TransactionManager
             txn.abort() ;
         }
 
+        // Process any pending commits held up due to a reader. 
         if ( readers == 0 && writers == 0 ) 
         {
             // Given this is sync'ed to the TransactionManager, 
@@ -185,18 +220,12 @@ public class TransactionManager
     
     private void endTransaction(Transaction transaction)
     {
-        if ( log.isDebugEnabled() )
-            log.debug("endTransaction: "+transaction) ;
-        
         if ( transaction.getMode() == READ )
             readers-- ;
         else
             writers-- ;
         activeTransactions.remove(transaction) ;
         
-        if ( log.isDebugEnabled() )
-            log.debug(format("endTransaction: R=%d / W=%d / #=%d\n", readers, writers,activeTransactions.size())) ;
-        
     }
 
     // LATER.

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Transactional.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Transactional.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Transactional.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Transactional.java Wed Jul 13 13:31:46 2011
@@ -11,11 +11,24 @@ package com.hp.hpl.jena.tdb.transaction;
  */ 
 public interface Transactional
 {
-    // version 1
+    // begin - commitPrepare - commitEnact - clearup
+    // begin - abort - clearup
+    // May be reused via a new call to begin - see impl for if that's possible. 
+    
+    /** Start an update transaction */  
     public void begin(Transaction txn) ;
-    public void commit(Transaction txn) ;
-    //public boolean postCommit(Transaction txn) ;
+    
+    /** End of active phase - will not be making these changes*/
     public void abort(Transaction txn) ;
+    
+    /** End of active phase. Make changes safe; do not update the base data. */
+    public void commitPrepare(Transaction txn) ;
+
+    /** Update the base data */ 
+    public void commitEnact(Transaction txn) ;
+    
+    /** All done - transaction committed and incorporated in the base dataset */
+    public void clearup(Transaction txn) ;
 }
 
 /*

Modified: incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/AbstractTestNodeTableTrans.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/AbstractTestNodeTableTrans.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/AbstractTestNodeTableTrans.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/AbstractTestNodeTableTrans.java Wed Jul 13 13:31:46 2011
@@ -44,10 +44,15 @@ public abstract class AbstractTestNodeTa
         }
     }
     
+    Transaction createTxn(long id) 
+    {
+        return new Transaction(null, null, id, null, null) ; 
+    }
+    
     @Test public void nodetrans_01()
     {
         NodeTableTrans ntt = create() ;
-        Transaction txn = new Transaction(null, null, 11, null) ; 
+        Transaction txn = createTxn(11) ; 
         ntt.begin(txn) ;
         ntt.abort(txn) ;
     }
@@ -58,7 +63,7 @@ public abstract class AbstractTestNodeTa
         NodeTableTrans ntt = create() ;
         NodeTable nt0 = ntt.getBaseNodeTable() ;
         
-        Transaction txn = new Transaction(null, null, 11, null) ; 
+        Transaction txn = createTxn(11) ; 
         ntt.begin(txn) ;
         // Add a node
         NodeId nodeId = ntt.getAllocateNodeId(node1) ;
@@ -68,10 +73,12 @@ public abstract class AbstractTestNodeTa
         assertEquals(NodeId.NodeDoesNotExist, nt0.getNodeIdForNode(node1)) ;
         assertEquals(node1, ntt.getNodeForNodeId(nodeId)) ;
         
-        ntt.commit(txn) ;
+        ntt.commitPrepare(txn) ;
+        ntt.commitEnact(txn) ;
         // Check it is now in the base.
         assertEquals(node1, nt0.getNodeForNodeId(nodeId)) ;
         assertEquals(nodeId, nt0.getNodeIdForNode(node1)) ;
+        ntt.clearup(txn) ;
     }
 
     @Test public void nodetrans_03()
@@ -79,7 +86,7 @@ public abstract class AbstractTestNodeTa
         NodeTableTrans ntt = create() ;
         NodeTable nt0 = ntt.getBaseNodeTable() ;
         
-        Transaction txn = new Transaction(null, null, 11, null) ; 
+        Transaction txn = createTxn(11) ; 
         ntt.begin(txn) ;
         // Add a node
         NodeId nodeId = ntt.getAllocateNodeId(node1) ;
@@ -93,13 +100,14 @@ public abstract class AbstractTestNodeTa
         // Check it is not in the base.
         assertEquals(NodeId.NodeDoesNotExist, nt0.getNodeIdForNode(node1)) ;
         assertNull(nt0.getNodeForNodeId(nodeId)) ;
+        ntt.clearup(txn) ;
     }
     
     @Test public void nodetrans_04()
     {
         NodeTableTrans ntt = create(node1) ;
         NodeTable nt0 = ntt.getBaseNodeTable() ;
-        Transaction txn = new Transaction(null, null, 11, null) ; 
+        Transaction txn = createTxn(11) ; 
         ntt.begin(txn) ;
         // Add a node
         NodeId nodeId = ntt.getAllocateNodeId(node2) ;
@@ -107,8 +115,10 @@ public abstract class AbstractTestNodeTa
         assertEquals(NodeId.NodeDoesNotExist, nt0.getNodeIdForNode(node2)) ;
         // Is here
         assertEquals(nodeId, ntt.getNodeIdForNode(node2)) ;
-        ntt.commit(txn) ;
+        ntt.commitPrepare(txn) ;
+        ntt.commitEnact(txn) ;
         assertEquals(nodeId, nt0.getNodeIdForNode(node2)) ;
+        ntt.clearup(txn) ;
     }
 
 }

Modified: incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/AbstractTestObjectFileTrans.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/AbstractTestObjectFileTrans.java?rev=1146007&r1=1146006&r2=1146007&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/AbstractTestObjectFileTrans.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/AbstractTestObjectFileTrans.java Wed Jul 13 13:31:46 2011
@@ -34,7 +34,7 @@ public abstract class AbstractTestObject
     @Before
     public void setup()
     {
-        txn = new Transaction(null, null, ++count, null) ;
+        txn = new Transaction(null, null, ++count, null, null) ;
         file1 = createFile("base") ;
         file2 = createFile("log") ;
     }
@@ -89,8 +89,10 @@ public abstract class AbstractTestObject
         
         file.begin(txn) ; 
         contains(file2) ;
-        file.commit(txn) ;
+        file.commitPrepare(txn) ;
+        file.commitEnact(txn) ;
         contains(file1, "ABC") ;
+        file.clearup(txn) ;
     }
 
     @Test public void objFileTrans_03()
@@ -99,8 +101,10 @@ public abstract class AbstractTestObject
         init() ;
         file.begin(txn) ; 
         write(file, "X") ;
-        file.commit(txn) ;
+        file.commitPrepare(txn) ;
+        file.commitEnact(txn) ;
         contains(file1, "ABC", "X") ;
+        file.clearup(txn) ;
     }
 
     @Test public void objFileTrans_04()
@@ -109,8 +113,10 @@ public abstract class AbstractTestObject
         init() ;
         file.begin(txn) ; 
         write(file, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") ;
-        file.commit(txn) ;
+        file.commitPrepare(txn) ;
+        file.commitEnact(txn) ;
         contains(file1, "ABC", "ABC", "ABCDEFGHIJKLMNOPQRSTUVWXYZ") ;
+        file.clearup(txn) ;
     }
 
     @Test public void objFileTrans_05()
@@ -121,6 +127,7 @@ public abstract class AbstractTestObject
         write(file, "ABCDEF") ;
         file.abort(txn) ;
         contains(file1, "ABC") ;
+        file.clearup(txn) ;
     }
 
     @Test public void objFileTrans_06()