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/01 22:39:48 UTC

svn commit: r1142086 - in /incubator/jena/Experimental/TxTDB/trunk: src-dev/tx/ src/main/java/com/hp/hpl/jena/tdb/store/ src/main/java/com/hp/hpl/jena/tdb/transaction/ src/test/java/com/hp/hpl/jena/tdb/transaction/

Author: andy
Date: Fri Jul  1 20:39:47 2011
New Revision: 1142086

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

Removed:
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetBuilderTxn_Old.java
Modified:
    incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/Replay.java
    incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/TxMain.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/store/DatasetGraphTDB.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/DatasetGraphTxnTDB.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Journal.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/JournalEntry.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/JournalEntryType.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/Transaction.java
    incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/TransactionManager.java
    incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/TestJournal.java

Modified: incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/Replay.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/Replay.java?rev=1142086&r1=1142085&r2=1142086&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/Replay.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/Replay.java Fri Jul  1 20:39:47 2011
@@ -5,48 +5,53 @@
  */
 
 package tx;
-//import static tx.journal.JournalEntryType.* ;
 
 import java.nio.ByteBuffer ;
 
+import com.hp.hpl.jena.tdb.base.block.Block ;
 import com.hp.hpl.jena.tdb.transaction.Journal ;
 import com.hp.hpl.jena.tdb.transaction.JournalEntry ;
 
