[rhmessaging-commits] rhmessaging commits: r973 - in store/trunk/cpp: lib/jrnl and 1 other directories.

rhmessaging-commits at lists.jboss.org rhmessaging-commits at lists.jboss.org
Tue Oct 9 00:26:13 EDT 2007


Author: kpvdr
Date: 2007-10-09 00:26:13 -0400 (Tue, 09 Oct 2007)
New Revision: 973

Added:
   store/trunk/cpp/lib/DataTokenImpl.cpp
   store/trunk/cpp/lib/DataTokenImpl.h
   store/trunk/cpp/lib/JournalImpl.cpp
   store/trunk/cpp/lib/JournalImpl.h
Modified:
   store/trunk/cpp/lib/BdbMessageStore.cpp
   store/trunk/cpp/lib/BdbMessageStore.h
   store/trunk/cpp/lib/Makefile.am
   store/trunk/cpp/lib/TxnCtxt.h
   store/trunk/cpp/lib/jrnl/data_tok.hpp
   store/trunk/cpp/lib/jrnl/deq_rec.cpp
   store/trunk/cpp/lib/jrnl/deq_rec.hpp
   store/trunk/cpp/lib/jrnl/enq_rec.cpp
   store/trunk/cpp/lib/jrnl/enq_rec.hpp
   store/trunk/cpp/lib/jrnl/file_hdr.hpp
   store/trunk/cpp/lib/jrnl/jcntl.cpp
   store/trunk/cpp/lib/jrnl/jcntl.hpp
   store/trunk/cpp/lib/jrnl/jerrno.cpp
   store/trunk/cpp/lib/jrnl/jerrno.hpp
   store/trunk/cpp/lib/jrnl/pmgr.cpp
   store/trunk/cpp/lib/jrnl/rmgr.cpp
   store/trunk/cpp/lib/jrnl/rmgr.hpp
   store/trunk/cpp/lib/jrnl/rrfc.cpp
   store/trunk/cpp/lib/jrnl/rrfc.hpp
   store/trunk/cpp/lib/jrnl/txn_rec.cpp
   store/trunk/cpp/lib/jrnl/txn_rec.hpp
   store/trunk/cpp/lib/jrnl/wmgr.cpp
   store/trunk/cpp/lib/jrnl/wmgr.hpp
   store/trunk/cpp/tests/jrnl/JournalSystemTests.cpp
   store/trunk/cpp/tests/jrnl/cp_rtest_jrnl
   store/trunk/cpp/tests/jrnl/jtest.cpp
   store/trunk/cpp/tests/jrnl/jtest.hpp
   store/trunk/cpp/tests/jrnl/msg_consumer.cpp
   store/trunk/cpp/tests/jrnl/msg_consumer.hpp
   store/trunk/cpp/tests/jrnl/msg_producer.cpp
   store/trunk/cpp/tests/jrnl/rtest
   store/trunk/cpp/tests/jrnl/rtests.csv
   store/trunk/cpp/tests/jrnl/rwtests.csv
   store/trunk/cpp/tests/jrnl/tests.ods
   store/trunk/cpp/tests/jrnl/wtests.csv
Log:
Completion of xid encode and decode for enqueue, dequeue and transaction records. The decode path for dequeue and transaction remains untested. Added additional read and write pipeline tests.