-
 public class Replay
 {
-    public static void reply(Journal journal)
+    public static void print(Journal journal)
     {
         for ( JournalEntry e : journal )
         {
-            
+            System.out.println("Entry: ") ;
             ByteBuffer bb = e.getByteBuffer() ;
-            
-            e.getFileRef() ;
-            
-            switch (e.getType())
-            {
-                case Block:
-                    // Get block ref.
-                    // Find block mgr
-                    // do it.
-                    break ;
-                case Object:
-                    // Get id
-                    // get bytes
-                    // dispatch to NodeTable.
-                    // ?? Node rebuilding?
-                    // Check ids.
-                    break ;
-                case Commit:
-                    break ;
-                case Abort:
-                    break ;
-                case Checkpoint:
-                    //default:
-            }
+            Block blk = e.getBlock() ;
+            if ( bb != null )
+                System.out.println("  "+bb) ;
+            if ( blk != null )
+                System.out.println("  "+blk) ;
+            System.out.println("  "+e.getFileRef()) ;
+            System.out.println("  "+e.getType()) ;
         }
     }
+//            switch (e.getType())
+//            {
+//                case Block:
+//                    // Get block ref.
+//                    // Find block mgr
+//                    // do it.
+//                    break ;
+//                case Object:
+//                    // Get id
+//                    // get bytes
+//                    // dispatch to NodeTable.
+//                    // ?? Node rebuilding?
+//                    // Check ids.
+//                    break ;
+//                case Commit:
+//                    break ;
+//                case Abort:
+//                    break ;
+//                case Checkpoint:
+//                    //default:
+//            }
+//        }
+//    }
 }
 
 /*

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=1142086&r1=1142085&r2=1142086&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/TxMain.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src-dev/tx/TxMain.java Fri Jul  1 20:39:47 2011
@@ -28,6 +28,8 @@ import com.hp.hpl.jena.sparql.util.NodeF
 import com.hp.hpl.jena.sparql.util.QueryExecUtils ;
 import com.hp.hpl.jena.tdb.TDBFactory ;
 import com.hp.hpl.jena.tdb.base.block.FileMode ;
+import com.hp.hpl.jena.tdb.base.file.BufferChannel ;
+import com.hp.hpl.jena.tdb.base.file.BufferChannelFile ;
 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 ;
@@ -43,8 +45,8 @@ import com.hp.hpl.jena.tdb.store.Dataset
 import com.hp.hpl.jena.tdb.store.DatasetPrefixesTDB ;
 import com.hp.hpl.jena.tdb.store.NodeId ;
 import com.hp.hpl.jena.tdb.sys.SystemTDB ;
-import com.hp.hpl.jena.tdb.transaction.DatasetBuilderTxn ;
 import com.hp.hpl.jena.tdb.transaction.DatasetGraphTxnTDB ;
+import com.hp.hpl.jena.tdb.transaction.Journal ;
 import com.hp.hpl.jena.tdb.transaction.NodeTableTrans ;
 import com.hp.hpl.jena.tdb.transaction.TransactionManager ;
 import com.hp.hpl.jena.update.UpdateAction ;
@@ -74,6 +76,9 @@ public class TxMain
     
     public static void main(String... args)
     {
+        // next: write block id to Journal 
+        // Next: API, transactions, and rollback.
+        
         if ( false ) 
             SystemTDB.setFileMode(FileMode.direct) ;
         
@@ -81,11 +86,20 @@ public class TxMain
         DatasetGraphTDB dsg0 = build() ;
         query("SELECT (Count(*) AS ?c) { ?s ?p ?o }", dsg0) ;
 
-        DatasetGraphTDB dsg1 = new DatasetBuilderTxn(new TransactionManager()).build(dsg0) ;
+        TransactionManager txnMgr = new TransactionManager() ;
+        
+        DatasetGraphTxnTDB dsg1 = txnMgr.begin(dsg0) ;
+        
         load("D.ttl", dsg1) ;
         query("SELECT (Count(*) AS ?c) { ?s ?p ?o }", dsg1) ;
         query("SELECT (Count(*) AS ?c) { ?s ?p ?o }", dsg0) ;
         
+        dsg1.commit() ;
+        
+        BufferChannel bc = new BufferChannelFile(DBdir+"/journal.jrnl") ;
+        Journal j = new Journal(bc) ;
+        Replay.print(j) ;
+        
         exit(0) ;
         deconstruct(dsg0) ;
         

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/store/DatasetGraphTDB.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/store/DatasetGraphTDB.java?rev=1142086&r1=1142085&r2=1142086&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/store/DatasetGraphTDB.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/store/DatasetGraphTDB.java Fri Jul  1 20:39:47 2011
@@ -8,7 +8,6 @@ package com.hp.hpl.jena.tdb.store;
 
 
 import java.util.Iterator ;
-import java.util.Properties ;
 
 import org.openjena.atlas.iterator.Iter ;
 import org.openjena.atlas.iterator.Transform ;

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=1142086&r1=1142085&r2=1142086&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 Fri Jul  1 20:39:47 2011
@@ -13,7 +13,6 @@ import java.util.Iterator ;
 import java.util.Map ;
 import java.util.Set ;
 
-import org.openjena.atlas.lib.NotImplemented ;
 import org.openjena.atlas.logging.Log ;
 
 import com.hp.hpl.jena.tdb.base.block.Block ;
@@ -49,7 +48,8 @@ public class BlockMgrJournal implements 
     @Override
     public void commit(Transaction txn)
     {
-        throw new NotImplemented("yet") ;
+        for ( Block blk : writeBlocks.values() )
+            writeJournalEntry(blk) ;
     }
 
     @Override
@@ -246,15 +246,11 @@ public class BlockMgrJournal implements 
     {
         checkIfClosed() ;
         blockMgr.endRead() ;
-        for ( Block blk : writeBlocks.values() )
-            writeJournalEntry(blk) ;
     }
 
     private void writeJournalEntry(Block blk)
     {
-        // Space for BlockRef.
-        // [TxTDB:TODO] Space for BlockRef.
-        JournalEntry entry = new JournalEntry(JournalEntryType.Block, fileRef, blk.getByteBuffer()) ;
+        JournalEntry entry = new JournalEntry(fileRef, blk) ;
         journal.writeJournal(entry) ;
     }
     

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=1142086&r1=1142085&r2=1142086&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 Fri Jul  1 20:39:47 2011
@@ -52,14 +52,15 @@ public class DatasetBuilderTxn
         else
             chan = new BufferChannelFile(dsg.getLocation().absolute(Names.journalFile)) ;
         journal = new Journal(chan) ;
+        txn.set(journal) ;
         
         BlockMgrBuilder blockMgrBuilder = new BlockMgrBuilderTx() ;
         NodeTableBuilder nodeTableBuilder = new NodeTableBuilderTx() ;
         
-        //  [TxTDB:PATCH-UP] FAKE BEGIN
-        
         DatasetBuilderStd x = new DatasetBuilderStd(blockMgrBuilder, nodeTableBuilder) ;
-        return x.build(dsg.getLocation(), dsg.getConfig().properties) ;    
+        DatasetGraphTDB dsg2 = x.build(dsg.getLocation(), dsg.getConfig().properties) ;
+        return new DatasetGraphTxnTDB(dsg2, txn) ;
+        
     }
     
     
@@ -104,7 +105,7 @@ public class DatasetBuilderTxn
                 objectFile = FileFactory.createObjectFileDisk(objFilename) ;
 
             NodeTableTrans ntt = new NodeTableTrans(ntBase, idx, objectFile) ;
-            ntt.begin(txn) ; //  [TxTDB:PATCH-UP] FAKE BEGIN
+            txn.add(ntt) ;
             
             // Add inline wrapper.
             NodeTable nt = NodeTableInline.create(ntt) ;
@@ -122,8 +123,9 @@ public class DatasetBuilderTxn
             BlockMgr baseMgr = blockMgrs.get(ref) ;
             if ( baseMgr == null )
                 throw new TDBException("No BlockMgr for "+ref) ;
-            BlockMgrJournal blkMg = new BlockMgrJournal(txn, ref, baseMgr, journal) ;
-            return blkMg ;
+            BlockMgrJournal blkMgr = new BlockMgrJournal(txn, ref, baseMgr, journal) ;
+            txn.add(blkMgr) ;
+            return blkMgr ;
         }
     }
 }

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetGraphTxnTDB.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetGraphTxnTDB.java?rev=1142086&r1=1142085&r2=1142086&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetGraphTxnTDB.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/DatasetGraphTxnTDB.java Fri Jul  1 20:39:47 2011
@@ -18,6 +18,8 @@ public class DatasetGraphTxnTDB extends 
         this.transaction = txn ;
     }
 
+    public Transaction getTransaction() { return transaction ; }
+    
     public void commit() { transaction.commit() ; }
     public void abort() { transaction.abort() ; }
     

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Journal.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Journal.java?rev=1142086&r1=1142085&r2=1142086&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Journal.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/Journal.java Fri Jul  1 20:39:47 2011
@@ -7,7 +7,7 @@
 package com.hp.hpl.jena.tdb.transaction;
 
 import static com.hp.hpl.jena.tdb.sys.SystemTDB.SizeOfInt ;
-
+import static com.hp.hpl.jena.tdb.transaction.JournalEntryType.* ;
 import java.nio.ByteBuffer ;
 import java.util.Iterator ;
 
@@ -16,6 +16,7 @@ import org.openjena.atlas.lib.Closeable 
 import org.openjena.atlas.lib.Sync ;
 
 
+import com.hp.hpl.jena.tdb.base.block.Block ;
 import com.hp.hpl.jena.tdb.base.file.BufferChannel ;
 import com.hp.hpl.jena.tdb.sys.FileRef ;
 
@@ -37,12 +38,14 @@ class Journal implements Iterable<Journa
     
     BufferChannel channel ;
     private long position ;
-    // Length, type, fileRef.
+    // Length, type, fileRef, [block id]
     // Length is length of variable part.
-    public static int Overhead = 3*SizeOfInt ;
+    public static int Overhead = 4*SizeOfInt ;
+    public static final int NoId = 5 ;
     
-    byte[] buffer = new byte[Overhead] ;
-    ByteBuffer header = ByteBuffer.wrap(buffer) ;
+//    byte[] _buffer = new byte[Overhead] ;
+//    ByteBuffer header = ByteBuffer.wrap(_buffer) ;
+    ByteBuffer header = ByteBuffer.allocate(Overhead) ;
     
     public Journal(BufferChannel channel)
     {
@@ -53,24 +56,38 @@ class Journal implements Iterable<Journa
     synchronized
     public long writeJournal(JournalEntry entry)
     {
-        return  _write(entry.getType(), entry.getFileRef(), entry.getByteBuffer()) ;
+        return  _write(entry.getType(), entry.getFileRef(), entry.getByteBuffer(), entry.getBlock()) ;
     }
     
     synchronized
     public long writeJournal(JournalEntryType type, FileRef fileRef, ByteBuffer buffer)
     {
-        return _write(type, fileRef, buffer) ;
+        return _write(type, fileRef, buffer, null) ;
+    }
+    
+    synchronized
+    public long writeJournal(FileRef fileRef, Block block)
+    {
+        return _write(Block, fileRef, null, block) ;
     }
      
     synchronized
-    private long _write(JournalEntryType type, FileRef fileRef, ByteBuffer buffer)
+    private long _write(JournalEntryType type, FileRef fileRef, ByteBuffer buffer, Block block)
     {
-        // FileRefs: one int.
+        if ( buffer != null && block != null )
+            throw new TDBTransactionException("Buffer and block to write") ;
+        if ( block != null )
+            buffer = block.getByteBuffer() ;
+
+        if ( block != null && type != Block )
+            throw new TDBTransactionException("Block to write but not block type") ;
         
         long posn = position ;
         int len = 0 ;
         
         // [TxDEV:TODO] CRC
+        // [TxDEV:TODO] compress
+        
         if ( buffer != null )
             len = buffer.remaining() ; 
         
@@ -78,12 +95,18 @@ class Journal implements Iterable<Journa
         header.putInt(type.id) ;
         header.putInt(len) ;
         header.putInt(fileRef.getId()) ;
+        int blkId = (block==null) ? NoId : block.getId().intValue() ;
+        header.putInt(blkId) ;
         header.flip() ;
-
         channel.write(header) ;
+        
         if ( len > 0 )
+        {
+            int x = buffer.position() ;
             // Write bytes
             channel.write(buffer) ;
+            buffer.position(x) ;
+        }
         
         position += len+Overhead ;
         return posn ;
@@ -103,18 +126,30 @@ class Journal implements Iterable<Journa
     // Move position to end of read.
     private JournalEntry _read()
     {
+        // UGLY Maybe better to leave some space in the block's byte buffer.
         // [TxTDB:TODO] Make robust against partial read.
         header.clear() ;
         channel.read(header) ;
         header.rewind() ;
-        int typeId = header.getInt() ; 
-        int len    = header.getInt() ;
-        int ref    = header.getInt() ;
+        int typeId  = header.getInt() ; 
+        int len     = header.getInt() ;
+        int ref     = header.getInt() ;
+        int blockId = header.getInt() ;
+        
+        JournalEntryType type = JournalEntryType.type(typeId) ;
         FileRef fileRef = FileRef.get(ref) ;
         ByteBuffer bb = ByteBuffer.allocate(len) ;
+        Block block = null ;
         channel.read(bb) ;
-        JournalEntryType type = JournalEntryType.type(typeId) ;
-        return new JournalEntry(type, fileRef, bb) ;
+        bb.rewind() ;
+        if ( type == Block )
+        {
+            block = new Block(blockId, bb) ;
+            bb = null ;
+        }
+        else
+            blockId = NoId ;
+        return new JournalEntry(type, fileRef, bb, block) ;
     } 
 
     /** Iterator of entries from current point in Journal, going forward. Must be JournalEntry aligned at start. */

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/JournalEntry.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/JournalEntry.java?rev=1142086&r1=1142085&r2=1142086&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/JournalEntry.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/JournalEntry.java Fri Jul  1 20:39:47 2011
@@ -8,6 +8,7 @@ package com.hp.hpl.jena.tdb.transaction;
 
 import java.nio.ByteBuffer ;
 
+import com.hp.hpl.jena.tdb.base.block.Block ;
 import com.hp.hpl.jena.tdb.sys.FileRef ;
 
 
@@ -16,26 +17,42 @@ public class JournalEntry
     static public final JournalEntry Commit = new JournalEntry(JournalEntryType.Commit) ;
     static public final JournalEntry Abort = new JournalEntry(JournalEntryType.Abort) ;
     static public final JournalEntry CheckPoint = new JournalEntry(JournalEntryType.Checkpoint) ;
-    private final JournalEntryType type ;
+    
+    private final JournalEntryType type ;   // One or other must be null - or both.
     private final ByteBuffer byteBuffer ;
+    private final Block block ;
+    private final int id = -98 ;
     private final FileRef fileRef ;
     
     private JournalEntry(JournalEntryType type)
     {
-        this.type = type ;
-        this.byteBuffer = null ;
-        this.fileRef = null ;
+        this(type, null, null, null) ;
     }
     
     public JournalEntry(JournalEntryType type, FileRef fileRef, ByteBuffer bytes)
     {
+        this(type, fileRef, bytes, null) ;
+    }
+    
+    public JournalEntry(FileRef fileRef, Block block)
+    {
+        this(JournalEntryType.Block, fileRef, null, block) ;
+    }
+
+    JournalEntry(JournalEntryType type, FileRef fileRef, ByteBuffer bytes, Block block)
+    {
+        if ( bytes != null && block != null )
+            throw new TDBTransactionException("buffer != null and block != null") ;
         this.type = type ;
         this.byteBuffer = bytes ;
+        this.block = block ;
         this.fileRef = fileRef ;
     }