Modified: store/trunk/cpp/lib/BdbMessageStore.cpp
===================================================================
--- store/trunk/cpp/lib/BdbMessageStore.cpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/BdbMessageStore.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -129,7 +129,7 @@
         THROW_STORE_EXCEPTION("Queue already created: " + queue.getName());
     }
     if (usingJrnl()) {
-        journal::jcntl* jQueue = new journal::jcntl(queue.getName(), getJrnlDir(queue), string("JournalData"));
+        JournalImpl* jQueue = new JournalImpl(queue.getName(), getJrnlDir(queue), string("JournalData"));
         queue.setExternalQueueStore(dynamic_cast<ExternalQueueStore*>(jQueue));
 		try	{
 	     	// init will create the deque's for the init...
@@ -155,7 +155,7 @@
     qpid::broker::ExternalQueueStore* eqs = queue.getExternalQueueStore();
     if (eqs)
     {
-        journal::jcntl* jQueue = static_cast<journal::jcntl*>(eqs);
+        JournalImpl* jQueue = static_cast<JournalImpl*>(eqs);
     	jQueue->delete_jrnl_files();
         queue.setExternalQueueStore(NULL); // will delete the journal if exists
     }
@@ -299,7 +299,7 @@
         if (usingJrnl())
         {
 	          const char* queueName = queue->getName().c_str();
-              journal::jcntl* jQueue = new journal::jcntl(queueName, getJrnlDir(queueName), string("JournalData"));
+              JournalImpl* jQueue = new JournalImpl(queueName, getJrnlDir(queueName), string("JournalData"));
               queue->setExternalQueueStore(dynamic_cast<ExternalQueueStore*>(jQueue));
 	
 	          try
@@ -387,19 +387,20 @@
     size_t preambleLength = sizeof(u_int32_t)/*header size*/;
     u_int64_t maxMessageId(1);
  
-    journal::jcntl* jc = static_cast<journal::jcntl*>(queue->getExternalQueueStore());
-	journal::data_tok dtokp;
+    JournalImpl* jc = static_cast<JournalImpl*>(queue->getExternalQueueStore());
+	DataTokenImpl dtokp;
 	size_t readSize = 0;
 //	char** buff = 0;
 //    unsigned aio_sleep_cnt = 0;
 	unsigned msg_count=0;
     bool read = true;
 
-// hack...
-   char buff [1024]; size_t buffSize = 1024;
+    void* dbuff = NULL; size_t dbuffSize = 0;
+    void* xidbuff = NULL; size_t xidbuffSize = 0;
+    bool transientFlag = false;
 
 
-    dtokp.set_wstate(rhm::journal::data_tok::ENQ);
+    dtokp.set_wstate(DataTokenImpl::ENQ);
 	// read the message from the Journal.
     try {
         while (read) {
@@ -407,15 +408,15 @@
 //std:: cout << "loop -- uses fixed size -> FIX <-" << std::endl;
 
 //        const iores read_data(void** dbuf, size_t& dbsize, data_tok* const dtok)
-            rhm::journal::iores res = jc->read_data_record(&buff, buffSize, &dtokp);
+            rhm::journal::iores res = jc->read_data_record(&dbuff, dbuffSize, &xidbuff, xidbuffSize, transientFlag, &dtokp);
     		readSize = dtokp.dsize();
-	    	assert(readSize < buffSize); /// fail safe for hack...
+//	    	assert(readSize < buffSize); /// fail safe for hack...
 		
             switch (res)
             {
                 case rhm::journal::RHM_IORES_SUCCESS:{
                     msg_count++;
-	                char* data = buff;
+	                char* data = (char*)dbuff;
 				    unsigned headerSize = Buffer(data, preambleLength).getLong();
                     Buffer headerBuff(data+ preambleLength, headerSize); /// do we want read size or header size ????
 
@@ -442,7 +443,7 @@
                     }
 
     				dtokp.reset();
-	    			dtokp.set_wstate(rhm::journal::data_tok::ENQ);
+	    			dtokp.set_wstate(DataTokenImpl::ENQ);
                     break;
 		        }
                 case rhm::journal::RHM_IORES_AIO_WAIT:
@@ -783,11 +784,11 @@
     //buffer.flip();
 
    
-	journal::data_tok* dtokp = NULL; 
+	DataTokenImpl* dtokp = NULL; 
     try {
 
      if ( queue && usingJrnl()){
-        dtokp = new journal::data_tok;
+        dtokp = new DataTokenImpl;
  	    // deleted this in the callback...
 	    dtokp->setSourceMessage (&message);
 	    dtokp->set_rid(message.getPersistenceId()); // set the messageID into the Journal header (record-id)
@@ -796,12 +797,12 @@
             bool written = false;
             while (!written)
             {
-	            journal::jcntl* jc = static_cast<journal::jcntl*>(queue->getExternalQueueStore());
+	            JournalImpl* jc = static_cast<JournalImpl*>(queue->getExternalQueueStore());
 				rhm::journal::iores eres = jc->enqueue_data_record(buff, size, size, dtokp, /*txn->getXid(),*/ false);
                 switch (eres)
                 {
                     case rhm::journal::RHM_IORES_SUCCESS:
-                        if (dtokp->wstate() >= rhm::journal::data_tok::ENQ_SUBM)
+                        if (dtokp->wstate() >= DataTokenImpl::ENQ_SUBM)
                             written = true;
                         break;
                     case rhm::journal::RHM_IORES_AIO_WAIT:
@@ -893,12 +894,12 @@
 {
 //	unsigned aio_sleep_cnt = 0;
     bool written = false;
-	journal::data_tok* ddtokp =  new journal::data_tok;
+	DataTokenImpl* ddtokp =  new DataTokenImpl;
  	ddtokp->setSourceMessage (&msg);
 	ddtokp->set_rid(msg.getPersistenceId()); // message id to be dequeued
 	ddtokp->set_dequeue_rid(messageIdSequence.next());
-	ddtokp->set_wstate(journal::data_tok::ENQ);
-	journal::jcntl* jc = static_cast<journal::jcntl*>(queue.getExternalQueueStore());
+	ddtokp->set_wstate(DataTokenImpl::ENQ);
+	JournalImpl* jc = static_cast<JournalImpl*>(queue.getExternalQueueStore());
 	string tid;
     if (ctxt){
 		TxnCtxt* txn = check(ctxt);

Modified: store/trunk/cpp/lib/BdbMessageStore.h
===================================================================
--- store/trunk/cpp/lib/BdbMessageStore.h	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/BdbMessageStore.h	2007-10-09 04:26:13 UTC (rev 973)
@@ -39,7 +39,8 @@
 #include <iostream>
 #include <boost/format.hpp>
 #include <boost/ptr_container/ptr_list.hpp>
-#include <jrnl/jcntl.hpp>
+#include "JournalImpl.h"
+#include "DataTokenImpl.h"
 
 namespace rhm {
     namespace bdbstore {

Added: store/trunk/cpp/lib/DataTokenImpl.cpp
===================================================================
--- store/trunk/cpp/lib/DataTokenImpl.cpp	                        (rev 0)
+++ store/trunk/cpp/lib/DataTokenImpl.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -0,0 +1,32 @@
+/*
+    Copyright (C) 2007 Red Hat Software
+
+    This file is part of Red Hat Messaging.
+    
+    Red Hat Messaging is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
+    USA
+
+    The GNU Lesser General Public License is available in the file COPYING.
+*/
+
+#include "DataTokenImpl.h"
+
+using namespace rhm::bdbstore;
+
+DataTokenImpl::DataTokenImpl():data_tok()
+{}
+
+DataTokenImpl::~DataTokenImpl()
+{}

Added: store/trunk/cpp/lib/DataTokenImpl.h
===================================================================
--- store/trunk/cpp/lib/DataTokenImpl.h	                        (rev 0)
+++ store/trunk/cpp/lib/DataTokenImpl.h	2007-10-09 04:26:13 UTC (rev 973)
@@ -0,0 +1,42 @@
+/*
+    Copyright (C) 2007 Red Hat Software
+
+    This file is part of Red Hat Messaging.
+    
+    Red Hat Messaging is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
+    USA
+
+    The GNU Lesser General Public License is available in the file COPYING.
+*/
+
+#ifndef _DataTokenImpl_
+#define _DataTokenImpl_
+
+#include "jrnl/data_tok.hpp"
+
+namespace rhm {
+    namespace bdbstore {
+
+        class DataTokenImpl : public journal::data_tok
+        {
+        public:
+            DataTokenImpl();
+            ~DataTokenImpl();
+        };
+
+        } // namespace bdbstore
+    } // namespace rhm
+
+#endif

Added: store/trunk/cpp/lib/JournalImpl.cpp
===================================================================
--- store/trunk/cpp/lib/JournalImpl.cpp	                        (rev 0)
+++ store/trunk/cpp/lib/JournalImpl.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -0,0 +1,35 @@
+/*
+    Copyright (C) 2007 Red Hat Software
+
+    This file is part of Red Hat Messaging.
+    
+    Red Hat Messaging is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
+    USA
+
+    The GNU Lesser General Public License is available in the file COPYING.
+*/
+
+#include "JournalImpl.h"
+
+using namespace rhm::bdbstore;
+
+JournalImpl::JournalImpl(const std::string& journalId,
+                         const std::string& journalDirectory,
+                         const std::string& journalBaseFilename):
+                         jcntl(journalId, journalDirectory, journalBaseFilename)
+{}
+
+JournalImpl::~JournalImpl()
+{}

Added: store/trunk/cpp/lib/JournalImpl.h
===================================================================
--- store/trunk/cpp/lib/JournalImpl.h	                        (rev 0)
+++ store/trunk/cpp/lib/JournalImpl.h	2007-10-09 04:26:13 UTC (rev 973)
@@ -0,0 +1,44 @@
+/*
+    Copyright (C) 2007 Red Hat Software
+
+    This file is part of Red Hat Messaging.
+    
+    Red Hat Messaging is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
+    USA
+
+    The GNU Lesser General Public License is available in the file COPYING.
+*/
+
+#ifndef _JournalImpl_
+#define _JournalImpl_
+
+#include "jrnl/jcntl.hpp"
+
+namespace rhm {
+    namespace bdbstore {
+
+        class JournalImpl : public journal::jcntl
+        {
+        public:
+            JournalImpl(const std::string& journalId,
+                        const std::string& journalDirectory,
+                        const std::string& journalBaseFilename);
+            ~JournalImpl();
+        };
+
+        } // namespace bdbstore
+    } // namespace rhm
+
+#endif

Modified: store/trunk/cpp/lib/Makefile.am
===================================================================
--- store/trunk/cpp/lib/Makefile.am	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/Makefile.am	2007-10-09 04:26:13 UTC (rev 973)
@@ -17,18 +17,22 @@
   BdbMessageStore.cpp				\
   BindingDbt.cpp				\
   BufferValue.cpp				\
+  DataTokenImpl.cpp			\
   IdDbt.cpp					\
   IdPairDbt.cpp					\
   IdSequence.cpp				\
+  JournalImpl.cpp				\
   PreparedTransaction.cpp			\
   StringDbt.cpp					\
   BdbMessageStore.h		\
   BindingDbt.h			\
   BufferValue.h			\
   Cursor.h			\
+  DataTokenImpl.h		\
   IdDbt.h			\
   IdPairDbt.h			\
   IdSequence.h			\
+  JournalImpl.h			\
   PreparedTransaction.h		\
   StoreException.h		\
   StringDbt.h			\

Modified: store/trunk/cpp/lib/TxnCtxt.h
===================================================================
--- store/trunk/cpp/lib/TxnCtxt.h	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/TxnCtxt.h	2007-10-09 04:26:13 UTC (rev 973)
@@ -29,7 +29,8 @@
 #include <qpid/sys/Mutex.h>
 #include <boost/shared_ptr.hpp>
 #include <vector>
-#include <jrnl/jcntl.hpp>
+#include "JournalImpl.h"
+#include "DataTokenImpl.h"
 #include <boost/format.hpp>
 
 namespace rhm{
@@ -61,9 +62,9 @@
 	
 	void completeTXN(bool commit){
 		for (TxnCtxt::ipqdef::iterator i = impactedQueues.begin(); i != impactedQueues.end(); i++) { 
-	   		journal::jcntl* jc = static_cast<journal::jcntl*>((*i)->getExternalQueueStore());
+	   		JournalImpl* jc = static_cast<JournalImpl*>((*i)->getExternalQueueStore());
 			if (jc) { /* if using journal */
-                journal::data_tok* dtokp = new journal::data_tok;
+                DataTokenImpl* dtokp = new DataTokenImpl;
 				if (commit)
 					jc->txn_commit(dtokp, getXid());
 				else
@@ -92,7 +93,7 @@
             if (!firstloop) ::usleep(AIO_SLEEP_TIME); // move this into the get events call aiolib..
 			allWritten = true;
 			for (TxnCtxt::ipqdef::iterator i = impactedQueues.begin(); i != impactedQueues.end(); i++) { 
-	           	journal::jcntl* jc = static_cast<journal::jcntl*>((*i)->getExternalQueueStore());
+	           	JournalImpl* jc = static_cast<JournalImpl*>((*i)->getExternalQueueStore());
 				if (jc && !(jc->is_txn_synced(getXid())))
 				{
 					if (firstloop)

Modified: store/trunk/cpp/lib/jrnl/data_tok.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/data_tok.hpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/data_tok.hpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -131,7 +131,7 @@
         inline const bool is_enqueued() const { return _wstate == ENQ; }
         inline const bool is_readable() const { return _wstate == ENQ; }
         inline const bool is_read() const { return _rstate == READ; }
-        inline const bool is_dequeueable() const { return _wstate == ENQ; }
+        inline const bool is_dequeueable() const { return _wstate == ENQ || _wstate == DEQ_PART; }
         inline void set_wstate(const write_state wstate) { _wstate = wstate; }
         void set_rstate(const read_state rstate);
         inline const size_t dsize() const { return _dsize; }

Modified: store/trunk/cpp/lib/jrnl/deq_rec.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/deq_rec.cpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/deq_rec.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -59,10 +59,7 @@
 {}
 
 deq_rec::~deq_rec()
-{
-    if (_buff)
-        ::free(_buff);
-}
+{}
 
 void
 deq_rec::reset()
@@ -72,11 +69,7 @@
     _deq_hdr._xidsize = 0;
     _deq_tail._rid = 0;
     _xidp = NULL;
-    if (_buff)
-    {
-        ::free(_buff);
-        _buff = NULL;
-    }
+    _buff = NULL;
 }
 
 void
@@ -88,11 +81,7 @@
     _deq_hdr._xidsize = xidlen;
     _deq_tail._rid = rid;
     _xidp = xidp;
-    if (_buff)
-    {
-        ::free(_buff);
-        _buff = NULL;
-    }
+    _buff = NULL;
 }
 
 u_int32_t
@@ -218,7 +207,7 @@
     if (rec_offs_dblks) // Continuation of record on new page
     {
         const u_int32_t hdr_xid_dblks = size_dblks(deq_hdr::size() + _deq_hdr._xidsize);
-        const u_int32_t hdr_xid_tail_dblks = size_dblks(enq_hdr::size() +  _deq_hdr._xidsize +
+        const u_int32_t hdr_xid_tail_dblks = size_dblks(deq_hdr::size() + _deq_hdr._xidsize +
                 rec_tail::size());
         const size_t rec_offs = rec_offs_dblks * JRNL_DBLK_SIZE;
 
@@ -291,7 +280,7 @@
                 throw jexception(jerrno::JERR__MALLOC, ss.str(), "deq_rec", "decode");
             }
             const u_int32_t hdr_xid_dblks = size_dblks(deq_hdr::size() + _deq_hdr._xidsize);
-            const u_int32_t hdr_xid_tail_dblks = size_dblks(enq_hdr::size() +  _deq_hdr._xidsize +
+            const u_int32_t hdr_xid_tail_dblks = size_dblks(deq_hdr::size() +  _deq_hdr._xidsize +
                     rec_tail::size());
 
             // Check if record (header + xid + tail) fits within this page, we can check the
@@ -329,6 +318,18 @@
     return size_dblks(rd_cnt);
 }
 
+const size_t
+deq_rec::get_xid(const void** const xidpp)
+{
+    if (!_buff)
+    {
+        *xidpp = NULL;
+        return 0;
+    }
+    *xidpp = _buff;
+    return _deq_hdr._xidsize;
+}
+
 std::string&
 deq_rec::str(std::string& str) const
 {

Modified: store/trunk/cpp/lib/jrnl/deq_rec.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/deq_rec.hpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/deq_rec.hpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -61,7 +61,7 @@
         rec_tail _deq_tail;         ///< Record tail, only encoded if XID is present
 
     public:
-        // constructor used for read operations and xid must have memory allocated
+        // constructor used for read operations and xid will have memory allocated
         deq_rec();
         // constructor used for write operations, where xid already exists
         deq_rec(const u_int64_t rid, const u_int64_t drid, const void* const xidp,
@@ -77,7 +77,7 @@
                 throw (jexception);
         u_int32_t decode(hdr& h, void* rptr, u_int32_t rec_offs_dblks, u_int32_t max_size_dblks)
                 throw (jexception);
-        inline const void* const get_xid() { return _buff; }
+        const size_t get_xid(const void** const xidpp);
         std::string& str(std::string& str) const;
         inline const size_t data_size() const { return 0; } // This record never carries data
         const size_t xid_size() const;

Modified: store/trunk/cpp/lib/jrnl/enq_rec.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/enq_rec.cpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/enq_rec.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -33,6 +33,7 @@
 #include <jrnl/enq_rec.hpp>
 
 #include <assert.h>
+#include <errno.h>
 #include <iomanip>
 #include <sstream>
 #include <jrnl/jerrno.hpp>
@@ -42,54 +43,43 @@
 namespace journal
 {
 
-// Default constructor; must be used in conjunction with reset() to prepare
-// instance for use with write or read operations
+// Constructor used for read operations, where buf contains preallocated space to receive data.
 enq_rec::enq_rec():
         jrec(), // superclass
         _enq_hdr(RHM_JDAT_ENQ_MAGIC, RHM_JDAT_VERSION, 0, 0, 0),
         _xidp(NULL),
         _data(NULL),
         _buff(NULL),
-        _enq_tail(_enq_hdr._hdr),
-        _max_data_size(0),
-        _data_size(0)
+        _enq_tail(_enq_hdr._hdr)
 {}
 
 // Constructor used for transactional write operations, where dbuf contains data to be written.
 enq_rec::enq_rec(const u_int64_t rid, const void* const dbuf, const size_t dlen,
         const void* const xidp, const size_t xidlen, bool transient):
         jrec(), // superclass
-        _enq_hdr(RHM_JDAT_ENQ_MAGIC, RHM_JDAT_VERSION, rid, xidlen, dlen,
-                transient),
+        _enq_hdr(RHM_JDAT_ENQ_MAGIC, RHM_JDAT_VERSION, rid, xidlen, dlen, transient),
         _xidp(xidp),
         _data(dbuf),
         _buff(NULL),
-        _enq_tail(_enq_hdr._hdr),
-        _max_data_size(0),
-        _data_size(dlen)
+        _enq_tail(_enq_hdr._hdr)
 {}
 
-// Constructor used for read operations, where buf contains preallocated space to receive data.
-enq_rec::enq_rec(void* const buf, const size_t bufsize):
-        jrec(), // superclass
-        _enq_hdr(RHM_JDAT_ENQ_MAGIC, RHM_JDAT_VERSION, 0, 0, bufsize),
-        _xidp(NULL),
-        _data(NULL),
-        _buff(buf),
-        _enq_tail(_enq_hdr._hdr),
-        _max_data_size(bufsize),
-        _data_size(0)
+enq_rec::~enq_rec()
 {}
 
-enq_rec::~enq_rec()
+// Prepare instance for use in reading data from journal, where buf contains preallocated space
+// to receive data.
+void
+enq_rec::reset()
 {
-#ifdef RHM_NOAIO
-    if (_wbuff)
-    {
-        ::free(_wbuff);
-        _wbuff = NULL;
-    }
-#endif
+    _enq_hdr._hdr._rid = 0;
+    _enq_hdr.set_transient(false);
+    _enq_hdr._xidsize = 0;
+    _enq_hdr._dsize = 0;
+    _xidp = NULL;
+    _data = NULL;
+    _buff = NULL;
+    _enq_tail._rid = 0;
 }
 
 // Prepare instance for use in writing transactional data to journal, where dbuf contains data to
@@ -106,26 +96,8 @@
     _data = dbuf;
     _buff = NULL;
     _enq_tail._rid = rid;
-    _max_data_size = 0;
-    _data_size = dlen;
 }
 
-// Prepare instance for use in reading data from journal, where buf contains preallocated space
-// to receive data.
-void
-enq_rec::reset(void* const buf, const size_t bufsize)
-{
-    _enq_hdr._hdr._rid = 0;
-    _enq_hdr._xidsize = 0;
-    _enq_hdr._dsize = bufsize;
-    _xidp = NULL;
-    _data = NULL;
-    _buff = buf;
-    _enq_tail._rid = 0;
-    _max_data_size = bufsize;
-    _data_size = 0;
-}
-
 u_int32_t
 enq_rec::encode(void* wptr, u_int32_t rec_offs_dblks, u_int32_t max_size_dblks) throw (jexception)
 {
@@ -155,7 +127,7 @@
             rec_offs -= _enq_hdr._xidsize - wsize2;
             if (rem)
             {
-                wsize = _data_size > rec_offs ? _data_size - rec_offs : 0;
+                wsize = _enq_hdr._dsize > rec_offs ? _enq_hdr._dsize - rec_offs : 0;
                 wsize2 = wsize;
                 if (wsize)
                 {
@@ -165,7 +137,7 @@
                     wr_cnt += wsize;
                     rem -= wsize;
                 }
-                rec_offs -= _data_size - wsize2;
+                rec_offs -= _enq_hdr._dsize - wsize2;
             }
             if (rem)
             {
@@ -194,13 +166,13 @@
                 wr_cnt += wsize;
             }
             rec_offs -= _enq_hdr._xidsize - wsize;
-            wsize = _data_size > rec_offs ? _data_size - rec_offs : 0;
+            wsize = _enq_hdr._dsize > rec_offs ? _enq_hdr._dsize - rec_offs : 0;
             if (wsize)
             {
                 ::memcpy((char*)wptr + wr_cnt, (char*)_data + rec_offs, wsize);
                 wr_cnt += wsize;
             }
-            rec_offs -= _data_size - wsize;
+            rec_offs -= _enq_hdr._dsize - wsize;
             wsize = sizeof(_enq_tail) > rec_offs ? sizeof(_enq_tail) - rec_offs : 0;
             if (wsize)
             {
@@ -234,7 +206,7 @@
             }
             if (rem)
             {
-                wsize = rem >= _data_size ? _data_size : rem;
+                wsize = rem >= _enq_hdr._dsize ? _enq_hdr._dsize : rem;
                 ::memcpy((char*)wptr + wr_cnt, _data, wsize);
                 wr_cnt += wsize;
                 rem -= wsize;
@@ -255,8 +227,8 @@
                 ::memcpy((char*)wptr + wr_cnt, _xidp, _enq_hdr._xidsize);
                 wr_cnt += _enq_hdr._xidsize;
             }
-            ::memcpy((char*)wptr + wr_cnt, _data, _data_size);
-            wr_cnt += _data_size;
+            ::memcpy((char*)wptr + wr_cnt, _data, _enq_hdr._dsize);
+            wr_cnt += _enq_hdr._dsize;
             ::memcpy((char*)wptr + wr_cnt, (void*)&_enq_tail, sizeof(_enq_tail));
             wr_cnt += sizeof(_enq_tail);
 #ifdef RHM_CLEAN
@@ -278,29 +250,42 @@
     size_t rd_cnt = 0;
     if (rec_offs_dblks) // Continuation of record on new page
     {
-        const u_int32_t hdr_data_dblks = size_dblks(enq_hdr::size() + _data_size);
-        const u_int32_t hdr_data_tail_dblks = size_dblks(enq_hdr::size() + _data_size +
-                rec_tail::size());
+        const u_int32_t hdr_data_dblks = size_dblks(enq_hdr::size() + _enq_hdr._xidsize +
+                _enq_hdr._dsize);
+        const u_int32_t hdr_tail_dblks = size_dblks(enq_hdr::size() + _enq_hdr._xidsize +
+                _enq_hdr._dsize + rec_tail::size());
         const size_t rec_offs = rec_offs_dblks * JRNL_DBLK_SIZE;
+        const size_t offs = rec_offs - enq_hdr::size();
 
-        if (hdr_data_tail_dblks - rec_offs_dblks <= max_size_dblks)
+        if (hdr_tail_dblks - rec_offs_dblks <= max_size_dblks)
         {
             // Remainder of record fits within this page
-            if (rec_offs - enq_hdr::size() < _data_size)
+            if (offs < _enq_hdr._xidsize)
             {
-                // Data still outstanding, copy remainder of data and tail
-                const size_t data_offs = rec_offs - enq_hdr::size();
-                const size_t data_rem = _data_size - data_offs;
-                ::memcpy((char*)_buff + data_offs, rptr, data_rem);
+                // some XID still outstanding, copy remainder of XID, data and tail
+                const size_t rem = _enq_hdr._xidsize + _enq_hdr._dsize - offs;
+                ::memcpy((char*)_buff + offs, rptr, rem);
+                rd_cnt += rem;
+                ::memcpy((void*)&_enq_tail, ((char*)rptr + rd_cnt), sizeof(_enq_tail));
+                chk_tail();
+                rd_cnt += sizeof(_enq_tail);
+            }
+            else if (offs < _enq_hdr._xidsize + _enq_hdr._dsize)
+            {
+                // some data still outstanding, copy remainder of data and tail
+                const size_t data_offs = offs - _enq_hdr._xidsize;
+                const size_t data_rem = _enq_hdr._dsize - data_offs;
+                ::memcpy((char*)_buff + offs, rptr, data_rem);
                 rd_cnt += data_rem;
-                ::memcpy((void*)&_enq_tail, ((char*)rptr + data_rem), sizeof(_enq_tail));
+                ::memcpy((void*)&_enq_tail, ((char*)rptr + rd_cnt), sizeof(_enq_tail));
                 chk_tail();
                 rd_cnt += sizeof(_enq_tail);
             }
             else
             {
                 // Tail or part of tail only outstanding, complete tail
-                const size_t tail_offs = rec_offs - enq_hdr::size() - _data_size;
+                const size_t tail_offs = rec_offs - enq_hdr::size() - _enq_hdr._xidsize -
+                        _enq_hdr._dsize;
                 const size_t tail_rem = rec_tail::size() - tail_offs;
                 ::memcpy((char*)&_enq_tail + tail_offs, rptr, tail_rem);
                 chk_tail();
@@ -309,23 +294,34 @@
         }
         else if (hdr_data_dblks - rec_offs_dblks <= max_size_dblks)
         {
-            // Remainder of record data fits within this page, tail split
-            const size_t data_offs = rec_offs - enq_hdr::size();
-            const size_t data_rem = _data_size - data_offs;
-            ::memcpy((char*)_buff + data_offs, rptr, data_rem);
-            rd_cnt += data_rem;
+            // Remainder of xid & data fits within this page; tail split
+            if (offs < _enq_hdr._xidsize)
+            {
+                // some XID still outstanding, copy remainder of XID and data
+                const size_t rem = _enq_hdr._xidsize + _enq_hdr._dsize - offs;
+                ::memcpy((char*)_buff + offs, rptr, rem);
+                rd_cnt += rem;
+            }
+            else if (offs < _enq_hdr._xidsize + _enq_hdr._dsize)
+            {
+                // some data still outstanding, copy remainder of data
+                const size_t data_offs = offs - _enq_hdr._xidsize;
+                const size_t data_rem = _enq_hdr._dsize - data_offs;
+                ::memcpy((char*)_buff + offs, rptr, data_rem);
+                rd_cnt += data_rem;
+            }
             const size_t tail_rem = (max_size_dblks * JRNL_DBLK_SIZE) - rd_cnt;
             if (tail_rem)
             {
-                ::memcpy((void*)&_enq_tail, ((char*)rptr + data_rem), tail_rem);
+                ::memcpy((void*)&_enq_tail, ((char*)rptr + rd_cnt), tail_rem);
                 rd_cnt += tail_rem;
             }
         }
         else
         {
-            // Remainder of record data split
+            // Since xid and data are contiguous, both fit within current page - copy whole page
             const size_t data_cp_size = (max_size_dblks * JRNL_DBLK_SIZE);
-            ::memcpy((char*)_buff + rec_offs - enq_hdr::size(), rptr, data_cp_size);
+            ::memcpy((char*)_buff + offs, rptr, data_cp_size);
             rd_cnt += data_cp_size;
         }
     }
@@ -348,32 +344,55 @@
         _enq_hdr._dsize = *(size_t*)((char*)rptr + rd_cnt);
         rd_cnt = _enq_hdr.size();
         chk_hdr();
-        _data_size = _enq_hdr._dsize;
-        if (_enq_hdr._xidsize)
+        if (_enq_hdr._xidsize + _enq_hdr._dsize)
         {
-            // TODO: Decode xid here
-        }
+            _buff = ::malloc(_enq_hdr._xidsize + _enq_hdr._dsize);
+            if (_buff == NULL)
+            {
+                std::stringstream ss;
+                ss << "_buff malloc(): errno=" << errno;
+                throw jexception(jerrno::JERR__MALLOC, ss.str(), "deq_rec", "decode");
+            }
 
-        if (_data_size)
-        {
-            const u_int32_t hdr_data_dblks = size_dblks(enq_hdr::size() + _data_size);
-            const u_int32_t hdr_data_tail_dblks = size_dblks(enq_hdr::size() + _data_size +
-                    rec_tail::size());
+            const u_int32_t hdr_xid_dblks = size_dblks(enq_hdr::size() + _enq_hdr._xidsize);
+            const u_int32_t hdr_data_dblks = size_dblks(enq_hdr::size() + _enq_hdr._xidsize +
+                    _enq_hdr._dsize);
+            const u_int32_t hdr_tail_dblks = size_dblks(enq_hdr::size() + _enq_hdr._xidsize +
+                    _enq_hdr._dsize + rec_tail::size());
             // Check if record (header + data + tail) fits within this page, we can check the
             // tail before the expense of copying data to memory
-            if (hdr_data_tail_dblks <= max_size_dblks)
+            if (hdr_tail_dblks <= max_size_dblks)
             {
-                // Entire header, data and tail fits within this page
-                ::memcpy((void*)&_enq_tail, (char*)rptr + rd_cnt + _data_size, sizeof(_enq_tail));
+                // Header, xid, data and tail fits within this page
+                if (_enq_hdr._xidsize)
+                {
+                    ::memcpy(_buff, (char*)rptr + rd_cnt, _enq_hdr._xidsize);
+                    rd_cnt += _enq_hdr._xidsize;
+                }
+                if (_enq_hdr._dsize)
+                {
+                    ::memcpy((char*)_buff + _enq_hdr._xidsize, (char*)rptr + rd_cnt,
+                            _enq_hdr._dsize);
+                    rd_cnt += _enq_hdr._dsize;
+                }
+                ::memcpy((void*)&_enq_tail, (char*)rptr + rd_cnt, sizeof(_enq_tail));
                 chk_tail();
-                ::memcpy(_buff, (char*)rptr + rd_cnt, _data_size);
-                rd_cnt += _data_size + sizeof(_enq_tail);
+                rd_cnt += sizeof(_enq_tail);
             }
             else if (hdr_data_dblks <= max_size_dblks)
             {
-                // Entire header and data fit within this page, tail split
-                ::memcpy(_buff, (char*)rptr + rd_cnt, _data_size);
-                rd_cnt += _data_size;
+                // Header, xid and data fit within this page, tail split or separated
+                if (_enq_hdr._xidsize)
+                {
+                    ::memcpy(_buff, (char*)rptr + rd_cnt, _enq_hdr._xidsize);
+                    rd_cnt += _enq_hdr._xidsize;
+                }
+                if (_enq_hdr._dsize)
+                {
+                    ::memcpy((char*)_buff + _enq_hdr._xidsize, (char*)rptr + rd_cnt,
+                            _enq_hdr._dsize);
+                    rd_cnt += _enq_hdr._dsize;
+                }
                 const size_t tail_rem = (max_size_dblks * JRNL_DBLK_SIZE) - rd_cnt;
                 if (tail_rem)
                 {
@@ -381,9 +400,24 @@
                     rd_cnt += tail_rem;
                 }
             }
+            else if (hdr_xid_dblks <= max_size_dblks)
+            {
+                // Header and xid fits within this page, data split or separated
+                if (_enq_hdr._xidsize)
+                {
+                    ::memcpy(_buff, (char*)rptr + rd_cnt, _enq_hdr._xidsize);
+                    rd_cnt += _enq_hdr._xidsize;
+                }
+                if (_enq_hdr._dsize)
+                {
+                    const size_t data_cp_size = (max_size_dblks * JRNL_DBLK_SIZE) - rd_cnt;
+                    ::memcpy((char*)_buff + _enq_hdr._xidsize, (char*)rptr + rd_cnt, data_cp_size);
+                    rd_cnt += data_cp_size;
+                }
+            }
             else
             {
-                // Header fits within this page, record data split
+                // Header fits within this page, xid split or separated
                 const size_t data_cp_size = (max_size_dblks * JRNL_DBLK_SIZE) - rd_cnt;
                 ::memcpy(_buff, (char*)rptr + rd_cnt, data_cp_size);
                 rd_cnt += data_cp_size;
@@ -393,6 +427,30 @@
     return size_dblks(rd_cnt);
 }
 
+const size_t
+enq_rec::get_xid(void** const xidpp)
+{
+    if (!_buff)
+    {
+        *xidpp = NULL;
+        return 0;
+    }
+    *xidpp = _buff;
+    return _enq_hdr._xidsize;
+}
+
+const size_t
+enq_rec::get_data(void** const datapp)
+{
+    if (!_buff)
+    {
+        *datapp = NULL;
+        return 0;
+    }
+    *datapp = (void*)((char*)_buff + _enq_hdr._xidsize);
+    return _enq_hdr._dsize;
+}
+
 std::string&
 enq_rec::str(std::string& str) const
 {
@@ -410,7 +468,7 @@
 const size_t
 enq_rec::data_size() const
 {
-    return _data_size;
+    return _enq_hdr._dsize;
 }
 
 const size_t
@@ -422,7 +480,7 @@
 const size_t
 enq_rec::rec_size() const
 {
-    return enq_hdr::size() + _enq_hdr._xidsize + _data_size + rec_tail::size();
+    return enq_hdr::size() + _enq_hdr._xidsize + _enq_hdr._dsize + rec_tail::size();
 }
 
 void
@@ -445,14 +503,6 @@
         ss << " read=0x" << std::setw(2) << (int)_enq_hdr._hdr._magic;
         throw jexception(jerrno::JERR_DREC_INVRHDR, ss.str(), "enq_rec", "chk_hdr");
     }
-    if (_enq_hdr._dsize > _max_data_size)
-    {
-        std::stringstream ss;
-        ss << std::hex << std::setfill('0');
-        ss << "data_size: rid=" << std::setw(16) << _enq_hdr._hdr._rid;
-        ss << std::dec << ": buff_size=" << _max_data_size << " data_size=" << _enq_hdr._dsize;
-        throw jexception(jerrno::JERR_DREC_BUFFSIZE, ss.str(), "enq_rec", "chk_hdr");
-    }
 }
 
 void

Modified: store/trunk/cpp/lib/jrnl/enq_rec.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/enq_rec.hpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/enq_rec.hpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -60,13 +60,10 @@
         const void* _data;          ///< Pointer to data to be written to disk
         void* _buff;                ///< Pointer to buffer to receive data read from disk
         rec_tail _enq_tail;
-        size_t _max_data_size;      ///< Max buffer size for decoding into during read
-        size_t _data_size;          ///< Size of data (bytes)
 
     public:
         /**
-        * \brief Default constructor; must be used in conjunction with reset() to prepare
-        *     instance for use with write or read operations.
+        * \brief Constructor used for read operations.
         */
         enq_rec();
 
@@ -77,30 +74,24 @@
                 const void* const xidp, const size_t xidlen, bool transient);
 
         /**
-        * \brief Constructor used for read operations, where buf contains preallocated space
-        *     to receive data.
-        */
-        enq_rec(void* const buf, const size_t bufsize);
-
-        /**
         * \brief Destructor
         */
         ~enq_rec();
 
+        // Prepare instance for use in reading data from journal, xid and data will be allocated
+        void reset();
         // Prepare instance for use in writing data to journal
         void reset(const u_int64_t rid, const void* const dbuf, const size_t dlen,
                 const void* const xidp, const size_t xidlen, bool transient);
-        // Prepare instance for use in reading data from journal
-        void reset(void* const buf, const size_t bufsize);
 
         u_int32_t encode(void* wptr, u_int32_t rec_offs_dblks, u_int32_t max_size_dblks)
                 throw (jexception);
         u_int32_t decode(hdr& h, void* rptr, u_int32_t rec_offs_dblks, u_int32_t max_size_dblks)
                 throw (jexception);
+        const size_t get_xid(void** const xidpp);
+        const size_t get_data(void** const datapp);
+        inline const bool is_transient() const { return _enq_hdr.is_transient(); }
         std::string& str(std::string& str) const;
-        inline const size_t max_data_size() const { return _max_data_size; }
-        inline const size_t max_rec_size() const
-                { return _max_data_size + enq_hdr::size() + rec_tail::size(); }
         const size_t data_size() const;
         const size_t xid_size() const;
         const size_t rec_size() const;

Modified: store/trunk/cpp/lib/jrnl/file_hdr.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/file_hdr.hpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/file_hdr.hpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -314,7 +314,7 @@
         enq_hdr(const u_int32_t magic, const u_int8_t version, const u_int64_t rid,
                 const size_t xidsize, const size_t dsize, const bool transient = false);
         
-        inline const bool is_transient() { return _hdr._uflag & ENQ_HDR_TRANSIENT_MASK; }
+        inline const bool is_transient() const { return _hdr._uflag & ENQ_HDR_TRANSIENT_MASK; }
         void set_transient(const bool transient);
 
         /**

Modified: store/trunk/cpp/lib/jrnl/jcntl.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jcntl.cpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/jcntl.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -67,7 +67,8 @@
 jcntl::~jcntl()
 {
     if (_init_flag && !_stop_flag)
-    	stop(true); 
+    	try { stop(true); }
+        catch (jexception e) { std::cerr << e << std::endl; }
     if (_datafh)
     {
         for (u_int32_t i=0; i<JRNL_NUM_FILES; i++)
@@ -223,11 +224,11 @@
 }
 
 const iores
-jcntl::read_data_record(void* const dbuf, const size_t dbsize, data_tok* const dtokp)
-        throw (jexception)
+jcntl::read_data_record(void** const datapp, size_t& dsize, void** const xidpp, size_t& xidsize,
+        bool& transient, data_tok* const dtokp) throw (jexception)
 {
     check_rstatus("read_data");
-    return _rmgr.read(dbuf, dbsize, dtokp);
+    return _rmgr.read(datapp, dsize, xidpp, xidsize, transient, dtokp);
 }
 
 const iores
@@ -277,7 +278,7 @@
 }
 
 void
-jcntl::stop(bool block_for_aio_cmpl) throw (jexception)
+jcntl::stop(bool block_till_aio_cmpl) throw (jexception)
 {
     if (_readonly_flag)
         check_rstatus("stop");
@@ -287,7 +288,7 @@
     if (!_readonly_flag)
     {
         flush();
-        if (block_for_aio_cmpl)
+        if (block_till_aio_cmpl)
             aio_cmpl_wait();
     }
 }

Modified: store/trunk/cpp/lib/jrnl/jcntl.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jcntl.hpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/jcntl.hpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -219,6 +219,7 @@
         * \param wr_dtokl deque for storing data tokens retruning from enqueue and dequeue (write)
         *     AIO operations.
         * \param wr_cb Function pointer to callback function for write operations. May be NULL.
+        * \param prep_tx_list
         *
         * \exception TODO
         */
@@ -388,18 +389,37 @@
         const iores discard_data_record(data_tok* const dtokp) throw (jexception);
 
         /**
-        * \brief Reads data from the journal.
+        * \brief Reads data from the journal. It is the responsibility of the reader to free
+        *     the memeory that is allocated through this call - see below for detials.
         *
-        * \param dbuf Pointer to buffer into which data is to be read.
-        * \param dbsize Buffer capacity in bytes - i.e. Maximum size of data to be written into
-        *     dbuf.
+        * Reads the next non-dequeued data record from the journal.
+        *
+        * <b>Note</b> that this call allocates memory into which the data and XID are copied. It
+        * is the responsibility of the caller to free this memory. The memory for the data and
+        * XID are allocated in a single call, and the XID precedes the data in the memory space.
+        * Thus, where an XID exists, freeing the XID pointer will free both the XID and data memory.
+        * However, if an XID does not exist for the message, the XID pointer xidpp is set to NULL,
+        * and it is the data pointer datapp that must be freed. Should neither an XID nor data be
+        * present (ie an empty record), then no memory is allocated, and both pointers will be NULL.
+        * In this case, there is no need to free memory.
+        *
+        * \param datapp Pointer to pointer that will be set to point to memory allocated and
+        *     containing the data. Will be set to NULL if the call fails or there is no data
+        *     in the record.
+        * \param dsize Ref that will be set to the size of the data. Will be set to 0 if the call
+        *     fails or if there is no data in the record.
+        * \param xidpp Pointer to pointer that will be set to point to memory allocated and
+        *     containing the XID. Will be set to NULL if the call fails or there is no XID attached
+        *     to this record.
+        * \param xidsize Ref that will be set to the size of the XID.
+        * \param transient Ref that will be set true if record is transient.
         * \param dtokp Pointer to data_tok instance for this data, used to track state of data
         *     through journal.
         *
         * \exception TODO
         */
-        const iores read_data_record(void* const dbuf, const size_t dbsize, data_tok* const dtokp)
-                throw (jexception);
+        const iores read_data_record(void** const datapp, size_t& dsize, void** const xidpp,
+                size_t& xidsize, bool& transient, data_tok* const dtokp) throw (jexception);
 
         /**
         * \brief Dequeues (marks as no longer needed) data record in journal.
@@ -443,6 +463,8 @@
         * are effectively deleted from the journal, and can not be read. All dequeued records remain
         * as though they had never been dequeued.
         *
+        * \param dtokp Pointer to data_tok instance for this data, used to track state of data
+        *     through journal.
         * \param xid String containing xid.
         *
         * \exception TODO
@@ -456,6 +478,8 @@
         * records are effectively released for reading and dequeueing. All dequeued records are
         * removed and can no longer be accessed.
         *
+        * \param dtokp Pointer to data_tok instance for this data, used to track state of data
+        *     through journal.
         * \param xid String containing xid.
         *
         * \exception TODO
@@ -499,10 +523,10 @@
         * <b>Note:</b> The jouranl cannot be restarted without either initailizing it or restoring
         *     it.
         *
-        * \param block_for_aio_cmpl If true, will block the thread while waiting for all outstanding
-        *     AIO operations to complete.
+        * \param block_till_aio_cmpl If true, will block the thread while waiting for all
+        *     outstanding AIO operations to complete.
         */
-        void stop(bool block_for_aio_cmpl = false) throw (jexception);
+        void stop(bool block_till_aio_cmpl = false) throw (jexception);
 
         /**
         * \brief Force a flush of the write page cache, creating a single AIO write operation.
@@ -510,6 +534,14 @@
         inline void flush() throw (jexception) { _wmgr.flush(); }
 
         inline const u_int32_t get_enq_cnt() const { return _emap.size(); }
+        inline const u_int32_t get_wr_outstanding_aio_dblks() const
+                { return _wrfc.aio_outstanding_dblks(); }
+        inline const u_int32_t get_wr_outstanding_aio_dblks(u_int16_t pi) const
+                { return _wrfc.file_handle(pi)->wr_aio_outstanding_dblks(); }
+        inline const u_int32_t get_rd_outstanding_aio_dblks() const
+                { return _rrfc.aio_outstanding_dblks(); }
+        inline const u_int32_t get_rd_outstanding_aio_dblks(u_int16_t pi) const
+                { return _rrfc.file_handle(pi)->rd_aio_outstanding_dblks(); }
 
         /**
         * \brief Check if the journal is stopped.
@@ -517,7 +549,7 @@
         * \return <b><i>true</i></b> if the jouranl is stopped;
         *     <b><i>false</i></b> otherwise.
         */
-        bool is_stopped() { return _stop_flag; }
+        inline bool is_stopped() { return _stop_flag; }
 
         /**
         * \brief Check if the journal is ready to read and write data.

Modified: store/trunk/cpp/lib/jrnl/jerrno.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jerrno.cpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/jerrno.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -56,7 +56,7 @@
 const u_int32_t jerrno::JERR_JCNTL_READONLY     = 0x0201;
 const u_int32_t jerrno::JERR_JCNTL_AIOCMPLWAIT  = 0x0202;
 const u_int32_t jerrno::JERR_JCNTL_UNKNOWNMAGIC = 0x0203;
-const u_int32_t jerrno::JERR_JCNTL_NOTRECOVERED = 0x0204; ///< Req' recover() to be called first
+const u_int32_t jerrno::JERR_JCNTL_NOTRECOVERED = 0x0204;
 
 // class jdir
 const u_int32_t jerrno::JERR_JDIR_NOTDIR        = 0x0300;
@@ -87,19 +87,19 @@
 
 // class data_rec
 const u_int32_t jerrno::JERR_DREC_INVRHDR       = 0x0701;
-const u_int32_t jerrno::JERR_DREC_BUFFSIZE      = 0x0702;
 
 // class wmgr
 const u_int32_t jerrno::JERR_WMGR_BADPGSTATE    = 0x0801;
 const u_int32_t jerrno::JERR_WMGR_BADDTOKSTATE  = 0x0802;
 const u_int32_t jerrno::JERR_WMGR_ENQDISCONT    = 0x0803;
-const u_int32_t jerrno::JERR_WMGR_DEQDISCONT    = 0x0804;    ///< Deq. new dtok when previous part compl.
+const u_int32_t jerrno::JERR_WMGR_DEQDISCONT    = 0x0804;
 
 // class rmgr
 const u_int32_t jerrno::JERR_RMGR_UNKNOWNMAGIC  = 0x0900;
 const u_int32_t jerrno::JERR_RMGR_RIDMISMATCH   = 0x0901;
 const u_int32_t jerrno::JERR_RMGR_FIDMISMATCH   = 0x0902;
 const u_int32_t jerrno::JERR_RMGR_ENQSTATE      = 0x0903;
+const u_int32_t jerrno::JERR_RMGR_BADRECTYPE    = 0x0904;
 
 // class data_tok
 const u_int32_t jerrno::JERR_DTOK_ILLEGALSTATE  = 0x0a00;
@@ -173,8 +173,6 @@
 
     // class data_rec
     _err_map[JERR_DREC_INVRHDR] = std::string("JERR_DREC_INVRHDR: Invalid data record header.");
-    _err_map[JERR_DREC_BUFFSIZE] = std::string("JERR_DREC_BUFFSIZE: "
-            "Journal data record too big to fit into buffer.");
 
     // class wmgr
     _err_map[JERR_WMGR_BADPGSTATE] = std::string("JERR_WMGR_BADPGSTATE: "
@@ -195,6 +193,8 @@
             "FID mismatch between emap and rrfc");
     _err_map[JERR_RMGR_ENQSTATE] = std::string("JERR_RMGR_ENQSTATE: "
             "Attempted read when data token wstate was not ENQ");
+    _err_map[JERR_RMGR_BADRECTYPE] = std::string("JERR_RMGR_BADRECTYPE: "
+            "Attempted operation on inappropriate record type");
 
     // class data_tok
     _err_map[JERR_DTOK_ILLEGALSTATE] = std::string("JERR_MTOK_ILLEGALSTATE: "

Modified: store/trunk/cpp/lib/jrnl/jerrno.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jerrno.hpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/jerrno.hpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -104,7 +104,6 @@
 
         // class data_rec
         static const u_int32_t JERR_DREC_INVRHDR;       ///< Invalid data record header
-        static const u_int32_t JERR_DREC_BUFFSIZE;      ///< Journal data record too big for buffer
 
         // class wmgr
         static const u_int32_t JERR_WMGR_BADPGSTATE;    ///< Page buffer in illegal state.
@@ -117,6 +116,7 @@
         static const u_int32_t JERR_RMGR_RIDMISMATCH;   ///< RID mismatch between rec and dtok
         static const u_int32_t JERR_RMGR_FIDMISMATCH;   ///< FID mismatch between emap and rrfc
         static const u_int32_t JERR_RMGR_ENQSTATE;      ///< Attempted read when wstate not ENQ
+        static const u_int32_t JERR_RMGR_BADRECTYPE;    ///< Attempted op on incorrect rec type
 
         // class data_tok
         static const u_int32_t JERR_DTOK_ILLEGALSTATE;  ///< Attempted to change to illegal state

Modified: store/trunk/cpp/lib/jrnl/pmgr.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/pmgr.cpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/pmgr.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -209,10 +209,13 @@
 pmgr::rotate_page(page_state state)
 {
     _page_cb_arr[_pg_index]._state = state;
-    _pg_offset_dblks = 0;
+    if (_pg_offset_dblks >= JRNL_WMGR_PAGE_SIZE * JRNL_SBLK_SIZE)
+    {
+        _pg_offset_dblks = 0;
+        _pg_cntr++;
+    }
     if (++_pg_index >= _pages)
         _pg_index = 0;
-    _pg_cntr++;
     return false;
 }
 

Modified: store/trunk/cpp/lib/jrnl/rmgr.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/rmgr.cpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/rmgr.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -210,26 +210,38 @@
 }
 
 const iores
-rmgr::read(void* const mbuf, const size_t mbsize, data_tok* dtokp) throw (jexception)
+rmgr::read(void** const datapp, size_t& dsize, void** const xidpp, size_t& xidsize, bool& transient,
+        data_tok* dtokp) throw (jexception)
 {
 //std::cout << " rmgr::read()" << std::flush;
+
     iores res = pre_read_check(dtokp);
     if (res != RHM_IORES_SUCCESS)
+    {
+        set_params_null(datapp, dsize, xidpp, xidsize);
         return res;
+    }
 
 //std::cout << " c" << std::flush;
     if (dtokp->rstate() == data_tok::SKIP_PART)
     {
         const iores res = skip(dtokp);
         if (res != RHM_IORES_SUCCESS)
+        {
+            set_params_null(datapp, dsize, xidpp, xidsize);
             return res;
+        }
     }
 //std::cout << " d" << std::flush;
     if (dtokp->rstate() == data_tok::READ_PART)
     {
         assert(dtokp->rid() == _hdr._rid);
         void* rptr = (void*)((char*)_page_ptr_arr[_pg_index] + (_pg_offset_dblks * JRNL_DBLK_SIZE));
-        return read_enq(_hdr, rptr, dtokp);
+        const iores res = read_enq(_hdr, rptr, dtokp);
+        dsize = _enq_rec.get_data(datapp);
+        xidsize = _enq_rec.get_xid(xidpp);
+        transient = _enq_rec.is_transient();
+        return res;
     }
 //std::cout << " e" << std::flush;
     _hdr.reset();
@@ -248,7 +260,7 @@
             aio_cycle();
             return RHM_IORES_AIO_WAIT;
         }
-//std::cout << " h" << std::flush;
+//std::cout << " h:" << _pg_index << "-" << _pg_offset_dblks << std::flush;
         void* rptr = (void*)((char*)_page_ptr_arr[_pg_index] +
                 (_pg_offset_dblks * JRNL_DBLK_SIZE));
         ::memcpy(&_hdr, rptr, sizeof(hdr));
@@ -257,7 +269,7 @@
             case RHM_JDAT_ENQ_MAGIC:
             {
 //std::cout << " E" << std::flush;
-                _enq_rec.reset(mbuf, mbsize); // sets enqueue rec size
+                _enq_rec.reset(); // sets enqueue rec size
                 // Check if RID of this rec is still enqueued, if so read it, else skip
 #ifdef RHM_RDONLY
                 bool is_enq = true;
@@ -310,33 +322,36 @@
 //                         throw jexception(jerrno::JERR_RMGR_FIDMISMATCH, ss.str(), "rmgr", "read");
 //                     }
 #endif
-                    return read_enq(_hdr, rptr, dtokp);
+                    const iores res = read_enq(_hdr, rptr, dtokp);
+                    dsize = _enq_rec.get_data(datapp);
+                    xidsize = _enq_rec.get_xid(xidpp);
+                    transient = _enq_rec.is_transient();
+                    return res;
                 }
-                else
-                {
-//std::cout << " %" << std::flush;
-                    // skip this record, it is already dequeued
-                    u_int64_t* sizep = (u_int64_t*)((char*)rptr + sizeof(hdr) +
-#if defined(JRNL_32_BIT)
-                            sizeof(u_int32_t) + // filler
-#endif
-                            sizeof(size_t));
-//u_int32_t dblks = jrec::size_dblks((size_t)*sizep + sizeof(enq_hdr) + sizeof(enq_tail));
-//std::cout << "{" << *sizep << "=" << dblks << "d}" << std::flush;
-                    dtokp->set_dsize((size_t)*sizep);
-                    skip(dtokp);
-                }
+                else // skip this record, it is already dequeued
+//{ std::cout << " %" << std::flush;
+                    consume_xid_rec(_hdr, rptr, dtokp);
+//}
                 break;
             }
             case RHM_JDAT_DEQ_MAGIC:
 //std::cout << " D" << std::flush;
-                consume_deq();
+                consume_xid_rec(_hdr, rptr, dtokp);
                 break;
+            case RHM_JDAT_TXA_MAGIC:
+//std::cout << " A" << std::flush;
+                consume_xid_rec(_hdr, rptr, dtokp);
+                break;
+            case RHM_JDAT_TXC_MAGIC:
+//std::cout << " C" << std::flush;
+                consume_xid_rec(_hdr, rptr, dtokp);
+                break;
             case RHM_JDAT_EMPTY_MAGIC:
 //std::cout << " X" << std::flush;
                 consume_filler();
                 break;
             default:
+//std::cout << " ?" << std::flush;
                 std::stringstream ss;
                 ss << std::hex << std::setfill('0');
                 ss << "Magic=0x" << std::setw(8) << _hdr._magic << std::dec;
@@ -417,15 +432,12 @@
     if (_aio_evt_rem)
         get_events();
 
-//std::string s;
-//std::cout << " [a pi=" << _pg_index << " d=" << dblks_rem() << " c=" << (_rrfc.is_compl()?"T":"F")  << " wo=" << (_rrfc.is_wr_aio_outstanding()?"T":"F") << " status:" << _rrfc.file_handle()->status_str(s) << "]" << std::flush;
     if(dblks_rem() == 0 && _rrfc.is_compl() && !_rrfc.is_wr_aio_outstanding())
     {
         aio_cycle();   // check if any AIOs have returned
         return RHM_IORES_EMPTY;
     }
 
-//std::cout << " b" << std::flush;
     // Check write state of this token is ENQ - required for read
     if (dtokp)
     {
@@ -491,64 +503,41 @@
     return RHM_IORES_SUCCESS;
 }
 
-const iores
-rmgr::read_deq(hdr& h, void* rptr, data_tok* dtokp) throw (jexception)
+void
+rmgr::consume_xid_rec(hdr& h, void* rptr, data_tok* dtokp) throw (jexception)
 {
-    if (_page_cb_arr[_pg_index]._state != AIO_COMPLETE)
+    if (h._magic == RHM_JDAT_ENQ_MAGIC)
     {
-//std::cout << " W=" << page_state_str(_page_cb_arr[_pg_index]._state) << std::flush;
-        aio_cycle();   // check if any AIOs have returned
-        return RHM_IORES_AIO_WAIT;
+        enq_hdr ehdr;
+        ::memcpy(&ehdr, rptr, sizeof(enq_hdr));
+        dtokp->set_dsize(ehdr._xidsize + sizeof(enq_hdr) + sizeof(rec_tail));
     }
-//std::cout << " X" << dtokp->dblocks_read() << "," << dblks_rem() << std::flush;
-
-    // Read data from this page, first block will have header and data size.
-    u_int32_t dblks_rd = _deq_rec.decode(h, rptr, dtokp->dblocks_read(), dblks_rem());
-    dtokp->incr_dblocks_read(dblks_rd);
-
-    _pg_offset_dblks += dblks_rd;
-
-    // If data still incomplete, move to next page and decode again
-    // TODO
-    while (dtokp->dblocks_read() < _enq_rec.rec_size_dblks())
+    else if (h._magic == RHM_JDAT_DEQ_MAGIC)
     {
-//std::cout << " Y" << std::flush;
-        rotate_page();
-        if (_page_cb_arr[_pg_index]._state != AIO_COMPLETE)
-        {
-            dtokp->set_rstate(data_tok::READ_PART);
-            dtokp->set_dsize(_enq_rec.data_size());
-            return RHM_IORES_AIO_WAIT;
-        }
-
-        rptr = (void*)((char*)_page_ptr_arr[_pg_index]);
-        dblks_rd = _enq_rec.decode(h, rptr, dtokp->dblocks_read(), dblks_rem());
-        dtokp->incr_dblocks_read(dblks_rd);
-        _pg_offset_dblks += dblks_rd;
+        deq_hdr dhdr;
+        ::memcpy(&dhdr, rptr, sizeof(deq_hdr));
+        if (dhdr._xidsize)
+            dtokp->set_dsize(dhdr._xidsize + sizeof(deq_hdr) + sizeof(rec_tail));
+        else
+            dtokp->set_dsize(sizeof(deq_hdr));
     }
-
-    // If we have finished with this page, rotate it
-    if (dblks_rem() == 0)
-//{std::cout << " Z" << std::flush;
-        rotate_page();
-//}    
-
-    // Set the record size in dtokp
-    dtokp->set_rstate(data_tok::READ);
-    dtokp->set_dsize(_enq_rec.data_size());
-    return RHM_IORES_SUCCESS;
+    else if (h._magic == RHM_JDAT_TXA_MAGIC || h._magic == RHM_JDAT_TXC_MAGIC)
+    {
+        txn_hdr thdr;
+        ::memcpy(&thdr, rptr, sizeof(txn_hdr));
+        dtokp->set_dsize(thdr._xidsize + sizeof(txn_hdr) + sizeof(rec_tail));
+    }
+    else
+    {
+        std::stringstream ss;
+        ss << "Record type found = \"" << (char*)&h._magic << "\"";
+        throw jexception(jerrno::JERR_RMGR_BADRECTYPE, ss.str(), "rmgr", "consume_xid_rec");
+    }
+    dtokp->set_dblocks_read(0);
+    skip(dtokp);
 }
 
-// *** DEPRECATED ***, to be removed, use read_deq()
 void
-rmgr::consume_deq() throw (jexception)
-{
-    _pg_offset_dblks++;
-    if (dblks_rem() == 0)
-        rotate_page();
-}
-
-void
 rmgr::consume_filler() throw (jexception)
 {
     // Filler (Magic "RHMx") is one dblk by definition
@@ -560,33 +549,39 @@
 const iores
 rmgr::skip(data_tok* dtokp) throw (jexception)
 {
-    u_int32_t dsize_dblks = jrec::size_dblks(dtokp->dsize() + sizeof(enq_hdr) + sizeof(rec_tail));
-    u_int32_t tot_dblk_cnt = dtokp->rstate() == data_tok::SKIP_PART ? dtokp->dblocks_read() : 0;
-//std::cout << " S" << tot_dblk_cnt << std::flush;
+    u_int32_t dsize_dblks = jrec::size_dblks(dtokp->dsize());
+    u_int32_t tot_dblk_cnt = dtokp->dblocks_read();
+//std::cout << " [S " << dsize_dblks << "," << tot_dblk_cnt << std::flush;
     while (true)
     {
         u_int32_t this_dblk_cnt = 0;
         if (dsize_dblks - tot_dblk_cnt > dblks_rem())
-//{std::cout << "-1" << std::flush;
+//{std::cout << " x" << std::flush;
             this_dblk_cnt = dblks_rem();
 //}
         else
-//{std::cout << "-2" << std::flush;
+//{std::cout << " f" << std::flush;
             this_dblk_cnt = dsize_dblks - tot_dblk_cnt;
 //}
 //std::cout << "->" << this_dblk_cnt << std::flush;
-        dtokp->incr_dblocks_read(this_dblk_cnt);
-        _pg_offset_dblks += this_dblk_cnt;
-        tot_dblk_cnt += this_dblk_cnt;
-        if (tot_dblk_cnt < _enq_rec.rec_size_dblks())
+        if (this_dblk_cnt)
         {
-//std::cout << " * t=" << tot_dblk_cnt << " rs=" << _enq_rec.rec_size_dblks() << std::flush;
-            rotate_page();
+            dtokp->incr_dblocks_read(this_dblk_cnt);
+            _pg_offset_dblks += this_dblk_cnt;
+            tot_dblk_cnt += this_dblk_cnt;
+        }
+        if (tot_dblk_cnt < dsize_dblks)
+        {
+            if (_pg_offset_dblks == JRNL_SBLK_SIZE * JRNL_RMGR_PAGE_SIZE)
+//{ std::cout << " rot" << std::flush;
+                rotate_page();
+//}            
             if (_page_cb_arr[_pg_index]._state != AIO_COMPLETE)
             {
                 dtokp->set_rstate(data_tok::SKIP_PART);
                 // Use data_tok::dblocks_proc field to save how many skip bloks still to go...
-                dtokp->set_dblocks_read(_enq_rec.rec_size_dblks() - tot_dblk_cnt);
+//                dtokp->set_dblocks_read(dsize_dblks - tot_dblk_cnt);
+//std::cout << " w]" << std::flush;
                 return RHM_IORES_AIO_WAIT;
             }
 //std::cout << " !" << std::flush;
@@ -597,6 +592,7 @@
             dtokp->set_rstate(data_tok::UNREAD);
             dtokp->set_dsize(0);
             dtokp->set_dblocks_read(0);
+//std::cout << "]" << std::flush;
             return RHM_IORES_SUCCESS;
         }
     }
@@ -637,14 +633,10 @@
 void
 rmgr::init_aio_reads(const int16_t first_uninit, const u_int16_t num_uninit) throw (jexception)
 {
-//std::cout << " #(" << first_uninit << "," << num_uninit << ")" << std::flush;
     for (int16_t i=0; i<num_uninit; i++)
     {
-//std::cout << ">pi=" << ((i + first_uninit) % _pages) << "-wc=" << (_rrfc.file_handle()->wr_cmpl_cnt_dblks()) << "-fid=" << (_rrfc.file_handle()->fid()) << std::flush;
         if (_rrfc.empty()) // Nothing to do; this file not yet written to
-//{std::cout << "!" << std::flush;
             break;        
-//}        
             
         // If this is the first read from a file, increase the read pointers to beyond fhdr
         // or consume fhdr here for analysis (not req'd at present)
@@ -662,9 +654,6 @@
         u_int32_t rd_size = file_rem_dblks > pg_size_dblks ? pg_size_dblks : file_rem_dblks;
         if (rd_size)
         {
-//std::string s;
-//std::cout << " (" << _rrfc.file_handle()->status(s) << ")";
-//std::cout << " <frd=" << file_rem_dblks << ">" << std::flush;
             int16_t pi = (i + first_uninit) % _pages;
             // TODO: For perf, combine contiguous pages into single read
             //   1 or 2 AIOs needed depending on whether read block folds
@@ -680,14 +669,9 @@
 //std::cout << "{r^" << pi << "," << rd_size << "}" << std::flush;
         }
         else // If there is nothing to read for this page, neither will there be for the others...
-//{std::cout << "&" << std::flush;
             break;
-//}
         if (_rrfc.file_rotate())
-        {
-//std::cout << " @@@@@" << std::flush;
             _rrfc.rotate();
-        }        
     }
 }
 
@@ -722,5 +706,14 @@
     return _page_cb_arr[_pg_index]._rdblks - _pg_offset_dblks;
 }
 
+void
+rmgr::set_params_null(void** const datapp, size_t& dsize, void** const xidpp, size_t& xidsize)
+{
+    *datapp = NULL;
+    dsize = 0;
+    *xidpp = NULL;
+    xidsize = 0;
+}
+
 } // namespace journal
 } // namespace rhm

Modified: store/trunk/cpp/lib/jrnl/rmgr.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/rmgr.hpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/rmgr.hpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -71,16 +71,17 @@
         const iores get(const u_int64_t& rid, const size_t& dsize, const size_t& dsize_avail,
                 const void** const data, bool auto_discard) throw (jexception);
         const iores discard(data_tok* dtok) throw (jexception);
-        const iores read(void* const mbuf, const size_t mbsize, data_tok* dtok)
-                throw (jexception);
+        const iores read(void** const datapp, size_t& dsize, void** const xidpp, size_t& xidsize,
+                bool& transient, data_tok* dtokp) throw (jexception);
         const u_int32_t get_events(page_state state = AIO_COMPLETE) throw (jexception);
 
     private:
         void initialize() throw (jexception);
         const iores pre_read_check(data_tok* dtokp) throw (jexception);
         const iores read_enq(hdr& h, void* rptr, data_tok* dtokp) throw (jexception);
-        const iores read_deq(hdr& h, void* rptr, data_tok* dtokp) throw (jexception);
-        void consume_deq() throw (jexception); // DEPRECATED, to be removed, use read_deq()
+//        const iores read_deq(hdr& h, void* rptr, data_tok* dtokp) throw (jexception);
+//        const iores read_txn(hdr& h, void* rptr, data_tok* dtokp) throw (jexception);
+        void consume_xid_rec(hdr& h, void* rptr, data_tok* dtokp) throw (jexception);
         void consume_filler() throw (jexception);
         const iores skip(data_tok* dtokp) throw (jexception);
         void aio_cycle() throw (jexception);
@@ -89,6 +90,8 @@
         void consume_fhdr() throw (jexception);
         void rotate_page();
         const u_int32_t dblks_rem() const;
+        void set_params_null(void** const datapp, size_t& dsize, void** const xidpp,
+                size_t& xidsize);
 
 
         // Special version of libaio's io_prep_pread() which preserves the value of the data

Modified: store/trunk/cpp/lib/jrnl/rrfc.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/rrfc.cpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/rrfc.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -31,6 +31,7 @@
 */
 
 
+#include <assert.h>
 #include <jrnl/rrfc.hpp>
 #include <jrnl/jerrno.hpp>
 
@@ -82,5 +83,12 @@
 #endif
 }
 
+nlfh*
+rrfc::file_handle(u_int16_t pg_index) const
+{
+    assert(pg_index < _nfiles);
+    return _fh_arr[pg_index];
+}
+
 } // namespace journal
 } // namespace rhm

Modified: store/trunk/cpp/lib/jrnl/rrfc.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/rrfc.hpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/rrfc.hpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -92,6 +92,12 @@
         */
         inline nlfh* file_handle() const { return _curr_fh; }
 
+        /**
+        * \brief Returns the journal file handle for the given page index within the rotating
+        *     file group.
+        */
+        nlfh* file_handle(u_int16_t pg_index) const;
+
         // Convenience access methods to current file handle
 
         inline const u_int32_t fid() const { return _curr_fh->fid(); }
@@ -121,7 +127,7 @@
         inline const u_int32_t remaining_dblks() { return _curr_fh->rd_remaining_dblks(); }
         inline const bool is_full() const { return _curr_fh->is_rd_full(); }
         inline const bool is_compl() const { return _curr_fh->is_rd_compl(); }
-        inline const u_int32_t aio_outstanding_dblks()
+        inline const u_int32_t aio_outstanding_dblks() const
                 { return _curr_fh->rd_aio_outstanding_dblks(); }
         inline const bool file_rotate() const { return _curr_fh->rd_file_rotate(); }
         inline const bool is_wr_aio_outstanding() const

Modified: store/trunk/cpp/lib/jrnl/txn_rec.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/txn_rec.cpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/txn_rec.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -61,10 +61,7 @@
 {}
 
 txn_rec::~txn_rec()
-{
-    if (_buff)
-        ::free(_buff);
-}
+{}
 
 void
 txn_rec::reset(const u_int32_t magic)
@@ -73,11 +70,7 @@
     _txn_hdr._hdr._rid = 0;
     _txn_hdr._xidsize = 0;
     _xidp = NULL;
-    if (_buff)
-    {
-        ::free(_buff);
-        _buff = NULL;
-    }
+    _buff = NULL;
     _txn_tail._xmagic = ~magic;
     _txn_tail._rid = 0;
 }
@@ -90,11 +83,7 @@
     _txn_hdr._hdr._rid = rid;
     _txn_hdr._xidsize = xidlen;
     _xidp = xidp;
-    if (_buff)
-    {
-        ::free(_buff);
-        _buff = NULL;
-    }
+    _buff = NULL;
     _txn_tail._xmagic = ~magic;
     _txn_tail._rid = rid;
 }
@@ -217,8 +206,8 @@
     size_t rd_cnt = 0;
     if (rec_offs_dblks) // Continuation of record on new page
     {
-        const u_int32_t hdr_xid_dblks = size_dblks(deq_hdr::size() + _txn_hdr._xidsize);
-        const u_int32_t hdr_xid_tail_dblks = size_dblks(enq_hdr::size() +  _txn_hdr._xidsize +
+        const u_int32_t hdr_xid_dblks = size_dblks(txn_hdr::size() + _txn_hdr._xidsize);
+        const u_int32_t hdr_xid_tail_dblks = size_dblks(txn_hdr::size() +  _txn_hdr._xidsize +
                 rec_tail::size());
         const size_t rec_offs = rec_offs_dblks * JRNL_DBLK_SIZE;
 
@@ -286,8 +275,8 @@
             ss << "_buff malloc(): errno=" << errno;
             throw jexception(jerrno::JERR__MALLOC, ss.str(), "txn_rec", "decode");
         }
-        const u_int32_t hdr_xid_dblks = size_dblks(deq_hdr::size() + _txn_hdr._xidsize);
-        const u_int32_t hdr_xid_tail_dblks = size_dblks(enq_hdr::size() + _txn_hdr._xidsize +
+        const u_int32_t hdr_xid_dblks = size_dblks(txn_hdr::size() + _txn_hdr._xidsize);
+        const u_int32_t hdr_xid_tail_dblks = size_dblks(txn_hdr::size() + _txn_hdr._xidsize +
                 rec_tail::size());
 
         // Check if record (header + xid + tail) fits within this page, we can check the
@@ -324,6 +313,18 @@
     return size_dblks(rd_cnt);
 }
 
+const size_t
+txn_rec::get_xid(const void** const xidpp)
+{
+    if (!_buff)
+    {
+        *xidpp = NULL;
+        return 0;
+    }
+    *xidpp = _buff;
+    return _txn_hdr._xidsize;
+}
+
 std::string&
 txn_rec::str(std::string& str) const
 {

Modified: store/trunk/cpp/lib/jrnl/txn_rec.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/txn_rec.hpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/txn_rec.hpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -77,7 +77,7 @@
                 throw (jexception);
         u_int32_t decode(hdr& h, void* rptr, u_int32_t rec_offs_dblks, u_int32_t max_size_dblks)
                 throw (jexception);
-        inline const void* const get_xid() { return _buff; }
+        const size_t get_xid(const void** const xidpp);
         std::string& str(std::string& str) const;
         inline const size_t data_size() const { return 0; } // This record never carries data
         const size_t xid_size() const;

Modified: store/trunk/cpp/lib/jrnl/wmgr.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/wmgr.cpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/wmgr.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -47,7 +47,9 @@
         _wrfc(wrfc),
         _max_dtokpp(0),
         _max_io_wait_us(0),
-        _fhdr_buff(NULL),
+        _fhdr_base_ptr(NULL),
+        _fhdr_ptr_arr(NULL),
+        _iocba(NULL),
         _cached_offset_dblks(0),
         _enq_busy(false),
         _deq_busy(false),
@@ -61,7 +63,9 @@
         _wrfc(wrfc),
         _max_dtokpp(max_dtokpp),
         _max_io_wait_us(max_iowait_us),
-        _fhdr_buff(NULL),
+        _fhdr_base_ptr(NULL),
+        _fhdr_ptr_arr(NULL),
+        _iocba(NULL),
         _cached_offset_dblks(0),
         _enq_busy(false),
         _deq_busy(false),
@@ -71,11 +75,7 @@
 
 wmgr::~wmgr()
 {
-    if (_fhdr_buff)
-    {
-        ::free(_fhdr_buff);
-        _fhdr_buff = NULL;
-    }
+    clean();
 }
 
 void
@@ -600,16 +600,12 @@
                 throw jexception(jerrno::JERR__AIO, "wmgr", "write_flush");
             _wrfc.add_subm_cnt_dblks(_cached_offset_dblks);
             _aio_evt_rem++;
+//std::cout << "{w^" << _pg_index << "," << _cached_offset_dblks << "}" << std::flush;
             _cached_offset_dblks = 0;
-//std::cout << "{w^" << _pg_index << "}" << std::flush;
 
-            // Rotate cache page?
-            if (_pg_offset_dblks >= JRNL_WMGR_PAGE_SIZE * JRNL_SBLK_SIZE)
-            {
-                rotate_page(AIO_PENDING); // increments _pg_index, resets _pg_offset_dblks if req'd
-                if (_page_cb_arr[_pg_index]._state == UNUSED)
-                    _page_cb_arr[_pg_index]._state = IN_USE;
-            }
+           rotate_page(AIO_PENDING); // increments _pg_index, resets _pg_offset_dblks if req'd
+           if (_page_cb_arr[_pg_index]._state == UNUSED)
+               _page_cb_arr[_pg_index]._state = IN_USE;
         }
     }
     get_events(UNUSED);
@@ -661,9 +657,9 @@
             ss << " offset=" << iocbp->u.c.offset << " fh=" << iocbp->aio_fildes << "]";
             throw jexception(jerrno::JERR__AIO, ss.str(), "wmgr", "get_events");
         }
-        if (pcbp) // File header writes have no pcb, and will jump to else
+        if (pcbp) // Page writes have pcb
         {
-//std::cout << "{w*" << pcbp->_index << "}" << std::flush;
+//std::cout << "{w*" << pcbp->_index << "," << pcbp->_wdblks << "}" << std::flush;
             u_int32_t s = pcbp->_pdtokl->size();
             for (u_int32_t k=0; k<s; k++)
             {
@@ -706,8 +702,14 @@
             pcbp->_pdtokl->clear();
             pcbp->_state = state;
         }
-        else
-            _wrfc.add_cmpl_cnt_dblks(JRNL_SBLK_SIZE);
+        else // File header writes have no pcb
+        {
+            file_hdr* fhp = (file_hdr*)iocbp->u.c.buf;
+            u_int32_t fid = fhp->_fid;
+            nlfh* nlfhp = _wrfc.file_handle(fid);
+//std::cout << "{f*:" << _wrfc.index() << ":" << fid << "," << iocbp << "}" << std::flush;
+            nlfhp->add_wr_cmpl_cnt_dblks(JRNL_SBLK_SIZE);
+        }        
     }
 
     // Perform AIO return callback
@@ -721,13 +723,36 @@
 wmgr::initialize() throw (jexception)
 {
     pmgr::initialize();
-    if (::posix_memalign(&_fhdr_buff, _sblksize, _sblksize))
+    if (::posix_memalign(&_fhdr_base_ptr, _sblksize, _sblksize * JRNL_NUM_FILES))
     {
+        clean();
         std::stringstream ss;
         ss << "posix_memalign(): blksize=" << _sblksize << " size=" << _sblksize;
         ss << " errno=" << errno;
         throw jexception(jerrno::JERR__MALLOC, ss.str(), "wmgr", "initialize");
     }
+    _fhdr_ptr_arr = (void**)::malloc(_pages * sizeof(void*));
+    if (_fhdr_ptr_arr == NULL)
+    {
+        clean();
+        std::stringstream ss;
+        ss << "_fhdr_ptr_arr malloc(): errno=" << errno;
+        throw jexception(jerrno::JERR__MALLOC, ss.str(), "wmgr", "initialize");
+    }
+    _iocba = (iocb**)::malloc(sizeof(iocb*) * JRNL_NUM_FILES);
+    if (_iocba == NULL)
+    {
+        clean();
+        std::stringstream ss;
+        ss << "_iocba new(): errno=" << errno;
+        throw jexception(jerrno::JERR__MALLOC, ss.str(), "wmgr", "initialize");
+    }
+    ::memset(_iocba, 0, sizeof(iocb*) * JRNL_NUM_FILES);
+    for (u_int16_t i=0; i<JRNL_NUM_FILES; i++)
+    {
+        _fhdr_ptr_arr[i] = (void*)((char*)_fhdr_base_ptr + _sblksize * i);
+        _iocba[i] = ::new iocb;
+    }
     _page_cb_arr[0]._state = IN_USE;
     _ddtokl.clear();
     _cached_offset_dblks = 0;
@@ -825,18 +850,42 @@
 wmgr::write_fhdr(u_int64_t rid, u_int32_t fid, size_t fro) throw (jexception)
 {
     file_hdr fhdr(RHM_JDAT_FILE_MAGIC, RHM_JDAT_VERSION, 0, rid, fid, fro, true);
-    ::memcpy(_fhdr_buff, &fhdr, sizeof(fhdr));
+    ::memcpy(_fhdr_ptr_arr[fid], &fhdr, sizeof(fhdr));
 #ifdef RHM_CLEAN
-    ::memset((char*)_fhdr_buff + sizeof(fhdr), RHM_CLEAN_CHAR, _sblksize - sizeof(fhdr));
+    ::memset((char*)_fhdr_ptr_arr[fid] + sizeof(fhdr), RHM_CLEAN_CHAR, _sblksize - sizeof(fhdr));
 #endif
-    iocb* iocbp = &_fhdr_iocb;
-    ::io_prep_pwrite(iocbp, _wrfc.fh(), _fhdr_buff, _sblksize, 0);
+    iocb* iocbp = _iocba[fid];
+    ::io_prep_pwrite(iocbp, _wrfc.fh(), _fhdr_ptr_arr[fid], _sblksize, 0);
     if (::io_submit(_ioctx, 1, &iocbp) < 0)
         throw jexception(jerrno::JERR__AIO, "wmgr", "write_fhdr");
     _aio_evt_rem++;
+//std::cout << "{f^" << fid << "," << JRNL_SBLK_SIZE << "," << iocbp << "}" << std::flush;
     _wrfc.add_subm_cnt_dblks(JRNL_SBLK_SIZE);
 }
 
+void
+wmgr::clean()
+{
+    if (_fhdr_base_ptr)
+    {
+        ::free(_fhdr_base_ptr);
+        _fhdr_base_ptr = NULL;
+    }
+    if (_fhdr_ptr_arr)
+    {
+        ::free(_fhdr_ptr_arr);
+        _fhdr_ptr_arr = NULL;
+    }
+    if (_iocba)
+    {
+        for (u_int32_t i=0; i<JRNL_NUM_FILES; i++)
+            if (_iocba[i])
+                ::delete _iocba[i];
+        ::free(_iocba);
+        _iocba = NULL;
+    }
+}
+
 // static
 
 const char* wmgr::_op_str[] = {"enqueue", "dequeue", "abort", "commit"};

Modified: store/trunk/cpp/lib/jrnl/wmgr.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/wmgr.hpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/lib/jrnl/wmgr.hpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -71,16 +71,19 @@
         wrfc& _wrfc;                    ///< Ref to write rotating file controller
         u_int32_t _max_dtokpp;          ///< Max data writes per page
         u_int32_t _max_io_wait_us;      ///< Max wait in microseconds till submit
-        void* _fhdr_buff;               ///< Buffer for file header writes
-        iocb _fhdr_iocb;                ///< IO control block for file header writes
+        void* _fhdr_base_ptr;           ///< Base pointer to file header memory
+        void** _fhdr_ptr_arr;           ///< Array of pointers to file headers memory
+        iocb** _iocba;                  ///< Array of iocb pointers for file header writes
         u_int32_t _cached_offset_dblks; ///< Amount of unwritten data in page (dblocks)
         std::deque<data_tok*> _ddtokl;  ///< Deferred dequeue data_tok list
+
         // TODO: Convert _enq_busy etc into a proper threadsafe lock
         // TODO: Convert to enum? Are these encodes mutually exclusive?
         bool _enq_busy;                 ///< Flag true if enqueue is in progress
         bool _deq_busy;                 ///< Flag true if dequeue is in progress
         bool _abort_busy;               ///< Flag true if abort is in progress
         bool _commit_busy;              ///< Flag true if commit is in progress
+
         enum _op_type { WMGR_ENQUEUE = 0, WMGR_DEQUEUE, WMGR_ABORT, WMGR_COMMIT };
         static const char* _op_str[];
 
@@ -117,6 +120,7 @@
         const iores rotate_file();
         void dblk_roundup();
         void write_fhdr(u_int64_t rid, u_int32_t fid, size_t fro) throw (jexception);
+        void clean();
 
         // Special version of libaio's io_prep_pwrite() which preserves the value of the data
         // pointer. This allows iocbs to be initialized with a pointer that can be re-used. Note

Modified: store/trunk/cpp/tests/jrnl/JournalSystemTests.cpp
===================================================================
--- store/trunk/cpp/tests/jrnl/JournalSystemTests.cpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/tests/jrnl/JournalSystemTests.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -37,7 +37,6 @@
 #include <PreparedTransaction.h>
 #include <boost/ptr_container/ptr_list.hpp>
 
-#define MAX_MSG_SIZE 127
 #define NUM_MSGS 5
 #define MAX_AIO_SLEEPS 500
 #define AIO_SLEEP_TIME 1000
@@ -52,7 +51,7 @@
     CPPUNIT_TEST(RecoverReadTest);
     CPPUNIT_TEST(RecoveredReadTest);
     CPPUNIT_TEST(RecoveredDequeueTest);
-    CPPUNIT_TEST(ComplexRecoveryTest1);
+//    CPPUNIT_TEST(ComplexRecoveryTest1);
     CPPUNIT_TEST(EncodeTest_000);
     CPPUNIT_TEST(EncodeTest_001);
     CPPUNIT_TEST(EncodeTest_002);
@@ -86,7 +85,11 @@
 
     jtest t;
     std::string msg;
-    char buff[MAX_MSG_SIZE + 1];
+    void* mbuff;
+    size_t msize;
+    void* xidbuff;
+    size_t xidsize;
+    bool transientFlag;
 
 public:
 
@@ -276,8 +279,12 @@
                 rhm::journal::jcntl jc(test_name, "jdata", test_name);
                 jc.recover(txn_list);
                 for (int m=0; m<NUM_MSGS; m++)
+                {
+                    read_msg(&jc);
                     CPPUNIT_ASSERT_MESSAGE("Message corrupt during recover.",
-                            create_msg(msg, m).compare(read_msg(&jc)) == 0);
+                            create_msg(msg, m).compare(string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
             }
         }
         catch (rhm::journal::jexception& e)
@@ -305,8 +312,13 @@
                 CPPUNIT_ASSERT_MESSAGE("Journal heap instantiation failed.", jcp != NULL);
                 jcp->recover(txn_list);
                 for (int m=0; m<NUM_MSGS; m++)
+                {
+                    read_msg(jcp);
+                    std::string msg((char*)mbuff, msize);
                     CPPUNIT_ASSERT_MESSAGE("Message corrupt during recover.",
-                            create_msg(msg, m).compare(read_msg(jcp)) == 0);
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 delete jcp;
             }
         }
@@ -337,12 +349,20 @@
                 rhm::journal::jcntl jc(test_name, "jdata", test_name);
                 jc.recover(txn_list);
                 for (int m=0; m<NUM_MSGS; m++)
+                {
+                    read_msg(&jc);
                     CPPUNIT_ASSERT_MESSAGE("Message corrupt during recover.",
-                            create_msg(msg, m).compare(read_msg(&jc)) == 0);
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 jc.recover_complete();
                 for (int m=0; m<NUM_MSGS; m++)
+                {
+                    read_msg(&jc);
                     CPPUNIT_ASSERT_MESSAGE("Message corrupt after recovery.",
-                            create_msg(msg, m).compare(read_msg(&jc)) == 0);
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
             }
         }
         catch (rhm::journal::jexception& e)
@@ -370,12 +390,20 @@
                 CPPUNIT_ASSERT_MESSAGE("Journal heap instantiation failed.", jcp != NULL);
                 jcp->recover(txn_list);
                 for (int m=0; m<NUM_MSGS; m++)
+                {
+                    read_msg(jcp);
                     CPPUNIT_ASSERT_MESSAGE("Message corrupt during recover.",
-                            create_msg(msg, m).compare(read_msg(jcp)) == 0);
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 jcp->recover_complete();
                 for (int m=0; m<NUM_MSGS; m++)
+                {
+                    read_msg(jcp);
                     CPPUNIT_ASSERT_MESSAGE("Message corrupt after recovery.",
-                            create_msg(msg, m).compare(read_msg(jcp)) == 0);
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 delete jcp;
             }
         }
@@ -406,12 +434,20 @@
                 rhm::journal::jcntl jc(test_name, "jdata", test_name);
                 jc.recover(txn_list);
                 for (int m=0; m<NUM_MSGS; m++)
+                {
+                    read_msg(&jc);
                     CPPUNIT_ASSERT_MESSAGE("Message corrupt during recover.",
-                            create_msg(msg, m).compare(read_msg(&jc)) == 0);
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 jc.recover_complete();
                 for (int m=0; m<NUM_MSGS; m++)
+                {
+                    read_msg(&jc);
                     CPPUNIT_ASSERT_MESSAGE("Message corrupt after recovery.",
-                            create_msg(msg, m).compare(read_msg(&jc)) == 0);
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 for (int m=0; m<NUM_MSGS; m++)
                     deq_msg(&jc, m);
             }
@@ -441,12 +477,20 @@
                 CPPUNIT_ASSERT_MESSAGE("Journal heap instantiation failed.", jcp != NULL);
                 jcp->recover(txn_list);
                 for (int m=0; m<NUM_MSGS; m++)
+                {
+                    read_msg(jcp);
                     CPPUNIT_ASSERT_MESSAGE("Message corrupt during recover.",
-                            create_msg(msg, m).compare(read_msg(jcp)) == 0);
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 jcp->recover_complete();
                 for (int m=0; m<NUM_MSGS; m++)
+                {
+                    read_msg(jcp);
                     CPPUNIT_ASSERT_MESSAGE("Message corrupt after recovery.",
-                            create_msg(msg, m).compare(read_msg(jcp)) == 0);
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 for (int m=0; m<NUM_MSGS; m++)
                     deq_msg(jcp, m);
                 delete jcp;
@@ -480,26 +524,42 @@
                     deq_msg(&jc, m);
                 jc.flush();
                 for (int m=NUM_MSGS; m<NUM_MSGS*2; m++)
-                    CPPUNIT_ASSERT_MESSAGE("Message corrupt during recover.",
-                            create_msg(msg, m).compare(read_msg(&jc)) == 0);
+                {
+                    read_msg(&jc);
+                    CPPUNIT_ASSERT_MESSAGE("Message corrupt before recover.",
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
             }
             {
                 rhm::journal::jcntl jc(test_name, "jdata", test_name);
                 jc.recover(txn_list);
                 for (int m=NUM_MSGS; m<NUM_MSGS*2; m++)
+                {
+                    read_msg(&jc);
                     CPPUNIT_ASSERT_MESSAGE("Message corrupt during recover.",
-                            create_msg(msg, m).compare(read_msg(&jc)) == 0);
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 jc.recover_complete();
                 // rids: NUM_MSGS*3 to NUM_MSGS*4 - 1
                 for (int m=NUM_MSGS*3; m<NUM_MSGS*4; m++)
                     enq_msg(&jc, create_msg(msg, m));
                 jc.flush();
                 for (int m=NUM_MSGS; m<NUM_MSGS*2; m++)
-                    CPPUNIT_ASSERT_MESSAGE("Message corrupt during recover.",
-                            create_msg(msg, m).compare(read_msg(&jc)) == 0);
+                {
+                    read_msg(&jc);
+                    CPPUNIT_ASSERT_MESSAGE("Message corrupt after recover.",
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 for (int m=NUM_MSGS*3; m<NUM_MSGS*4; m++)
-                    CPPUNIT_ASSERT_MESSAGE("Message corrupt during recover.",
-                            create_msg(msg, m).compare(read_msg(&jc)) == 0);
+                {
+                    read_msg(&jc);
+                    CPPUNIT_ASSERT_MESSAGE("Message corrupt after recover.",
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 // rids: NUM_MSGS*4 to NUM_MSGS*6 - 1
                 for (int m=NUM_MSGS; m<NUM_MSGS*2; m++)
                     deq_msg(&jc, m);
@@ -530,8 +590,12 @@
                     deq_msg(jcp, m);
                 jcp->flush();
                 for (int m=NUM_MSGS; m<NUM_MSGS*2; m++)
-                    CPPUNIT_ASSERT_MESSAGE("Message corrupt during recover.",
-                            create_msg(msg, m).compare(read_msg(jcp)) == 0);
+                {
+                    read_msg(jcp);
+                    CPPUNIT_ASSERT_MESSAGE("Message corrupt before recover.",
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 delete jcp;
                 jcp = NULL;
             }
@@ -540,19 +604,31 @@
                 CPPUNIT_ASSERT_MESSAGE("Journal heap instantiation failed.", jcp != NULL);
                 jcp->recover(txn_list);
                 for (int m=NUM_MSGS; m<NUM_MSGS*2; m++)
+                {
+                    read_msg(jcp);
                     CPPUNIT_ASSERT_MESSAGE("Message corrupt during recover.",
-                            create_msg(msg, m).compare(read_msg(jcp)) == 0);
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 jcp->recover_complete();
                 // rids: NUM_MSGS*3 to NUM_MSGS*4 - 1
                 for (int m=NUM_MSGS*3; m<NUM_MSGS*4; m++)
                     enq_msg(jcp, create_msg(msg, m));
                 jcp->flush();
                 for (int m=NUM_MSGS; m<NUM_MSGS*2; m++)
+                {
+                    read_msg(jcp);
                     CPPUNIT_ASSERT_MESSAGE("Message corrupt after recovery.",
-                            create_msg(msg, m).compare(read_msg(jcp)) == 0);
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 for (int m=NUM_MSGS*3; m<NUM_MSGS*4; m++)
+                {
+                    read_msg(jcp);
                     CPPUNIT_ASSERT_MESSAGE("Message corrupt after recovery.",
-                            create_msg(msg, m).compare(read_msg(jcp)) == 0);
+                            create_msg(msg, m).compare(std::string((char*)mbuff, msize)) == 0);
+                    cleanMessage();
+                }
                 // rids: NUM_MSGS*4 to NUM_MSGS*6 - 1
                 for (int m=NUM_MSGS; m<NUM_MSGS*2; m++)
                     deq_msg(jcp, m);
@@ -748,18 +824,14 @@
 
     char* read_msg(rhm::journal::jcntl* jc)
     {
-        memset(buff, '*', MAX_MSG_SIZE);
-        buff[MAX_MSG_SIZE] = '\0';
-
         rhm::journal::data_tok* dtp = new rhm::journal::data_tok;
         CPPUNIT_ASSERT_MESSAGE("Data Token heap intantiation failed.", dtp != NULL);
         dtp->set_wstate(rhm::journal::data_tok::ENQ);
 
         unsigned aio_sleep_cnt = 0;
-        while (handle_jcntl_response(jc->read_data_record(buff, MAX_MSG_SIZE, dtp), jc,
-                aio_sleep_cnt, dtp));
-        buff[dtp->dsize()] = '\0';
-        return buff;
+        while (handle_jcntl_response(jc->read_data_record(&mbuff, msize, &xidbuff, xidsize,
+                transientFlag, dtp), jc, aio_sleep_cnt, dtp));
+        return (char*)mbuff;
     }
     
     bool handle_jcntl_response(rhm::journal::iores res, rhm::journal::jcntl* jc,
@@ -768,7 +840,7 @@
         switch (res)
         {
             case rhm::journal::RHM_IORES_SUCCESS:
-                buff[dtp->dsize()] = '\0';
+                //((char*)mbuff)[msize] = '\0';
                 return false;
             case rhm::journal::RHM_IORES_AIO_WAIT:
                 if (++aio_sleep_cnt <= MAX_AIO_SLEEPS)
@@ -811,7 +883,7 @@
     void runEncodeTest(const unsigned num_msgs, const unsigned min_msg_size,
             const unsigned max_msg_szie, const bool auto_deq, const unsigned min_xid_size,
             const unsigned max_xid_size, const bool transient, const unsigned iterations,
-            const char* test_descr)
+            char* test_descr)
     {
         std::cout << "  [" << test_descr << "] " << std::flush;
         jtest::targs ta(num_msgs, min_msg_size, max_msg_szie, auto_deq, min_xid_size,
@@ -833,6 +905,21 @@
             t.finalize();
         }
     }
+    
+    void cleanMessage()
+    {
+        if (xidbuff)
+        {
+            free(xidbuff);
+            xidbuff = NULL;
+            mbuff = NULL;
+        }
+        else if (mbuff)
+        {
+            free (mbuff);
+            mbuff = NULL;
+        }
+    }
 };
 
 // Make this test suite a plugin.

Modified: store/trunk/cpp/tests/jrnl/cp_rtest_jrnl
===================================================================
--- store/trunk/cpp/tests/jrnl/cp_rtest_jrnl	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/tests/jrnl/cp_rtest_jrnl	2007-10-09 04:26:13 UTC (rev 973)
@@ -1,6 +1,6 @@
 #!/bin/bash
 JDATA_DIR=jdata
-TAR_DIR=test/rd_test_jrnls
+TAR_DIR=rd_test_jrnls
 
 function get_filename
 {

Modified: store/trunk/cpp/tests/jrnl/jtest.cpp
===================================================================
--- store/trunk/cpp/tests/jrnl/jtest.cpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/tests/jrnl/jtest.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -59,7 +59,6 @@
         t.run();
         t.report();
         t.finalize();
-        cout << "*** jtest done." << endl << endl;
     }
     catch (const rhm::journal::jexception& e)
     {
@@ -68,6 +67,7 @@
         cerr << "*** jtest failed with code 0x" << std::setw(4) << e.err_code() << " ***" << endl;
         return(1);
     }
+    cout << "*** jtest done." << endl << endl;
     return 0;
 }
 
@@ -84,7 +84,7 @@
 
 jtest::targs::targs(const u_int32_t num_msgs, const size_t min_msg_size, const size_t max_msg_size,
         const bool auto_deq, const size_t min_xid_size, const size_t max_xid_size,
-        const bool transient, const char* comment):
+        const bool transient, char* comment):
         _num_msgs(num_msgs),
         _min_msg_size(min_msg_size),
         _max_msg_size(max_msg_size),
@@ -320,7 +320,7 @@
     {
         msg_consumer::interrupt(); // Wheels fell off; stop consumer thread
         cout << "Producer failed with exception 0x" << hex << setw(4) << setfill('0')
-                << e.err_code() << "; consumer thread aborted." << endl;
+                << e.err_code() << "; consumer thread aborted." << dec << endl;
         cout << e << endl;
         p_args_ptr->_err = e.err_code();
     }
@@ -337,7 +337,7 @@
     {
         msg_producer::interrupt(); // Train smash; stop producer thread
         cout << "Consumer failed with exception 0x" << hex << setw(4) << setfill('0')
-            << e.err_code() << "; producer thread aborted." << endl;
+            << e.err_code() << "; producer thread aborted." << dec << endl;
         cout << e << endl;
         c_args_ptr->_err = e.err_code();
     }
@@ -396,7 +396,13 @@
                 tap->_transient = !(strcmp(toks[TRANSIENT_COL], "FALSE") == 0 ||
                         strcmp(toks[TRANSIENT_COL], "0") == 0);
                 if (toks.size() > COMMENT_COL)
+                {
                     tap->_comment =  toks[COMMENT_COL];
+                    if (tap->_comment[0] == '"')
+                        tap->_comment++;
+                    if (tap->_comment[strlen(tap->_comment) - 1] == '"')
+                        tap->_comment[strlen(tap->_comment) - 1] = 0;
+                }
                 else
                     tap->_comment = NULL;
                 std::cout << "Test " << tnum << ": Messages=" << tap->_num_msgs << " Size=" <<

Modified: store/trunk/cpp/tests/jrnl/jtest.hpp
===================================================================
--- store/trunk/cpp/tests/jrnl/jtest.hpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/tests/jrnl/jtest.hpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -56,11 +56,11 @@
         size_t _min_xid_size;
         size_t _max_xid_size;
         bool _transient;
-        const char* _comment;
+        char* _comment;
         targs();
         targs(const u_int32_t num_msgs, const size_t min_msg_size, const size_t max_msg_size,
                 const bool auto_deq, const size_t min_xid_size, const size_t max_xid_size,
-                const bool transient, const char* comment = NULL);
+                const bool transient, char* comment = NULL);
     };
 
 private:

Modified: store/trunk/cpp/tests/jrnl/msg_consumer.cpp
===================================================================
--- store/trunk/cpp/tests/jrnl/msg_consumer.cpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/tests/jrnl/msg_consumer.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -94,11 +94,16 @@
 
 u_int32_t
 msg_consumer::consume(rhm::journal::jcntl& _jcntl, const u_int32_t num_msgs,
-        const size_t min_msg_size, const size_t max_msg_size, const size_t /*min_xid_size*/,
-        const size_t /*max_xid_size*/, const bool /*transient*/) throw (rhm::journal::jexception)
+        const size_t min_msg_size, const size_t max_msg_size, const size_t min_xid_size,
+        const size_t max_xid_size, const bool transient_expected) throw (rhm::journal::jexception)
 {
 //std::cout << "msg_consumer::consume() num_msgs=" << num_msgs << std::endl;
-    size_t data_size;
+    void* datap = NULL;
+    size_t data_size = 0;
+    void* xidp = NULL;
+    size_t xid_size = 0;
+    bool transient_flag = false;
+
     u_int32_t msgCntr = 0;
     for (msgCntr = 0; msgCntr < num_msgs && !_interrupt_flag; msgCntr++)
     {
@@ -112,8 +117,8 @@
         {
             if (dtokp->wstate() >= rhm::journal::data_tok::ENQ)
             {
-                rhm::journal::iores res = _jcntl.read_data_record((void* const)_msg_buff,
-                        buffSize, dtokp);
+                rhm::journal::iores res = _jcntl.read_data_record(&datap, data_size, &xidp,
+                        xid_size, transient_flag, dtokp);
                 rhm::journal::data_tok::read_state rs = dtokp->rstate();
                 rhm::journal::data_tok::write_state ws = dtokp->wstate();
                 switch (res)
@@ -124,13 +129,14 @@
                                     iores_str[res] << " ws=" << dtokp->wstate_str() << "; rs=" <<
                                     dtokp->rstate_str();
                         data_size = dtokp->dsize();
-                        _msg_buff[data_size] = 0; // Make msg into a c-string
                         read = true;
                         _tot_dblks += dtokp->dblocks_read();
                         _tot_dsize += data_size;
 
                         // Comment out these for performance checks/measurements        
-                        check_msg(msgCntr, data_size, min_msg_size, max_msg_size, true, _msg_buff);
+                        check_msg(msgCntr, data_size, min_msg_size, max_msg_size, true, datap);
+                        check_xid(msgCntr, xid_size, min_xid_size, max_xid_size, true, xidp);
+                        check_transience(msgCntr, transient_flag, transient_expected);
                         //print_dbug(msgCntr, data_size, _msg_buff, true);
                         break;
                  case rhm::journal::RHM_IORES_AIO_WAIT:
@@ -177,7 +183,18 @@
                             "msg_consumer", "consume");
                 usleep(ENQ_WAIT_SLEEP_TIME);
             }
-        }
+        } // while(!read)
+        
+        // Clean up allocated message/xid memory
+        if (xidp)
+            ::free(xidp);
+        else if (datap)
+            ::free(datap);
+        datap = NULL;
+        data_size = 0;
+        xidp = NULL;
+        xid_size = 0;
+        transient_flag = false;
     }
     _interrupt_flag = false;
     return msgCntr;
@@ -204,7 +221,8 @@
 
 void
 msg_consumer::check_msg(const u_int32_t msgCntr, const size_t msg_size, const size_t min_msg_size,
-        const size_t max_msg_size, bool chk_data, char* buff) const throw (rhm::journal::jexception)
+        const size_t max_msg_size, bool chk_data, void* datap) const
+        throw (rhm::journal::jexception)
 {
     if (max_msg_size > 0 && (msg_size < min_msg_size || msg_size > max_msg_size))
     {
@@ -223,12 +241,13 @@
     {
         for (unsigned i=0; i<msg_size; i++)
         {
+            char found = ((char*)datap)[i];
             char expected = '0' + (((msgCntr%10) + i + 1) % 10);
-            if (buff[i] != expected)
+            if (found != expected)
             {
                 std::stringstream ss;
                 ss << "Message " << msgCntr << " failed content check at char " << i;
-                ss << ": found \'" << buff[i] << "\'; expected \'" << expected << "\'";
+                ss << ": found \'" << found << "\'; expected \'" << expected << "\'";
                 throw rhm::journal::jexception(EXCEPTION_BASE+4, ss.str(), "msg_consumer",
                         "check_msg");
             }
@@ -237,6 +256,58 @@
 }
 
 void
+msg_consumer::check_xid(const u_int32_t msgCntr, const size_t xid_size, const size_t min_xid_size,
+        const size_t max_xid_size, bool chk_xid_data, void* xidp) const
+        throw (rhm::journal::jexception)
+{
+    if (max_xid_size > 0 && (xid_size < min_xid_size || xid_size > max_xid_size))
+    {
+        std::stringstream ss;
+        ss << "Message " << msgCntr << " of size " << xid_size;
+        if (min_xid_size == max_xid_size)
+            ss << " is valid, but exptected size is " << max_xid_size;
+        else
+        {
+            ss << " is valid, but exptected size must lie between " << min_xid_size;
+            ss << " and " << max_xid_size;
+        }
+        throw rhm::journal::jexception(EXCEPTION_BASE+5, ss.str(), "msg_consumer", "check_xid");
+    }
+    if (chk_xid_data)
+    {
+        for (unsigned i=0; i<xid_size; i++)
+        {
+            char found = ((char*)xidp)[i];
+            char expected = 'a' + (((msgCntr%26) + i) % 26);
+            if (found != expected)
+            {
+                std::stringstream ss;
+                ss << "Message " << msgCntr << " failed XID check at char " << i;
+                ss << ": found \'" << found << "\'; expected \'" << expected << "\'";
+                throw rhm::journal::jexception(EXCEPTION_BASE+6, ss.str(), "msg_consumer",
+                        "check_xid");
+            }
+        }
+    }
+}
+
+void
+msg_consumer::check_transience(const u_int32_t msgCntr, const bool transient_flag,
+        const bool transient_expected_flag) const throw (rhm::journal::jexception)
+{
+    if ((transient_flag && !transient_expected_flag) ||
+            (!transient_flag && transient_expected_flag))
+    {
+        std::stringstream ss;
+        ss << "Message " << msgCntr << " failed transience check: found ";
+        ss << (transient_flag?"transient":"persistent") << "; expected ";
+        ss << (transient_expected_flag?"transient":"persistent") << ".";
+        throw rhm::journal::jexception(EXCEPTION_BASE+7, ss.str(), "msg_consumer",
+                "check_transience");
+    }
+}
+
+void
 msg_consumer::print_dbug(const u_int32_t msgCntr, const size_t msg_size, char* buff,
         const bool show_msg) const
 {
@@ -274,6 +345,6 @@
     };
 
 u_int16_t msg_consumer::instCnt = 0;
-const size_t msg_consumer::buffSize = JRNL_DBLK_SIZE * JRNL_SBLK_SIZE * JRNL_FILE_SIZE * JRNL_NUM_FILES;
-char msg_consumer::_msg_buff[msg_consumer::buffSize];
+// const size_t msg_consumer::buffSize = JRNL_DBLK_SIZE * JRNL_SBLK_SIZE * JRNL_FILE_SIZE * JRNL_NUM_FILES;
+// char msg_consumer::_msg_buff[msg_consumer::buffSize];
 bool msg_consumer::_interrupt_flag = false;

Modified: store/trunk/cpp/tests/jrnl/msg_consumer.hpp
===================================================================
--- store/trunk/cpp/tests/jrnl/msg_consumer.hpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/tests/jrnl/msg_consumer.hpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -62,8 +62,8 @@
 
 private:
     static u_int16_t instCnt;
-    static const size_t buffSize;
-    static char _msg_buff[];
+//     static const size_t buffSize;
+//     static char _msg_buff[];
     static bool _interrupt_flag;
     u_int32_t _num_msgs;
     std::deque<rhm::journal::data_tok*>& _dtok_master_list; // One dtok per msg to be received
@@ -91,8 +91,13 @@
     static void interrupt();
 private:
     void check_msg(const u_int32_t msgCntr, const size_t msg_size, const size_t min_msg_size,
-        const size_t max_msg_size, bool chk_data, char* buff) const
-        throw (rhm::journal::jexception);
+            const size_t max_msg_size, bool chk_data, void* datap) const
+            throw (rhm::journal::jexception);
+    void check_xid(const u_int32_t msgCntr, const size_t xid_size, const size_t min_xid_size,
+            const size_t max_xid_size, bool chk_xid_data, void* xidp) const
+            throw (rhm::journal::jexception);
+    void check_transience(const u_int32_t msgCntr, const bool transient_flag,
+            const bool transient_expected_flag) const throw (rhm::journal::jexception);
     void print_dbug(const u_int32_t msgCntr, const size_t msg_size, char* buff,
             const bool show_msg = false) const;
 

Modified: store/trunk/cpp/tests/jrnl/msg_producer.cpp
===================================================================
--- store/trunk/cpp/tests/jrnl/msg_producer.cpp	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/tests/jrnl/msg_producer.cpp	2007-10-09 04:26:13 UTC (rev 973)
@@ -263,14 +263,17 @@
             _dd_dtok_list.push_back(dtokp);
         }
         else if (dtokp->wstate() == rhm::journal::data_tok::DEQ)
-//{ std::cout << ">D" << dtokp->id() << " " << std::flush;
+        {
+//std::cout << ">D" << dtokp->id() << " " << std::flush;
             _num_msgs_deq++;
-//}
+        }
         else if (dtokp->wstate() == rhm::journal::data_tok::ABORTED ||
             dtokp->wstate() == rhm::journal::data_tok::COMMITTED)
-//{std::cout << ">T" << dtokp->id() << " " << std::flush;
+        {
+//std::cout << ">T" << dtokp->id() << " " << std::flush;
             _num_txn++;
-//} else std::cout << ">?" << dtokp->id() << " st=" << dtokp->wstate_str() << " " << std::flush;
+        }
+//else std::cout << ">?" << dtokp->id() << " st=" << dtokp->wstate_str() << " " << std::flush;
         this_dtok_list.pop_front();
     }
 }
@@ -353,6 +356,7 @@
                 // Create new data_tok, push to back of maseter list
                 rhm::journal::data_tok* txn_dtokp = new rhm::journal::data_tok;
                 _dtok_master_list.push_back(txn_dtokp);
+//std::cout << " T" << ddtokp->id() << " " << std::flush;
                 while (!written)
                 {
                     rhm::journal::iores dres;
@@ -402,10 +406,11 @@
 {
     // Clear any unsent enqueues in buffer, then wait for all enqueues to return
     unsigned flush_cnt = 0;
-    if (_num_msgs_enq < num_msgs_sent)
+    assert(num_msgs_sent == _num_msgs_enq_subm);
+    if (_num_msgs_enq < _num_msgs_enq_subm)
     {
         jc.flush();
-        while (_num_msgs_enq < num_msgs_sent && !_interrupt_flag)
+        while (_num_msgs_enq < _num_msgs_enq_subm && !_interrupt_flag)
         {
             if (flush_cnt >= MAX_FLUSH_SLEEPS)
             {
@@ -441,10 +446,12 @@
 
         // Clear any unsent dequeues in buffer, then wait for all dequeues to return
         flush_cnt = 0;
-        if (_num_msgs_deq < num_msgs_sent)
+        assert(num_msgs_sent == _num_msgs_deq_subm);
+        if (_num_msgs_deq < _num_msgs_deq_subm || _num_txn < _num_txn_subm)
         {
             jc.flush();
-            while (_num_msgs_deq < num_msgs_sent && !_interrupt_flag)
+            while ((_num_msgs_deq < _num_msgs_deq_subm || _num_txn < _num_txn_subm) &&
+                    !_interrupt_flag)
             {
                 if (flush_cnt >= MAX_FLUSH_SLEEPS)
                 {

Modified: store/trunk/cpp/tests/jrnl/rtest
===================================================================
--- store/trunk/cpp/tests/jrnl/rtest	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/tests/jrnl/rtest	2007-10-09 04:26:13 UTC (rev 973)
@@ -29,6 +29,7 @@
 TEMP_V_FILE=/tmp/v.txt
 
 NUM_JFILES=8
+VG_ITERATIONS=1
 #VG_NORM_FILESIZE=11
 VG_NORM_FILESIZE=18 # RHEL5 triggers extra valgrind messages when pthreads are in use
 
@@ -36,7 +37,7 @@
 W_DO_TEST=T
 W_TEST_FILE=wtests.csv
 W_TEST_START=0
-W_TEST_STOP=196
+W_TEST_STOP=218
 W_NITER=5
 
 # Read test
@@ -50,7 +51,7 @@
 RW_DO_TEST=T
 RW_TEST_FILE=rwtests.csv
 RW_TEST_START=0
-RW_TEST_STOP=148
+RW_TEST_STOP=170
 RW_NITER=5
 
 RM=rm
@@ -357,7 +358,7 @@
     local test_num=$2
 
     # Perform valgrind test (memory leak check)
-    echo -n " *"
+    echo -n "*"
     ${VALGRIND} ${TEST_PROG} ${test_file} ${test_num} > ${NULL_FILE} 2> ${TEMP_V_FILE}
     local ret=$?
     if (( ${ret} != 0 )); then
@@ -469,11 +470,13 @@
             fi
         done
 
-        valgrind_memchk ${test_file} $t
-        local ret=$?
-        if (( ${ret} != 0 )); then
-            return ${ret}
-        fi
+		for (( i=1; i<=${VG_ITERATIONS}; i++ )); do
+            valgrind_memchk ${test_file} $t
+            local ret=$?
+            if (( ${ret} != 0 )); then
+                return ${ret}
+            fi
+        done
 
         # Remove journals accumulated during test
         echo -n " ~"

Modified: store/trunk/cpp/tests/jrnl/rtests.csv
===================================================================
--- store/trunk/cpp/tests/jrnl/rtests.csv	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/tests/jrnl/rtests.csv	2007-10-09 04:26:13 UTC (rev 973)
@@ -2,146 +2,168 @@
 "Test #","tf","pf","amn","mn incr","#msgs","ms incr","Min","Max","Min","Max","auto-deq","transient","bytes","dblks","bytes","dblks","bytes","dblks","comment"
 ,,,,,,,,,,,,,,,,,,,
 "Initialize only",,,,,,,,,,,,,,,,,,,
-0,"L",,0,0,0,0,0,0,0,0,FALSE,FALSE,,,,,,,"No messages - journal creation/initialization only"
+0,"L",0,0,0,0,0,0,0,0,0,FALSE,FALSE,44,1,0,0,0,0,"No messages – journal creation/initialization only"
 ,,,,,,,,,,,,,,,,,,,
-"Simple message  combinations of persistent/transient, dequeued/non-dequeued, transactional/non-transactional",,,,,,,,,,,,,,,,,,,
-1,"L",,1,0,1,0,10,10,0,0,FALSE,FALSE,54,1,0,0,0,0,"1 * 10-byte message"
-2,"L",,10,0,10,0,10,10,0,0,FALSE,FALSE,54,1,0,0,0,0,"10 * 10-byte message"
-3,"L",,1,0,1,0,10,10,0,0,FALSE,TRUE,54,1,0,0,0,0,"1 * 10-byte message [transient]"
-4,"L",,10,0,10,0,10,10,0,0,FALSE,TRUE,54,1,0,0,0,0,"10 * 10-byte message [transient]"
-5,"L",,1,0,1,0,10,10,10,10,FALSE,FALSE,64,1,0,0,0,0,"1 * 10-byte message [txn]"
-6,"L",,10,0,10,0,10,10,10,10,FALSE,FALSE,64,1,0,0,0,0,"10 * 10-byte message [txn]"
-7,"L",,1,0,1,0,10,10,10,10,FALSE,TRUE,64,1,0,0,0,0,"1 * 10-byte message [txn transient]"
-8,"L",,10,0,10,0,10,10,10,10,FALSE,TRUE,64,1,0,0,0,0,"10 * 10-byte message [txn transient]"
-9,"L",,1,0,1,0,10,10,0,0,TRUE,FALSE,54,1,32,1,0,0,"1 * 10-byte message [deq]"
-10,"L",,10,0,10,0,10,10,0,0,TRUE,FALSE,54,1,32,1,0,0,"10 * 10-byte message [deq]"
-11,"L",,1,0,1,0,10,10,0,0,TRUE,TRUE,54,1,32,1,0,0,"1 * 10-byte message [transient deq]"
-12,"L",,10,0,10,0,10,10,0,0,TRUE,TRUE,54,1,32,1,0,0,"10 * 10-byte message [transient deq]"
-13,"L",,1,0,1,0,10,10,10,10,TRUE,FALSE,64,1,54,1,46,1,"1 * 10-byte message [txn deq]"
-14,"L",,10,0,10,0,10,10,10,10,TRUE,FALSE,64,1,54,1,46,1,"10 * 10-byte message [txn deq]"
-15,"L",,1,0,1,0,10,10,10,10,TRUE,TRUE,64,1,54,1,46,1,"1 * 10-byte message [txn transient deq]"
-16,"L",,10,0,10,0,10,10,10,10,TRUE,TRUE,64,1,54,1,46,1,"10 * 10-byte message [txn transient deq]"
+"Simple message  combinations of persistent/deq transientueued/non-dequeued, transactional/non-transactional",,,,,,,,,,,,,,,,,,,
+1,"L",1,1,0,1,0,10,10,0,0,FALSE,FALSE,54,1,0,0,0,0,"1 * 10-byte message"
+2,"L",1,10,0,10,0,10,10,0,0,FALSE,FALSE,54,1,0,0,0,0,"10 * 10-byte message"
+3,"L",1,1,0,1,0,10,10,0,0,FALSE,TRUE,54,1,0,0,0,0,"1 * 10-byte message [transient]"
+4,"L",1,10,0,10,0,10,10,0,0,FALSE,TRUE,54,1,0,0,0,0,"10 * 10-byte message [transient]"
+5,"L",1,1,0,1,0,10,10,10,10,FALSE,FALSE,64,1,0,0,0,0,"1 * 10-byte message [txn]"
+6,"L",1,10,0,10,0,10,10,10,10,FALSE,FALSE,64,1,0,0,0,0,"10 * 10-byte message [txn]"
+7,"L",1,1,0,1,0,10,10,10,10,FALSE,TRUE,64,1,0,0,0,0,"1 * 10-byte message [txn transient]"
+8,"L",1,10,0,10,0,10,10,10,10,FALSE,TRUE,64,1,0,0,0,0,"10 * 10-byte message [txn transient]"
+9,"L",1,1,0,1,0,10,10,0,0,TRUE,FALSE,54,1,32,1,0,0,"1 * 10-byte message [deq]"
+10,"L",1,10,0,10,0,10,10,0,0,TRUE,FALSE,54,1,32,1,0,0,"10 * 10-byte message [deq]"
+11,"L",1,1,0,1,0,10,10,0,0,TRUE,TRUE,54,1,32,1,0,0,"1 * 10-byte message [deq transient]"
+12,"L",1,10,0,10,0,10,10,0,0,TRUE,TRUE,54,1,32,1,0,0,"10 * 10-byte message [deq transient]"
+13,"L",1,1,0,1,0,10,10,10,10,TRUE,FALSE,64,1,54,1,46,1,"1 * 10-byte message [deq txn]"
+14,"L",1,10,0,10,0,10,10,10,10,TRUE,FALSE,64,1,54,1,46,1,"10 * 10-byte message [deq txn]"
+15,"L",1,1,0,1,0,10,10,10,10,TRUE,TRUE,64,1,54,1,46,1,"1 * 10-byte message [txn deq transient]"
+16,"L",1,10,0,10,0,10,10,10,10,TRUE,TRUE,64,1,54,1,46,1,"10 * 10-byte message [txn deq transient]"
 ,,,,,,,,,,,,,,,,,,,
 "Transition from one d-block to two per message",,,,,,,,,,,,,,,,,,,
-17,"L",,10,0,10,0,84,84,0,0,FALSE,FALSE,128,1,0,0,0,0,"1 dblk exact fit"
-18,"L",,10,0,10,1,85,85,0,0,FALSE,FALSE,129,2,0,0,0,0,"1 dblk + 1 byte"
-19,"L",,10,0,10,0,58,58,26,26,FALSE,FALSE,128,1,0,0,0,0,"1 dblk exact fit [txn]"
-20,"L",,10,0,10,1,59,59,26,26,FALSE,FALSE,129,2,0,0,0,0,"1 dblk + 1 byte [txn]"
+17,"L",1,10,0,10,0,84,84,0,0,FALSE,FALSE,128,1,0,0,0,0,"1 dblk exact fit"
+18,"L",1,10,0,10,1,85,85,0,0,FALSE,FALSE,129,2,0,0,0,0,"1 dblk + 1 byte"
+19,"L",1,10,0,10,0,58,58,26,26,FALSE,FALSE,128,1,0,0,0,0,"1 dblk exact fit [txn]"
+20,"L",1,10,0,10,1,59,59,26,26,FALSE,FALSE,129,2,0,0,0,0,"1 dblk + 1 byte [txn]"
 ,,,,,,,,,,,,,,,,,,,
 "Transition from one s-block to two per message",,,,,,,,,,,,,,,,,,,
-21,"L",,10,0,10,0,468,468,0,0,FALSE,FALSE,512,4,0,0,0,0,"1 sblk exact fit"
-22,"L",,10,0,10,1,469,469,0,0,FALSE,FALSE,513,5,0,0,0,0,"1 sblk + 1 byte"
-23,"L",,10,0,10,0,442,442,26,26,FALSE,FALSE,512,4,0,0,0,0,"1 sblk exact fit [txn]"
-24,"L",,10,0,10,1,443,443,26,26,FALSE,FALSE,513,5,0,0,0,0,"1 sblk + 1 byte [txn]"
+21,"L",1,10,0,10,0,468,468,0,0,FALSE,FALSE,512,4,0,0,0,0,"1 sblk exact fit"
+22,"L",1,10,0,10,1,469,469,0,0,FALSE,FALSE,513,5,0,0,0,0,"1 sblk + 1 byte"
+23,"L",1,10,0,10,0,442,442,26,26,FALSE,FALSE,512,4,0,0,0,0,"1 sblk exact fit [txn]"
+24,"L",1,10,0,10,1,443,443,26,26,FALSE,FALSE,513,5,0,0,0,0,"1 sblk + 1 byte [txn]"
 ,,,,,,,,,,,,,,,,,,,
 "Transition from first page to second",,,,,,,,,,,,,,,,,,,
-25,"L",,8,0,8,0,4052,4052,0,0,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page"
-26,"L",,8,1,9,0,4052,4052,0,0,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page"
-27,"L",,8,0,8,1,4053,4053,0,0,FALSE,FALSE,4097,33,0,0,0,0,"1/8 page + 1 byte"
-28,"L",,8,0,8,0,3796,3796,256,256,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page [txn]"
-29,"L",,8,1,9,0,3796,3796,256,256,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page [txn]"
-30,"L",,8,0,8,1,3797,3797,256,256,FALSE,FALSE,4097,33,0,0,0,0,"1/8 page + 1 byte [txn]"
-31,"L",,8,0,8,0,3924,3924,0,0,TRUE,FALSE,3968,31,32,1,0,0,"1/8 page incl deq [deq]"
-32,"L",,8,1,9,0,3924,3924,0,0,TRUE,FALSE,3968,31,32,1,0,0,"1/8 page incl deq [deq]"
-33,"L",,8,0,8,1,3925,3925,0,0,TRUE,FALSE,3969,32,32,1,0,0,"1/8 page incl deq + 1 byte [deq]"
-34,"L",,8,0,8,0,3028,3028,256,256,TRUE,FALSE,3328,26,300,3,292,3,"1/8 page incl deq & txn [deq txn]"
-35,"L",,8,1,9,0,3028,3028,256,256,TRUE,FALSE,3328,26,300,3,292,3,"1/8 page incl deq & txn [deq txn]"
-36,"L",,8,0,8,1,3029,3029,256,256,TRUE,FALSE,3329,27,300,3,292,3,"1/8 page incl deq & txn + 1 byte [deq txn]"
+25,"L",1,8,0,8,0,8148,8148,0,0,FALSE,FALSE,8192,64,0,0,0,0,"1/8 page"
+26,"L",1,8,1,9,0,8148,8148,0,0,FALSE,FALSE,8192,64,0,0,0,0,"1/8 page"
+27,"L",1,8,0,8,1,8149,8149,0,0,FALSE,FALSE,8193,65,0,0,0,0,"1/8 page + 1 byte"
+28,"L",1,8,0,8,0,7892,7892,256,256,FALSE,FALSE,8192,64,0,0,0,0,"1/8 page [txn]"
+29,"L",1,8,1,9,0,7892,7892,256,256,FALSE,FALSE,8192,64,0,0,0,0,"1/8 page [txn]"
+30,"L",1,8,0,8,1,7893,7893,256,256,FALSE,FALSE,8193,65,0,0,0,0,"1/8 page + 1 byte [txn]"
+31,"L",1,8,0,8,0,8020,8020,0,0,TRUE,FALSE,8064,63,32,1,0,0,"1/8 page incl deq [deq]"
+32,"L",1,8,1,9,0,8020,8020,0,0,TRUE,FALSE,8064,63,32,1,0,0,"1/8 page incl deq [deq]"
+33,"L",1,8,0,8,1,8021,8021,0,0,TRUE,FALSE,8065,64,32,1,0,0,"1/8 page incl deq + 1 byte [deq]"
+34,"L",1,8,0,8,0,7124,7124,256,256,TRUE,FALSE,7424,58,300,3,292,3,"1/8 page incl deq & txn [deq txn]"
+35,"L",1,8,1,9,0,7124,7124,256,256,TRUE,FALSE,7424,58,300,3,292,3,"1/8 page incl deq & txn [deq txn]"
+36,"L",1,8,0,8,1,7125,7125,256,256,TRUE,FALSE,7425,59,300,3,292,3,"1/8 page incl deq & txn + 1 byte [deq txn]"
 ,,,,,,,,,,,,,,,,,,,
-"Page cache rollover (from page 32 back to page 0) - no dequeues as exact sizes are needed and dequeues are non-deterministic",,,,,,,,,,,,,,,,,,,
-37,"L",1,32,0,32,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"1 page"
-38,"L",1,32,1,33,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"1 page"
-39,"L",1,32,0,32,1,32725,32725,0,0,FALSE,FALSE,32769,257,0,0,0,0,"1 page + 1 byte"
-40,"L",1.5,22,0,22,0,49108,49108,0,0,FALSE,FALSE,49152,384,0,0,0,0,"1.5 pages"
-41,"L",1,32,0,32,0,32468,32468,256,256,FALSE,FALSE,32768,256,0,0,0,0,"1 page [txn]"
-42,"L",1,32,1,33,0,32468,32468,256,256,FALSE,FALSE,32768,256,0,0,0,0,"1 page [txn]"
-43,"L",1,32,0,32,1,32469,32469,256,256,FALSE,FALSE,32769,257,0,0,0,0,"1 page + 1 byte [txn]"
-44,"L",1.5,22,0,22,0,48852,48852,256,256,FALSE,FALSE,49152,384,0,0,0,0,"1.5 pages [txn]"
-45,"L",1,32,0,32,0,32596,32596,0,0,TRUE,FALSE,32640,255,32,1,0,0,"1 page incl deq [deq]"
-46,"L",1,32,1,33,0,32596,32596,0,0,TRUE,FALSE,32640,255,32,1,0,0,"1 page incl deq [deq]"
-47,"L",1,32,0,32,1,32597,32597,0,0,TRUE,FALSE,32641,256,32,1,0,0,"1 page incl deq + 1 byte [deq]"
-48,"L",1.5,22,0,22,0,48980,48980,0,0,TRUE,FALSE,49024,383,32,1,0,0,"1.5 pages incl deq [deq]"
-49,"L",1,32,0,32,0,31700,31700,256,256,TRUE,FALSE,32000,250,300,3,292,3,"1 page incl deq & txn [deq txn]"
-50,"L",1,32,1,33,0,31700,31700,256,256,TRUE,FALSE,32000,250,300,3,292,3,"1 page incl deq & txn [deq txn]"
-51,"L",1,32,0,32,1,31701,31701,256,256,TRUE,FALSE,32001,251,300,3,292,3,"1 page incl deq & txn + 1 byte [deq txn]"
-52,"L",1.5,22,0,22,0,48084,48084,256,256,TRUE,FALSE,48384,378,300,3,292,3,"1.5 pages incl deq & txn [deq txn]"
+"Page cache rollover (from page 16 back to page 0)",,,,,,,,,,,,,,,,,,,
+37,"L",1,16,0,16,0,65492,65492,0,0,FALSE,FALSE,65536,512,0,0,0,0,"1 page"
+38,"L",1,16,1,17,0,65492,65492,0,0,FALSE,FALSE,65536,512,0,0,0,0,"1 page"
+39,"L",1,16,0,16,1,65493,65493,0,0,FALSE,FALSE,65537,513,0,0,0,0,"1 page + 1 byte"
+40,"L",1.5,11,0,11,0,98260,98260,0,0,FALSE,FALSE,98304,768,0,0,0,0,"1.5 pages"
+41,"L",1,16,0,16,0,65236,65236,256,256,FALSE,FALSE,65536,512,0,0,0,0,"1 page [txn]"
+42,"L",1,16,1,17,0,65236,65236,256,256,FALSE,FALSE,65536,512,0,0,0,0,"1 page [txn]"
+43,"L",1,16,0,16,1,65237,65237,256,256,FALSE,FALSE,65537,513,0,0,0,0,"1 page + 1 byte [txn]"
+44,"L",1.5,11,0,11,0,98004,98004,256,256,FALSE,FALSE,98304,768,0,0,0,0,"1.5 pages [txn]"
+45,"L",1,16,0,16,0,65364,65364,0,0,TRUE,FALSE,65408,511,32,1,0,0,"1 page incl deq [deq]"
+46,"L",1,16,1,17,0,65364,65364,0,0,TRUE,FALSE,65408,511,32,1,0,0,"1 page incl deq [deq]"
+47,"L",1,16,0,16,1,65365,65365,0,0,TRUE,FALSE,65409,512,32,1,0,0,"1 page incl deq + 1 byte [deq]"
+48,"L",1.5,11,0,11,0,98132,98132,0,0,TRUE,FALSE,98176,767,32,1,0,0,"1.5 pages incl deq [deq]"
+49,"L",1,16,0,16,0,64468,64468,256,256,TRUE,FALSE,64768,506,300,3,292,3,"1 page incl deq & txn [deq txn]"
+50,"L",1,16,1,17,0,64468,64468,256,256,TRUE,FALSE,64768,506,300,3,292,3,"1 page incl deq & txn [deq txn]"
+51,"L",1,16,0,16,1,64469,64469,256,256,TRUE,FALSE,64769,507,300,3,292,3,"1 page incl deq & txn + 1 byte [deq txn]"
+52,"L",1.5,11,0,11,0,97236,97236,256,256,TRUE,FALSE,97536,762,300,3,292,3,"1.5 pages incl deq & txn [deq txn]"
 ,,,,,,,,,,,,,,,,,,,
-"File transition (from file 0000 to 0001) - no dequeues as exact sizes are needed and dequeues are non-deterministic",,,,,,,,,,,,,,,,,,,
-53,"L",1,48,0,48,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"1 page"
-54,"L",1,48,1,49,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"1 page"
-55,"L",1,48,0,48,1,32725,32725,0,0,FALSE,FALSE,32769,257,0,0,0,0,"1 page + 1 byte"
-56,"L",2.5,20,0,20,0,81876,81876,0,0,FALSE,FALSE,81920,640,0,0,0,0,"2.5 pages"
-57,"L",1,48,0,48,0,32468,32468,256,256,FALSE,FALSE,32768,256,0,0,0,0,"1 page [txn]"
-58,"L",1,48,1,49,0,32468,32468,256,256,FALSE,FALSE,32768,256,0,0,0,0,"1 page [txn]"
-59,"L",1,48,0,48,1,32469,32469,256,256,FALSE,FALSE,32769,257,0,0,0,0,"1 page + 1 byte [txn]"
-60,"L",2.5,20,0,20,0,81620,81620,256,256,FALSE,FALSE,81920,640,0,0,0,0,"2.5 pages [txn]"
-61,"L",1,48,0,48,0,32596,32596,0,0,TRUE,FALSE,32640,255,32,1,0,0,"1 page incl deq [deq]"
-62,"L",1,48,1,49,0,32596,32596,0,0,TRUE,FALSE,32640,255,32,1,0,0,"1 page incl deq [deq]"
-63,"L",1,48,0,48,1,32597,32597,0,0,TRUE,FALSE,32641,256,32,1,0,0,"1 page incl deq + 1 byte [deq]"
-64,"L",2.5,20,0,20,0,81748,81748,0,0,TRUE,FALSE,81792,639,32,1,0,0,"2.5 pages incl deq [deq]"
-65,"L",1,48,0,48,0,31700,31700,256,256,TRUE,FALSE,32000,250,300,3,292,3,"1 page incl deq & txn [deq txn]"
-66,"L",1,48,1,49,0,31700,31700,256,256,TRUE,FALSE,32000,250,300,3,292,3,"1 page incl deq & txn [deq txn]"
-67,"L",1,48,0,48,1,31701,31701,256,256,TRUE,FALSE,32001,251,300,3,292,3,"1 page incl deq & txn + 1 byte [deq txn]"
-68,"L",2.5,20,0,20,0,80852,80852,256,256,TRUE,FALSE,81152,634,300,3,292,3,"2.5 pages incl deq & txn [deq txn]"
+"File transition (from file 0000 to 0001)",,,,,,,,,,,,,,,,,,,
+53,"L",1,24,0,24,0,65492,65492,0,0,FALSE,FALSE,65536,512,0,0,0,0,"1 page"
+54,"L",1,24,1,25,0,65492,65492,0,0,FALSE,FALSE,65536,512,0,0,0,0,"1 page"
+55,"L",1,24,0,24,1,65493,65493,0,0,FALSE,FALSE,65537,513,0,0,0,0,"1 page + 1 byte"
+56,"L",2.5,10,0,10,0,163796,163796,0,0,FALSE,FALSE,163840,1280,0,0,0,0,"2.5 pages"
+57,"L",1,24,0,24,0,65236,65236,256,256,FALSE,FALSE,65536,512,0,0,0,0,"1 page [txn]"
+58,"L",1,24,1,25,0,65236,65236,256,256,FALSE,FALSE,65536,512,0,0,0,0,"1 page [txn]"
+59,"L",1,24,0,24,1,65237,65237,256,256,FALSE,FALSE,65537,513,0,0,0,0,"1 page + 1 byte [txn]"
+60,"L",2.5,10,0,10,0,163540,163540,256,256,FALSE,FALSE,163840,1280,0,0,0,0,"2.5 pages [txn]"
+61,"L",1,24,0,24,0,65364,65364,0,0,TRUE,FALSE,65408,511,32,1,0,0,"1 page incl deq [deq]"
+62,"L",1,24,1,25,0,65364,65364,0,0,TRUE,FALSE,65408,511,32,1,0,0,"1 page incl deq [deq]"
+63,"L",1,24,0,24,1,65365,65365,0,0,TRUE,FALSE,65409,512,32,1,0,0,"1 page incl deq + 1 byte [deq]"
+64,"L",2.5,10,0,10,0,163668,163668,0,0,TRUE,FALSE,163712,1279,32,1,0,0,"2.5 pages incl deq [deq]"
+65,"L",1,24,0,24,0,64468,64468,256,256,TRUE,FALSE,64768,506,300,3,292,3,"1 page incl deq & txn [deq txn]"
+66,"L",1,24,1,25,0,64468,64468,256,256,TRUE,FALSE,64768,506,300,3,292,3,"1 page incl deq & txn [deq txn]"
+67,"L",1,24,0,24,1,64469,64469,256,256,TRUE,FALSE,64769,507,300,3,292,3,"1 page incl deq & txn + 1 byte [deq txn]"
+68,"L",2.5,10,0,10,0,162772,162772,256,256,TRUE,FALSE,163072,1274,300,3,292,3,"2.5 pages incl deq & txn [deq txn]"
 ,,,,,,,,,,,,,,,,,,,
 "File rollover (from file 0007 to 0000) - RHM_WRONLY req'd for auto-dequeue == FALSE",,,,,,,,,,,,,,,,,,,
-69,"L",0.5,16,0,16,0,786388,786388,0,0,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file"
-70,"L",0.5,16,0,16,0,786132,786132,256,256,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file"
+69,"L",0.5,16,0,16,0,786388,786388,0,0,FALSE,FALSE,786432,6144,0,0,0,0,"12 pages = ½ file"
+70,"L",0.5,16,0,16,0,786132,786132,256,256,FALSE,FALSE,786432,6144,0,0,0,0,"12 pages = ½ file"
 ,,,,,,,,,,,,,,,,,,,
 "Multi-page messages (large messages) - tests various paths in encoder.",,,,,,,,,,,,,,,,,,,
-71,"L",1,16,0,16,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"data 1 page"
-72,"L",1,16,0,16,1,32725,32725,0,0,FALSE,FALSE,32769,257,0,0,0,0,"data 1 page + 1 byte (tail split; 1 byte over page boundary)"
-73,"L",1,16,0,16,11,32735,32735,0,0,FALSE,FALSE,32779,257,0,0,0,0,"data 1 page + 11 bytes (tail split; 11 bytes over page boundary)"
-74,"L",1,16,0,16,12,32736,32736,0,0,FALSE,FALSE,32780,257,0,0,0,0,"data 1 page + 12 bytes (tail separated exactly onto next page)"
-75,"L",1,16,0,16,13,32737,32737,0,0,FALSE,FALSE,32781,257,0,0,0,0,"data 1 page + 13 bytes (xid split; 1 byte over page boundary)"
-76,"L",1,16,0,16,0,32468,32468,256,256,FALSE,FALSE,32768,256,0,0,0,0,"data 1 page [txn]"
-77,"L",1,16,0,16,1,32469,32469,256,256,FALSE,FALSE,32769,257,0,0,0,0,"data 1 page + 1 byte (tail split; 1 byte over page boundary) [txn]"
-78,"L",1,16,0,16,11,32479,32479,256,256,FALSE,FALSE,32779,257,0,0,0,0,"data 1 page + 11 bytes (tail split; 11 bytes over page boundary) [txn]"
-79,"L",1,16,0,16,12,32480,32480,256,256,FALSE,FALSE,32780,257,0,0,0,0,"data 1 page + 12 bytes (tail separated exactly onto next page) [txn]"
-80,"L",1,16,0,16,13,32481,32481,256,256,FALSE,FALSE,32781,257,0,0,0,0,"data 1 page + 13 bytes (xid split; 1 byte over page boundary) [txn]"
-81,"L",2,16,0,16,0,65492,65492,0,0,FALSE,FALSE,65536,512,0,0,0,0,"data 2 pages"
-82,"L",2,16,0,16,1,65493,65493,0,0,FALSE,FALSE,65537,513,0,0,0,0,"data 2 pages + 1 byte (tail split; 1 byte over page boundary)"
-83,"L",2,16,0,16,11,65503,65503,0,0,FALSE,FALSE,65547,513,0,0,0,0,"data 2 pages + 11 bytes (tail split; 11 bytes over page boundary)"
-84,"L",2,16,0,16,12,65504,65504,0,0,FALSE,FALSE,65548,513,0,0,0,0,"data 2 pages + 12 bytes (tail separated exactly onto next page)"
-85,"L",2,16,0,16,13,65505,65505,0,0,FALSE,FALSE,65549,513,0,0,0,0,"data 2 pages + 13 bytes (xid split; 1 byte over page boundary)"
-86,"L",2,16,0,16,0,65236,65236,256,256,FALSE,FALSE,65536,512,0,0,0,0,"data 2 pages [txn]"
-87,"L",2,16,0,16,1,65237,65237,256,256,FALSE,FALSE,65537,513,0,0,0,0,"data 2 pages + 1 byte (tail split; 1 byte over page boundary) [txn]"
-88,"L",2,16,0,16,11,65247,65247,256,256,FALSE,FALSE,65547,513,0,0,0,0,"data 2 pages + 11 bytes (tail split; 11 bytes over page boundary) [txn]"
-89,"L",2,16,0,16,12,65248,65248,256,256,FALSE,FALSE,65548,513,0,0,0,0,"data 2 pages + 12 bytes (tail separated exactly onto next page) [txn]"
-90,"L",2,16,0,16,13,65249,65249,256,256,FALSE,FALSE,65549,513,0,0,0,0,"data 2 pages + 13 bytes (xid split; 1 byte over page boundary) [txn]"
-91,"L",4,16,0,16,0,131028,131028,0,0,FALSE,FALSE,131072,1024,0,0,0,0,"data 4 pages"
-92,"L",4,16,0,16,1,131029,131029,0,0,FALSE,FALSE,131073,1025,0,0,0,0,"data 4 pages + 1 byte (tail split; 1 byte over page boundary)"
-93,"L",4,16,0,16,11,131039,131039,0,0,FALSE,FALSE,131083,1025,0,0,0,0,"data 4 pages + 11 bytes (tail split; 11 bytes over page boundary)"
-94,"L",4,16,0,16,12,131040,131040,0,0,FALSE,FALSE,131084,1025,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page)"
-95,"L",4,16,0,16,13,131041,131041,0,0,FALSE,FALSE,131085,1025,0,0,0,0,"data 4 pages + 13 bytes (xid split; 1 byte over page boundary)"
-96,"L",4,16,0,16,0,130772,130772,256,256,FALSE,FALSE,131072,1024,0,0,0,0,"data 4 pages [txn]"
-97,"L",4,16,0,16,1,130773,130773,256,256,FALSE,FALSE,131073,1025,0,0,0,0,"data 4 pages + 1 byte (tail split; 1 byte over page boundary) [txn]"
-98,"L",4,16,0,16,11,130783,130783,256,256,FALSE,FALSE,131083,1025,0,0,0,0,"data 4 pages + 11 bytes (tail split; 11 bytes over page boundary) [txn]"
-99,"L",4,16,0,16,12,130784,130784,256,256,FALSE,FALSE,131084,1025,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page) [txn]"
-100,"L",4,16,0,16,13,130785,130785,256,256,FALSE,FALSE,131085,1025,0,0,0,0,"data 4 pages + 13 bytes (xid split; 1 byte over page boundary) [txn]"
-101,"L",3.5,16,0,16,0,114644,114644,0,0,FALSE,FALSE,114688,896,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page) [txn]"
-102,"L",3.5,16,0,16,1,114645,114645,0,0,FALSE,FALSE,114689,897,0,0,0,0,"data 4 pages + 13 bytes (xid split; 1 byte over page boundary) [txn]"
-103,"L",3.5,16,0,16,0,114388,114388,256,256,FALSE,FALSE,114688,896,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page) [txn]"
-104,"L",3.5,16,0,16,1,114389,114389,256,256,FALSE,FALSE,114689,897,0,0,0,0,"data 4 pages + 13 bytes (xid split; 1 byte over page boundary) [txn]"
-105,"L",1,16,0,16,-1,10,10,32735,32735,FALSE,FALSE,32789,257,0,0,0,0,"xid 1 page – 1 byte; data 10 bytes (exact fit) [txn]"
-106,"L",1,16,0,16,0,10,10,32736,32736,FALSE,FALSE,32790,257,0,0,0,0,"xid 1 page; data 10 bytes (exact fit) [txn]"
-107,"L",1,16,0,16,1,10,10,32737,32737,FALSE,FALSE,32791,257,0,0,0,0,"xid 1 page + 1 byte; data 10 bytes (exact fit) [txn]"
-108,"L",2,16,0,16,-1,10,10,65503,65503,FALSE,FALSE,65557,513,0,0,0,0,"xid 2 pages – 1 byte; data 10 bytes (exact fit) [txn]"
-109,"L",2,16,0,16,0,10,10,65504,65504,FALSE,FALSE,65558,513,0,0,0,0,"xid 2 pages; data 10 bytes (exact fit) [txn]"
-110,"L",2,16,0,16,1,10,10,65505,65505,FALSE,FALSE,65559,513,0,0,0,0,"xid 2 pages + 1 byte; data 10 bytes (exact fit) [txn]"
-111,"L",4,16,0,16,-1,10,10,131039,131039,FALSE,FALSE,131093,1025,0,0,0,0,"xid 4 pages – 1 byte; data 10 bytes (exact fit) [txn]"
-112,"L",4,16,0,16,0,10,10,131040,131040,FALSE,FALSE,131094,1025,0,0,0,0,"xid 4 pages; data 10 bytes (exact fit) [txn]"
-113,"L",4,16,0,16,1,10,10,131041,131041,FALSE,FALSE,131095,1025,0,0,0,0,"xid 4 pages + 1 byte; data 10 bytes (exact fit) [txn]"
-114,"L",3.5,16,0,16,0,10,10,114656,114656,FALSE,FALSE,114710,897,0,0,0,0,"xid 3.5 pages; data 10 bytes (exact fit) [txn]"
-115,"L",3.5,16,0,16,1,10,10,114657,114657,FALSE,FALSE,114711,897,0,0,0,0,"xid 3.5 pages + 1 byte; data 10 bytes (exact fit) [txn]"
-116,"L",1,16,0,16,-1,10,10,32735,32735,TRUE,FALSE,32789,257,32779,257,32771,257,"xid 1 page – 1 byte; data 10 bytes (exact fit) [txn]"
-117,"L",1,16,0,16,0,10,10,32736,32736,TRUE,FALSE,32790,257,32780,257,32772,257,"xid 1 page; data 10 bytes (exact fit) [txn]"
-118,"L",1,16,0,16,1,10,10,32737,32737,TRUE,FALSE,32791,257,32781,257,32773,257,"xid 1 page + 1 byte; data 10 bytes (exact fit) [txn]"
-119,"L",2,16,0,16,-1,10,10,65503,65503,TRUE,FALSE,65557,513,65547,513,65539,513,"xid 2 pages – 1 byte; data 10 bytes (exact fit) [txn]"
-120,"L",2,16,0,16,0,10,10,65504,65504,TRUE,FALSE,65558,513,65548,513,65540,513,"xid 2 pages; data 10 bytes (exact fit) [txn]"
-121,"L",2,16,0,16,1,10,10,65505,65505,TRUE,FALSE,65559,513,65549,513,65541,513,"xid 2 pages + 1 byte; data 10 bytes (exact fit) [txn]"
-122,"L",4,16,0,16,-1,10,10,131039,131039,TRUE,FALSE,131093,1025,131083,1025,131075,1025,"xid 4 pages – 1 byte; data 10 bytes (exact fit) [txn]"
-123,"L",4,16,0,16,0,10,10,131040,131040,TRUE,FALSE,131094,1025,131084,1025,131076,1025,"xid 4 pages; data 10 bytes (exact fit) [txn]"
-124,"L",4,16,0,16,1,10,10,131041,131041,TRUE,FALSE,131095,1025,131085,1025,131077,1025,"xid 4 pages + 1 byte; data 10 bytes (exact fit) [txn]"
-125,"L",3.5,16,0,16,0,10,10,114656,114656,TRUE,FALSE,114710,897,114700,897,114692,897,"xid 3.5 pages; data 10 bytes (exact fit) [txn]"
-126,"L",3.5,16,0,16,1,10,10,114657,114657,TRUE,FALSE,114711,897,114701,897,114693,897,"xid 3.5 pages + 1 byte; data 10 bytes (exact fit) [txn]"
+71,"L",1,8,0,8,0,65492,65492,0,0,FALSE,FALSE,65536,512,0,0,0,0,"data 1 page"
+72,"L",1,8,0,8,1,65493,65493,0,0,FALSE,FALSE,65537,513,0,0,0,0,"data 1 page + 1 byte (tail split; 1 byte over page boundary)"
+73,"L",1,8,0,8,11,65503,65503,0,0,FALSE,FALSE,65547,513,0,0,0,0,"data 1 page + 11 bytes (tail split; 11 bytes over page boundary)"
+74,"L",1,8,0,8,12,65504,65504,0,0,FALSE,FALSE,65548,513,0,0,0,0,"data 1 page + 12 bytes (tail separated exactly onto next page)"
+75,"L",1,8,0,8,13,65505,65505,0,0,FALSE,FALSE,65549,513,0,0,0,0,"data 1 page + 13 bytes (data split; 1 byte over page boundary)"
+76,"L",1,8,0,8,0,65236,65236,256,256,FALSE,FALSE,65536,512,0,0,0,0,"data 1 page [txn]"
+77,"L",1,8,0,8,1,65237,65237,256,256,FALSE,FALSE,65537,513,0,0,0,0,"data 1 page + 1 byte (tail split; 1 byte over page boundary) [txn]"
+78,"L",1,8,0,8,11,65247,65247,256,256,FALSE,FALSE,65547,513,0,0,0,0,"data 1 page + 11 bytes (tail split; 11 bytes over page boundary) [txn]"
+79,"L",1,8,0,8,12,65248,65248,256,256,FALSE,FALSE,65548,513,0,0,0,0,"data 1 page + 12 bytes (tail separated exactly onto next page) [txn]"
+80,"L",1,8,0,8,13,65249,65249,256,256,FALSE,FALSE,65549,513,0,0,0,0,"data 1 page + 13 bytes (data split; 1 byte over page boundary) [txn]"
+81,"L",2,8,0,8,0,131028,131028,0,0,FALSE,FALSE,131072,1024,0,0,0,0,"data 2 pages"
+82,"L",2,8,0,8,1,131029,131029,0,0,FALSE,FALSE,131073,1025,0,0,0,0,"data 2 pages + 1 byte (tail split; 1 byte over page boundary)"
+83,"L",2,8,0,8,11,131039,131039,0,0,FALSE,FALSE,131083,1025,0,0,0,0,"data 2 pages + 11 bytes (tail split; 11 bytes over page boundary)"
+84,"L",2,8,0,8,12,131040,131040,0,0,FALSE,FALSE,131084,1025,0,0,0,0,"data 2 pages + 12 bytes (tail separated exactly onto next page)"
+85,"L",2,8,0,8,13,131041,131041,0,0,FALSE,FALSE,131085,1025,0,0,0,0,"data 2 pages + 13 bytes (data split; 1 byte over page boundary)"
+86,"L",2,8,0,8,0,130772,130772,256,256,FALSE,FALSE,131072,1024,0,0,0,0,"data 2 pages [txn]"
+87,"L",2,8,0,8,1,130773,130773,256,256,FALSE,FALSE,131073,1025,0,0,0,0,"data 2 pages + 1 byte (tail split; 1 byte over page boundary) [txn]"
+88,"L",2,8,0,8,11,130783,130783,256,256,FALSE,FALSE,131083,1025,0,0,0,0,"data 2 pages + 11 bytes (tail split; 11 bytes over page boundary) [txn]"
+89,"L",2,8,0,8,12,130784,130784,256,256,FALSE,FALSE,131084,1025,0,0,0,0,"data 2 pages + 12 bytes (tail separated exactly onto next page) [txn]"
+90,"L",2,8,0,8,13,130785,130785,256,256,FALSE,FALSE,131085,1025,0,0,0,0,"data 2 pages + 13 bytes (data split; 1 byte over page boundary) [txn]"
+91,"L",4,8,0,8,0,262100,262100,0,0,FALSE,FALSE,262144,2048,0,0,0,0,"data 4 pages"
+92,"L",4,8,0,8,1,262101,262101,0,0,FALSE,FALSE,262145,2049,0,0,0,0,"data 4 pages + 1 byte (tail split; 1 byte over page boundary)"
+93,"L",4,8,0,8,11,262111,262111,0,0,FALSE,FALSE,262155,2049,0,0,0,0,"data 4 pages + 11 bytes (tail split; 11 bytes over page boundary)"
+94,"L",4,8,0,8,12,262112,262112,0,0,FALSE,FALSE,262156,2049,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page)"
+95,"L",4,8,0,8,13,262113,262113,0,0,FALSE,FALSE,262157,2049,0,0,0,0,"data 4 pages + 13 bytes (data split; 1 byte over page boundary)"
+96,"L",4,8,0,8,0,261844,261844,256,256,FALSE,FALSE,262144,2048,0,0,0,0,"data 4 pages [txn]"
+97,"L",4,8,0,8,1,261845,261845,256,256,FALSE,FALSE,262145,2049,0,0,0,0,"data 4 pages + 1 byte (tail split; 1 byte over page boundary) [txn]"
+98,"L",4,8,0,8,11,261855,261855,256,256,FALSE,FALSE,262155,2049,0,0,0,0,"data 4 pages + 11 bytes (tail split; 11 bytes over page boundary) [txn]"
+99,"L",4,8,0,8,12,261856,261856,256,256,FALSE,FALSE,262156,2049,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page) [txn]"
+100,"L",4,8,0,8,13,261857,261857,256,256,FALSE,FALSE,262157,2049,0,0,0,0,"data 4 pages + 13 bytes (data split; 1 byte over page boundary) [txn]"
+101,"L",3.5,8,0,8,0,229332,229332,0,0,FALSE,FALSE,229376,1792,0,0,0,0,"data 3.5 pages"
+102,"L",3.5,8,0,8,1,229333,229333,0,0,FALSE,FALSE,229377,1793,0,0,0,0,"data 3.5 pages + 1 byte"
+103,"L",3.5,8,0,8,0,229076,229076,256,256,FALSE,FALSE,229376,1792,0,0,0,0,"data 3.5 pages [txn]"
+104,"L",3.5,8,0,8,1,229077,229077,256,256,FALSE,FALSE,229377,1793,0,0,0,0,"data 3.5 pages + 1 byte [txn]"
+105,"L",1,8,0,8,-1,10,10,65503,65503,FALSE,FALSE,65557,513,0,0,0,0,"xid 1 page – 1 byte; data 10 bytes (exact fit) [txn]"
+106,"L",1,8,0,8,0,10,10,65504,65504,FALSE,FALSE,65558,513,0,0,0,0,"xid 1 page; data 10 bytes (exact fit) [txn]"
+107,"L",1,8,0,8,1,10,10,65505,65505,FALSE,FALSE,65559,513,0,0,0,0,"xid 1 page + 1 byte; data 10 bytes (exact fit) [txn]"
+108,"L",2,8,0,8,-1,10,10,131039,131039,FALSE,FALSE,131093,1025,0,0,0,0,"xid 2 pages – 1 byte; data 10 bytes (exact fit) [txn]"
+109,"L",2,8,0,8,0,10,10,131040,131040,FALSE,FALSE,131094,1025,0,0,0,0,"xid 2 pages; data 10 bytes (exact fit) [txn]"
+110,"L",2,8,0,8,1,10,10,131041,131041,FALSE,FALSE,131095,1025,0,0,0,0,"xid 2 pages + 1 byte; data 10 bytes (exact fit) [txn]"
+111,"L",4,8,0,8,-1,10,10,262111,262111,FALSE,FALSE,262165,2049,0,0,0,0,"xid 4 pages – 1 byte; data 10 bytes (exact fit) [txn]"
+112,"L",4,8,0,8,0,10,10,262112,262112,FALSE,FALSE,262166,2049,0,0,0,0,"xid 4 pages; data 10 bytes (exact fit) [txn]"
+113,"L",4,8,0,8,1,10,10,262113,262113,FALSE,FALSE,262167,2049,0,0,0,0,"xid 4 pages + 1 byte; data 10 bytes (exact fit) [txn]"
+114,"L",3.5,8,0,8,0,10,10,229344,229344,FALSE,FALSE,229398,1793,0,0,0,0,"xid 3.5 pages; data 10 bytes (exact fit) [txn]"
+115,"L",3.5,8,0,8,1,10,10,229345,229345,FALSE,FALSE,229399,1793,0,0,0,0,"xid 3.5 pages + 1 byte; data 10 bytes (exact fit) [txn]"
+116,"L",1,8,0,8,-1,10,10,65503,65503,TRUE,FALSE,65557,513,65547,513,65539,513,"xid 1 page – 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+117,"L",1,8,0,8,0,10,10,65504,65504,TRUE,FALSE,65558,513,65548,513,65540,513,"xid 1 page for enq rec; data 10 bytes (exact fit) [deq, txn]"
+118,"L",1,8,0,8,1,10,10,65505,65505,TRUE,FALSE,65559,513,65549,513,65541,513,"xid 1 page + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+119,"L",2,8,0,8,-1,10,10,131039,131039,TRUE,FALSE,131093,1025,131083,1025,131075,1025,"xid 2 pages – 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+120,"L",2,8,0,8,0,10,10,131040,131040,TRUE,FALSE,131094,1025,131084,1025,131076,1025,"xid 2 pages for enq rec; data 10 bytes (exact fit) [deq, txn]"
+121,"L",2,8,0,8,1,10,10,131041,131041,TRUE,FALSE,131095,1025,131085,1025,131077,1025,"xid 2 pages + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+122,"L",4,8,0,8,-1,10,10,262111,262111,TRUE,FALSE,262165,2049,262155,2049,262147,2049,"xid 4 pages – 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+123,"L",4,8,0,8,0,10,10,262112,262112,TRUE,FALSE,262166,2049,262156,2049,262148,2049,"xid 4 pages for enq rec; data 10 bytes (exact fit) [deq, txn]"
+124,"L",4,8,0,8,1,10,10,262113,262113,TRUE,FALSE,262167,2049,262157,2049,262149,2049,"xid 4 pages + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+125,"L",3.5,8,0,8,0,10,10,229344,229344,TRUE,FALSE,229398,1793,229388,1793,229380,1793,"xid 3.5 pages for enq rec; data 10 bytes (exact fit) [deq, txn]"
+126,"L",3.5,8,0,8,1,10,10,229345,229345,TRUE,FALSE,229399,1793,229389,1793,229381,1793,"xid 3.5 pages + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+127,"L",1,8,0,8,-1,10,10,65503,65503,TRUE,FALSE,65557,513,65547,513,65539,513,"xid 1 page – 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+128,"L",1,8,0,8,0,10,10,65504,65504,TRUE,FALSE,65558,513,65548,513,65540,513,"xid 1 page for deq rec; data 10 bytes (exact fit) [deq, txn]"
+129,"L",1,8,0,8,1,10,10,65505,65505,TRUE,FALSE,65559,513,65549,513,65541,513,"xid 1 page + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+130,"L",2,8,0,8,-1,10,10,131039,131039,TRUE,FALSE,131093,1025,131083,1025,131075,1025,"xid 2 pages – 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+131,"L",2,8,0,8,0,10,10,131040,131040,TRUE,FALSE,131094,1025,131084,1025,131076,1025,"xid 2 pages for deq rec; data 10 bytes (exact fit) [deq, txn]"
+132,"L",2,8,0,8,1,10,10,131041,131041,TRUE,FALSE,131095,1025,131085,1025,131077,1025,"xid 2 pages + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+133,"L",4,8,0,8,-1,10,10,262111,262111,TRUE,FALSE,262165,2049,262155,2049,262147,2049,"xid 4 pages – 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+134,"L",4,8,0,8,0,10,10,262112,262112,TRUE,FALSE,262166,2049,262156,2049,262148,2049,"xid 4 pages for deq rec; data 10 bytes (exact fit) [deq, txn]"
+135,"L",4,8,0,8,1,10,10,262113,262113,TRUE,FALSE,262167,2049,262157,2049,262149,2049,"xid 4 pages + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+136,"L",3.5,8,0,8,0,10,10,229344,229344,TRUE,FALSE,229398,1793,229388,1793,229380,1793,"xid 3.5 pages for deq rec; data 10 bytes (exact fit) [deq, txn]"
+137,"L",3.5,8,0,8,1,10,10,229345,229345,TRUE,FALSE,229399,1793,229389,1793,229381,1793,"xid 3.5 pages + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+138,"L",1,8,0,8,-1,10,10,65511,65511,TRUE,FALSE,65565,513,65555,513,65547,513,"xid 1 page – 1 byte for txn rec; data 10 bytes (exact fit) [deq, txn]"
+139,"L",1,8,0,8,0,10,10,65512,65512,TRUE,FALSE,65566,513,65556,513,65548,513,"xid 1 page for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+140,"L",1,8,0,8,1,10,10,65513,65513,TRUE,FALSE,65567,513,65557,513,65549,513,"xid 1 page + 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+141,"L",2,8,0,8,-1,10,10,131047,131047,TRUE,FALSE,131101,1025,131091,1025,131083,1025,"xid 2 pages – 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+142,"L",2,8,0,8,0,10,10,131048,131048,TRUE,FALSE,131102,1025,131092,1025,131084,1025,"xid 2 pages for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+143,"L",2,8,0,8,1,10,10,131049,131049,TRUE,FALSE,131103,1025,131093,1025,131085,1025,"xid 2 pages + 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+144,"L",4,8,0,8,-1,10,10,262119,262119,TRUE,FALSE,262173,2049,262163,2049,262155,2049,"xid 4 pages – 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+145,"L",4,8,0,8,0,10,10,262120,262120,TRUE,FALSE,262174,2049,262164,2049,262156,2049,"xid 4 pages for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+146,"L",4,8,0,8,1,10,10,262121,262121,TRUE,FALSE,262175,2049,262165,2049,262157,2049,"xid 4 pages + 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+147,"L",3.5,8,0,8,0,10,10,229352,229352,TRUE,FALSE,229406,1793,229396,1793,229388,1793,"xid 3.5 pages for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+148,"L",3.5,8,0,8,1,10,10,229353,229353,TRUE,FALSE,229407,1793,229397,1793,229389,1793,"xid 3.5 pages + 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"

Modified: store/trunk/cpp/tests/jrnl/rwtests.csv
===================================================================
--- store/trunk/cpp/tests/jrnl/rwtests.csv	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/tests/jrnl/rwtests.csv	2007-10-09 04:26:13 UTC (rev 973)
@@ -2,53 +2,53 @@
 "Test #","tf","pf","amn","mn incr","#msgs","ms incr","Min","Max","Min","Max","auto-deq","transient","bytes","dblks","bytes","dblks","bytes","dblks","comment"
 ,,,,,,,,,,,,,,,,,,,
 "Initialize only",,,,,,,,,,,,,,,,,,,
-0,"L",,0,0,0,0,0,0,0,0,FALSE,FALSE,,,,,,,"No messages - journal creation/initialization only"
+0,"L",0,0,0,0,0,0,0,0,0,FALSE,FALSE,44,1,0,0,0,0,"No messages -  journal creation/initialization only"
 ,,,,,,,,,,,,,,,,,,,
-"Simple message  combinations of persistent/transient, dequeued/non-dequeued, transactional/non-transactional",,,,,,,,,,,,,,,,,,,
-1,"L",,1,0,1,0,10,10,0,0,FALSE,FALSE,54,1,0,0,0,0,"1 * 10-byte message"
-2,"L",,10,0,10,0,10,10,0,0,FALSE,FALSE,54,1,0,0,0,0,"10 * 10-byte message"
-3,"L",,1,0,1,0,10,10,0,0,FALSE,TRUE,54,1,0,0,0,0,"1 * 10-byte message [transient]"
-4,"L",,10,0,10,0,10,10,0,0,FALSE,TRUE,54,1,0,0,0,0,"10 * 10-byte message [transient]"
-5,"L",,1,0,1,0,10,10,10,10,FALSE,FALSE,64,1,0,0,0,0,"1 * 10-byte message [txn]"
-6,"L",,10,0,10,0,10,10,10,10,FALSE,FALSE,64,1,0,0,0,0,"10 * 10-byte message [txn]"
-7,"L",,1,0,1,0,10,10,10,10,FALSE,TRUE,64,1,0,0,0,0,"1 * 10-byte message [txn transient]"
-8,"L",,10,0,10,0,10,10,10,10,FALSE,TRUE,64,1,0,0,0,0,"10 * 10-byte message [txn transient]"
-9,"L",,1,0,1,0,10,10,0,0,TRUE,FALSE,54,1,32,1,0,0,"1 * 10-byte message [deq]"
-10,"L",,10,0,10,0,10,10,0,0,TRUE,FALSE,54,1,32,1,0,0,"10 * 10-byte message [deq]"
-11,"L",,1,0,1,0,10,10,0,0,TRUE,TRUE,54,1,32,1,0,0,"1 * 10-byte message [transient deq]"
-12,"L",,10,0,10,0,10,10,0,0,TRUE,TRUE,54,1,32,1,0,0,"10 * 10-byte message [transient deq]"
-13,"L",,1,0,1,0,10,10,10,10,TRUE,FALSE,64,1,54,1,46,1,"1 * 10-byte message [txn deq]"
-14,"L",,10,0,10,0,10,10,10,10,TRUE,FALSE,64,1,54,1,46,1,"10 * 10-byte message [txn deq]"
-15,"L",,1,0,1,0,10,10,10,10,TRUE,TRUE,64,1,54,1,46,1,"1 * 10-byte message [txn transient deq]"
-16,"L",,10,0,10,0,10,10,10,10,TRUE,TRUE,64,1,54,1,46,1,"10 * 10-byte message [txn transient deq]"
+"Simple message  combinations of persistent/deq transientueued/non-dequeued, transactional/non-transactional",,,,,,,,,,,,,,,,,,,
+1,"L",1,1,0,1,0,10,10,0,0,FALSE,FALSE,54,1,0,0,0,0,"1 * 10-byte message"
+2,"L",1,10,0,10,0,10,10,0,0,FALSE,FALSE,54,1,0,0,0,0,"10 * 10-byte message"
+3,"L",1,1,0,1,0,10,10,0,0,FALSE,TRUE,54,1,0,0,0,0,"1 * 10-byte message [transient]"
+4,"L",1,10,0,10,0,10,10,0,0,FALSE,TRUE,54,1,0,0,0,0,"10 * 10-byte message [transient]"
+5,"L",1,1,0,1,0,10,10,10,10,FALSE,FALSE,64,1,0,0,0,0,"1 * 10-byte message [txn]"
+6,"L",1,10,0,10,0,10,10,10,10,FALSE,FALSE,64,1,0,0,0,0,"10 * 10-byte message [txn]"
+7,"L",1,1,0,1,0,10,10,10,10,FALSE,TRUE,64,1,0,0,0,0,"1 * 10-byte message [txn transient]"
+8,"L",1,10,0,10,0,10,10,10,10,FALSE,TRUE,64,1,0,0,0,0,"10 * 10-byte message [txn transient]"
+9,"L",1,1,0,1,0,10,10,0,0,TRUE,FALSE,54,1,32,1,0,0,"1 * 10-byte message [deq]"
+10,"L",1,10,0,10,0,10,10,0,0,TRUE,FALSE,54,1,32,1,0,0,"10 * 10-byte message [deq]"
+11,"L",1,1,0,1,0,10,10,0,0,TRUE,TRUE,54,1,32,1,0,0,"1 * 10-byte message [deq transient]"
+12,"L",1,10,0,10,0,10,10,0,0,TRUE,TRUE,54,1,32,1,0,0,"10 * 10-byte message [deq transient]"
+13,"L",1,1,0,1,0,10,10,10,10,TRUE,FALSE,64,1,54,1,46,1,"1 * 10-byte message [deq txn]"
+14,"L",1,10,0,10,0,10,10,10,10,TRUE,FALSE,64,1,54,1,46,1,"10 * 10-byte message [deq txn]"
+15,"L",1,1,0,1,0,10,10,10,10,TRUE,TRUE,64,1,54,1,46,1,"1 * 10-byte message [txn deq transient]"
+16,"L",1,10,0,10,0,10,10,10,10,TRUE,TRUE,64,1,54,1,46,1,"10 * 10-byte message [txn deq transient]"
 ,,,,,,,,,,,,,,,,,,,
 "Transition from one d-block to two per message",,,,,,,,,,,,,,,,,,,
-17,"L",,10,0,10,0,84,84,0,0,FALSE,FALSE,128,1,0,0,0,0,"1 dblk exact fit"
-18,"L",,10,0,10,1,85,85,0,0,FALSE,FALSE,129,2,0,0,0,0,"1 dblk + 1 byte"
-19,"L",,10,0,10,0,58,58,26,26,FALSE,FALSE,128,1,0,0,0,0,"1 dblk exact fit [txn]"
-20,"L",,10,0,10,1,59,59,26,26,FALSE,FALSE,129,2,0,0,0,0,"1 dblk + 1 byte [txn]"
+17,"L",1,10,0,10,0,84,84,0,0,FALSE,FALSE,128,1,0,0,0,0,"1 dblk exact fit"
+18,"L",1,10,0,10,1,85,85,0,0,FALSE,FALSE,129,2,0,0,0,0,"1 dblk + 1 byte"
+19,"L",1,10,0,10,0,58,58,26,26,FALSE,FALSE,128,1,0,0,0,0,"1 dblk exact fit [txn]"
+20,"L",1,10,0,10,1,59,59,26,26,FALSE,FALSE,129,2,0,0,0,0,"1 dblk + 1 byte [txn]"
 ,,,,,,,,,,,,,,,,,,,
 "Transition from one s-block to two per message",,,,,,,,,,,,,,,,,,,
-21,"L",,10,0,10,0,468,468,0,0,FALSE,FALSE,512,4,0,0,0,0,"1 sblk exact fit"
-22,"L",,10,0,10,1,469,469,0,0,FALSE,FALSE,513,5,0,0,0,0,"1 sblk + 1 byte"
-23,"L",,10,0,10,0,442,442,26,26,FALSE,FALSE,512,4,0,0,0,0,"1 sblk exact fit [txn]"
-24,"L",,10,0,10,1,443,443,26,26,FALSE,FALSE,513,5,0,0,0,0,"1 sblk + 1 byte [txn]"
+21,"L",1,10,0,10,0,468,468,0,0,FALSE,FALSE,512,4,0,0,0,0,"1 sblk exact fit"
+22,"L",1,10,0,10,1,469,469,0,0,FALSE,FALSE,513,5,0,0,0,0,"1 sblk + 1 byte"
+23,"L",1,10,0,10,0,442,442,26,26,FALSE,FALSE,512,4,0,0,0,0,"1 sblk exact fit [txn]"
+24,"L",1,10,0,10,1,443,443,26,26,FALSE,FALSE,513,5,0,0,0,0,"1 sblk + 1 byte [txn]"
 ,,,,,,,,,,,,,,,,,,,
 "Transition from first page to second",,,,,,,,,,,,,,,,,,,
-25,"L",,8,0,8,0,4052,4052,0,0,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page"
-26,"L",,8,1,9,0,4052,4052,0,0,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page"
-27,"L",,8,0,8,1,4053,4053,0,0,FALSE,FALSE,4097,33,0,0,0,0,"1/8 page + 1 byte"
-28,"L",,8,0,8,0,3796,3796,256,256,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page [txn]"
-29,"L",,8,1,9,0,3796,3796,256,256,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page [txn]"
-30,"L",,8,0,8,1,3797,3797,256,256,FALSE,FALSE,4097,33,0,0,0,0,"1/8 page + 1 byte [txn]"
-31,"L",,8,0,8,0,3924,3924,0,0,TRUE,FALSE,3968,31,32,1,0,0,"1/8 page incl deq [deq]"
-32,"L",,8,1,9,0,3924,3924,0,0,TRUE,FALSE,3968,31,32,1,0,0,"1/8 page incl deq [deq]"
-33,"L",,8,0,8,1,3925,3925,0,0,TRUE,FALSE,3969,32,32,1,0,0,"1/8 page incl deq + 1 byte [deq]"
-34,"L",,8,0,8,0,3028,3028,256,256,TRUE,FALSE,3328,26,300,3,292,3,"1/8 page incl deq & txn [deq txn]"
-35,"L",,8,1,9,0,3028,3028,256,256,TRUE,FALSE,3328,26,300,3,292,3,"1/8 page incl deq & txn [deq txn]"
-36,"L",,8,0,8,1,3029,3029,256,256,TRUE,FALSE,3329,27,300,3,292,3,"1/8 page incl deq & txn + 1 byte [deq txn]"
+25,"L",1,8,0,8,0,4052,4052,0,0,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page"
+26,"L",1,8,1,9,0,4052,4052,0,0,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page"
+27,"L",1,8,0,8,1,4053,4053,0,0,FALSE,FALSE,4097,33,0,0,0,0,"1/8 page + 1 byte"
+28,"L",1,8,0,8,0,3796,3796,256,256,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page [txn]"
+29,"L",1,8,1,9,0,3796,3796,256,256,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page [txn]"
+30,"L",1,8,0,8,1,3797,3797,256,256,FALSE,FALSE,4097,33,0,0,0,0,"1/8 page + 1 byte [txn]"
+31,"L",1,8,0,8,0,3924,3924,0,0,TRUE,FALSE,3968,31,32,1,0,0,"1/8 page incl deq [deq]"
+32,"L",1,8,1,9,0,3924,3924,0,0,TRUE,FALSE,3968,31,32,1,0,0,"1/8 page incl deq [deq]"
+33,"L",1,8,0,8,1,3925,3925,0,0,TRUE,FALSE,3969,32,32,1,0,0,"1/8 page incl deq + 1 byte [deq]"
+34,"L",1,8,0,8,0,3028,3028,256,256,TRUE,FALSE,3328,26,300,3,292,3,"1/8 page incl deq & txn [deq txn]"
+35,"L",1,8,1,9,0,3028,3028,256,256,TRUE,FALSE,3328,26,300,3,292,3,"1/8 page incl deq & txn [deq txn]"
+36,"L",1,8,0,8,1,3029,3029,256,256,TRUE,FALSE,3329,27,300,3,292,3,"1/8 page incl deq & txn + 1 byte [deq txn]"
 ,,,,,,,,,,,,,,,,,,,
-"Page cache rollover (from page 32 back to page 0) - no dequeues as exact sizes are needed and dequeues are non-deterministic",,,,,,,,,,,,,,,,,,,
+"Page cache rollover (from page 32 back to page 0)",,,,,,,,,,,,,,,,,,,
 37,"L",1,32,0,32,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"1 page"
 38,"L",1,32,1,33,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"1 page"
 39,"L",1,32,0,32,1,32725,32725,0,0,FALSE,FALSE,32769,257,0,0,0,0,"1 page + 1 byte"
@@ -66,7 +66,7 @@
 51,"L",1,32,0,32,1,31701,31701,256,256,TRUE,FALSE,32001,251,300,3,292,3,"1 page incl deq & txn + 1 byte [deq txn]"
 52,"L",1.5,22,0,22,0,48084,48084,256,256,TRUE,FALSE,48384,378,300,3,292,3,"1.5 pages incl deq & txn [deq txn]"
 ,,,,,,,,,,,,,,,,,,,
-"File transition (from file 0000 to 0001) - no dequeues as exact sizes are needed and dequeues are non-deterministic",,,,,,,,,,,,,,,,,,,
+"File transition (from file 0000 to 0001)",,,,,,,,,,,,,,,,,,,
 53,"L",1,48,0,48,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"1 page"
 54,"L",1,48,1,49,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"1 page"
 55,"L",1,48,0,48,1,32725,32725,0,0,FALSE,FALSE,32769,257,0,0,0,0,"1 page + 1 byte"
@@ -115,36 +115,36 @@
 94,"L",1,16,0,16,1,32725,32725,0,0,FALSE,FALSE,32769,257,0,0,0,0,"data 1 page + 1 byte (tail split; 1 byte over page boundary)"
 95,"L",1,16,0,16,11,32735,32735,0,0,FALSE,FALSE,32779,257,0,0,0,0,"data 1 page + 11 bytes (tail split; 11 bytes over page boundary)"
 96,"L",1,16,0,16,12,32736,32736,0,0,FALSE,FALSE,32780,257,0,0,0,0,"data 1 page + 12 bytes (tail separated exactly onto next page)"
-97,"L",1,16,0,16,13,32737,32737,0,0,FALSE,FALSE,32781,257,0,0,0,0,"data 1 page + 13 bytes (xid split; 1 byte over page boundary)"
+97,"L",1,16,0,16,13,32737,32737,0,0,FALSE,FALSE,32781,257,0,0,0,0,"data 1 page + 13 bytes (data split; 1 byte over page boundary)"
 98,"L",1,16,0,16,0,32468,32468,256,256,FALSE,FALSE,32768,256,0,0,0,0,"data 1 page [txn]"
 99,"L",1,16,0,16,1,32469,32469,256,256,FALSE,FALSE,32769,257,0,0,0,0,"data 1 page + 1 byte (tail split; 1 byte over page boundary) [txn]"
 100,"L",1,16,0,16,11,32479,32479,256,256,FALSE,FALSE,32779,257,0,0,0,0,"data 1 page + 11 bytes (tail split; 11 bytes over page boundary) [txn]"
 101,"L",1,16,0,16,12,32480,32480,256,256,FALSE,FALSE,32780,257,0,0,0,0,"data 1 page + 12 bytes (tail separated exactly onto next page) [txn]"
-102,"L",1,16,0,16,13,32481,32481,256,256,FALSE,FALSE,32781,257,0,0,0,0,"data 1 page + 13 bytes (xid split; 1 byte over page boundary) [txn]"
+102,"L",1,16,0,16,13,32481,32481,256,256,FALSE,FALSE,32781,257,0,0,0,0,"data 1 page + 13 bytes (data split; 1 byte over page boundary) [txn]"
 103,"L",2,16,0,16,0,65492,65492,0,0,FALSE,FALSE,65536,512,0,0,0,0,"data 2 pages"
 104,"L",2,16,0,16,1,65493,65493,0,0,FALSE,FALSE,65537,513,0,0,0,0,"data 2 pages + 1 byte (tail split; 1 byte over page boundary)"
 105,"L",2,16,0,16,11,65503,65503,0,0,FALSE,FALSE,65547,513,0,0,0,0,"data 2 pages + 11 bytes (tail split; 11 bytes over page boundary)"
 106,"L",2,16,0,16,12,65504,65504,0,0,FALSE,FALSE,65548,513,0,0,0,0,"data 2 pages + 12 bytes (tail separated exactly onto next page)"
-107,"L",2,16,0,16,13,65505,65505,0,0,FALSE,FALSE,65549,513,0,0,0,0,"data 2 pages + 13 bytes (xid split; 1 byte over page boundary)"
+107,"L",2,16,0,16,13,65505,65505,0,0,FALSE,FALSE,65549,513,0,0,0,0,"data 2 pages + 13 bytes (data split; 1 byte over page boundary)"
 108,"L",2,16,0,16,0,65236,65236,256,256,FALSE,FALSE,65536,512,0,0,0,0,"data 2 pages [txn]"
 109,"L",2,16,0,16,1,65237,65237,256,256,FALSE,FALSE,65537,513,0,0,0,0,"data 2 pages + 1 byte (tail split; 1 byte over page boundary) [txn]"
 110,"L",2,16,0,16,11,65247,65247,256,256,FALSE,FALSE,65547,513,0,0,0,0,"data 2 pages + 11 bytes (tail split; 11 bytes over page boundary) [txn]"
 111,"L",2,16,0,16,12,65248,65248,256,256,FALSE,FALSE,65548,513,0,0,0,0,"data 2 pages + 12 bytes (tail separated exactly onto next page) [txn]"
-112,"L",2,16,0,16,13,65249,65249,256,256,FALSE,FALSE,65549,513,0,0,0,0,"data 2 pages + 13 bytes (xid split; 1 byte over page boundary) [txn]"
+112,"L",2,16,0,16,13,65249,65249,256,256,FALSE,FALSE,65549,513,0,0,0,0,"data 2 pages + 13 bytes (data split; 1 byte over page boundary) [txn]"
 113,"L",4,16,0,16,0,131028,131028,0,0,FALSE,FALSE,131072,1024,0,0,0,0,"data 4 pages"
 114,"L",4,16,0,16,1,131029,131029,0,0,FALSE,FALSE,131073,1025,0,0,0,0,"data 4 pages + 1 byte (tail split; 1 byte over page boundary)"
 115,"L",4,16,0,16,11,131039,131039,0,0,FALSE,FALSE,131083,1025,0,0,0,0,"data 4 pages + 11 bytes (tail split; 11 bytes over page boundary)"
 116,"L",4,16,0,16,12,131040,131040,0,0,FALSE,FALSE,131084,1025,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page)"
-117,"L",4,16,0,16,13,131041,131041,0,0,FALSE,FALSE,131085,1025,0,0,0,0,"data 4 pages + 13 bytes (xid split; 1 byte over page boundary)"
+117,"L",4,16,0,16,13,131041,131041,0,0,FALSE,FALSE,131085,1025,0,0,0,0,"data 4 pages + 13 bytes (data split; 1 byte over page boundary)"
 118,"L",4,16,0,16,0,130772,130772,256,256,FALSE,FALSE,131072,1024,0,0,0,0,"data 4 pages [txn]"
 119,"L",4,16,0,16,1,130773,130773,256,256,FALSE,FALSE,131073,1025,0,0,0,0,"data 4 pages + 1 byte (tail split; 1 byte over page boundary) [txn]"
 120,"L",4,16,0,16,11,130783,130783,256,256,FALSE,FALSE,131083,1025,0,0,0,0,"data 4 pages + 11 bytes (tail split; 11 bytes over page boundary) [txn]"
 121,"L",4,16,0,16,12,130784,130784,256,256,FALSE,FALSE,131084,1025,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page) [txn]"
-122,"L",4,16,0,16,13,130785,130785,256,256,FALSE,FALSE,131085,1025,0,0,0,0,"data 4 pages + 13 bytes (xid split; 1 byte over page boundary) [txn]"
-123,"L",3.5,16,0,16,0,114644,114644,0,0,FALSE,FALSE,114688,896,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page) [txn]"
-124,"L",3.5,16,0,16,1,114645,114645,0,0,FALSE,FALSE,114689,897,0,0,0,0,"data 4 pages + 13 bytes (xid split; 1 byte over page boundary) [txn]"
-125,"L",3.5,16,0,16,0,114388,114388,256,256,FALSE,FALSE,114688,896,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page) [txn]"
-126,"L",3.5,16,0,16,1,114389,114389,256,256,FALSE,FALSE,114689,897,0,0,0,0,"data 4 pages + 13 bytes (xid split; 1 byte over page boundary) [txn]"
+122,"L",4,16,0,16,13,130785,130785,256,256,FALSE,FALSE,131085,1025,0,0,0,0,"data 4 pages + 13 bytes (data split; 1 byte over page boundary) [txn]"
+123,"L",3.5,16,0,16,0,114644,114644,0,0,FALSE,FALSE,114688,896,0,0,0,0,"data 3.5 pages"
+124,"L",3.5,16,0,16,1,114645,114645,0,0,FALSE,FALSE,114689,897,0,0,0,0,"data 3.5 pages + 1 byte"
+125,"L",3.5,16,0,16,0,114388,114388,256,256,FALSE,FALSE,114688,896,0,0,0,0,"data 3.5 pages [txn]"
+126,"L",3.5,16,0,16,1,114389,114389,256,256,FALSE,FALSE,114689,897,0,0,0,0,"data 3.5 pages + 1 byte [txn]"
 127,"L",1,16,0,16,-1,10,10,32735,32735,FALSE,FALSE,32789,257,0,0,0,0,"xid 1 page – 1 byte; data 10 bytes (exact fit) [txn]"
 128,"L",1,16,0,16,0,10,10,32736,32736,FALSE,FALSE,32790,257,0,0,0,0,"xid 1 page; data 10 bytes (exact fit) [txn]"
 129,"L",1,16,0,16,1,10,10,32737,32737,FALSE,FALSE,32791,257,0,0,0,0,"xid 1 page + 1 byte; data 10 bytes (exact fit) [txn]"
@@ -156,14 +156,36 @@
 135,"L",4,16,0,16,1,10,10,131041,131041,FALSE,FALSE,131095,1025,0,0,0,0,"xid 4 pages + 1 byte; data 10 bytes (exact fit) [txn]"
 136,"L",3.5,16,0,16,0,10,10,114656,114656,FALSE,FALSE,114710,897,0,0,0,0,"xid 3.5 pages; data 10 bytes (exact fit) [txn]"
 137,"L",3.5,16,0,16,1,10,10,114657,114657,FALSE,FALSE,114711,897,0,0,0,0,"xid 3.5 pages + 1 byte; data 10 bytes (exact fit) [txn]"
-138,"L",1,16,0,16,-1,10,10,32735,32735,TRUE,FALSE,32789,257,32779,257,32771,257,"xid 1 page – 1 byte; data 10 bytes (exact fit) [txn]"
-139,"L",1,16,0,16,0,10,10,32736,32736,TRUE,FALSE,32790,257,32780,257,32772,257,"xid 1 page; data 10 bytes (exact fit) [txn]"
-140,"L",1,16,0,16,1,10,10,32737,32737,TRUE,FALSE,32791,257,32781,257,32773,257,"xid 1 page + 1 byte; data 10 bytes (exact fit) [txn]"
-141,"L",2,16,0,16,-1,10,10,65503,65503,TRUE,FALSE,65557,513,65547,513,65539,513,"xid 2 pages – 1 byte; data 10 bytes (exact fit) [txn]"
-142,"L",2,16,0,16,0,10,10,65504,65504,TRUE,FALSE,65558,513,65548,513,65540,513,"xid 2 pages; data 10 bytes (exact fit) [txn]"
-143,"L",2,16,0,16,1,10,10,65505,65505,TRUE,FALSE,65559,513,65549,513,65541,513,"xid 2 pages + 1 byte; data 10 bytes (exact fit) [txn]"
-144,"L",4,16,0,16,-1,10,10,131039,131039,TRUE,FALSE,131093,1025,131083,1025,131075,1025,"xid 4 pages – 1 byte; data 10 bytes (exact fit) [txn]"
-145,"L",4,16,0,16,0,10,10,131040,131040,TRUE,FALSE,131094,1025,131084,1025,131076,1025,"xid 4 pages; data 10 bytes (exact fit) [txn]"
-146,"L",4,16,0,16,1,10,10,131041,131041,TRUE,FALSE,131095,1025,131085,1025,131077,1025,"xid 4 pages + 1 byte; data 10 bytes (exact fit) [txn]"
-147,"L",3.5,16,0,16,0,10,10,114656,114656,TRUE,FALSE,114710,897,114700,897,114692,897,"xid 3.5 pages; data 10 bytes (exact fit) [txn]"
-148,"L",3.5,16,0,16,1,10,10,114657,114657,TRUE,FALSE,114711,897,114701,897,114693,897,"xid 3.5 pages + 1 byte; data 10 bytes (exact fit) [txn]"
+138,"L",1,16,0,16,-1,10,10,32735,32735,TRUE,FALSE,32789,257,32779,257,32771,257,"xid 1 page – 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+139,"L",1,16,0,16,0,10,10,32736,32736,TRUE,FALSE,32790,257,32780,257,32772,257,"xid 1 page for enq rec; data 10 bytes (exact fit) [deq, txn]"
+140,"L",1,16,0,16,1,10,10,32737,32737,TRUE,FALSE,32791,257,32781,257,32773,257,"xid 1 page + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+141,"L",2,16,0,16,-1,10,10,65503,65503,TRUE,FALSE,65557,513,65547,513,65539,513,"xid 2 pages – 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+142,"L",2,16,0,16,0,10,10,65504,65504,TRUE,FALSE,65558,513,65548,513,65540,513,"xid 2 pages for enq rec; data 10 bytes (exact fit) [deq, txn]"
+143,"L",2,16,0,16,1,10,10,65505,65505,TRUE,FALSE,65559,513,65549,513,65541,513,"xid 2 pages + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+144,"L",4,16,0,16,-1,10,10,131039,131039,TRUE,FALSE,131093,1025,131083,1025,131075,1025,"xid 4 pages – 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+145,"L",4,16,0,16,0,10,10,131040,131040,TRUE,FALSE,131094,1025,131084,1025,131076,1025,"xid 4 pages for enq rec; data 10 bytes (exact fit) [deq, txn]"
+146,"L",4,16,0,16,1,10,10,131041,131041,TRUE,FALSE,131095,1025,131085,1025,131077,1025,"xid 4 pages + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+147,"L",3.5,16,0,16,0,10,10,114656,114656,TRUE,FALSE,114710,897,114700,897,114692,897,"xid 3.5 pages for enq rec; data 10 bytes (exact fit) [deq, txn]"
+148,"L",3.5,16,0,16,1,10,10,114657,114657,TRUE,FALSE,114711,897,114701,897,114693,897,"xid 3.5 pages + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+149,"L",1,16,0,16,-1,10,10,32735,32735,TRUE,FALSE,32789,257,32779,257,32771,257,"xid 1 page – 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+150,"L",1,16,0,16,0,10,10,32736,32736,TRUE,FALSE,32790,257,32780,257,32772,257,"xid 1 page for deq rec; data 10 bytes (exact fit) [deq, txn]"
+151,"L",1,16,0,16,1,10,10,32737,32737,TRUE,FALSE,32791,257,32781,257,32773,257,"xid 1 page + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+152,"L",2,16,0,16,-1,10,10,65503,65503,TRUE,FALSE,65557,513,65547,513,65539,513,"xid 2 pages – 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+153,"L",2,16,0,16,0,10,10,65504,65504,TRUE,FALSE,65558,513,65548,513,65540,513,"xid 2 pages for deq rec; data 10 bytes (exact fit) [deq, txn]"
+154,"L",2,16,0,16,1,10,10,65505,65505,TRUE,FALSE,65559,513,65549,513,65541,513,"xid 2 pages + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+155,"L",4,16,0,16,-1,10,10,131039,131039,TRUE,FALSE,131093,1025,131083,1025,131075,1025,"xid 4 pages – 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+156,"L",4,16,0,16,0,10,10,131040,131040,TRUE,FALSE,131094,1025,131084,1025,131076,1025,"xid 4 pages for deq rec; data 10 bytes (exact fit) [deq, txn]"
+157,"L",4,16,0,16,1,10,10,131041,131041,TRUE,FALSE,131095,1025,131085,1025,131077,1025,"xid 4 pages + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+158,"L",3.5,16,0,16,0,10,10,114656,114656,TRUE,FALSE,114710,897,114700,897,114692,897,"xid 3.5 pages for deq rec; data 10 bytes (exact fit) [deq, txn]"
+159,"L",3.5,16,0,16,1,10,10,114657,114657,TRUE,FALSE,114711,897,114701,897,114693,897,"xid 3.5 pages + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+160,"L",1,16,0,16,-1,10,10,32743,32743,TRUE,FALSE,32797,257,32787,257,32779,257,"xid 1 page – 1 byte for txn rec; data 10 bytes (exact fit) [deq, txn]"
+161,"L",1,16,0,16,0,10,10,32744,32744,TRUE,FALSE,32798,257,32788,257,32780,257,"xid 1 page for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+162,"L",1,16,0,16,1,10,10,32745,32745,TRUE,FALSE,32799,257,32789,257,32781,257,"xid 1 page + 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+163,"L",2,16,0,16,-1,10,10,65511,65511,TRUE,FALSE,65565,513,65555,513,65547,513,"xid 2 pages – 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+164,"L",2,16,0,16,0,10,10,65512,65512,TRUE,FALSE,65566,513,65556,513,65548,513,"xid 2 pages for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+165,"L",2,16,0,16,1,10,10,65513,65513,TRUE,FALSE,65567,513,65557,513,65549,513,"xid 2 pages + 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+166,"L",4,16,0,16,-1,10,10,131047,131047,TRUE,FALSE,131101,1025,131091,1025,131083,1025,"xid 4 pages – 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+167,"L",4,16,0,16,0,10,10,131048,131048,TRUE,FALSE,131102,1025,131092,1025,131084,1025,"xid 4 pages for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+168,"L",4,16,0,16,1,10,10,131049,131049,TRUE,FALSE,131103,1025,131093,1025,131085,1025,"xid 4 pages + 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+169,"L",3.5,16,0,16,0,10,10,114664,114664,TRUE,FALSE,114718,897,114708,897,114700,897,"xid 3.5 pages for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+170,"L",3.5,16,0,16,1,10,10,114665,114665,TRUE,FALSE,114719,897,114709,897,114701,897,"xid 3.5 pages + 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"

Modified: store/trunk/cpp/tests/jrnl/tests.ods
===================================================================
(Binary files differ)

Modified: store/trunk/cpp/tests/jrnl/wtests.csv
===================================================================
--- store/trunk/cpp/tests/jrnl/wtests.csv	2007-10-08 21:47:52 UTC (rev 972)
+++ store/trunk/cpp/tests/jrnl/wtests.csv	2007-10-09 04:26:13 UTC (rev 973)
@@ -2,9 +2,9 @@
 "Test #","tf","pf","amn","mn incr","#msgs","ms incr","Min","Max","Min","Max","auto-deq","transient","bytes","dblks","bytes","dblks","bytes","dblks","comment"
 ,,,,,,,,,,,,,,,,,,,
 "Initialize only",,,,,,,,,,,,,,,,,,,
-0,"L",0,0,0,0,0,0,0,0,0,FALSE,FALSE,44,1,0,0,0,0,"No messages - journal creation/initialization only"
+0,"L",0,0,0,0,0,0,0,0,0,FALSE,FALSE,44,1,0,0,0,0,"No messages – journal creation/initialization only"
 ,,,,,,,,,,,,,,,,,,,
-"Simple message  combinations of persistent/transient, dequeued/non-dequeued, transactional/non-transactional",,,,,,,,,,,,,,,,,,,
+"Simple message  combinations of persistent/deq transientueued/non-dequeued, transactional/non-transactional",,,,,,,,,,,,,,,,,,,
 1,"L",1,1,0,1,0,10,10,0,0,FALSE,FALSE,54,1,0,0,0,0,"1 * 10-byte message"
 2,"L",1,10,0,10,0,10,10,0,0,FALSE,FALSE,54,1,0,0,0,0,"10 * 10-byte message"
 3,"L",1,1,0,1,0,10,10,0,0,FALSE,TRUE,54,1,0,0,0,0,"1 * 10-byte message [transient]"
@@ -15,12 +15,12 @@
 8,"L",1,10,0,10,0,10,10,10,10,FALSE,TRUE,64,1,0,0,0,0,"10 * 10-byte message [txn transient]"
 9,"L",1,1,0,1,0,10,10,0,0,TRUE,FALSE,54,1,32,1,0,0,"1 * 10-byte message [deq]"
 10,"L",1,10,0,10,0,10,10,0,0,TRUE,FALSE,54,1,32,1,0,0,"10 * 10-byte message [deq]"
-11,"L",1,1,0,1,0,10,10,0,0,TRUE,TRUE,54,1,32,1,0,0,"1 * 10-byte message [transient deq]"
-12,"L",1,10,0,10,0,10,10,0,0,TRUE,TRUE,54,1,32,1,0,0,"10 * 10-byte message [transient deq]"
-13,"L",1,1,0,1,0,10,10,10,10,TRUE,FALSE,64,1,54,1,46,1,"1 * 10-byte message [txn deq]"
-14,"L",1,10,0,10,0,10,10,10,10,TRUE,FALSE,64,1,54,1,46,1,"10 * 10-byte message [txn deq]"
-15,"L",1,1,0,1,0,10,10,10,10,TRUE,TRUE,64,1,54,1,46,1,"1 * 10-byte message [txn transient deq]"
-16,"L",1,10,0,10,0,10,10,10,10,TRUE,TRUE,64,1,54,1,46,1,"10 * 10-byte message [txn transient deq]"
+11,"L",1,1,0,1,0,10,10,0,0,TRUE,TRUE,54,1,32,1,0,0,"1 * 10-byte message [deq transient]"
+12,"L",1,10,0,10,0,10,10,0,0,TRUE,TRUE,54,1,32,1,0,0,"10 * 10-byte message [deq transient]"
+13,"L",1,1,0,1,0,10,10,10,10,TRUE,FALSE,64,1,54,1,46,1,"1 * 10-byte message [deq txn]"
+14,"L",1,10,0,10,0,10,10,10,10,TRUE,FALSE,64,1,54,1,46,1,"10 * 10-byte message [deq txn]"
+15,"L",1,1,0,1,0,10,10,10,10,TRUE,TRUE,64,1,54,1,46,1,"1 * 10-byte message [txn deq transient]"
+16,"L",1,10,0,10,0,10,10,10,10,TRUE,TRUE,64,1,54,1,46,1,"10 * 10-byte message [txn deq transient]"
 ,,,,,,,,,,,,,,,,,,,
 "Transition from one d-block to two per message",,,,,,,,,,,,,,,,,,,
 17,"L",1,10,0,10,0,84,84,0,0,FALSE,FALSE,128,1,0,0,0,0,"1 dblk exact fit"
@@ -48,7 +48,7 @@
 35,"L",1,8,1,9,0,3028,3028,256,256,TRUE,FALSE,3328,26,300,3,292,3,"1/8 page incl deq & txn [deq txn]"
 36,"L",1,8,0,8,1,3029,3029,256,256,TRUE,FALSE,3329,27,300,3,292,3,"1/8 page incl deq & txn + 1 byte [deq txn]"
 ,,,,,,,,,,,,,,,,,,,
-"Page cache rollover (from page 32 back to page 0) - no dequeues as exact sizes are needed and dequeues are non-deterministic",,,,,,,,,,,,,,,,,,,
+"Page cache rollover (from page 32 back to page 0)",,,,,,,,,,,,,,,,,,,
 37,"L",1,32,0,32,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"1 page"
 38,"L",1,32,1,33,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"1 page"
 39,"L",1,32,0,32,1,32725,32725,0,0,FALSE,FALSE,32769,257,0,0,0,0,"1 page + 1 byte"
@@ -66,7 +66,7 @@
 51,"L",1,32,0,32,1,31701,31701,256,256,TRUE,FALSE,32001,251,300,3,292,3,"1 page incl deq & txn + 1 byte [deq txn]"
 52,"L",1.5,22,0,22,0,48084,48084,256,256,TRUE,FALSE,48384,378,300,3,292,3,"1.5 pages incl deq & txn [deq txn]"
 ,,,,,,,,,,,,,,,,,,,
-"File transition (from file 0000 to 0001) - no dequeues as exact sizes are needed and dequeues are non-deterministic",,,,,,,,,,,,,,,,,,,
+"File transition (from file 0000 to 0001)",,,,,,,,,,,,,,,,,,,
 53,"L",1,48,0,48,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"1 page"
 54,"L",1,48,1,49,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"1 page"
 55,"L",1,48,0,48,1,32725,32725,0,0,FALSE,FALSE,32769,257,0,0,0,0,"1 page + 1 byte"
@@ -115,36 +115,36 @@
 94,"L",1,16,0,16,1,32725,32725,0,0,FALSE,FALSE,32769,257,0,0,0,0,"data 1 page + 1 byte (tail split; 1 byte over page boundary)"
 95,"L",1,16,0,16,11,32735,32735,0,0,FALSE,FALSE,32779,257,0,0,0,0,"data 1 page + 11 bytes (tail split; 11 bytes over page boundary)"
 96,"L",1,16,0,16,12,32736,32736,0,0,FALSE,FALSE,32780,257,0,0,0,0,"data 1 page + 12 bytes (tail separated exactly onto next page)"
-97,"L",1,16,0,16,13,32737,32737,0,0,FALSE,FALSE,32781,257,0,0,0,0,"data 1 page + 13 bytes (xid split; 1 byte over page boundary)"
+97,"L",1,16,0,16,13,32737,32737,0,0,FALSE,FALSE,32781,257,0,0,0,0,"data 1 page + 13 bytes (data split; 1 byte over page boundary)"
 98,"L",1,16,0,16,0,32468,32468,256,256,FALSE,FALSE,32768,256,0,0,0,0,"data 1 page [txn]"
 99,"L",1,16,0,16,1,32469,32469,256,256,FALSE,FALSE,32769,257,0,0,0,0,"data 1 page + 1 byte (tail split; 1 byte over page boundary) [txn]"
 100,"L",1,16,0,16,11,32479,32479,256,256,FALSE,FALSE,32779,257,0,0,0,0,"data 1 page + 11 bytes (tail split; 11 bytes over page boundary) [txn]"
 101,"L",1,16,0,16,12,32480,32480,256,256,FALSE,FALSE,32780,257,0,0,0,0,"data 1 page + 12 bytes (tail separated exactly onto next page) [txn]"
-102,"L",1,16,0,16,13,32481,32481,256,256,FALSE,FALSE,32781,257,0,0,0,0,"data 1 page + 13 bytes (xid split; 1 byte over page boundary) [txn]"
+102,"L",1,16,0,16,13,32481,32481,256,256,FALSE,FALSE,32781,257,0,0,0,0,"data 1 page + 13 bytes (data split; 1 byte over page boundary) [txn]"
 103,"L",2,16,0,16,0,65492,65492,0,0,FALSE,FALSE,65536,512,0,0,0,0,"data 2 pages"
 104,"L",2,16,0,16,1,65493,65493,0,0,FALSE,FALSE,65537,513,0,0,0,0,"data 2 pages + 1 byte (tail split; 1 byte over page boundary)"
 105,"L",2,16,0,16,11,65503,65503,0,0,FALSE,FALSE,65547,513,0,0,0,0,"data 2 pages + 11 bytes (tail split; 11 bytes over page boundary)"
 106,"L",2,16,0,16,12,65504,65504,0,0,FALSE,FALSE,65548,513,0,0,0,0,"data 2 pages + 12 bytes (tail separated exactly onto next page)"
-107,"L",2,16,0,16,13,65505,65505,0,0,FALSE,FALSE,65549,513,0,0,0,0,"data 2 pages + 13 bytes (xid split; 1 byte over page boundary)"
+107,"L",2,16,0,16,13,65505,65505,0,0,FALSE,FALSE,65549,513,0,0,0,0,"data 2 pages + 13 bytes (data split; 1 byte over page boundary)"
 108,"L",2,16,0,16,0,65236,65236,256,256,FALSE,FALSE,65536,512,0,0,0,0,"data 2 pages [txn]"
 109,"L",2,16,0,16,1,65237,65237,256,256,FALSE,FALSE,65537,513,0,0,0,0,"data 2 pages + 1 byte (tail split; 1 byte over page boundary) [txn]"
 110,"L",2,16,0,16,11,65247,65247,256,256,FALSE,FALSE,65547,513,0,0,0,0,"data 2 pages + 11 bytes (tail split; 11 bytes over page boundary) [txn]"
 111,"L",2,16,0,16,12,65248,65248,256,256,FALSE,FALSE,65548,513,0,0,0,0,"data 2 pages + 12 bytes (tail separated exactly onto next page) [txn]"
-112,"L",2,16,0,16,13,65249,65249,256,256,FALSE,FALSE,65549,513,0,0,0,0,"data 2 pages + 13 bytes (xid split; 1 byte over page boundary) [txn]"
+112,"L",2,16,0,16,13,65249,65249,256,256,FALSE,FALSE,65549,513,0,0,0,0,"data 2 pages + 13 bytes (data split; 1 byte over page boundary) [txn]"
 113,"L",4,16,0,16,0,131028,131028,0,0,FALSE,FALSE,131072,1024,0,0,0,0,"data 4 pages"
 114,"L",4,16,0,16,1,131029,131029,0,0,FALSE,FALSE,131073,1025,0,0,0,0,"data 4 pages + 1 byte (tail split; 1 byte over page boundary)"
 115,"L",4,16,0,16,11,131039,131039,0,0,FALSE,FALSE,131083,1025,0,0,0,0,"data 4 pages + 11 bytes (tail split; 11 bytes over page boundary)"
 116,"L",4,16,0,16,12,131040,131040,0,0,FALSE,FALSE,131084,1025,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page)"
-117,"L",4,16,0,16,13,131041,131041,0,0,FALSE,FALSE,131085,1025,0,0,0,0,"data 4 pages + 13 bytes (xid split; 1 byte over page boundary)"
+117,"L",4,16,0,16,13,131041,131041,0,0,FALSE,FALSE,131085,1025,0,0,0,0,"data 4 pages + 13 bytes (data split; 1 byte over page boundary)"
 118,"L",4,16,0,16,0,130772,130772,256,256,FALSE,FALSE,131072,1024,0,0,0,0,"data 4 pages [txn]"
 119,"L",4,16,0,16,1,130773,130773,256,256,FALSE,FALSE,131073,1025,0,0,0,0,"data 4 pages + 1 byte (tail split; 1 byte over page boundary) [txn]"
 120,"L",4,16,0,16,11,130783,130783,256,256,FALSE,FALSE,131083,1025,0,0,0,0,"data 4 pages + 11 bytes (tail split; 11 bytes over page boundary) [txn]"
 121,"L",4,16,0,16,12,130784,130784,256,256,FALSE,FALSE,131084,1025,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page) [txn]"
-122,"L",4,16,0,16,13,130785,130785,256,256,FALSE,FALSE,131085,1025,0,0,0,0,"data 4 pages + 13 bytes (xid split; 1 byte over page boundary) [txn]"
-123,"L",3.5,16,0,16,0,114644,114644,0,0,FALSE,FALSE,114688,896,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page) [txn]"
-124,"L",3.5,16,0,16,1,114645,114645,0,0,FALSE,FALSE,114689,897,0,0,0,0,"data 4 pages + 13 bytes (xid split; 1 byte over page boundary) [txn]"
-125,"L",3.5,16,0,16,0,114388,114388,256,256,FALSE,FALSE,114688,896,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page) [txn]"
-126,"L",3.5,16,0,16,1,114389,114389,256,256,FALSE,FALSE,114689,897,0,0,0,0,"data 4 pages + 13 bytes (xid split; 1 byte over page boundary) [txn]"
+122,"L",4,16,0,16,13,130785,130785,256,256,FALSE,FALSE,131085,1025,0,0,0,0,"data 4 pages + 13 bytes (data split; 1 byte over page boundary) [txn]"
+123,"L",3.5,16,0,16,0,114644,114644,0,0,FALSE,FALSE,114688,896,0,0,0,0,"data 3.5 pages"
+124,"L",3.5,16,0,16,1,114645,114645,0,0,FALSE,FALSE,114689,897,0,0,0,0,"data 3.5 pages + 1 byte"
+125,"L",3.5,16,0,16,0,114388,114388,256,256,FALSE,FALSE,114688,896,0,0,0,0,"data 3.5 pages [txn]"
+126,"L",3.5,16,0,16,1,114389,114389,256,256,FALSE,FALSE,114689,897,0,0,0,0,"data 3.5 pages + 1 byte [txn]"
 127,"L",1,16,0,16,-1,10,10,32735,32735,FALSE,FALSE,32789,257,0,0,0,0,"xid 1 page – 1 byte; data 10 bytes (exact fit) [txn]"
 128,"L",1,16,0,16,0,10,10,32736,32736,FALSE,FALSE,32790,257,0,0,0,0,"xid 1 page; data 10 bytes (exact fit) [txn]"
 129,"L",1,16,0,16,1,10,10,32737,32737,FALSE,FALSE,32791,257,0,0,0,0,"xid 1 page + 1 byte; data 10 bytes (exact fit) [txn]"
@@ -156,100 +156,122 @@
 135,"L",4,16,0,16,1,10,10,131041,131041,FALSE,FALSE,131095,1025,0,0,0,0,"xid 4 pages + 1 byte; data 10 bytes (exact fit) [txn]"
 136,"L",3.5,16,0,16,0,10,10,114656,114656,FALSE,FALSE,114710,897,0,0,0,0,"xid 3.5 pages; data 10 bytes (exact fit) [txn]"
 137,"L",3.5,16,0,16,1,10,10,114657,114657,FALSE,FALSE,114711,897,0,0,0,0,"xid 3.5 pages + 1 byte; data 10 bytes (exact fit) [txn]"
-138,"L",1,16,0,16,-1,10,10,32735,32735,TRUE,FALSE,32789,257,32779,257,32771,257,"xid 1 page – 1 byte; data 10 bytes (exact fit) [txn]"
-139,"L",1,16,0,16,0,10,10,32736,32736,TRUE,FALSE,32790,257,32780,257,32772,257,"xid 1 page; data 10 bytes (exact fit) [txn]"
-140,"L",1,16,0,16,1,10,10,32737,32737,TRUE,FALSE,32791,257,32781,257,32773,257,"xid 1 page + 1 byte; data 10 bytes (exact fit) [txn]"
-141,"L",2,16,0,16,-1,10,10,65503,65503,TRUE,FALSE,65557,513,65547,513,65539,513,"xid 2 pages – 1 byte; data 10 bytes (exact fit) [txn]"
-142,"L",2,16,0,16,0,10,10,65504,65504,TRUE,FALSE,65558,513,65548,513,65540,513,"xid 2 pages; data 10 bytes (exact fit) [txn]"
-143,"L",2,16,0,16,1,10,10,65505,65505,TRUE,FALSE,65559,513,65549,513,65541,513,"xid 2 pages + 1 byte; data 10 bytes (exact fit) [txn]"
-144,"L",4,16,0,16,-1,10,10,131039,131039,TRUE,FALSE,131093,1025,131083,1025,131075,1025,"xid 4 pages – 1 byte; data 10 bytes (exact fit) [txn]"
-145,"L",4,16,0,16,0,10,10,131040,131040,TRUE,FALSE,131094,1025,131084,1025,131076,1025,"xid 4 pages; data 10 bytes (exact fit) [txn]"
-146,"L",4,16,0,16,1,10,10,131041,131041,TRUE,FALSE,131095,1025,131085,1025,131077,1025,"xid 4 pages + 1 byte; data 10 bytes (exact fit) [txn]"
-147,"L",3.5,16,0,16,0,10,10,114656,114656,TRUE,FALSE,114710,897,114700,897,114692,897,"xid 3.5 pages; data 10 bytes (exact fit) [txn]"
-148,"L",3.5,16,0,16,1,10,10,114657,114657,TRUE,FALSE,114711,897,114701,897,114693,897,"xid 3.5 pages + 1 byte; data 10 bytes (exact fit) [txn]"
+138,"L",1,16,0,16,-1,10,10,32735,32735,TRUE,FALSE,32789,257,32779,257,32771,257,"xid 1 page – 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+139,"L",1,16,0,16,0,10,10,32736,32736,TRUE,FALSE,32790,257,32780,257,32772,257,"xid 1 page for enq rec; data 10 bytes (exact fit) [deq, txn]"
+140,"L",1,16,0,16,1,10,10,32737,32737,TRUE,FALSE,32791,257,32781,257,32773,257,"xid 1 page + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+141,"L",2,16,0,16,-1,10,10,65503,65503,TRUE,FALSE,65557,513,65547,513,65539,513,"xid 2 pages – 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+142,"L",2,16,0,16,0,10,10,65504,65504,TRUE,FALSE,65558,513,65548,513,65540,513,"xid 2 pages for enq rec; data 10 bytes (exact fit) [deq, txn]"
+143,"L",2,16,0,16,1,10,10,65505,65505,TRUE,FALSE,65559,513,65549,513,65541,513,"xid 2 pages + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+144,"L",4,16,0,16,-1,10,10,131039,131039,TRUE,FALSE,131093,1025,131083,1025,131075,1025,"xid 4 pages – 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+145,"L",4,16,0,16,0,10,10,131040,131040,TRUE,FALSE,131094,1025,131084,1025,131076,1025,"xid 4 pages for enq rec; data 10 bytes (exact fit) [deq, txn]"
+146,"L",4,16,0,16,1,10,10,131041,131041,TRUE,FALSE,131095,1025,131085,1025,131077,1025,"xid 4 pages + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+147,"L",3.5,16,0,16,0,10,10,114656,114656,TRUE,FALSE,114710,897,114700,897,114692,897,"xid 3.5 pages for enq rec; data 10 bytes (exact fit) [deq, txn]"
+148,"L",3.5,16,0,16,1,10,10,114657,114657,TRUE,FALSE,114711,897,114701,897,114693,897,"xid 3.5 pages + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]"
+149,"L",1,16,0,16,-1,10,10,32735,32735,TRUE,FALSE,32789,257,32779,257,32771,257,"xid 1 page – 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+150,"L",1,16,0,16,0,10,10,32736,32736,TRUE,FALSE,32790,257,32780,257,32772,257,"xid 1 page for deq rec; data 10 bytes (exact fit) [deq, txn]"
+151,"L",1,16,0,16,1,10,10,32737,32737,TRUE,FALSE,32791,257,32781,257,32773,257,"xid 1 page + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+152,"L",2,16,0,16,-1,10,10,65503,65503,TRUE,FALSE,65557,513,65547,513,65539,513,"xid 2 pages – 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+153,"L",2,16,0,16,0,10,10,65504,65504,TRUE,FALSE,65558,513,65548,513,65540,513,"xid 2 pages for deq rec; data 10 bytes (exact fit) [deq, txn]"
+154,"L",2,16,0,16,1,10,10,65505,65505,TRUE,FALSE,65559,513,65549,513,65541,513,"xid 2 pages + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+155,"L",4,16,0,16,-1,10,10,131039,131039,TRUE,FALSE,131093,1025,131083,1025,131075,1025,"xid 4 pages – 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+156,"L",4,16,0,16,0,10,10,131040,131040,TRUE,FALSE,131094,1025,131084,1025,131076,1025,"xid 4 pages for deq rec; data 10 bytes (exact fit) [deq, txn]"
+157,"L",4,16,0,16,1,10,10,131041,131041,TRUE,FALSE,131095,1025,131085,1025,131077,1025,"xid 4 pages + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+158,"L",3.5,16,0,16,0,10,10,114656,114656,TRUE,FALSE,114710,897,114700,897,114692,897,"xid 3.5 pages for deq rec; data 10 bytes (exact fit) [deq, txn]"
+159,"L",3.5,16,0,16,1,10,10,114657,114657,TRUE,FALSE,114711,897,114701,897,114693,897,"xid 3.5 pages + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]"
+160,"L",1,16,0,16,-1,10,10,32743,32743,TRUE,FALSE,32797,257,32787,257,32779,257,"xid 1 page – 1 byte for txn rec; data 10 bytes (exact fit) [deq, txn]"
+161,"L",1,16,0,16,0,10,10,32744,32744,TRUE,FALSE,32798,257,32788,257,32780,257,"xid 1 page for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+162,"L",1,16,0,16,1,10,10,32745,32745,TRUE,FALSE,32799,257,32789,257,32781,257,"xid 1 page + 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+163,"L",2,16,0,16,-1,10,10,65511,65511,TRUE,FALSE,65565,513,65555,513,65547,513,"xid 2 pages – 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+164,"L",2,16,0,16,0,10,10,65512,65512,TRUE,FALSE,65566,513,65556,513,65548,513,"xid 2 pages for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+165,"L",2,16,0,16,1,10,10,65513,65513,TRUE,FALSE,65567,513,65557,513,65549,513,"xid 2 pages + 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+166,"L",4,16,0,16,-1,10,10,131047,131047,TRUE,FALSE,131101,1025,131091,1025,131083,1025,"xid 4 pages – 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+167,"L",4,16,0,16,0,10,10,131048,131048,TRUE,FALSE,131102,1025,131092,1025,131084,1025,"xid 4 pages for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+168,"L",4,16,0,16,1,10,10,131049,131049,TRUE,FALSE,131103,1025,131093,1025,131085,1025,"xid 4 pages + 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+169,"L",3.5,16,0,16,0,10,10,114664,114664,TRUE,FALSE,114718,897,114708,897,114700,897,"xid 3.5 pages for  txn rec; data 10 bytes (exact fit) [deq, txn]"
+170,"L",3.5,16,0,16,1,10,10,114665,114665,TRUE,FALSE,114719,897,114709,897,114701,897,"xid 3.5 pages + 1 byte for  txn rec; data 10 bytes (exact fit) [deq, txn]"
 ,,,,,,,,,,,,,,,,,,,
 "Large (multi-megabyte) messages - RHM_WRONLY req'd for auto-dequeue == FALSE",,,,,,,,,,,,,,,,,,,
-149,"L",1,32,0,32,0,1572820,1572820,0,0,FALSE,FALSE,1572864,12288,0,0,0,0,"48 pages = 1 file exactly"
-150,"L",1,32,0,32,1,1572821,1572821,0,0,FALSE,FALSE,1572865,12289,0,0,0,0,"48 pages + 1 byte"
-151,"L",1,32,0,32,0,1605588,1605588,0,0,FALSE,FALSE,1605632,12544,0,0,0,0,"49 pages = 1 file + 1 page"
-152,"L",1,32,0,32,1,1589205,1589205,0,0,FALSE,FALSE,1589249,12417,0,0,0,0,"49 pages + 1 byte = 1 file + 1 page + 1 byte"
-153,"L",1,32,0,32,0,1572565,1572565,255,255,FALSE,FALSE,1572864,12288,0,0,0,0,"48 pages = 1 file exactly [txn]"
-154,"L",1,32,0,32,1,1572566,1572566,255,255,FALSE,FALSE,1572865,12289,0,0,0,0,"48 pages + 1 byte [txn]"
-155,"L",1,32,0,32,0,1588949,1588949,255,255,FALSE,FALSE,1589248,12416,0,0,0,0,"49 pages = 1 file + 1 page [txn]"
-156,"L",1,32,0,32,1,1584854,1584854,255,255,FALSE,FALSE,1585153,12385,0,0,0,0,"49 pages + 1 byte = 1 file + 1 page + 1 byte [txn]"
-157,"L",1,32,0,32,0,1572692,1572692,0,0,TRUE,FALSE,1572736,12287,32,1,0,0,"48 pages incl deq = 1 file exactly [deq]"
-158,"L",1,32,0,32,1,1572693,1572693,0,0,TRUE,FALSE,1572737,12288,32,1,0,0,"48 pages incl deq + 1 byte [deq]"
-159,"L",1,32,0,32,0,1595220,1595220,0,0,TRUE,FALSE,1595264,12463,32,1,0,0,"49 pages incl deq = 1 file + 1 page [deq]"
-160,"L",1,32,0,32,1,1589077,1589077,0,0,TRUE,FALSE,1589121,12416,32,1,0,0,"49 pages incl deq + 1 byte = 1 file + 1 page + 1 byte [deq]"
-161,"L",1,32,0,32,0,1571797,1571797,255,255,TRUE,FALSE,1572096,12282,299,3,291,3,"48 pages incl deq & txn = 1 file exactly [deq txn]"
-162,"L",1,32,0,32,1,1571798,1571798,255,255,TRUE,FALSE,1572097,12283,299,3,291,3,"48 pages incl deq & txn + 1 byte [deq txn]"
-163,"L",1,32,0,32,0,1571797,1571797,255,255,TRUE,FALSE,1572096,12282,299,3,291,3,"49 pages incl deq & txn = 1 file + 1 page [deq txn]"
-164,"L",1,32,0,32,1,1571798,1571798,255,255,TRUE,FALSE,1572097,12283,299,3,291,3,"49 pages incl deq & txn + 1 byte = 1 file + 1 page + 1 byte [deq txn]"
-165,"L",2,16,0,16,0,3145684,3145684,0,0,FALSE,FALSE,3145728,24576,0,0,0,0,"96 pages = 2 files exactly"
-166,"L",2,16,0,16,1,3145685,3145685,0,0,FALSE,FALSE,3145729,24577,0,0,0,0,"96 pages + 1 byte"
-167,"L",2,16,0,16,0,3146708,3146708,0,0,FALSE,FALSE,3146752,24584,0,0,0,0,"97 pages = 2 files + 1 page"
-168,"L",2,16,0,16,1,3145685,3145685,0,0,FALSE,FALSE,3145729,24577,0,0,0,0,"97 pages + 1 byte = 2 files + 1 page + 1 byte"
-169,"L",2,16,0,16,0,3145429,3145429,255,255,FALSE,FALSE,3145728,24576,0,0,0,0,"96 pages = 2 files exactly [txn]"
-170,"L",2,16,0,16,1,3145430,3145430,255,255,FALSE,FALSE,3145729,24577,0,0,0,0,"96 pages + 1 byte [txn]"
-171,"L",2,16,0,16,0,3145429,3145429,255,255,FALSE,FALSE,3145728,24576,0,0,0,0,"97 pages = 2 files + 1 page [txn]"
-172,"L",2,16,0,16,1,3145430,3145430,255,255,FALSE,FALSE,3145729,24577,0,0,0,0,"97 pages + 1 byte = 2 files + 1 page + 1 byte [txn]"
-173,"L",2,16,0,16,0,3145556,3145556,0,0,TRUE,FALSE,3145600,24575,32,1,0,0,"96 pages incl deq = 2 files exactly [deq]"
-174,"L",2,16,0,16,1,3145557,3145557,0,0,TRUE,FALSE,3145601,24576,32,1,0,0,"96 pages incl deq + 1 byte [deq]"
-175,"L",2,16,0,16,0,3145556,3145556,0,0,TRUE,FALSE,3145600,24575,32,1,0,0,"97 pages incl deq = 2 files + 1 page [deq]"
-176,"L",2,16,0,16,1,3145557,3145557,0,0,TRUE,FALSE,3145601,24576,32,1,0,0,"97 pages incl deq + 1 byte = 2 files + 1 page + 1 byte [deq]"
-177,"L",2,16,0,16,0,3144661,3144661,255,255,TRUE,FALSE,3144960,24570,299,3,291,3,"96 pages incl deq & txn = 2 files exactly [deq txn]"
-178,"L",2,16,0,16,1,3144662,3144662,255,255,TRUE,FALSE,3144961,24571,299,3,291,3,"96 pages incl deq & txn + 1 byte [deq txn]"
-179,"L",2,16,0,16,0,3144661,3144661,255,255,TRUE,FALSE,3144960,24570,299,3,291,3,"97 pages incl deq & txn = 2 files + 1 page [deq txn]"
-180,"L",2,16,0,16,1,3144662,3144662,255,255,TRUE,FALSE,3144961,24571,299,3,291,3,"97 pages incl deq & txn + 1 byte = 2 files + 1 page + 1 byte [deq txn]"
-181,"L",4,8,0,8,0,6291412,6291412,0,0,FALSE,FALSE,6291456,49152,0,0,0,0,"192 pages = 2 files exactly"
-182,"L",4,8,0,8,1,6291413,6291413,0,0,FALSE,FALSE,6291457,49153,0,0,0,0,"192 pages + 1 byte"
-183,"L",4,8,0,8,0,6291412,6291412,0,0,FALSE,FALSE,6291456,49152,0,0,0,0,"193 pages = 2 files + 1 page"
-184,"L",4,8,0,8,1,6291413,6291413,0,0,FALSE,FALSE,6291457,49153,0,0,0,0,"193 pages + 1 byte = 2 files + 1 page + 1 byte"
-185,"L",4,8,0,8,0,6291157,6291157,255,255,FALSE,FALSE,6291456,49152,0,0,0,0,"192 pages = 2 files exactly [txn]"
-186,"L",4,8,0,8,1,6291158,6291158,255,255,FALSE,FALSE,6291457,49153,0,0,0,0,"192 pages + 1 byte [txn]"
-187,"L",4,8,0,8,0,6291157,6291157,255,255,FALSE,FALSE,6291456,49152,0,0,0,0,"193 pages = 2 files + 1 page [txn]"
-188,"L",4,8,0,8,1,6291158,6291158,255,255,FALSE,FALSE,6291457,49153,0,0,0,0,"193 pages + 1 byte = 2 files + 1 page + 1 byte [txn]"
-189,"L",4,8,0,8,0,6291284,6291284,0,0,TRUE,FALSE,6291328,49151,32,1,0,0,"192 pages incl deq = 2 files exactly [deq]"
-190,"L",4,8,0,8,1,6291285,6291285,0,0,TRUE,FALSE,6291329,49152,32,1,0,0,"192 pages incl deq + 1 byte [deq]"
-191,"L",4,8,0,8,0,6291284,6291284,0,0,TRUE,FALSE,6291328,49151,32,1,0,0,"193 pages incl deq = 2 files + 1 page [deq]"
-192,"L",4,8,0,8,1,6291285,6291285,0,0,TRUE,FALSE,6291329,49152,32,1,0,0,"193 pages incl deq + 1 byte = 2 files + 1 page + 1 byte [deq]"
-193,"L",4,8,0,8,0,6290389,6290389,255,255,TRUE,FALSE,6290688,49146,299,3,291,3,"192 pages incl deq & txn = 2 files exactly [deq txn]"
-194,"L",4,8,0,8,1,6290390,6290390,255,255,TRUE,FALSE,6290689,49147,299,3,291,3,"192 pages incl deq & txn + 1 byte [deq txn]"
-195,"L",4,8,0,8,0,6290389,6290389,255,255,TRUE,FALSE,6290688,49146,299,3,291,3,"193 pages incl deq & txn = 2 files + 1 page [deq txn]"
-196,"L",4,8,0,8,1,6290390,6290390,255,255,TRUE,FALSE,6290689,49147,299,3,291,3,"193 pages incl deq & txn + 1 byte = 2 files + 1 page + 1 byte [deq txn]"
+171,"L",1,32,0,32,0,1572820,1572820,0,0,FALSE,FALSE,1572864,12288,0,0,0,0,"48 pages = 1 file exactly"
+172,"L",1,32,0,32,1,1572821,1572821,0,0,FALSE,FALSE,1572865,12289,0,0,0,0,"48 pages + 1 byte"
+173,"L",1,32,0,32,0,1605588,1605588,0,0,FALSE,FALSE,1605632,12544,0,0,0,0,"49 pages = 1 file + 1 page"
+174,"L",1,32,0,32,1,1589205,1589205,0,0,FALSE,FALSE,1589249,12417,0,0,0,0,"49 pages + 1 byte = 1 file + 1 page + 1 byte"
+175,"L",1,32,0,32,0,1572565,1572565,255,255,FALSE,FALSE,1572864,12288,0,0,0,0,"48 pages = 1 file exactly [txn]"
+176,"L",1,32,0,32,1,1572566,1572566,255,255,FALSE,FALSE,1572865,12289,0,0,0,0,"48 pages + 1 byte [txn]"
+177,"L",1,32,0,32,0,1588949,1588949,255,255,FALSE,FALSE,1589248,12416,0,0,0,0,"49 pages = 1 file + 1 page [txn]"
+178,"L",1,32,0,32,1,1584854,1584854,255,255,FALSE,FALSE,1585153,12385,0,0,0,0,"49 pages + 1 byte = 1 file + 1 page + 1 byte [txn]"
+179,"L",1,32,0,32,0,1572692,1572692,0,0,TRUE,FALSE,1572736,12287,32,1,0,0,"48 pages incl deq = 1 file exactly [deq]"
+180,"L",1,32,0,32,1,1572693,1572693,0,0,TRUE,FALSE,1572737,12288,32,1,0,0,"48 pages incl deq + 1 byte [deq]"
+181,"L",1,32,0,32,0,1595220,1595220,0,0,TRUE,FALSE,1595264,12463,32,1,0,0,"49 pages incl deq = 1 file + 1 page [deq]"
+182,"L",1,32,0,32,1,1589077,1589077,0,0,TRUE,FALSE,1589121,12416,32,1,0,0,"49 pages incl deq + 1 byte = 1 file + 1 page + 1 byte [deq]"
+183,"L",1,32,0,32,0,1571797,1571797,255,255,TRUE,FALSE,1572096,12282,299,3,291,3,"48 pages incl deq & txn = 1 file exactly [deq txn]"
+184,"L",1,32,0,32,1,1571798,1571798,255,255,TRUE,FALSE,1572097,12283,299,3,291,3,"48 pages incl deq & txn + 1 byte [deq txn]"
+185,"L",1,32,0,32,0,1571797,1571797,255,255,TRUE,FALSE,1572096,12282,299,3,291,3,"49 pages incl deq & txn = 1 file + 1 page [deq txn]"
+186,"L",1,32,0,32,1,1571798,1571798,255,255,TRUE,FALSE,1572097,12283,299,3,291,3,"49 pages incl deq & txn + 1 byte = 1 file + 1 page + 1 byte [deq txn]"
+187,"L",2,16,0,16,0,3145684,3145684,0,0,FALSE,FALSE,3145728,24576,0,0,0,0,"96 pages = 2 files exactly"
+188,"L",2,16,0,16,1,3145685,3145685,0,0,FALSE,FALSE,3145729,24577,0,0,0,0,"96 pages + 1 byte"
+189,"L",2,16,0,16,0,3146708,3146708,0,0,FALSE,FALSE,3146752,24584,0,0,0,0,"97 pages = 2 files + 1 page"
+190,"L",2,16,0,16,1,3145685,3145685,0,0,FALSE,FALSE,3145729,24577,0,0,0,0,"97 pages + 1 byte = 2 files + 1 page + 1 byte"
+191,"L",2,16,0,16,0,3145429,3145429,255,255,FALSE,FALSE,3145728,24576,0,0,0,0,"96 pages = 2 files exactly [txn]"
+192,"L",2,16,0,16,1,3145430,3145430,255,255,FALSE,FALSE,3145729,24577,0,0,0,0,"96 pages + 1 byte [txn]"
+193,"L",2,16,0,16,0,3145429,3145429,255,255,FALSE,FALSE,3145728,24576,0,0,0,0,"97 pages = 2 files + 1 page [txn]"
+194,"L",2,16,0,16,1,3145430,3145430,255,255,FALSE,FALSE,3145729,24577,0,0,0,0,"97 pages + 1 byte = 2 files + 1 page + 1 byte [txn]"
+195,"L",2,16,0,16,0,3145556,3145556,0,0,TRUE,FALSE,3145600,24575,32,1,0,0,"96 pages incl deq = 2 files exactly [deq]"
+196,"L",2,16,0,16,1,3145557,3145557,0,0,TRUE,FALSE,3145601,24576,32,1,0,0,"96 pages incl deq + 1 byte [deq]"
+197,"L",2,16,0,16,0,3145556,3145556,0,0,TRUE,FALSE,3145600,24575,32,1,0,0,"97 pages incl deq = 2 files + 1 page [deq]"
+198,"L",2,16,0,16,1,3145557,3145557,0,0,TRUE,FALSE,3145601,24576,32,1,0,0,"97 pages incl deq + 1 byte = 2 files + 1 page + 1 byte [deq]"
+199,"L",2,16,0,16,0,3144661,3144661,255,255,TRUE,FALSE,3144960,24570,299,3,291,3,"96 pages incl deq & txn = 2 files exactly [deq txn]"
+200,"L",2,16,0,16,1,3144662,3144662,255,255,TRUE,FALSE,3144961,24571,299,3,291,3,"96 pages incl deq & txn + 1 byte [deq txn]"
+201,"L",2,16,0,16,0,3144661,3144661,255,255,TRUE,FALSE,3144960,24570,299,3,291,3,"97 pages incl deq & txn = 2 files + 1 page [deq txn]"
+202,"L",2,16,0,16,1,3144662,3144662,255,255,TRUE,FALSE,3144961,24571,299,3,291,3,"97 pages incl deq & txn + 1 byte = 2 files + 1 page + 1 byte [deq txn]"
+203,"L",4,8,0,8,0,6291412,6291412,0,0,FALSE,FALSE,6291456,49152,0,0,0,0,"192 pages = 2 files exactly"
+204,"L",4,8,0,8,1,6291413,6291413,0,0,FALSE,FALSE,6291457,49153,0,0,0,0,"192 pages + 1 byte"
+205,"L",4,8,0,8,0,6291412,6291412,0,0,FALSE,FALSE,6291456,49152,0,0,0,0,"193 pages = 2 files + 1 page"
+206,"L",4,8,0,8,1,6291413,6291413,0,0,FALSE,FALSE,6291457,49153,0,0,0,0,"193 pages + 1 byte = 2 files + 1 page + 1 byte"
+207,"L",4,8,0,8,0,6291157,6291157,255,255,FALSE,FALSE,6291456,49152,0,0,0,0,"192 pages = 2 files exactly [txn]"
+208,"L",4,8,0,8,1,6291158,6291158,255,255,FALSE,FALSE,6291457,49153,0,0,0,0,"192 pages + 1 byte [txn]"
+209,"L",4,8,0,8,0,6291157,6291157,255,255,FALSE,FALSE,6291456,49152,0,0,0,0,"193 pages = 2 files + 1 page [txn]"
+210,"L",4,8,0,8,1,6291158,6291158,255,255,FALSE,FALSE,6291457,49153,0,0,0,0,"193 pages + 1 byte = 2 files + 1 page + 1 byte [txn]"
+211,"L",4,8,0,8,0,6291284,6291284,0,0,TRUE,FALSE,6291328,49151,32,1,0,0,"192 pages incl deq = 2 files exactly [deq]"
+212,"L",4,8,0,8,1,6291285,6291285,0,0,TRUE,FALSE,6291329,49152,32,1,0,0,"192 pages incl deq + 1 byte [deq]"
+213,"L",4,8,0,8,0,6291284,6291284,0,0,TRUE,FALSE,6291328,49151,32,1,0,0,"193 pages incl deq = 2 files + 1 page [deq]"
+214,"L",4,8,0,8,1,6291285,6291285,0,0,TRUE,FALSE,6291329,49152,32,1,0,0,"193 pages incl deq + 1 byte = 2 files + 1 page + 1 byte [deq]"
+215,"L",4,8,0,8,0,6290389,6290389,255,255,TRUE,FALSE,6290688,49146,299,3,291,3,"192 pages incl deq & txn = 2 files exactly [deq txn]"
+216,"L",4,8,0,8,1,6290390,6290390,255,255,TRUE,FALSE,6290689,49147,299,3,291,3,"192 pages incl deq & txn + 1 byte [deq txn]"
+217,"L",4,8,0,8,0,6290389,6290389,255,255,TRUE,FALSE,6290688,49146,299,3,291,3,"193 pages incl deq & txn = 2 files + 1 page [deq txn]"
+218,"L",4,8,0,8,1,6290390,6290390,255,255,TRUE,FALSE,6290689,49147,299,3,291,3,"193 pages incl deq & txn + 1 byte = 2 files + 1 page + 1 byte [deq txn]"
 ,,,,,,,,,,,,,,,,,,,
 "High volume tests of random message lengths - RHM_WRONLY req'd for auto-dequeue == FALSE",,,,,,,,,,,,,,,,,,,
-197,"M",1,5000000,0,5000000,0,0,84,0,0,FALSE,FALSE,128,1,0,0,0,0,"1 dblk max"
-198,"M",3,3000000,0,3000000,0,0,340,0,0,FALSE,FALSE,384,3,0,0,0,0,"3 dblks max"
-199,"M",10,1600000,0,1600000,0,0,1236,0,0,FALSE,FALSE,1280,10,0,0,0,0,"10 dblks max"
-200,"M",30,6000000,0,6000000,0,0,3796,0,0,FALSE,FALSE,3840,30,0,0,0,0,"30 dblks max"
-201,"M",100,200000,0,200000,0,0,12756,0,0,FALSE,FALSE,12800,100,0,0,0,0,"100 dblks max"
-202,"M",300,60000,0,60000,0,0,38356,0,0,FALSE,FALSE,38400,300,0,0,0,0,"300 dblks max"
-203,"M",1000,20000,0,20000,0,0,127956,0,0,FALSE,FALSE,128000,1000,0,0,0,0,"1000 dblks max"
-204,"M",1,5000000,0,5000000,0,0,100,1,100,FALSE,FALSE,244,2,0,0,0,0,"100 bytes xid max + 100 bytes data max [txn]"
-205,"M",3,3000000,0,3000000,0,0,300,1,300,FALSE,FALSE,644,6,0,0,0,0,"300 bytes xid max + 300 bytes data max [txn]"
-206,"M",10,1600000,0,1600000,0,0,1000,1,1000,FALSE,FALSE,2044,16,0,0,0,0,"1000 bytes xid max + 1000 bytes data max [txn]"
-207,"M",30,6000000,0,6000000,0,0,3000,1,3000,FALSE,FALSE,6044,48,0,0,0,0,"3000 bytes xid max + 3000 bytes data max [txn]"
-208,"M",100,200000,0,200000,0,0,10000,1,10000,FALSE,FALSE,20044,157,0,0,0,0,"10000 bytes xid max + 10000 bytes data max [txn]"
-209,"M",300,60000,0,60000,0,0,30000,1,30000,FALSE,FALSE,60044,470,0,0,0,0,"30000 bytes xid max + 30000 bytes data max [txn]"
-210,"M",1000,20000,0,20000,0,0,100000,1,100000,FALSE,FALSE,200044,1563,0,0,0,0,"100000 bytes xid max + 100000 bytes data max [txn]"
-211,"M",1,5000000,0,5000000,0,0,84,0,0,TRUE,FALSE,128,1,32,1,0,0,"1 dblk max [deq]"
-212,"M",3,3000000,0,3000000,0,0,340,0,0,TRUE,FALSE,384,3,32,1,0,0,"3 dblks max [deq]"
-213,"M",10,1600000,0,1600000,0,0,1236,0,0,TRUE,FALSE,1280,10,32,1,0,0,"10 dblks max [deq]"
-214,"M",30,6000000,0,6000000,0,0,3796,0,0,TRUE,FALSE,3840,30,32,1,0,0,"30 dblks max [deq]"
-215,"M",100,200000,0,200000,0,0,12756,0,0,TRUE,FALSE,12800,100,32,1,0,0,"100 dblks max [deq]"
-216,"M",300,60000,0,60000,0,0,38356,0,0,TRUE,FALSE,38400,300,32,1,0,0,"300 dblks max [deq]"
-217,"M",1000,20000,0,20000,0,0,127956,0,0,TRUE,FALSE,128000,1000,32,1,0,0,"1000 dblks max [deq]"
-218,"M",1,5000000,0,5000000,0,0,100,1,100,TRUE,FALSE,244,2,144,2,136,2,"100 bytes xid max + 100 bytes data max [deq txn]"
-219,"M",3,3000000,0,3000000,0,0,300,1,300,TRUE,FALSE,644,6,344,3,336,3,"300 bytes xid max + 300 bytes data max [deq txn]"
-220,"M",10,1600000,0,1600000,0,0,1000,1,1000,TRUE,FALSE,2044,16,1044,9,1036,9,"1000 bytes xid max + 1000 bytes data max [deq txn]"
-221,"M",30,6000000,0,6000000,0,0,3000,1,3000,TRUE,FALSE,6044,48,3044,24,3036,24,"3000 bytes xid max + 3000 bytes data max [deq txn]"
-222,"M",100,200000,0,200000,0,0,10000,1,10000,TRUE,FALSE,20044,157,10044,79,10036,79,"10000 bytes xid max + 10000 bytes data max [deq txn]"
-223,"M",300,60000,0,60000,0,0,30000,1,30000,TRUE,FALSE,60044,470,30044,235,30036,235,"30000 bytes xid max + 30000 bytes data max [deq txn]"
-224,"M",1000,20000,0,20000,0,0,100000,1,100000,TRUE,FALSE,200044,1563,100044,782,100036,782,"100000 bytes xid max + 100000 bytes data max [deq txn]"
+219,"M",1,5000000,0,5000000,0,0,84,0,0,FALSE,FALSE,128,1,0,0,0,0,"1 dblk max"
+220,"M",3,3000000,0,3000000,0,0,340,0,0,FALSE,FALSE,384,3,0,0,0,0,"3 dblks max"
+221,"M",10,1600000,0,1600000,0,0,1236,0,0,FALSE,FALSE,1280,10,0,0,0,0,"10 dblks max"
+222,"M",30,6000000,0,6000000,0,0,3796,0,0,FALSE,FALSE,3840,30,0,0,0,0,"30 dblks max"
+223,"M",100,200000,0,200000,0,0,12756,0,0,FALSE,FALSE,12800,100,0,0,0,0,"100 dblks max"
+224,"M",300,60000,0,60000,0,0,38356,0,0,FALSE,FALSE,38400,300,0,0,0,0,"300 dblks max"
+225,"M",1000,20000,0,20000,0,0,127956,0,0,FALSE,FALSE,128000,1000,0,0,0,0,"1000 dblks max"
+226,"M",1,5000000,0,5000000,0,0,100,1,100,FALSE,FALSE,244,2,0,0,0,0,"100 bytes xid max + 100 bytes data max [txn]"
+227,"M",3,3000000,0,3000000,0,0,300,1,300,FALSE,FALSE,644,6,0,0,0,0,"300 bytes xid max + 300 bytes data max [txn]"
+228,"M",10,1600000,0,1600000,0,0,1000,1,1000,FALSE,FALSE,2044,16,0,0,0,0,"1000 bytes xid max + 1000 bytes data max [txn]"
+229,"M",30,6000000,0,6000000,0,0,3000,1,3000,FALSE,FALSE,6044,48,0,0,0,0,"3000 bytes xid max + 3000 bytes data max [txn]"
+230,"M",100,200000,0,200000,0,0,10000,1,10000,FALSE,FALSE,20044,157,0,0,0,0,"10000 bytes xid max + 10000 bytes data max [txn]"
+231,"M",300,60000,0,60000,0,0,30000,1,30000,FALSE,FALSE,60044,470,0,0,0,0,"30000 bytes xid max + 30000 bytes data max [txn]"
+232,"M",1000,20000,0,20000,0,0,100000,1,100000,FALSE,FALSE,200044,1563,0,0,0,0,"100000 bytes xid max + 100000 bytes data max [txn]"
+233,"M",1,5000000,0,5000000,0,0,84,0,0,TRUE,FALSE,128,1,32,1,0,0,"1 dblk max [deq]"
+234,"M",3,3000000,0,3000000,0,0,340,0,0,TRUE,FALSE,384,3,32,1,0,0,"3 dblks max [deq]"
+235,"M",10,1600000,0,1600000,0,0,1236,0,0,TRUE,FALSE,1280,10,32,1,0,0,"10 dblks max [deq]"
+236,"M",30,6000000,0,6000000,0,0,3796,0,0,TRUE,FALSE,3840,30,32,1,0,0,"30 dblks max [deq]"
+237,"M",100,200000,0,200000,0,0,12756,0,0,TRUE,FALSE,12800,100,32,1,0,0,"100 dblks max [deq]"
+238,"M",300,60000,0,60000,0,0,38356,0,0,TRUE,FALSE,38400,300,32,1,0,0,"300 dblks max [deq]"
+239,"M",1000,20000,0,20000,0,0,127956,0,0,TRUE,FALSE,128000,1000,32,1,0,0,"1000 dblks max [deq]"
+240,"M",1,5000000,0,5000000,0,0,100,1,100,TRUE,FALSE,244,2,144,2,136,2,"100 bytes xid max + 100 bytes data max [deq txn]"
+241,"M",3,3000000,0,3000000,0,0,300,1,300,TRUE,FALSE,644,6,344,3,336,3,"300 bytes xid max + 300 bytes data max [deq txn]"
+242,"M",10,1600000,0,1600000,0,0,1000,1,1000,TRUE,FALSE,2044,16,1044,9,1036,9,"1000 bytes xid max + 1000 bytes data max [deq txn]"
+243,"M",30,6000000,0,6000000,0,0,3000,1,3000,TRUE,FALSE,6044,48,3044,24,3036,24,"3000 bytes xid max + 3000 bytes data max [deq txn]"
+244,"M",100,200000,0,200000,0,0,10000,1,10000,TRUE,FALSE,20044,157,10044,79,10036,79,"10000 bytes xid max + 10000 bytes data max [deq txn]"
+245,"M",300,60000,0,60000,0,0,30000,1,30000,TRUE,FALSE,60044,470,30044,235,30036,235,"30000 bytes xid max + 30000 bytes data max [deq txn]"
+246,"M",1000,20000,0,20000,0,0,100000,1,100000,TRUE,FALSE,200044,1563,100044,782,100036,782,"100000 bytes xid max + 100000 bytes data max [deq txn]"
 ,,,,,,,,,,,,,,,,,,,
 "STANDARD PERFORMANCE BENCHMARK: 10,000,000 writes, data=212b (2 dblks)",,,,,,,,,,,,,,,,,,,
-198,"M",1,10000000,0,10000000,0,212,212,0,0,FALSE,FALSE,256,2,0,0,0,0,"212 bytes data (2 dblks enq)"
-199,"M",1,10000000,0,10000000,0,212,212,256,256,FALSE,FALSE,512,4,0,0,0,0,"212 bytes data + 256 bytes xid (4 dblks enq)"
-200,"M",1,10000000,0,10000000,0,212,212,0,0,TRUE,FALSE,256,2,32,1,0,0,"212 bytes data (2 dblks enq + 1 dblk deq)"
-201,"M",1,10000000,0,10000000,0,212,212,256,256,TRUE,FALSE,512,4,300,3,292,3,"212 bytes data + 256 bytes xid (4 dblks enq + 3 dblks deq + 3 dblks txn)"
+247,"M",1,10000000,0,10000000,0,212,212,0,0,FALSE,FALSE,256,2,0,0,0,0,"212 bytes data (2 dblks enq)"
+248,"M",1,10000000,0,10000000,0,212,212,256,256,FALSE,FALSE,512,4,0,0,0,0,"212 bytes data + 256 bytes xid (4 dblks enq)"
+249,"M",1,10000000,0,10000000,0,212,212,0,0,TRUE,FALSE,256,2,32,1,0,0,"212 bytes data (2 dblks enq + 1 dblk deq)"
+250,"M",1,10000000,0,10000000,0,212,212,256,256,TRUE,FALSE,512,4,300,3,292,3,"212 bytes data + 256 bytes xid (4 dblks enq + 3 dblks deq + 3 dblks txn)"




More information about the rhmessaging-commits mailing list