+    
 
     public JournalEntryType getType()       { return type ; }
     public ByteBuffer getByteBuffer()       { return byteBuffer ; }
+    public Block getBlock()                 { return block ; }
     public FileRef getFileRef()             { return fileRef ; }
 }
 

Modified: incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/JournalEntryType.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/JournalEntryType.java?rev=1142086&r1=1142085&r2=1142086&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/JournalEntryType.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/main/java/com/hp/hpl/jena/tdb/transaction/JournalEntryType.java Fri Jul  1 20:39:47 2011
@@ -12,7 +12,7 @@ import org.openjena.atlas.logging.Log ;
 public enum JournalEntryType 
 { 
     // Abort is used 
-    Block(1), Object(2), Commit(3), Abort(4), Checkpoint(5) ;
+    Block(1), Buffer(2), Object(3), Commit(4), Abort(5), Checkpoint(6) ;
     
     final int id ;
     JournalEntryType(int x) { id = x ; }
@@ -20,6 +20,7 @@ public enum JournalEntryType 
     static public JournalEntryType type(int x)
     {
         if ( x == Block.id )                return Block ;
+        else if ( x == Buffer.id )          return Buffer ;
         else if ( x == Object.id )          return Object ;
         else if ( x == Commit.id )          return Commit ;
         else if ( x == Abort.id )           return Abort ;

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=1142086&r1=1142085&r2=1142086&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 Fri Jul  1 20:39:47 2011
@@ -51,7 +51,8 @@ public class NodeTableTrans implements N
 
         this.nodeIndex = nodeIndex ;
         this.journal = journal ;
-        this.nodeTableJournal = null ;
+        nodeTableJournal = new NodeTableNative(nodeIndex, journal) ;
+        nodeTableJournal = NodeTableCache.create(sub, CacheSize, CacheSize) ;
     }
 
     public void setPassthrough(boolean v)   { passthrough = v ; }

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=1142086&r1=1142085&r2=1142086&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 Fri Jul  1 20:39:47 2011
@@ -21,35 +21,43 @@ public class Transaction
     private final long id ;
     private final TransactionManager txnMgr ;
     private final List<Iterator<?>> iterators ; 
-    private final List<Journal> journals = new ArrayList<Journal>() ;
-    private final List<ObjectFileTrans> objJournals = new ArrayList<ObjectFileTrans>() ;
+    private Journal journal = null ;
+    
+    private final List<NodeTableTrans> nodeTableTrans = new ArrayList<NodeTableTrans>() ;
+    private final List<BlockMgrJournal> blkMgrs = new ArrayList<BlockMgrJournal>() ;
 
     public Transaction(long id, TransactionManager txnMgr)
     {
         this.id = id ;
         this.txnMgr = txnMgr ;
+        //this.journal = journal ;
         this.iterators = new ArrayList<Iterator<?>>() ;
     }
 
     public void commit()
     {
-        // Write commit entry.
-        if ( journals.size() > 0 )
-        {
-            Journal jrnl = journals.get(0) ;
-            JournalEntry entry = new JournalEntry(JournalEntryType.Commit, FileRef.Journal, null) ;
-            jrnl.writeJournal(entry) ;
-        }
+        for ( BlockMgrJournal x : blkMgrs )
+            x.commit(this) ;
         
+        for ( NodeTableTrans x : nodeTableTrans )
+            x.commit(this) ;
         
-        for ( ObjectFileTrans jrnl : objJournals )
-            jrnl.sync() ;
+        JournalEntry entry = new JournalEntry(JournalEntryType.Commit, FileRef.Journal, null) ;
+        journal.writeJournal(entry) ;
+        journal.sync() ;        // Commit point.
+    }
     
-        for ( Journal jrnl : journals )
-            jrnl.sync() ;
+    public void abort()
+    { 
+        // Clearup.
+        for ( BlockMgrJournal x : blkMgrs )
+            x.abort(this) ;
+        
+        for ( NodeTableTrans x : nodeTableTrans )
+            x.abort(this) ;
     }
     
-    public void abort()                             { txnMgr.abort(this) ; }
+    
     public long getTxnId()                          { return id ; }
     public TransactionManager getTxnMgr()           { return txnMgr ; }
     
@@ -57,14 +65,28 @@ public class Transaction
     public void removeIterator(Iterator<?> iter)    { iterators.remove(iter) ; }
     public List<Iterator<?>> iterators()            { return Collections.unmodifiableList(iterators) ; }
     
-    public void add(Journal journal)
+    public Iterator<Transactional> components()
+    {
+        // FIX NEEDED
+        List<Transactional> x = new ArrayList<Transactional>() ;
+        x.addAll(nodeTableTrans) ;
+        x.addAll(blkMgrs) ;
+        return x.iterator() ;
+    }
+    
+    public void set(Journal journal)
+    {
+        this.journal = journal ;
+    }
+
+    public void add(NodeTableTrans ntt)
     {
-        journals.add(journal) ;
+        nodeTableTrans.add(ntt) ;
     }
 
-    public void add(ObjectFileTrans objFileTrans)
+    public void add(BlockMgrJournal blkMgr)
     {
-        objJournals.add(objFileTrans) ;
+        blkMgrs.add(blkMgr) ;
     }
 }
 

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=1142086&r1=1142085&r2=1142086&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 Fri Jul  1 20:39:47 2011
@@ -7,10 +7,10 @@
 package com.hp.hpl.jena.tdb.transaction;
 
 
+import java.util.Iterator ;
+
 import com.hp.hpl.jena.sparql.core.DatasetGraph ;
 import com.hp.hpl.jena.tdb.TDBException ;
-import com.hp.hpl.jena.tdb.base.file.Location ;
-import com.hp.hpl.jena.tdb.setup.DatasetBuilder ;
 import com.hp.hpl.jena.tdb.store.DatasetGraphTDB ;
 
 
@@ -32,7 +32,7 @@ public class TransactionManager
     public DatasetGraphTxnTDB begin(DatasetGraph dsg)
     {
         // If already a transaction ... 
-        // Subs transactions are a new view - commit is only comit to parent transaction.  
+        // Subs transactions are a new view - commit is only commit to parent transaction.  
         if ( dsg instanceof DatasetGraphTxnTDB )
         {
             throw new TDBException("Already in transactional DatasetGraph") ;
@@ -45,18 +45,15 @@ public class TransactionManager
             throw new TDBException("Not a TDB-backed dataset") ;
 
         DatasetGraphTDB dsgtdb = (DatasetGraphTDB)dsg ;
-        // For now, always build a parallel dataset - later, associate with the DatasetGraphTDB
-        // [TxTDB:TODO]
         // THIS IS NECESSARY BECAUSE THE DATASET MAY HAVE BEEN UPDATED AND CHANGES STILL IN CACHES.
-        // MUST WRITE OUT - BUT ALSO REUSE CACHES
+        // MUST WRITE OUT - BUT ALSO REUSE CACHES.
         dsgtdb.sync() ; 
         
-        Location location = dsgtdb.getLocation() ;
+        DatasetGraphTxnTDB dsgTxn = (DatasetGraphTxnTDB)new DatasetBuilderTxn(new TransactionManager()).build(dsgtdb) ;
         
-        // TODO Don't rebuild every time.
-        DatasetBuilder builder = new DatasetBuilderTxn_Old(this) ;
-        //return builder.build(Location.mem(), null) ;
-        DatasetGraphTxnTDB dsgTxn = (DatasetGraphTxnTDB)builder.build(location, null) ;
+        Iterator<Transactional> iter = dsgTxn.getTransaction().components() ;
+        for ( ; iter.hasNext() ; )
+            iter.next().begin(dsgTxn.getTransaction()) ;
         return dsgTxn ;
     }
 

Modified: incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/TestJournal.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/TestJournal.java?rev=1142086&r1=1142085&r2=1142086&view=diff
==============================================================================
--- incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/TestJournal.java (original)
+++ incubator/jena/Experimental/TxTDB/trunk/src/test/java/com/hp/hpl/jena/tdb/transaction/TestJournal.java Fri Jul  1 20:39:47 2011
@@ -14,6 +14,7 @@ import org.junit.Test ;
 import org.openjena.atlas.junit.BaseTest ;
 import org.openjena.atlas.lib.Bytes ;
 
+import com.hp.hpl.jena.tdb.base.block.Block ;
 import com.hp.hpl.jena.tdb.base.file.BufferChannel ;
 import com.hp.hpl.jena.tdb.base.file.BufferChannelMem ;
 import com.hp.hpl.jena.tdb.sys.FileRef ;
@@ -37,6 +38,9 @@ public class TestJournal extends BaseTes
         Bytes.setLong(0x2222222211111111L, bb3.array()) ;
     }
 
+    static Block blk1 = new Block(1, bb1) ;
+    static Block blk2 = new Block(2, bb2) ;
+    static Block blk3 = new Block(3, bb3) ;
     
     static FileRef testRef = FileRef.create("TEST") ;
     static FileRef testRef1 = FileRef.create("TEST1") ;
@@ -59,7 +63,7 @@ public class TestJournal extends BaseTes
     
     @Test public void journal_02()
     {
-        JournalEntry entry1 = new JournalEntry(JournalEntryType.Block, testRef, bb1) ;
+        JournalEntry entry1 = new JournalEntry(JournalEntryType.Buffer, testRef, bb1) ;
         long x = journal.writeJournal(entry1) ;
         assertEquals(0, x) ;
         JournalEntry entry9 = journal.readJournal(x) ;
@@ -68,7 +72,7 @@ public class TestJournal extends BaseTes
 
     @Test public void journal_03()
     {
-        JournalEntry entry1 = new JournalEntry(JournalEntryType.Block, testRef, bb1) ;
+        JournalEntry entry1 = new JournalEntry(JournalEntryType.Buffer, testRef, bb1) ;
         JournalEntry entry2 = new JournalEntry(JournalEntryType.Object, testRef, bb1) ;
         
         long x1 = journal.writeJournal(entry1) ;
@@ -104,8 +108,8 @@ public class TestJournal extends BaseTes
 
     @Test public void journal_05()
     {
-        JournalEntry entry1 = new JournalEntry(JournalEntryType.Block, testRef, bb1) ;
-        JournalEntry entry2 = new JournalEntry(JournalEntryType.Block, testRef1, bb1) ;
+        JournalEntry entry1 = new JournalEntry(JournalEntryType.Buffer, testRef, bb1) ;
+        JournalEntry entry2 = new JournalEntry(JournalEntryType.Buffer, testRef1, bb1) ;
         
         long x1 = journal.writeJournal(entry1) ;
         bb1.clear();
@@ -122,7 +126,28 @@ public class TestJournal extends BaseTes
         assertTrue(equal(entry1, entry1a)) ;
         assertTrue(equal(entry2, entry2a)) ;
         assertFalse(equal(entry1a, entry2a)) ;
+    }
+
+    @Test public void journal_06()
+    {
+        JournalEntry entry1 = new JournalEntry(testRef, blk1) ;
+        JournalEntry entry2 = new JournalEntry(testRef, blk2) ;
+        
+        long x1 = journal.writeJournal(entry1) ;
+        bb1.clear();
+        long x2 = journal.writeJournal(entry2) ;
+        bb1.clear();
+        assertEquals(0, x1) ;
+        assertNotEquals(0, x2) ;
         
+        JournalEntry entry1a = journal.readJournal(x1) ;
+        JournalEntry entry2a = journal.readJournal(x2) ;
+        
+        assertNotSame(entry1, entry1a) ;
+        assertNotSame(entry2, entry2a) ;
+        assertTrue(equal(entry1, entry1a)) ;
+        assertTrue(equal(entry2, entry2a)) ;
+        assertFalse(equal(entry1a, entry2a)) ;
     }
 
     private static boolean equal(JournalEntry entry1, JournalEntry entry2)
@@ -131,18 +156,50 @@ public class TestJournal extends BaseTes
             return false ;
         if ( ! entry1.getFileRef().equals(entry2.getFileRef()) )
             return false ;
-        return sameValue(entry1.getByteBuffer(), entry2.getByteBuffer()) ;
+        if ( entry1.getByteBuffer() == null && entry2.getByteBuffer() != null )
+            return false ;
+        if ( entry1.getByteBuffer() != null && entry2.getByteBuffer() == null )
+            return false ; 
+        if ( entry1.getBlock() == null && entry2.getBlock() != null )
+            return false ;
+        if ( entry1.getBlock() != null && entry2.getBlock() == null )
+            return false ; 
+        if ( entry1.getBlock() != null )
+            return sameValue(entry1.getBlock(), entry2.getBlock()) ;
+        else
+            return sameValue(entry1.getByteBuffer(), entry2.getByteBuffer()) ;
     }
     
     // In ByteBufferLib - remove/migrate
     public static boolean sameValue(ByteBuffer bb1, ByteBuffer bb2)
     {
+        if ( bb1 == null && bb2 == null ) return true ;
+        if ( bb1 == null ) return false ;
+        if ( bb2 == null ) return false ;
+        
         if ( bb1.capacity() != bb2.capacity() ) return false ;
         
-        for ( int i = 0 ; i < bb1.capacity() ; i++ )
-            if ( bb1.get(i) != bb2.get(i) ) return false ;
-        return true ;
+        int x1 = bb1.position() ; 
+        int x2 = bb1.position() ;
+
+        try {
+            for ( int i = 0 ; i < bb1.capacity() ; i++ )
+                if ( bb1.get(i) != bb2.get(i) ) return false ;
+            return true ;
+        } finally { bb1.position(x1) ; bb2.position(x2) ; }  
     }
+    
+    // In ByteBufferLib - remove/migrate
+    public static boolean sameValue(Block bb1, Block bb2)
+    {
+        if ( bb1 == null && bb2 == null ) return true ;
+        if ( bb1 == null ) return false ;
+        if ( bb2 == null ) return false ;
+        
+        if ( bb1.getId() != bb2.getId() ) return false ;
+        return  sameValue(bb1.getByteBuffer(), bb2.getByteBuffer()) ;
+    }
+
 }
 
 /*