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

rhmessaging-commits at lists.jboss.org rhmessaging-commits at lists.jboss.org
Fri Oct 5 16:46:46 EDT 2007


Author: kpvdr
Date: 2007-10-05 16:46:46 -0400 (Fri, 05 Oct 2007)
New Revision: 965

Modified:
   store/trunk/cpp/lib/TxnCtxt.h
   store/trunk/cpp/lib/jrnl/README
   store/trunk/cpp/lib/jrnl/data_tok.cpp
   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/jcfg.hpp
   store/trunk/cpp/lib/jrnl/jcntl.cpp
   store/trunk/cpp/lib/jrnl/jcntl.hpp
   store/trunk/cpp/lib/jrnl/pmgr.cpp
   store/trunk/cpp/lib/jrnl/pmgr.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/janalyze.py
   store/trunk/cpp/tests/jrnl/jtest.cpp
   store/trunk/cpp/tests/jrnl/msg_producer.cpp
   store/trunk/cpp/tests/jrnl/msg_producer.hpp
   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:
Transaction encoding path complete, txn decode path still incomplete

Modified: store/trunk/cpp/lib/TxnCtxt.h
===================================================================
--- store/trunk/cpp/lib/TxnCtxt.h	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/TxnCtxt.h	2007-10-05 20:46:46 UTC (rev 965)
@@ -62,11 +62,13 @@
 	void completeTXN(bool commit){
 		for (TxnCtxt::ipqdef::iterator i = impactedQueues.begin(); i != impactedQueues.end(); i++) { 
 	   		journal::jcntl* jc = static_cast<journal::jcntl*>((*i)->getExternalQueueStore());
-			if (jc) /* if using journal */
+			if (jc) { /* if using journal */
+                journal::data_tok* dtokp = new journal::data_tok;
 				if (commit)
-					jc->txn_commit(getXid());
+					jc->txn_commit(dtokp, getXid());
 				else
-					jc->txn_abort(getXid());
+					jc->txn_abort(dtokp, getXid());
+                }
 			}
 		deleteXidRecord();
 		sync();

Modified: store/trunk/cpp/lib/jrnl/README
===================================================================
--- store/trunk/cpp/lib/jrnl/README	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/README	2007-10-05 20:46:46 UTC (rev 965)
@@ -7,6 +7,8 @@
 libaio-dev (run "yum install libaio-dev" as root to install)
 doxygen (required to generate documentation)
 
+TODO: *** THIS DOC IS OUT OF DATE ****
+
 Building:
 ---------
 For manual building, use the makefile Makefile.rtest in the tests/jrnl directory.

Modified: store/trunk/cpp/lib/jrnl/data_tok.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/data_tok.cpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/data_tok.cpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -51,6 +51,7 @@
     _dblks_written(0),
     _dblks_read(0),
     _rid(0),
+    _xid(),
     _sourceMsg(NULL)
 {
     pthread_mutex_init(&_mutex, NULL);
@@ -93,6 +94,22 @@
             return "DEQ_SUBM";
         case DEQ:
             return "DEQ";
+        case ABORT_CACHED:
+            return "ABORT_CACHED";
+        case ABORT_PART:
+            return "ABORT_PART";
+        case ABORT_SUBM:
+            return "ABORT_SUBM";
+        case ABORTED:
+            return "ABORTED";
+        case COMMIT_CACHED:
+            return "COMMIT_CACHED";
+        case COMMIT_PART:
+            return "COMMIT_PART";
+        case COMMIT_SUBM:
+            return "COMMIT_SUBM";
+        case COMMITTED:
+            return "COMMITTED";
     }
     // Not using default: forces compiler to ensure all cases are covered.
     return "<wstate unknown>";
@@ -144,6 +161,7 @@
     _dblks_written = 0;
     _dblks_read = 0;
     _rid = 0;
+    _xid.clear();
 }
 
 } // namespace journal

Modified: store/trunk/cpp/lib/jrnl/data_tok.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/data_tok.hpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/data_tok.hpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -67,6 +67,9 @@
     class data_tok
     {
     public:
+        // TODO: Fix this, separate write state from operation
+        // ie: wstate = NONE, CACHED, PART, SUBM, COMPL
+        //     op = ENQUEUE, DEQUEUE, ABORT, COMMIT
         enum write_state
         {
             NONE,       ///< Data block not sent to journal
@@ -77,7 +80,15 @@
             DEQ_CACHED, ///< Data block dequeue written to page cache
             DEQ_PART,   ///< Data block part-submitted to AIO, waiting for page buffer to free up
             DEQ_SUBM,   ///< Data block dequeue submitted to AIO
-            DEQ         ///< Data block dequeue AIO write complete (dequeue complete)
+            DEQ,        ///< Data block dequeue AIO write complete (dequeue complete)
+            ABORT_CACHED,
+            ABORT_PART,
+            ABORT_SUBM,
+            ABORTED,
+            COMMIT_CACHED,
+            COMMIT_PART,
+            COMMIT_SUBM,
+            COMMITTED
         };
 
         enum read_state
@@ -98,6 +109,7 @@
         u_int32_t   _dblks_written; ///< Data blocks read/written
         u_int32_t   _dblks_read;    ///< Data blocks read/written
         u_int64_t   _rid;           ///< RID of data set by enqueue operation
+        std::string _xid;           ///< XID set by enqueue operation
         u_int64_t   _dequeue_rid;   ///< RID of data set by dequeue operation
         qpid::broker::PersistableMessage* _sourceMsg; ///< Pointer back to source Message in Broker
 
@@ -109,10 +121,10 @@
         inline void setSourceMessage(qpid::broker::PersistableMessage* msg) {_sourceMsg = msg;}
 
         inline const u_int64_t id() const { return _icnt; }
-        inline const write_state wstate() const {return _wstate; }
+        inline const write_state wstate() const { return _wstate; }
         const char* wstate_str() const;
         static const char* wstate_str(write_state wstate);
-        inline const read_state rstate() const {return _rstate; }
+        inline const read_state rstate() const { return _rstate; }
         const char* rstate_str() const;
         static const char* rstate_str(read_state rstate);
         inline const bool is_writable() const { return _wstate == NONE || _wstate == ENQ_PART; }
@@ -138,6 +150,14 @@
         inline void set_rid(const u_int64_t rid) { _rid = rid; }
         inline const u_int64_t dequeue_rid() const throw (jexception) {return _dequeue_rid; }
         inline void set_dequeue_rid(const u_int64_t rid) { _dequeue_rid = rid; }
+
+        inline const bool has_xid() const { return !_xid.empty(); }
+        inline const std::string& xid() const { return _xid; }
+        inline void clear_xid() { _xid.clear(); }
+        inline void set_xid(const std::string& xid) { _xid.assign(xid); }
+        inline void set_xid(const void* xidp, const size_t xid_len)
+                { _xid.assign((const char*)xidp, xid_len); }
+
         void reset();
     };
 

Modified: store/trunk/cpp/lib/jrnl/deq_rec.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/deq_rec.cpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/deq_rec.cpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -33,6 +33,7 @@
 #include <jrnl/deq_rec.hpp>
 
 #include <assert.h>
+#include <errno.h>
 #include <iomanip>
 #include <sstream>
 #include <jrnl/jerrno.hpp>
@@ -44,41 +45,54 @@
 
 deq_rec::deq_rec():
         _deq_hdr(RHM_JDAT_DEQ_MAGIC, RHM_JDAT_VERSION, 0, 0, 0, 0),
-        _xid(),
-        _deq_tail()
-{}
-
-deq_rec::deq_rec(const u_int64_t rid, const u_int64_t drid):
-        _deq_hdr(RHM_JDAT_DEQ_MAGIC, RHM_JDAT_VERSION, 0, rid, drid, 0),
-        _xid(),
+        _xidp(NULL),
+        _buff(NULL),
         _deq_tail(_deq_hdr._hdr)
 {}
 
-deq_rec::deq_rec(const u_int64_t rid, const u_int64_t drid, const std::string& xid):
-        _deq_hdr(RHM_JDAT_DEQ_MAGIC, RHM_JDAT_VERSION, 0, rid, drid, xid.size()),
-        _xid(xid),
+deq_rec::deq_rec(const u_int64_t rid, const u_int64_t drid, const void* const xidp,
+        const size_t xidlen):
+        _deq_hdr(RHM_JDAT_DEQ_MAGIC, RHM_JDAT_VERSION, 0, rid, drid, xidlen),
+        _xidp(xidp),
+        _buff(NULL),
         _deq_tail(_deq_hdr._hdr)
 {}
 
 deq_rec::~deq_rec()
-{}
+{
+    if (_buff)
+        ::free(_buff);
+}
 
 void
-deq_rec::reset(const  u_int64_t rid, const  u_int64_t drid)
+deq_rec::reset()
 {
-    _deq_hdr._hdr._rid = rid;
-    _deq_hdr._deq_rid = drid;
+    _deq_hdr._hdr._rid = 0;
+    _deq_hdr._deq_rid = 0;
     _deq_hdr._xidsize = 0;
-    _deq_tail._rid = rid;
+    _deq_tail._rid = 0;
+    _xidp = NULL;
+    if (_buff)
+    {
+        ::free(_buff);
+        _buff = NULL;
+    }
 }
 
 void
-deq_rec::reset(const  u_int64_t rid, const  u_int64_t drid, const std::string& xid)
+deq_rec::reset(const  u_int64_t rid, const  u_int64_t drid, const void* const xidp,
+        const size_t xidlen)
 {
     _deq_hdr._hdr._rid = rid;
     _deq_hdr._deq_rid = drid;
-    _deq_hdr._xidsize = xid.size();
+    _deq_hdr._xidsize = xidlen;
     _deq_tail._rid = rid;
+    _xidp = xidp;
+    if (_buff)
+    {
+        ::free(_buff);
+        _buff = NULL;
+    }
 }
 
 u_int32_t
@@ -86,7 +100,8 @@
 {
     assert(wptr != NULL);
     assert(max_size_dblks > 0);
-    assert(_xid.size() == _deq_hdr._xidsize);
+    if (_xidp == NULL)
+        assert(_deq_hdr._xidsize == 0);
 
     size_t rec_offs = rec_offs_dblks * JRNL_DBLK_SIZE;
     size_t rem = max_size_dblks * JRNL_DBLK_SIZE;
@@ -102,7 +117,7 @@
             {
                 if (wsize > rem)
                     wsize = rem;
-                ::memcpy(wptr, (const char*)_xid.c_str() + rec_offs, wsize);
+                ::memcpy(wptr, (char*)_xidp + rec_offs, wsize);
                 wr_cnt += wsize;
                 rem -= wsize;
             }
@@ -130,7 +145,7 @@
             size_t wsize = _deq_hdr._xidsize > rec_offs ? _deq_hdr._xidsize - rec_offs : 0;
             if (wsize)
             {
-                ::memcpy(wptr, _xid.c_str() + rec_offs, wsize);
+                ::memcpy(wptr, (char*)_xidp + rec_offs, wsize);
                 wr_cnt += wsize;
             }
             rec_offs -= _deq_hdr._xidsize - wsize;
@@ -140,9 +155,9 @@
                 ::memcpy((char*)wptr + wr_cnt, (char*)&_deq_tail + rec_offs, wsize);
                 wr_cnt += wsize;
 #ifdef RHM_CLEAN
-                ::memset((char*)wptr + wr_cnt, RHM_CLEAN_CHAR,
-                        (size_dblks(rec_size()) * JRNL_DBLK_SIZE) - 
-                        (rec_offs_dblks * JRNL_DBLK_SIZE) - wr_cnt);
+                size_t rec_offs = rec_offs_dblks * JRNL_DBLK_SIZE;
+                size_t dblk_rec_size = size_dblks(rec_size() - rec_offs) * JRNL_DBLK_SIZE;
+                ::memset((char*)wptr + wr_cnt, RHM_CLEAN_CHAR, dblk_rec_size - wr_cnt);
 #endif
             }
             rec_offs -= sizeof(_deq_tail) - wsize;
@@ -161,7 +176,7 @@
             if (rem)
             {
                 wsize = rem >= _deq_hdr._xidsize ? _deq_hdr._xidsize : rem;
-                ::memcpy((char*)wptr + wr_cnt, _xid.c_str(), wsize);
+                ::memcpy((char*)wptr + wr_cnt, _xidp, wsize);
                 wr_cnt += wsize;
                 rem -= wsize;
             }
@@ -178,14 +193,14 @@
         {
             if (_deq_hdr._xidsize)
             {
-                ::memcpy((char*)wptr + wr_cnt, _xid.c_str(), _deq_hdr._xidsize);
+                ::memcpy((char*)wptr + wr_cnt, _xidp, _deq_hdr._xidsize);
                 wr_cnt += _deq_hdr._xidsize;
                 ::memcpy((char*)wptr + wr_cnt, (void*)&_deq_tail, sizeof(_deq_tail));
                 wr_cnt += sizeof(_deq_tail);
             }
 #ifdef RHM_CLEAN
-            ::memset((char*)wptr + wr_cnt, RHM_CLEAN_CHAR,
-                    (size_dblks(rec_size()) * JRNL_DBLK_SIZE) - wr_cnt);
+            size_t dblk_rec_size = size_dblks(rec_size()) * JRNL_DBLK_SIZE;
+            ::memset((char*)wptr + wr_cnt, RHM_CLEAN_CHAR, dblk_rec_size - wr_cnt);
 #endif
         }
     }
@@ -215,7 +230,7 @@
                 // Part of xid still outstanding, copy remainder of xid and tail
                 const size_t xid_offs = rec_offs - deq_hdr::size();
                 const size_t xid_rem = _deq_hdr._xidsize - xid_offs;
-                _xid.append((char*)rptr, xid_rem);
+                ::memcpy((char*)_buff + xid_offs, rptr, xid_rem);
                 rd_cnt = xid_rem;
                 ::memcpy((void*)&_deq_tail, ((char*)rptr + rd_cnt), sizeof(_deq_tail));
                 chk_tail();
@@ -236,7 +251,7 @@
             // Remainder of xid fits within this page, tail split
             const size_t xid_offs = rec_offs - deq_hdr::size();
             const size_t xid_rem = _deq_hdr._xidsize - xid_offs;
-            _xid.append((char*)rptr, xid_rem);
+            ::memcpy((char*)_buff + xid_offs, rptr, xid_rem);
             rd_cnt += xid_rem;
             const size_t tail_rem = (max_size_dblks * JRNL_DBLK_SIZE) - rd_cnt;
             if (tail_rem)
@@ -249,7 +264,7 @@
         {
             // Remainder of xid split
             const size_t xid_cp_size = (max_size_dblks * JRNL_DBLK_SIZE);
-            _xid.append((char*)rptr, xid_cp_size);
+            ::memcpy((char*)_buff + rec_offs - deq_hdr::size(), rptr, xid_cp_size);
             rd_cnt += xid_cp_size;
         }
     }
@@ -268,6 +283,13 @@
         chk_hdr();
         if (_deq_hdr._xidsize)
         {
+            _buff = ::malloc(_deq_hdr._xidsize);
+            if (_buff == NULL)
+            {
+                std::stringstream ss;
+                ss << "_buff malloc(): errno=" << errno;
+                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 +
                     rec_tail::size());
@@ -277,16 +299,16 @@
             if (hdr_xid_tail_dblks <= max_size_dblks)
             {
                 // Entire header, xid and tail fits within this page
-                ::memcpy((void*)&_deq_tail, (char*)rptr + rd_cnt + _deq_hdr._xidsize,
-                        sizeof(_deq_tail));
+                ::memcpy(_buff, (char*)rptr + rd_cnt, _deq_hdr._xidsize);
+                rd_cnt += _deq_hdr._xidsize;
+                ::memcpy((void*)&_deq_tail, (char*)rptr + rd_cnt, sizeof(_deq_tail));
+                rd_cnt += sizeof(_deq_tail);
                 chk_tail();
-                _xid.assign((char*)rptr + rd_cnt, _deq_hdr._xidsize);
-                rd_cnt += _deq_hdr._xidsize + sizeof(_deq_tail);
             }
             else if (hdr_xid_dblks <= max_size_dblks)
             {
                 // Entire header and xid fit within this page, tail split
-                _xid.assign((char*)rptr + rd_cnt, _deq_hdr._xidsize);
+                ::memcpy(_buff, (char*)rptr + rd_cnt, _deq_hdr._xidsize);
                 rd_cnt += _deq_hdr._xidsize;
                 const size_t tail_rem = (max_size_dblks * JRNL_DBLK_SIZE) - rd_cnt;
                 if (tail_rem)
@@ -299,7 +321,7 @@
             {
                 // Header fits within this page, xid split
                 const size_t xid_cp_size = (max_size_dblks * JRNL_DBLK_SIZE) - rd_cnt;
-                _xid.assign((char*)rptr + rd_cnt, xid_cp_size);
+                ::memcpy(_buff, (char*)rptr + rd_cnt, xid_cp_size);
                 rd_cnt += xid_cp_size;
             }
         }
@@ -314,9 +336,9 @@
     ss << "deq_rec: m=" << _deq_hdr._hdr._magic;
     ss << " v=" << (int)_deq_hdr._hdr._version;
     ss << " rid=" << _deq_hdr._hdr._rid;
-    ss << " dren=" << _deq_hdr._deq_rid;
-    if (_deq_hdr._xidsize)
-        ss << " xid=\"" << _xid << "\"";
+    ss << " drid=" << _deq_hdr._deq_rid;
+    if (_xidp)
+        ss << " xid=\"" << _xidp << "\"";
     str.append(ss.str());
     return str;
 }

Modified: store/trunk/cpp/lib/jrnl/deq_rec.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/deq_rec.hpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/deq_rec.hpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -55,22 +55,29 @@
     class deq_rec : public jrec
     {
     private:
-        deq_hdr _deq_hdr;       ///< Dequeue header
-        std::string _xid;       ///< XID - empty string means no XID is set
-        rec_tail _deq_tail;     ///< Record tail, only encoded if XID is present
+        deq_hdr _deq_hdr;           ///< Dequeue header
+        const void* _xidp;          ///< xid pointer for encoding (writing to disk)
+        void* _buff;                ///< Pointer to buffer to receive data read from disk
+        rec_tail _deq_tail;         ///< Record tail, only encoded if XID is present
 
     public:
+        // constructor used for read operations and xid must have memory allocated
         deq_rec();
-        deq_rec(const u_int64_t rid, const u_int64_t drid);
-        deq_rec(const u_int64_t rid, const u_int64_t drid, const std::string& xid);
+        // 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,
+                const size_t xidlen);
         ~deq_rec();
 
-        void reset(const  u_int64_t rid, const  u_int64_t drid);
-        void reset(const  u_int64_t rid, const  u_int64_t drid, const std::string& xid);
+        // Prepare instance for use in reading data from journal
+        void reset();
+        // Prepare instance for use in writing data to journal
+        void reset(const  u_int64_t rid, const  u_int64_t drid, const void* const xidp,
+                const size_t xidlen);
         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);
+        inline const void* const get_xid() { return _buff; }
         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-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/enq_rec.cpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -349,6 +349,10 @@
         rd_cnt = _enq_hdr.size();
         chk_hdr();
         _data_size = _enq_hdr._dsize;
+        if (_enq_hdr._xidsize)
+        {
+            // TODO: Decode xid here
+        }
 
         if (_data_size)
         {

Modified: store/trunk/cpp/lib/jrnl/enq_rec.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/enq_rec.hpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/enq_rec.hpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -56,12 +56,12 @@
     {
     private:
         enq_hdr _enq_hdr;
-        const void* _xidp;              ///< xid pointer
-        const void* _data;              ///< Pointer to data to be written to disk
-        void* _buff;                    ///< Pointer to buffer to receive data read from disk
+        const void* _xidp;          ///< xid pointer for encoding (for writing to disk)
+        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)
+        size_t _max_data_size;      ///< Max buffer size for decoding into during read
+        size_t _data_size;          ///< Size of data (bytes)
 
     public:
         /**

Modified: store/trunk/cpp/lib/jrnl/file_hdr.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/file_hdr.hpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/file_hdr.hpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -336,7 +336,7 @@
     * The rid field below is the rid of the dequeue record itself; the deq-rid field is the rid of a
     * previous enqueue record being dequeued by this record.
     *
-    * Record header info in binary format (24 bytes):
+    * Record header info in binary format (32 bytes):
     * <pre>
     *   0                           7
     * +---+---+---+---+---+---+---+---+  -+
@@ -389,7 +389,7 @@
 
 
     /**
-    * \brief Struct for DTX commit and abort records.
+    * \brief Struct for transaction commit and abort records.
     *
     * Struct for DTX commit and abort records. Only the magic distinguishes between them. Since
     * this record must be used in the context of a valid XID, the xidsize field must not be zero.

Modified: store/trunk/cpp/lib/jrnl/jcfg.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jcfg.hpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/jcfg.hpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -75,8 +75,8 @@
 
 #define JRNL_INFO_EXTENSION     "jinf"      ///< Extension for journal info files
 #define JRNL_DATA_EXTENSION     "jdat"      ///< Extension for journal data files
-#define RHM_JDAT_DTXA_MAGIC     0x614d4852  ///< ("RHMa" in little endian) Magic for dtx abort hdrs
-#define RHM_JDAT_DTXC_MAGIC     0x634d4852  ///< ("RHMc" in little endian) Magic for dtx commit hdrs
+#define RHM_JDAT_TXA_MAGIC      0x614d4852  ///< ("RHMa" in little endian) Magic for dtx abort hdrs
+#define RHM_JDAT_TXC_MAGIC      0x634d4852  ///< ("RHMc" in little endian) Magic for dtx commit hdrs
 #define RHM_JDAT_DEQ_MAGIC      0x644d4852  ///< ("RHMd" in little endian) Magic for deq rec hdrs
 #define RHM_JDAT_ENQ_MAGIC      0x654d4852  ///< ("RHMe" in little endian) Magic for enq rec hdrs
 #define RHM_JDAT_FILE_MAGIC     0x664d4852  ///< ("RHMf" in little endian) Magic for file hdrs

Modified: store/trunk/cpp/lib/jrnl/jcntl.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jcntl.cpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/jcntl.cpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -245,15 +245,17 @@
 }
 
 const iores
-jcntl::txn_abort(const std::string& /*xid*/) throw (jexception)
+jcntl::txn_abort(data_tok* const dtokp, const std::string& xid) throw (jexception)
 {
-    return RHM_IORES_NOTIMPL;
+    check_wstatus("txn_abort");
+    return _wmgr.abort(dtokp, xid.c_str(), xid.size());
 }
 
 const iores
-jcntl::txn_commit(const std::string& /*xid*/) throw (jexception)
+jcntl::txn_commit(data_tok* const dtokp, const std::string& xid) throw (jexception)
 {
-    return RHM_IORES_NOTIMPL;
+    check_wstatus("txn_commit");
+    return _wmgr.commit(dtokp, xid.c_str(), xid.size());
 }
 
 const bool

Modified: store/trunk/cpp/lib/jrnl/jcntl.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jcntl.hpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/jcntl.hpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -447,7 +447,7 @@
         *
         * \exception TODO
         */
-        const iores txn_abort(const std::string& xid) throw (jexception);
+        const iores txn_abort(data_tok* const dtokp, const std::string& xid) throw (jexception);
 
         /**
         * \brief Commit the transaction for all records enqueued or dequeued with the matching xid.
@@ -460,7 +460,7 @@
         *
         * \exception TODO
         */
-        const iores txn_commit(const std::string& xid) throw (jexception);
+        const iores txn_commit(data_tok* const dtokp, const std::string& xid) throw (jexception);
 
         /**
         * \brief Check whether all the enqueue records for the given xid have reached disk.

Modified: store/trunk/cpp/lib/jrnl/pmgr.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/pmgr.cpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/pmgr.cpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -89,6 +89,9 @@
         _pg_cntr(0),
         _pg_offset_dblks(0),
         _aio_evt_rem(0),
+        _enq_rec(),
+        _deq_rec(),
+        _txn_rec(),
         _cb(NULL)
 {}
 
@@ -110,6 +113,8 @@
         _pg_offset_dblks(0),
         _aio_evt_rem(0),
         _enq_rec(),
+        _deq_rec(),
+        _txn_rec(),
         _cb(NULL)
 {
     initialize();

Modified: store/trunk/cpp/lib/jrnl/pmgr.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/pmgr.hpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/pmgr.hpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -132,8 +132,6 @@
         deq_rec _deq_rec;               ///< Dequeue record used for encoding/decoding
         txn_rec _txn_rec;               ///< Transaction record used for encoding/decoding
 
-        // TODO: move _cb down to wmgr, it is the only class that uses it There is no need for
-        // read callbacks based on AIO. - (check this asertion)
         aio_cb _cb;                     ///< Callback function pointer for AIO events
 
     public:

Modified: store/trunk/cpp/lib/jrnl/txn_rec.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/txn_rec.cpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/txn_rec.cpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -33,6 +33,7 @@
 #include <jrnl/txn_rec.hpp>
 
 #include <assert.h>
+#include <errno.h>
 #include <iomanip>
 #include <sstream>
 #include <jrnl/jerrno.hpp>
@@ -44,39 +45,58 @@
 
 txn_rec::txn_rec():
         _txn_hdr(),
-        _xid(),
-        _dtx_tail()
-{}
+        _xidp(NULL),
+        _buff(NULL),
+        _txn_tail()
+{
+    _txn_hdr._hdr._version = RHM_JDAT_VERSION;
+}
 
-txn_rec::txn_rec(const u_int32_t magic, const u_int64_t rid):
-        _txn_hdr(magic, RHM_JDAT_VERSION, 0, rid, 0),
-        _xid(),
-        _dtx_tail(_txn_hdr._hdr)
+txn_rec::txn_rec(const u_int32_t magic, const u_int64_t rid, const void* const xidp,
+        const size_t xidlen):
+        _txn_hdr(magic, RHM_JDAT_VERSION, 0, rid, xidlen),
+        _xidp(xidp),
+        _buff(NULL),
+        _txn_tail(_txn_hdr._hdr)
 {}
 
-txn_rec::txn_rec(const u_int32_t magic, const u_int64_t rid, const std::string& xid):
-        _txn_hdr(magic, RHM_JDAT_VERSION, 0, rid, xid.size()),
-        _xid(xid),
-        _dtx_tail(_txn_hdr._hdr)
-{}
-
 txn_rec::~txn_rec()
-{}
+{
+    if (_buff)
+        ::free(_buff);
+}
 
 void
-txn_rec::reset(const  u_int64_t rid)
+txn_rec::reset(const u_int32_t magic)
 {
-    _txn_hdr._hdr._rid = rid;
+    _txn_hdr._hdr._magic = magic;
+    _txn_hdr._hdr._rid = 0;
     _txn_hdr._xidsize = 0;
-    _dtx_tail._rid = rid;
+    _xidp = NULL;
+    if (_buff)
+    {
+        ::free(_buff);
+        _buff = NULL;
+    }
+    _txn_tail._xmagic = ~magic;
+    _txn_tail._rid = 0;
 }
 
 void
-txn_rec::reset(const  u_int64_t rid, const std::string& xid)
+txn_rec::reset(const u_int32_t magic, const  u_int64_t rid, const void* const xidp,
+        const size_t xidlen)
 {
+    _txn_hdr._hdr._magic = magic;
     _txn_hdr._hdr._rid = rid;
-    _txn_hdr._xidsize = xid.size();
-    _dtx_tail._rid = rid;
+    _txn_hdr._xidsize = xidlen;
+    _xidp = xidp;
+    if (_buff)
+    {
+        ::free(_buff);
+        _buff = NULL;
+    }
+    _txn_tail._xmagic = ~magic;
+    _txn_tail._rid = rid;
 }
 
 u_int32_t
@@ -84,8 +104,7 @@
 {
     assert(wptr != NULL);
     assert(max_size_dblks > 0);
-    assert(_xid.size() == _txn_hdr._xidsize);
-    assert(_txn_hdr._xidsize > 0);
+    assert(_xidp != NULL && _txn_hdr._xidsize > 0);
 
     size_t rec_offs = rec_offs_dblks * JRNL_DBLK_SIZE;
     size_t rem = max_size_dblks * JRNL_DBLK_SIZE;
@@ -101,24 +120,24 @@
             {
                 if (wsize > rem)
                     wsize = rem;
-                ::memcpy(wptr, (const char*)_xid.c_str() + rec_offs, wsize);
+                ::memcpy(wptr, (char*)_xidp + rec_offs, wsize);
                 wr_cnt += wsize;
                 rem -= wsize;
             }
             rec_offs -= _txn_hdr._xidsize - wsize2;
             if (rem)
             {
-                wsize = sizeof(_dtx_tail) > rec_offs ? sizeof(_dtx_tail) - rec_offs : 0;
+                wsize = sizeof(_txn_tail) > rec_offs ? sizeof(_txn_tail) - rec_offs : 0;
                 wsize2 = wsize;
                 if (wsize)
                 {
                     if (wsize > rem)
                         wsize = rem;
-                    ::memcpy((char*)wptr + wr_cnt, (char*)&_dtx_tail + rec_offs, wsize);
+                    ::memcpy((char*)wptr + wr_cnt, (char*)&_txn_tail + rec_offs, wsize);
                     wr_cnt += wsize;
                     rem -= wsize;
                 }
-                rec_offs -= sizeof(_dtx_tail) - wsize2;
+                rec_offs -= sizeof(_txn_tail) - wsize2;
             }
             assert(rem == 0);
             assert(rec_offs == 0);
@@ -129,22 +148,22 @@
             size_t wsize = _txn_hdr._xidsize > rec_offs ? _txn_hdr._xidsize - rec_offs : 0;
             if (wsize)
             {
-                ::memcpy(wptr, _xid.c_str() + rec_offs, wsize);
+                ::memcpy(wptr, (char*)_xidp + rec_offs, wsize);
                 wr_cnt += wsize;
             }
             rec_offs -= _txn_hdr._xidsize - wsize;
-            wsize = sizeof(_dtx_tail) > rec_offs ? sizeof(_dtx_tail) - rec_offs : 0;
+            wsize = sizeof(_txn_tail) > rec_offs ? sizeof(_txn_tail) - rec_offs : 0;
             if (wsize)
             {
-                ::memcpy((char*)wptr + wr_cnt, (char*)&_dtx_tail + rec_offs, wsize);
+                ::memcpy((char*)wptr + wr_cnt, (char*)&_txn_tail + rec_offs, wsize);
                 wr_cnt += wsize;
 #ifdef RHM_CLEAN
-                ::memset((char*)wptr + wr_cnt, RHM_CLEAN_CHAR,
-                        (size_dblks(rec_size()) * JRNL_DBLK_SIZE) -
-                        (rec_offs_dblks * JRNL_DBLK_SIZE) - wr_cnt);
+                size_t rec_offs = rec_offs_dblks * JRNL_DBLK_SIZE;
+                size_t dblk_rec_size = size_dblks(rec_size() - rec_offs) * JRNL_DBLK_SIZE;
+                ::memset((char*)wptr + wr_cnt, RHM_CLEAN_CHAR, dblk_rec_size - wr_cnt);
 #endif
             }
-            rec_offs -= sizeof(_dtx_tail) - wsize;
+            rec_offs -= sizeof(_txn_tail) - wsize;
             assert(rec_offs == 0);
         }
     }
@@ -160,14 +179,14 @@
             if (rem)
             {
                 wsize = rem >= _txn_hdr._xidsize ? _txn_hdr._xidsize : rem;
-                ::memcpy((char*)wptr + wr_cnt, _xid.c_str(), wsize);
+                ::memcpy((char*)wptr + wr_cnt, _xidp, wsize);
                 wr_cnt += wsize;
                 rem -= wsize;
             }
             if (rem)
             {
-                wsize = rem >= sizeof(_dtx_tail) ? sizeof(_dtx_tail) : rem;
-                ::memcpy((char*)wptr + wr_cnt, (void*)&_dtx_tail, wsize);
+                wsize = rem >= sizeof(_txn_tail) ? sizeof(_txn_tail) : rem;
+                ::memcpy((char*)wptr + wr_cnt, (void*)&_txn_tail, wsize);
                 wr_cnt += wsize;
                 rem -= wsize;
             }
@@ -175,16 +194,13 @@
         }
         else // No split required
         {
-            if (_txn_hdr._xidsize)
-            {
-                ::memcpy((char*)wptr + wr_cnt, _xid.c_str(), _txn_hdr._xidsize);
-                wr_cnt += _txn_hdr._xidsize;
-                ::memcpy((char*)wptr + wr_cnt, (void*)&_dtx_tail, sizeof(_dtx_tail));
-                wr_cnt += sizeof(_dtx_tail);
-            }
+            ::memcpy((char*)wptr + wr_cnt, _xidp, _txn_hdr._xidsize);
+            wr_cnt += _txn_hdr._xidsize;
+            ::memcpy((char*)wptr + wr_cnt, (void*)&_txn_tail, sizeof(_txn_tail));
+            wr_cnt += sizeof(_txn_tail);
 #ifdef RHM_CLEAN
-            ::memset((char*)wptr + wr_cnt, RHM_CLEAN_CHAR,
-                    (size_dblks(rec_size()) * JRNL_DBLK_SIZE) - wr_cnt);
+            size_t dblk_rec_size = size_dblks(rec_size()) * JRNL_DBLK_SIZE;
+            ::memset((char*)wptr + wr_cnt, RHM_CLEAN_CHAR, dblk_rec_size - wr_cnt);
 #endif
         }
     }
@@ -214,18 +230,18 @@
                 // Part of xid still outstanding, copy remainder of xid and tail
                 const size_t xid_offs = rec_offs - deq_hdr::size();
                 const size_t xid_rem = _txn_hdr._xidsize - xid_offs;
-                _xid.append((char*)rptr, xid_rem);
+                ::memcpy((char*)_buff + xid_offs, rptr, xid_rem);
                 rd_cnt = xid_rem;
-                ::memcpy((void*)&_dtx_tail, ((char*)rptr + rd_cnt), sizeof(_dtx_tail));
+                ::memcpy((void*)&_txn_tail, ((char*)rptr + rd_cnt), sizeof(_txn_tail));
                 chk_tail();
-                rd_cnt += sizeof(_dtx_tail);
+                rd_cnt += sizeof(_txn_tail);
             }
             else
             {
                 // Tail or part of tail only outstanding, complete tail
                 const size_t tail_offs = rec_offs - deq_hdr::size() - _txn_hdr._xidsize;
                 const size_t tail_rem = rec_tail::size() - tail_offs;
-                ::memcpy((char*)&_dtx_tail + tail_offs, rptr, tail_rem);
+                ::memcpy((char*)&_txn_tail + tail_offs, rptr, tail_rem);
                 chk_tail();
                 rd_cnt = tail_rem;
             }
@@ -235,12 +251,12 @@
             // Remainder of xid fits within this page, tail split
             const size_t xid_offs = rec_offs - deq_hdr::size();
             const size_t xid_rem = _txn_hdr._xidsize - xid_offs;
-            _xid.append((char*)rptr, xid_rem);
+            ::memcpy((char*)_buff + xid_offs, rptr, xid_rem);
             rd_cnt += xid_rem;
             const size_t tail_rem = (max_size_dblks * JRNL_DBLK_SIZE) - rd_cnt;
             if (tail_rem)
             {
-                ::memcpy((void*)&_dtx_tail, ((char*)rptr + xid_rem), tail_rem);
+                ::memcpy((void*)&_txn_tail, ((char*)rptr + xid_rem), tail_rem);
                 rd_cnt += tail_rem;
             }
         }
@@ -248,7 +264,7 @@
         {
             // Remainder of xid split
             const size_t xid_cp_size = (max_size_dblks * JRNL_DBLK_SIZE);
-            _xid.append((char*)rptr, xid_cp_size);
+            ::memcpy((char*)_buff + rec_offs - deq_hdr::size(), rptr, xid_cp_size);
             rd_cnt += xid_cp_size;
         }
     }
@@ -263,8 +279,15 @@
         _txn_hdr._xidsize = *(size_t*)((char*)rptr + rd_cnt);
         rd_cnt = _txn_hdr.size();
         chk_hdr();
+        _buff = ::malloc(_txn_hdr._xidsize);
+        if (_buff == NULL)
+        {
+            std::stringstream ss;
+            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_tail_dblks = size_dblks(enq_hdr::size() + _txn_hdr._xidsize +
                 rec_tail::size());
 
         // Check if record (header + xid + tail) fits within this page, we can check the
@@ -272,21 +295,21 @@
         if (hdr_xid_tail_dblks <= max_size_dblks)
         {
             // Entire header, xid and tail fits within this page
-            ::memcpy((void*)&_dtx_tail, (char*)rptr + rd_cnt + _txn_hdr._xidsize,
-                    sizeof(_dtx_tail));
+            ::memcpy(_buff, (char*)rptr + rd_cnt, _txn_hdr._xidsize);
+            rd_cnt += _txn_hdr._xidsize;
+            ::memcpy((void*)&_txn_tail, (char*)rptr + rd_cnt, sizeof(_txn_tail));
+            rd_cnt += sizeof(_txn_tail);
             chk_tail();
-            _xid.assign((char*)rptr + rd_cnt, _txn_hdr._xidsize);
-            rd_cnt += _txn_hdr._xidsize + sizeof(_dtx_tail);
         }
         else if (hdr_xid_dblks <= max_size_dblks)
         {
             // Entire header and xid fit within this page, tail split
-            _xid.assign((char*)rptr + rd_cnt, _txn_hdr._xidsize);
+            ::memcpy(_buff, (char*)rptr + rd_cnt, _txn_hdr._xidsize);
             rd_cnt += _txn_hdr._xidsize;
             const size_t tail_rem = (max_size_dblks * JRNL_DBLK_SIZE) - rd_cnt;
             if (tail_rem)
             {
-                ::memcpy((void*)&_dtx_tail, (char*)rptr + rd_cnt, tail_rem);
+                ::memcpy((void*)&_txn_tail, (char*)rptr + rd_cnt, tail_rem);
                 rd_cnt += tail_rem;
             }
         }
@@ -294,7 +317,7 @@
         {
             // Header fits within this page, xid split
             const size_t xid_cp_size = (max_size_dblks * JRNL_DBLK_SIZE) - rd_cnt;
-            _xid.assign((char*)rptr + rd_cnt, xid_cp_size);
+            ::memcpy(_buff, (char*)rptr + rd_cnt, xid_cp_size);
             rd_cnt += xid_cp_size;
         }
     }
@@ -305,13 +328,13 @@
 txn_rec::str(std::string& str) const
 {
     std::stringstream ss;
-    if (_txn_hdr._hdr._magic == RHM_JDAT_DTXA_MAGIC)
+    if (_txn_hdr._hdr._magic == RHM_JDAT_TXA_MAGIC)
         ss << "dtxa_rec: m=" << _txn_hdr._hdr._magic;
     else
         ss << "dtxc_rec: m=" << _txn_hdr._hdr._magic;
     ss << " v=" << (int)_txn_hdr._hdr._version;
     ss << " rid=" << _txn_hdr._hdr._rid;
-    ss << " xid=\"" << _xid << "\"";
+    ss << " xid=\"" << _xidp << "\"";
     str.append(ss.str());
     return str;
 }
@@ -332,13 +355,13 @@
 txn_rec::chk_hdr() const throw (jexception)
 {
     jrec::chk_hdr(_txn_hdr._hdr);
-    if (_txn_hdr._hdr._magic != RHM_JDAT_DTXA_MAGIC && _txn_hdr._hdr._magic != RHM_JDAT_DTXC_MAGIC)
+    if (_txn_hdr._hdr._magic != RHM_JDAT_TXA_MAGIC && _txn_hdr._hdr._magic != RHM_JDAT_TXC_MAGIC)
     {
         std::stringstream ss;
         ss << std::hex << std::setfill('0');
         ss << "dtx magic: rid=0x" << std::setw(16) << _txn_hdr._hdr._rid;
-        ss << ": expected=(0x" << std::setw(8) << RHM_JDAT_DTXA_MAGIC;
-        ss << " or 0x" << RHM_JDAT_DTXC_MAGIC;
+        ss << ": expected=(0x" << std::setw(8) << RHM_JDAT_TXA_MAGIC;
+        ss << " or 0x" << RHM_JDAT_TXC_MAGIC;
         ss << ") read=0x" << std::setw(2) << (int)_txn_hdr._hdr._magic;
         throw jexception(jerrno::JERR_DREC_INVRHDR, ss.str(), "txn_rec", "chk_hdr");
     }
@@ -354,7 +377,7 @@
 void
 txn_rec::chk_tail() const throw (jexception)
 {
-    jrec::chk_tail(_dtx_tail, _txn_hdr._hdr);
+    jrec::chk_tail(_txn_tail, _txn_hdr._hdr);
 }
 
 } // namespace journal

Modified: store/trunk/cpp/lib/jrnl/txn_rec.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/txn_rec.hpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/txn_rec.hpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -56,21 +56,28 @@
     {
     private:
         txn_hdr _txn_hdr;       ///< transaction header
-        std::string _xid;       ///< XID
-        rec_tail _dtx_tail;     ///< Record tail
+        const void* _xidp;      ///< xid pointer for encoding (writing to disk)
+        void* _buff;            ///< Pointer to buffer to receive data read from disk
+        rec_tail _txn_tail;     ///< Record tail
 
     public:
+        // constructor used for read operations and xid must have memory allocated
         txn_rec();
-        txn_rec(const u_int32_t magic, const u_int64_t rid);
-        txn_rec(const u_int32_t magic, const u_int64_t rid, const std::string& xid);
+        // constructor used for write operations, where xid already exists
+        txn_rec(const u_int32_t magic, const u_int64_t rid, const void* const xidp,
+                const size_t xidlen);
         ~txn_rec();
 
-        void reset(const  u_int64_t rid);
-        void reset(const  u_int64_t rid, const std::string& xid);
+        // Prepare instance for use in reading data from journal
+        void reset(const u_int32_t magic);
+        // Prepare instance for use in writing data to journal
+        void reset(const u_int32_t magic, const  u_int64_t rid, const void* const xidp,
+                const size_t xidlen);
         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);
+        inline const void* const get_xid() { return _buff; }
         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-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/wmgr.cpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -50,7 +50,9 @@
         _fhdr_buff(NULL),
         _cached_offset_dblks(0),
         _enq_busy(false),
-        _deq_busy(false)
+        _deq_busy(false),
+        _abort_busy(false),
+        _commit_busy(false)
 {}
 
 wmgr::wmgr(jcntl* jc, enq_map& emap, wrfc& wrfc, std::deque<data_tok*>* const dtokl,
@@ -62,7 +64,9 @@
         _fhdr_buff(NULL),
         _cached_offset_dblks(0),
         _enq_busy(false),
-        _deq_busy(false)
+        _deq_busy(false),
+        _abort_busy(false),
+        _commit_busy(false)
 {}
 
 wmgr::~wmgr()
@@ -96,10 +100,10 @@
     if (this_data_len != tot_data_len)
         return RHM_IORES_NOTIMPL;
 
-    if (_deq_busy)
+    if (_deq_busy || _abort_busy || _commit_busy)
         return RHM_IORES_BUSY;
 
-    iores res = pre_write_check(true, dtokp);
+    iores res = pre_write_check(WMGR_ENQUEUE, dtokp);
     if (res != RHM_IORES_SUCCESS)
         return res;
 
@@ -118,18 +122,17 @@
     else
         _enq_busy = true;
 
-    u_int64_t rid;
-    if (dtokp->getSourceMessage())
-    {
-        rid = dtokp->rid();
-        assert(rid != 0);
-    }
-    else
-        rid = cont ? _wrfc.rid() - 1 : _wrfc.get_incr_rid();
+    u_int64_t rid = initialize_rid(cont, dtokp);
     
     _enq_rec.reset(rid, data_buff, tot_data_len, xid_ptr, xid_len, transient);
     if (!cont)
+    {
         dtokp->set_rid(rid);
+        if (xid_len)
+            dtokp->set_xid(xid_ptr, xid_len);
+        else
+            dtokp->clear_xid();
+    }
     bool done = false;
     while (!done)
     {
@@ -224,10 +227,10 @@
     if (xid_len)
         assert(xid_ptr != NULL);
 
-    if (_enq_busy)
+    if (_enq_busy || _abort_busy || _commit_busy)
         return RHM_IORES_BUSY;
 
-    iores res = pre_write_check(false, dtokp);
+    iores res = pre_write_check(WMGR_DEQUEUE, dtokp);
     if (res != RHM_IORES_SUCCESS)
         return res;
 
@@ -246,19 +249,12 @@
     else
     {
         _deq_busy = true;
-        dtokp->set_dblocks_written(0); // Reset dblks_written from enqueue op
+        dtokp->set_dblocks_written(0); // Reset dblks_written from previous op
     }
 
-    u_int64_t rid;
-    if (dtokp->getSourceMessage())
-    {
-        rid = dtokp->dequeue_rid();
-        assert(rid != 0);
-    }
-    else
-        rid = _wrfc.get_incr_rid();
+    u_int64_t rid = initialize_rid(cont, dtokp);
     
-    _deq_rec.reset(rid, dtokp->rid());
+    _deq_rec.reset(rid, dtokp->rid(), xid_ptr, xid_len);
     bool done = false;
     while (!done)
     {
@@ -290,7 +286,7 @@
         // Has the file header been written (i.e. write pointers still at 0)?
         if (_wrfc.empty())
         {
-            u_int32_t rec_dblks_rem = _enq_rec.rec_size_dblks() - data_offs_dblks;
+            u_int32_t rec_dblks_rem = _deq_rec.rec_size_dblks() - data_offs_dblks;
             bool file_fit = rec_dblks_rem <= JRNL_FILE_SIZE * JRNL_SBLK_SIZE;
             bool file_full = rec_dblks_rem == JRNL_FILE_SIZE * JRNL_SBLK_SIZE;
             size_t fro = 0;
@@ -329,8 +325,8 @@
                         cont = true;
                     else
                     {
-                        // Set last data_tok in page only to state ENQ_PART
-                        dtokp->set_wstate(data_tok::ENQ_PART);
+                        // Set last data_tok in page only to state DEQ_PART
+                        dtokp->set_wstate(data_tok::DEQ_PART);
                         done = true;
                     }
                 }
@@ -344,6 +340,218 @@
 }
 
 const iores
+wmgr::abort(data_tok* dtokp, const void* const xid_ptr, const size_t xid_len) throw (jexception)
+{
+    // commit and abort MUST have a valid xid
+    assert(xid_ptr != NULL && xid_len > 0);
+
+    if (_enq_busy || _deq_busy || _commit_busy)
+        return RHM_IORES_BUSY;
+
+    iores res = pre_write_check(WMGR_ABORT, dtokp);
+    if (res != RHM_IORES_SUCCESS)
+        return res;
+
+    bool cont = false;
+    if (_abort_busy) // If abort() exited last time with RHM_IORES_FULL or RHM_IORES_AIO_WAIT
+    {
+        if (dtokp->wstate() == data_tok::ABORT_PART)
+            cont = true;
+        else
+        {
+            std::stringstream ss;
+            ss << "This data_tok: id=" << dtokp->id() << " state=" << dtokp->wstate_str();
+            throw jexception(jerrno::JERR_WMGR_DEQDISCONT, ss.str(), "wmgr", "abort");
+        }
+    }
+    else
+        _abort_busy = true;
+
+    u_int64_t rid = initialize_rid(cont, dtokp);
+    _txn_rec.reset(RHM_JDAT_TXA_MAGIC, rid, xid_ptr, xid_len);
+    bool done = false;
+    while (!done)
+    {
+        assert(_pg_offset_dblks < JRNL_WMGR_PAGE_SIZE * JRNL_SBLK_SIZE);
+        void* wptr = (void*)((char*)_page_ptr_arr[_pg_index] + _pg_offset_dblks * JRNL_DBLK_SIZE);
+        u_int32_t data_offs_dblks = dtokp->dblocks_written();
+        u_int32_t ret = _txn_rec.encode(wptr, data_offs_dblks,
+                (JRNL_WMGR_PAGE_SIZE * JRNL_SBLK_SIZE) - _pg_offset_dblks);
+        _pg_offset_dblks += ret;
+        _cached_offset_dblks += ret;
+        dtokp->incr_dblocks_written(ret);
+
+        // Is the encoding of this record complete?
+        if (dtokp->dblocks_written() >= _txn_rec.rec_size_dblks())
+        {
+            dtokp->set_wstate(data_tok::ABORT_SUBM);
+            _page_cb_arr[_pg_index]._pdtokl->push_back(dtokp);
+            done = true;
+        }
+
+        // Has the file header been written (i.e. write pointers still at 0)?
+        if (_wrfc.empty())
+        {
+            u_int32_t rec_dblks_rem = _txn_rec.rec_size_dblks() - data_offs_dblks;
+            bool file_fit = rec_dblks_rem <= JRNL_FILE_SIZE * JRNL_SBLK_SIZE;
+            bool file_full = rec_dblks_rem == JRNL_FILE_SIZE * JRNL_SBLK_SIZE;
+            size_t fro = 0;
+            if (cont)
+            {
+                if (file_fit && !file_full)
+                    fro = (rec_dblks_rem + JRNL_SBLK_SIZE) * JRNL_DBLK_SIZE;
+            }
+            else
+                fro = JRNL_SBLK_SIZE * JRNL_DBLK_SIZE;
+            write_fhdr(rid, _wrfc.index(), fro);
+        }
+
+        // Is the page full? If so, flush.
+        if (_pg_offset_dblks >= JRNL_WMGR_PAGE_SIZE * JRNL_SBLK_SIZE)
+        {
+            res = write_flush();
+            assert(res == RHM_IORES_SUCCESS);
+
+            if (_page_cb_arr[_pg_index]._state == AIO_PENDING && !done)
+            {
+                res = RHM_IORES_AIO_WAIT;
+                dtokp->set_wstate(data_tok::ABORT_PART);
+                done = true;
+            }
+
+            // File full?
+            if (_pg_cntr >= (JRNL_FILE_SIZE / JRNL_WMGR_PAGE_SIZE))
+            {
+                iores rfres = rotate_file();
+                if (rfres != RHM_IORES_SUCCESS)
+                    res = rfres;
+                if (!done)
+                {
+                    if (rfres == RHM_IORES_SUCCESS)
+                        cont = true;
+                    else
+                    {
+                        // Set last data_tok in page only to state ABORT_PART
+                        dtokp->set_wstate(data_tok::ABORT_PART);
+                        done = true;
+                    }
+                }
+            }
+        }
+    }    
+    if (dtokp->wstate() >= data_tok::ABORT_SUBM)
+        _abort_busy = false;
+    
+    return res;
+}
+
+const iores
+wmgr::commit(data_tok* dtokp, const void* const xid_ptr, const size_t xid_len) throw (jexception)
+{
+    // commit and abort MUST have a valid xid
+    assert(xid_ptr != NULL && xid_len > 0);
+
+    if (_enq_busy || _deq_busy || _abort_busy)
+        return RHM_IORES_BUSY;
+
+    iores res = pre_write_check(WMGR_COMMIT, dtokp);
+    if (res != RHM_IORES_SUCCESS)
+        return res;
+
+    bool cont = false;
+    if (_commit_busy) // If commit() exited last time with RHM_IORES_FULL or RHM_IORES_AIO_WAIT
+    {
+        if (dtokp->wstate() == data_tok::COMMIT_PART)
+            cont = true;
+        else
+        {
+            std::stringstream ss;
+            ss << "This data_tok: id=" << dtokp->id() << " state=" << dtokp->wstate_str();
+            throw jexception(jerrno::JERR_WMGR_DEQDISCONT, ss.str(), "wmgr", "commit");
+        }
+    }
+    else
+        _commit_busy = true;
+
+    u_int64_t rid = initialize_rid(cont, dtokp);
+    _txn_rec.reset(RHM_JDAT_TXC_MAGIC, rid, xid_ptr, xid_len);
+    bool done = false;
+    while (!done)
+    {
+        assert(_pg_offset_dblks < JRNL_WMGR_PAGE_SIZE * JRNL_SBLK_SIZE);
+        void* wptr = (void*)((char*)_page_ptr_arr[_pg_index] + _pg_offset_dblks * JRNL_DBLK_SIZE);
+        u_int32_t data_offs_dblks = dtokp->dblocks_written();
+        u_int32_t ret = _txn_rec.encode(wptr, data_offs_dblks,
+                (JRNL_WMGR_PAGE_SIZE * JRNL_SBLK_SIZE) - _pg_offset_dblks);
+        _pg_offset_dblks += ret;
+        _cached_offset_dblks += ret;
+        dtokp->incr_dblocks_written(ret);
+
+        // Is the encoding of this record complete?
+        if (dtokp->dblocks_written() >= _txn_rec.rec_size_dblks())
+        {
+            dtokp->set_wstate(data_tok::COMMIT_SUBM);
+            _page_cb_arr[_pg_index]._pdtokl->push_back(dtokp);
+            done = true;
+        }
+
+        // Has the file header been written (i.e. write pointers still at 0)?
+        if (_wrfc.empty())
+        {
+            u_int32_t rec_dblks_rem = _txn_rec.rec_size_dblks() - data_offs_dblks;
+            bool file_fit = rec_dblks_rem <= JRNL_FILE_SIZE * JRNL_SBLK_SIZE;
+            bool file_full = rec_dblks_rem == JRNL_FILE_SIZE * JRNL_SBLK_SIZE;
+            size_t fro = 0;
+            if (cont)
+            {
+                if (file_fit && !file_full)
+                    fro = (rec_dblks_rem + JRNL_SBLK_SIZE) * JRNL_DBLK_SIZE;
+            }
+            else
+                fro = JRNL_SBLK_SIZE * JRNL_DBLK_SIZE;
+            write_fhdr(rid, _wrfc.index(), fro);
+        }
+
+        // Is the page full? If so, flush.
+        if (_pg_offset_dblks >= JRNL_WMGR_PAGE_SIZE * JRNL_SBLK_SIZE)
+        {
+            res = write_flush();
+            assert(res == RHM_IORES_SUCCESS);
+
+            if (_page_cb_arr[_pg_index]._state == AIO_PENDING && !done)
+            {
+                res = RHM_IORES_AIO_WAIT;
+                dtokp->set_wstate(data_tok::COMMIT_PART);
+                done = true;
+            }
+
+            // File full?
+            if (_pg_cntr >= (JRNL_FILE_SIZE / JRNL_WMGR_PAGE_SIZE))
+            {
+                iores rfres = rotate_file();
+                if (rfres != RHM_IORES_SUCCESS)
+                    res = rfres;
+                if (!done)
+                {
+                    if (rfres == RHM_IORES_SUCCESS)
+                        cont = true;
+                    else
+                    {
+                        // Set last data_tok in page only to state COMMIT_PART
+                        dtokp->set_wstate(data_tok::COMMIT_PART);
+                        done = true;
+                    }
+                }
+            }
+        }
+    }    
+    if (dtokp->wstate() >= data_tok::COMMIT_SUBM)
+        _commit_busy = false;
+    
+    return res;
+}
+
+const iores
 wmgr::flush()
 {
     iores res = write_flush();
@@ -470,6 +678,14 @@
                     assert(dtp->wstate() == data_tok::DEQ_SUBM);
                     dtp->set_wstate(data_tok::DEQ);
                     break;
+                case data_tok::ABORT_SUBM:
+                    assert(dtp->wstate() == data_tok::ABORT_SUBM);
+                    dtp->set_wstate(data_tok::ABORTED);
+                    break;
+                case data_tok::COMMIT_SUBM:
+                    assert(dtp->wstate() == data_tok::COMMIT_SUBM);
+                    dtp->set_wstate(data_tok::COMMITTED);
+                    break;
                 default:
                     std::stringstream ss;
                     ss << "dtok_state=" << dtp->wstate_str();
@@ -519,7 +735,7 @@
 }
 
 const iores
-wmgr::pre_write_check(bool enqueue, data_tok* dtokp) throw (jexception)
+wmgr::pre_write_check(_op_type op, data_tok* dtokp) throw (jexception)
 {
     // Check status of current file
     if (!_wrfc.is_reset())
@@ -528,7 +744,7 @@
             return RHM_IORES_FULL;
     }
 
-    // Check status of current page
+    // Check status of current page is ok for writing
     if (_page_cb_arr[_pg_index]._state != IN_USE)
     {
         if (_page_cb_arr[_pg_index]._state == UNUSED)
@@ -538,25 +754,56 @@
         else
         {
             std::stringstream ss;
-            ss << "op=" << (enqueue ? "enqueue" : "dequeue") << " index=" << _pg_index;
-            ss << " state=" << _page_cb_arr[_pg_index].state_str();
+            ss << "op=" << _op_str[op] << " index=" << _pg_index << " state=";
+            ss << _page_cb_arr[_pg_index].state_str();
             throw jexception(jerrno::JERR_WMGR_BADPGSTATE, ss.str(), "wmgr", "pre_write_check");
         }
     }
 
-    // Check state of data_tok
-    bool res = enqueue ? dtokp->is_writable() : dtokp->is_dequeueable();
-    if (!res)
+    // operation-specific checks
+    switch (op)
     {
-        std::stringstream ss;
-        ss << "op=" << (enqueue ? "enqueue" : "dequeue") << " dtok_id=" << dtokp->id();
-        ss << " dtok_state=" << dtokp->wstate_str();
-        throw jexception(jerrno::JERR_WMGR_BADDTOKSTATE, ss.str(), "wmgr", "pre_write_check");
+        case WMGR_ENQUEUE:
+            if (!dtokp->is_writable())
+            {
+                std::stringstream ss;
+                ss << "op=" << _op_str[op] << " dtok_id=" << dtokp->id();
+                ss << " dtok_state=" << dtokp->wstate_str();
+                throw jexception(jerrno::JERR_WMGR_BADDTOKSTATE, ss.str(), "wmgr",
+                        "pre_write_check");
+            }
+            break;
+        case WMGR_DEQUEUE:
+            if (!dtokp->is_dequeueable())
+            {
+                std::stringstream ss;
+                ss << "op=" << _op_str[op] << " dtok_id=" << dtokp->id();
+                ss << " dtok_state=" << dtokp->wstate_str();
+                throw jexception(jerrno::JERR_WMGR_BADDTOKSTATE, ss.str(), "wmgr",
+                        "pre_write_check");
+            }
+            break;
+        case WMGR_ABORT:
+            break;
+        case WMGR_COMMIT:
+            break;
     }
 
     return RHM_IORES_SUCCESS;
 }
 
+const u_int64_t
+wmgr::initialize_rid(const bool cont, data_tok* dtokp)
+{
+    if (dtokp->getSourceMessage())
+    {
+        u_int64_t rid = dtokp->rid();
+        assert(rid != 0);
+        return rid;
+    }
+    return cont ? _wrfc.rid() - 1 : _wrfc.get_incr_rid();
+}
+
 void
 wmgr::dblk_roundup()
 {
@@ -590,5 +837,9 @@
     _wrfc.add_subm_cnt_dblks(JRNL_SBLK_SIZE);
 }
 
+// static
+
+const char* wmgr::_op_str[] = {"enqueue", "dequeue", "abort", "commit"};
+
 } // namespace journal
 } // namespace rhm

Modified: store/trunk/cpp/lib/jrnl/wmgr.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/wmgr.hpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/lib/jrnl/wmgr.hpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -75,10 +75,20 @@
         iocb _fhdr_iocb;                ///< IO control block 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 into a proper threadsafe lock
+        // 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[];
 
+        enq_rec _enq_rec;               ///< Enqueue record used for encoding/decoding
+        deq_rec _deq_rec;               ///< Dequeue record used for encoding/decoding
+        txn_rec _txn_rec;               ///< Transaction record used for encoding/decoding
+        aio_cb _cb;                     ///< Callback function pointer for AIO events
+
     public:
         wmgr(jcntl* jc, enq_map& emap, wrfc& wrfc);
         wmgr(jcntl* jc, enq_map& emap, wrfc& wrfc, std::deque<data_tok*>* const dtokl,
@@ -92,12 +102,17 @@
                 const size_t xid_len, const bool transient) throw (jexception);
         const iores dequeue(data_tok* dtokp, const void* const xid_ptr, const size_t xid_len)
                 throw (jexception);
+        const iores abort(data_tok* dtokp, const void* const xid_ptr, const size_t xid_len)
+                throw (jexception);
+        const iores commit(data_tok* dtokp, const void* const xid_ptr, const size_t xid_len)
+                throw (jexception);
         const iores flush();
         const u_int32_t get_events(page_state state) throw (jexception);
 
     private:
         void initialize() throw (jexception);
-        const iores pre_write_check(bool enqueue, data_tok* dtokp) throw (jexception);
+        const iores pre_write_check(_op_type op, data_tok* dtokp) throw (jexception);
+        const u_int64_t initialize_rid(const bool cont, data_tok* dtokp);
         const iores write_flush();
         const iores rotate_file();
         void dblk_roundup();

Modified: store/trunk/cpp/tests/jrnl/janalyze.py
===================================================================
--- store/trunk/cpp/tests/jrnl/janalyze.py	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/tests/jrnl/janalyze.py	2007-10-05 20:46:46 UTC (rev 965)
@@ -31,6 +31,16 @@
 num_files = 8
 hdr_ver = 1
 
+TEST_NUM_COL = 0
+NUM_MSGS_COL = 5
+MIN_MSG_SIZE_COL = 7
+MAX_MSG_SIZE_COL = 8
+MIN_XID_SIZE_COL = 9
+MAX_XID_SIZE_COL = 10
+AUTO_DEQ_COL = 11
+TRANSIENT_COL = 12
+COMMENT_COL = 19
+
 transient_mask = 0x1
 
 def load(f, klass):
@@ -215,6 +225,8 @@
         self.deq_tail = None
         self.xid_complete = False
         self.tail_complete = False
+        self.tail_bin = None
+        self.tail_offs = 0
         self.load(f)
 
     def load(self, f):
@@ -245,16 +257,18 @@
         return '%s %sdrid=%d' % (Hdr.__str__(self), print_xid(self.xidsize, self.xid), self.deq_rid)
 
 
-class TxHdr(Hdr):
+class TxnHdr(Hdr):
 
     format = '=Q'
 
     def init(self, f, foffs, xidsize):
-        self.xidsize = xid
+        self.xidsize = xidsize
         self.xid = None
         self.tx_tail = None
         self.xid_complete = False
         self.tail_complete = False
+        self.tail_bin = None
+        self.tail_offs = 0
         self.load(f)
 
     def load(self, f):
@@ -278,7 +292,7 @@
         return self.xid_complete and self.tail_complete
 
     def __str__(self):
-        return '%s x=%d xid=\"%s\"' % (Hdr.__str__(self), self.xidsize, self.xid)
+        return '%s %s' % (Hdr.__str__(self), print_xid(self.xidsize, self.xid))
 
 
 class RecTail(Sizeable):
@@ -338,11 +352,16 @@
 
     def complete(self):
         return self.xid_complete and self.data_complete and self.tail_complete
+    
+    def print_flags(self):
+        if self.flags & transient_mask > 0:
+            return '*TRANSIENT*'
+        return ''
 
     def __str__(self):
-        if self.enq_tail == None:
-            return '%s %s [no tail]' % (Hdr.__str__(self), self.dsize, dstr)
-        return '%s %s%s %s' % (Hdr.__str__(self), print_xid(self.xidsize, self.xid), print_data(self.dsize, self.data), self.enq_tail)
+#        if self.enq_tail == None:
+#            return '%s %s [no tail]' % (Hdr.__str__(self), self.dsize, dstr)
+        return '%s %s%s %s %s' % (Hdr.__str__(self), print_xid(self.xidsize, self.xid), print_data(self.dsize, self.data), self.enq_tail, self.print_flags())
 
 
 class Main:
@@ -366,11 +385,11 @@
             self.transient = tparams['transient']
         else:
             self.tnum = None
-            self.num_msgs = 0
-            self.msg_len = 0
-            self.auto_deq = False
-            self.xid_len = 0
-            self.transient = False
+            self.num_msgs = None
+            self.msg_len = None
+            self.auto_deq = None
+            self.xid_len = None
+            self.transient = None
         self.file_start = 0
         self.file_num = 0
         self.fro = 0x200
@@ -421,30 +440,46 @@
                     raise Exception('Message length (%d) incorrect; expected %d' % (len(hdr.data), self.msg_len))
                 if self.xid_len > 0 and len(hdr.xid) != self.xid_len:
                     raise Exception('XID length (%d) incorrect; expected %d' % (len(hdr.xidsize), self.xid_len))
-                if self.transient:
-                    if hdr.flags & transient_mask == 0:
-                        raise Exception('Expected transient record, found persistent')
-                else:
-                    if hdr.flags & transient_mask != 0:
-                        raise Exception('Expected persistent record, found transient')
+                if self.transient != None:
+                    if self.transient:
+                        if hdr.flags & transient_mask == 0:
+                            raise Exception('Expected transient record, found persistent')
+                    else:
+                        if hdr.flags & transient_mask != 0:
+                            raise Exception('Expected persistent record, found transient')
                 stop = not self.check_rid(hdr)
                 if  stop:
-                    warn = ' (WARNING: rid out of order, last rid = %d - could be overwrite boundary.)' % hdr.rid
+                    warn = ' (WARNING: rid out of order, rid = %d; last rid = %d - could be overwrite boundary.)' % (hdr.rid, self.last_rid)
                 else:
                     self.msg_cnt += 1
                     if self.auto_deq:
                         self.enqueued[hdr.rid] = hdr
             elif isinstance(hdr, DeqHdr) and not stop:
+                while not hdr.complete():
+                    stop = self.advance_file()
+                    if stop:
+                        break
+                    hdr.load(self.f)
                 if self.auto_deq:
                     if hdr.deq_rid in self.enqueued:
                         del self.enqueued[hdr.deq_rid]
                     else:
                         warn = ' (WARNING: dequeue rid %d not found in enqueued records)' % hdr.deq_rid
-                    stop = not self.check_rid(hdr)
+                stop = not self.check_rid(hdr)
+                if stop:
+                    warn = ' (WARNING: rid out of order, rid = %d; last rid = %d - could be overwrite boundary.)' % (hdr.rid, self.last_rid)
+                elif self.auto_deq != None:
+                    if not self.auto_deq:
+                        warn = ' WARNING: Dequeue record rid=%d found in non-dequeue test - ignoring.' % hdr.rid
+            elif isinstance(hdr, TxnHdr) and not stop:
+                while not hdr.complete():
+                    stop = self.advance_file()
                     if stop:
-                        warn = ' (WARNING: rid out of order, last rid = %d - could be overwrite boundary.)' % hdr.rid
-                elif self.tnum != None:
-                    warn = 'WARNING: Dequeue record rid=%d found in non-dequeue test - ignoring.' % hdr.rid
+                        break
+                    hdr.load(self.f)
+                stop = not self.check_rid(hdr)
+                if stop:
+                    warn = ' (WARNING: rid out of order, rid = %d; last rid = %d - could be overwrite boundary.)' % (hdr.rid, self.last_rid)
             print ' > %s%s' % (hdr, warn)
             if not stop:
                 stop = (self.last_file and hdr.check()) or hdr.empty() or self.fhdr.empty()
@@ -491,7 +526,7 @@
         return self.file_num
 
     def check_rid(self, hdr):
-        if  self.last_rid != -1 and hdr.rid !=  self.last_rid + 1:
+        if  self.last_rid != -1 and hdr.rid != self.last_rid + 1:
             return False
         self.last_rid = hdr.rid
         return True
@@ -500,16 +535,17 @@
         f=open(filename, 'r')
         for l in f:
             sl = l.strip().split(',')
-            if len(sl[1]) > 0: #Comments are in col 0, remaining cols are empty
+            if len(sl[0]) > 0 and sl[0][0] != '"':
                 try:
-                    if (int(sl[0]) == tnum):
-                        return { 'num_msgs':int(sl[1]),
-                                 'min_size':int(sl[2]),
-                                 'max_size':int(sl[3]),
-                                 'auto_deq':sl[4] != 'FALSE',
-                                 'xid_min_size':int(sl[5]),
-                                 'xid_max_size':int(sl[6]),
-                                 'transient':sl[7] != 'FALSE' }
+                    if (int(sl[TEST_NUM_COL]) == tnum):
+                        return { 'num_msgs':int(sl[NUM_MSGS_COL]),
+                                 'min_size':int(sl[MIN_MSG_SIZE_COL]),
+                                 'max_size':int(sl[MAX_MSG_SIZE_COL]),
+                                 'auto_deq':not (sl[AUTO_DEQ_COL] == 'FALSE' or sl[AUTO_DEQ_COL] == '0'),
+                                 'xid_min_size':int(sl[MIN_XID_SIZE_COL]),
+                                 'xid_max_size':int(sl[MAX_XID_SIZE_COL]),
+                                 'transient':not (sl[TRANSIENT_COL] == 'FALSE' or sl[TRANSIENT_COL] == '0'),
+                                 'comment':sl[COMMENT_COL] }
                 except Exception:
                     pass
         return None
@@ -541,8 +577,8 @@
 
 
 CLASSES = {
-    "a": TxHdr,
-    "c": TxHdr,
+    "a": TxnHdr,
+    "c": TxnHdr,
     "d": DeqHdr,
     "e": EnqRec,
     "f": FileHdr

Modified: store/trunk/cpp/tests/jrnl/jtest.cpp
===================================================================
--- store/trunk/cpp/tests/jrnl/jtest.cpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/tests/jrnl/jtest.cpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -344,6 +344,17 @@
      return NULL;
 }
 
+// Set spreadsheet cols here: A=0, B=1...
+#define TEST_NUM_COL      0
+#define NUM_MSGS_COL      5
+#define MIN_MSG_SIZE_COL  7
+#define MAX_MSG_SIZE_COL  8
+#define MIN_XID_SIZE_COL  9
+#define MAX_XID_SIZE_COL 10
+#define AUTO_DEQ_COL     11
+#define TRANSIENT_COL    12
+#define COMMENT_COL      19
+
 // static method
 void
 jtest::get_test(targs* tap, const std::string& filename, const unsigned tnum) throw (rhm::journal::jexception)
@@ -369,21 +380,23 @@
             toks.push_back(pch);
             pch = strtok(NULL, ",");
         }
-        if (toks.size() >= 5)
+        if (toks.size() > TRANSIENT_COL && toks[TEST_NUM_COL][0] != '"')
         {
-            unsigned this_tnum = atoi(toks[0]);
+            unsigned this_tnum = atoi(toks[TEST_NUM_COL]);
             if (this_tnum == tnum)
             {
                 found = true;
-                tap->_num_msgs = atol(toks[1]);
-                tap->_min_msg_size = atol(toks[2]);
-                tap->_max_msg_size = atol(toks[3]);
-                tap->_auto_deq = strcmp(toks[4], "FALSE") != 0;
-                tap->_min_xid_size = atol(toks[5]);
-                tap->_max_xid_size = atol(toks[6]);
-                tap->_transient = strcmp(toks[7], "FALSE") != 0;
-                if (toks.size() > 8)
-                    tap->_comment =  toks[8];
+                tap->_num_msgs = atol(toks[NUM_MSGS_COL]);
+                tap->_min_msg_size = atol(toks[MIN_MSG_SIZE_COL]);
+                tap->_max_msg_size = atol(toks[MAX_MSG_SIZE_COL]);
+                tap->_min_xid_size = atol(toks[MIN_XID_SIZE_COL]);
+                tap->_max_xid_size = atol(toks[MAX_XID_SIZE_COL]);
+                tap->_auto_deq = !(strcmp(toks[AUTO_DEQ_COL], "FALSE") == 0 ||
+                        strcmp(toks[AUTO_DEQ_COL], "0") == 0);
+                tap->_transient = !(strcmp(toks[TRANSIENT_COL], "FALSE") == 0 ||
+                        strcmp(toks[TRANSIENT_COL], "0") == 0);
+                if (toks.size() > COMMENT_COL)
+                    tap->_comment =  toks[COMMENT_COL];
                 else
                     tap->_comment = NULL;
                 std::cout << "Test " << tnum << ": Messages=" << tap->_num_msgs << " Size=" <<
@@ -413,7 +426,8 @@
     {
         std::cout << "ERROR: Failed to find test " << tnum << " in test file \"" << filename <<
                 "\"." << std::endl;
-        throw rhm::journal::jexception(EXCEPTION_BASE+6, "Test data not found in CSV test data file.");
+        throw rhm::journal::jexception(EXCEPTION_BASE+6,
+                "Test data not found in CSV test data file.");
     }
 }
 

Modified: store/trunk/cpp/tests/jrnl/msg_producer.cpp
===================================================================
--- store/trunk/cpp/tests/jrnl/msg_producer.cpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/tests/jrnl/msg_producer.cpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -56,6 +56,8 @@
         _num_msgs_enq(0),
         _num_msgs_deq_subm(0),
         _num_msgs_deq(0),
+        _num_txn_subm(0),
+        _num_txn(0),
         _dtok_master_list(dtok_master_list),
         _tot_dblks(0),
         _tot_dsize(0)
@@ -69,15 +71,6 @@
 
 msg_producer::~msg_producer()
 {
-    for (u_int32_t i=0; i<_dtok_master_list.size(); i++)
-    {
-        if (_dtok_master_list[i])
-        {
-            delete _dtok_master_list[i];
-            _dtok_master_list[i] = NULL;
-        }
-    }
-    _dtok_master_list.clear();
     instance_cnt--;
 }
 
@@ -102,6 +95,8 @@
     _num_msgs_enq = 0;
     _num_msgs_deq_subm = 0;
     _num_msgs_deq = 0;
+    _num_txn_subm = 0;
+    _num_txn = 0;
     _tot_dblks = 0;
     _tot_dsize = 0;
     _aio_cmpl_dtok_list.clear();
@@ -161,6 +156,7 @@
                         if (ws >= rhm::journal::data_tok::ENQ_SUBM)
                         {
                             written = true;
+                            _num_msgs_enq_subm++;
                             _tot_dblks += dtokp->dblocks_written();
                             _tot_dsize += dtokp->dsize();
                         }
@@ -177,7 +173,7 @@
                         if (aio_sleep_cnt >= MAX_AIO_SLEEPS)
                             throw rhm::journal::jexception(EXCEPTION_BASE+2,
                                     "Page cache full (AIO events outstanding for all pages); "
-                                    "exceeced wait time for pages to free.", "msg_producer",
+                                    "exceeded wait time for pages to free.", "msg_producer",
                                     "produce");
 //std::cout << "$" << dtokp->id() << " " << std::flush;
                         usleep(AIO_SLEEP_TIME);
@@ -202,17 +198,15 @@
                         jfull_sleep_cnt++;
                         break;
                     default:
-                        std::cout << "msg_producer::produce() Unexpected msg state: id=" <<
-                            dtokp->id() << " ws=" << wsstr << " eres=" << iores_str[eres] <<
-                            std::flush;
-                        throw rhm::journal::jexception(EXCEPTION_BASE+4,
-                                    "Unknown return from enqueue() or enqueue_tx()", "msg_producer",
-                                    "produce");
+                        std::stringstream ss;
+                        ss << "msg_producer::produce() Unexpected msg state: id=" <<
+                            dtokp->id() << " ws=" << wsstr << " res=" << iores_str[eres];
+                        throw rhm::journal::jexception(EXCEPTION_BASE+4, ss.str(), "msg_producer",
+                                "produce");
                 }
             
                 //print_dbug(msgCntr, size, (char*)msg, true);
             }
-            _num_msgs_enq_subm++;
             
             // Submit deferred dequeues (if any)
             if (_auto_dequeue)
@@ -265,11 +259,18 @@
         if (st == rhm::journal::data_tok::ENQ)
         {
             _num_msgs_enq++;
-//std::cout << "^" << dtokp->id() << " " << std::flush;
+//std::cout << ">E" << dtokp->id() << " " << std::flush;
             _dd_dtok_list.push_back(dtokp);
         }
         else if (dtokp->wstate() == rhm::journal::data_tok::DEQ)
+//{ 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;
+            _num_txn++;
+//} else std::cout << ">?" << dtokp->id() << " st=" << dtokp->wstate_str() << " " << std::flush;
         this_dtok_list.pop_front();
     }
 }
@@ -312,7 +313,12 @@
             bool written = false;
             while (!written)
             {
-                rhm::journal::iores dres = _jcptr->dequeue_data_record(ddtokp);
+                rhm::journal::iores dres;
+                if (ddtokp->has_xid())
+                    dres = _jcptr->dequeue_txn_data_record(ddtokp, ddtokp->xid());
+                else
+                    dres = _jcptr->dequeue_data_record(ddtokp);
+                
                 const char* wsstr = ddtokp->wstate_str();
                 switch (dres)
                 {
@@ -324,7 +330,7 @@
                         if (aio_sleep_cnt >= MAX_AIO_SLEEPS)
                             throw rhm::journal::jexception(EXCEPTION_BASE+6,
                                     "Page cache full (AIO events outstanding for all pages); "
-                                    "exceeced wait time for pages to free.", "msg_producer",
+                                    "exceeded wait time for pages to free.", "msg_producer",
                                     "send_deferred_dequeues");
 //std::cout << "$" << dres << " " << std::flush;
                         jc.get_wr_events();
@@ -332,11 +338,56 @@
                         aio_sleep_cnt++;
                         break;
                     default:
-                        std::cout << "msg_producer::send_deferred_dequeues()"
-                                " Unexpected msg state: id=" << ddtokp->id() << " ws=" << wsstr <<
-                                " dres=" << iores_str[dres] << std::flush;
+                        std::stringstream ss;
+                        ss << "msg_producer::send_deferred_dequeues() Unexpected msg state: id=" <<
+                            ddtokp->id() << " ws=" << wsstr << " res=" << iores_str[dres];
+                        throw rhm::journal::jexception(EXCEPTION_BASE+7, ss.str(), "msg_producer",
+                                "send_deferred_dequeues");
                 }
             }
+
+            // If transactional, commit for even rids, abort for odd rids
+            if (ddtokp->has_xid())
+            {
+                written = false;
+                // 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);
+                while (!written)
+                {
+                    rhm::journal::iores dres;
+                    if (ddtokp->rid()%2)
+                        dres = _jcptr->txn_abort(txn_dtokp, ddtokp->xid());
+                    else
+                        dres = _jcptr->txn_commit(txn_dtokp, ddtokp->xid());
+
+                    const char* wsstr = ddtokp->wstate_str();
+                    switch (dres)
+                    {
+                        case rhm::journal::RHM_IORES_SUCCESS:
+                            written = true;
+                            _num_txn_subm++;
+                            break;
+                        case rhm::journal::RHM_IORES_AIO_WAIT:
+                            if (aio_sleep_cnt >= MAX_AIO_SLEEPS)
+                                throw rhm::journal::jexception(EXCEPTION_BASE+8,
+                                        "Page cache full (AIO events outstanding for all pages); "
+                                        "exceeded wait time for pages to free.", "msg_producer",
+                                        "send_deferred_dequeues");
+                            jc.get_wr_events();
+                            usleep(AIO_SLEEP_TIME);
+                            aio_sleep_cnt++;
+                            break;
+                        default:
+                            std::stringstream ss;
+                            ss << "msg_producer::send_deferred_dequeues() "
+                                    "Unexpected msg state: id=" << ddtokp->id() << " ws=" <<
+                                    wsstr << " res=" << iores_str[dres];
+                            throw rhm::journal::jexception(EXCEPTION_BASE+9, ss.str(),
+                                    "msg_producer", "send_deferred_dequeues");
+                    }
+                }
+            }
             ditr = _dd_dtok_list.erase(ditr);
         }
 #ifndef RHM_WRONLY
@@ -361,7 +412,7 @@
                 std::stringstream ss;
                 ss << "Journal flush phase 1 failed, _num_msgs_enq=" << _num_msgs_enq;
                 ss << " num_msgs_sent=" << num_msgs_sent;
-                throw rhm::journal::jexception(EXCEPTION_BASE+7, ss.str(), "msg_producer",
+                throw rhm::journal::jexception(EXCEPTION_BASE+10, ss.str(), "msg_producer",
                         "jrnl_flush"); 
             }
 //std::cout << "+" << std::flush;
@@ -380,7 +431,7 @@
         while (!_dd_dtok_list.empty() && !_interrupt_flag)
         {
             if (++cnt > 10000)
-                throw rhm::journal::jexception(EXCEPTION_BASE+8,
+                throw rhm::journal::jexception(EXCEPTION_BASE+11,
                         "Timeout waiting for all messages to be read.", "msg_producer",
                         "jrnl_flush");
             usleep(1000);
@@ -400,7 +451,7 @@
                     std::stringstream ss;
                     ss << "Journal flush phase 2 failed, _num_msgs_deq=" << _num_msgs_deq;
                     ss << " num_msgs_sent=" << num_msgs_sent;
-                    throw rhm::journal::jexception(EXCEPTION_BASE+9, ss.str(), "msg_producer",
+                    throw rhm::journal::jexception(EXCEPTION_BASE+12, ss.str(), "msg_producer",
                             "jrnl_flush"); 
                 }
 //std::cout << "*" << std::flush;

Modified: store/trunk/cpp/tests/jrnl/msg_producer.hpp
===================================================================
--- store/trunk/cpp/tests/jrnl/msg_producer.hpp	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/tests/jrnl/msg_producer.hpp	2007-10-05 20:46:46 UTC (rev 965)
@@ -75,6 +75,8 @@
     u_int32_t _num_msgs_enq;
     u_int32_t _num_msgs_deq_subm;
     u_int32_t _num_msgs_deq;
+    u_int32_t _num_txn_subm;
+    u_int32_t _num_txn;
     std::deque<rhm::journal::data_tok*>& _dtok_master_list; // One dtok per msg to be sent
     std::deque<rhm::journal::data_tok*> _aio_cmpl_dtok_list; // Dtoks from completed AIOs go here
     std::deque<rhm::journal::data_tok*> _dd_dtok_list; // Deferred dequeues

Modified: store/trunk/cpp/tests/jrnl/rtest
===================================================================
--- store/trunk/cpp/tests/jrnl/rtest	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/tests/jrnl/rtest	2007-10-05 20:46:46 UTC (rev 965)
@@ -36,21 +36,21 @@
 W_DO_TEST=T
 W_TEST_FILE=wtests.csv
 W_TEST_START=0
-W_TEST_STOP=99
+W_TEST_STOP=196
 W_NITER=5
 
 # Read test
 R_DO_TEST=T
 R_TEST_FILE=rtests.csv
 R_TEST_START=0
-R_TEST_STOP=45
+R_TEST_STOP=126
 R_NITER=5
 
 # Read-Write test
 RW_DO_TEST=T
 RW_TEST_FILE=rwtests.csv
 RW_TEST_START=0
-RW_TEST_STOP=49
+RW_TEST_STOP=148
 RW_NITER=5
 
 RM=rm

Modified: store/trunk/cpp/tests/jrnl/rtests.csv
===================================================================
--- store/trunk/cpp/tests/jrnl/rtests.csv	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/tests/jrnl/rtests.csv	2007-10-05 20:46:46 UTC (rev 965)
@@ -1,72 +1,147 @@
-"Initialize only",,,,,,,,,
-0,0,0,0,FALSE,0,0,FALSE,,"No messages"
-,,,,,,,,,
-"Within first block, page, file",,,,,,,,,
-1,1,10,10,FALSE,0,0,FALSE,,"10-byte message"
-2,10,10,10,FALSE,0,0,FALSE,,"10-byte message"
-3,1,10,10,TRUE,0,0,FALSE,,"10-byte message"
-4,10,10,10,TRUE,0,0,FALSE,,"10-byte message"
-,,,,,,,,,
-"Transition from one d-block to two per message",,,,,,,,,
-5,10,84,84,FALSE,0,0,FALSE,,"1 dblk exact fit"
-6,10,85,85,FALSE,0,0,FALSE,,"1 dblk + 1 byte"
-7,10,84,84,TRUE,0,0,FALSE,,"1 dblk exact fit"
-8,10,85,85,TRUE,0,0,FALSE,,"1 dblk + 1 byte"
-,,,,,,,,,
-"Transition from one s-block to two per message",,,,,,,,,
-9,10,468,468,FALSE,0,0,FALSE,,"1 sblk exact fit"
-10,10,469,469,FALSE,0,0,FALSE,,"1 sblk + 1 byte"
-11,10,468,468,TRUE,0,0,FALSE,,"1 sblk exact fit"
-12,10,469,469,TRUE,0,0,FALSE,,"1 sblk + 1 byte"
-,,,,,,,,,
-"Transition from first page to second",,,,,,,,,
-13,8,8148,8148,FALSE,0,0,FALSE,,"8 * 1/8 page; Total = 1 page exact fit"
-14,9,8148,8148,FALSE,0,0,FALSE,,"9 * 1/8 page"
-15,8,8149,8149,FALSE,0,0,FALSE,,"8 * (1/8 page + 1 byte)"
-16,8,8020,8020,TRUE,0,0,FALSE,,"8 * (1/8 page – 1 dblk for deq record); Total = 1 page exact fit with deqs"
-17,9,8020,8020,TRUE,0,0,FALSE,,"9 * (1/8 page – 1 dblk for deq record)"
-18,8,8021,8021,TRUE,0,0,FALSE,,"8 * (1/8 page – 1 dblk for deq record + 1 byte)"
-,,,,,,,,,
-"Page cache rollover (from last page back to page 0) - no dequeues as exact sizes are needed and dequeues are non-deterministic",,,,,,,,,
-19,16,65492,65492,FALSE,0,0,FALSE,,"16 * (1 page exact fit); Total = entire cache exactly"
-20,17,65492,65492,FALSE,0,0,FALSE,,"17 * (1 page exact fit); Total = entire cache + reuse of 1 page"
-21,11,98260,98260,FALSE,0,0,FALSE,,"11 * 1.5 pages"
-22,11,98132,98132,TRUE,0,0,FALSE,,"11 * (1.5 pages including 1 sblk for deq record)"
-,,,,,,,,,
-"File transition (from file 0000 to 0001) - no dequeues as exact sizes are needed and dequeues are non-deterministic",,,,,,,,,
-23,24,65492,65492,FALSE,0,0,FALSE,,"24 * (1 page exact fit); Total = entire file exactly"
-24,25,65492,65492,FALSE,0,0,FALSE,,"25 * (1 page exact fit); Total = entire file + 1 page"
-25,10,163796,163796,FALSE,0,0,FALSE,,"10 * (2.5 pages); Total = entire file + 2 pages"
-26,10,163668,163668,TRUE,0,0,FALSE,,"10 * (2.5 pages including 1 sblk for deq record); Total = entire file + 2 pages"
-,,,,,,,,,
-"File rollover (from file 0007 to 0000) - RHM_WRONLY req'd for auto-dequeue == FALSE",,,,,,,,,
-27,16,786388,786388,FALSE,0,0,FALSE,,"16 * (12 pages = ½ file); Total = 8 files exactly"
-,,,,,,,,,
-"Multi-page messages (large messages) - tests various paths in encoder; no dequeues required to test this functionality.",,,,,,,,,
-28,16,65492,65492,FALSE,0,0,FALSE,,"16 * (1 page exact fit)"
-29,16,65493,65493,FALSE,0,0,FALSE,,"16 * (1 page + 1 byte): tail split"
-30,16,65503,65503,FALSE,0,0,FALSE,,"16 * (1 page + 11 bytes): tail split"
-31,16,65504,65504,FALSE,0,0,FALSE,,"16 * (1 page + 12 bytes): tail separated exactly"
-32,16,65505,65505,FALSE,0,0,FALSE,,"16 * (1 page + 13 bytes): data split"
-33,16,131028,131028,FALSE,0,0,FALSE,,"16 * (2 pages exact fit)"
-34,16,131029,131029,FALSE,0,0,FALSE,,"16 * (2 pages + 1 byte): tail split"
-35,16,131039,131039,FALSE,0,0,FALSE,,"16 * (2 pages + 11 bytes): tail split"
-36,16,131040,131040,FALSE,0,0,FALSE,,"16 * (2 pages + 12 bytes): tail separated exactly"
-37,16,131041,131041,FALSE,0,0,FALSE,,"16 * (2 pages + 13 bytes) data split"
-38,16,262100,262100,FALSE,0,0,FALSE,,"16 * (4 pages exact fit)"
-39,16,262101,262101,FALSE,0,0,FALSE,,"16 * (4 pages + 1 byte: tail split)"
-40,16,262111,262111,FALSE,0,0,FALSE,,"16 * (4 pages + 1 byte: tail split)"
-41,16,262112,262112,FALSE,0,0,FALSE,,"16 * (4 pages + 12 bytes: tail separated)"
-42,16,262113,262113,FALSE,0,0,FALSE,,"16 * (4 pages + 13 bytes: data split)"
-43,16,229332,229332,FALSE,0,0,FALSE,,"16 * (3.5 pages)"
-44,16,229333,229333,FALSE,0,0,FALSE,,"16 * (3.5 pages + 1 byte)"
-,,,,,,,,,
-"These set up journals for circular tests (repeatedly reading same journal) Make sure value testing is off!",,,,,,,,,
-45,98304,0,84,FALSE,0,0,FALSE,,"1 dblk no dequeues"
-46,49152,0,84,TRUE,0,0,FALSE,,"1 dblk with dequeues"
-47,49152,0,212,FALSE,0,0,FALSE,,"2 dblk no dequeues"
-48,24576,0,212,TRUE,0,0,FALSE,,"2 dblk with dequeues"
-49,32768,212,212,TRUE,0,0,FALSE,,"2 dblk fixed with dequeues"
-,,,,,,,,,
-"Circular tests",,,,,,,,,
-50,10000000,0,0,FALSE,0,0,FALSE,,"Read 10,000,000 messages from one of the circular test journals above"
+,,,,,,,"Msg size",,"Xid size",,,,"enq-size",,"deq-size",,"txn-size",,
+"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"
+,,,,,,,,,,,,,,,,,,,
+"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]"
+,,,,,,,,,,,,,,,,,,,
+"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]"
+,,,,,,,,,,,,,,,,,,,
+"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]"
+,,,,,,,,,,,,,,,,,,,
+"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]"
+,,,,,,,,,,,,,,,,,,,
+"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]"
+,,,,,,,,,,,,,,,,,,,
+"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 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"
+,,,,,,,,,,,,,,,,,,,
+"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]"

Modified: store/trunk/cpp/tests/jrnl/rwtests.csv
===================================================================
--- store/trunk/cpp/tests/jrnl/rwtests.csv	2007-10-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/tests/jrnl/rwtests.csv	2007-10-05 20:46:46 UTC (rev 965)
@@ -1,68 +1,169 @@
-"Initialize only",,,,,,,,,
-0,0,0,0,FALSE,0,0,FALSE,,"No messages"
-,,,,,,,,,
-"Within first block, page, file",,,,,,,,,
-1,1,10,10,FALSE,0,0,FALSE,,"10-byte message"
-2,10,10,10,FALSE,0,0,FALSE,,"10-byte message"
-3,1,10,10,TRUE,0,0,FALSE,,"10-byte message"
-4,10,10,10,TRUE,0,0,FALSE,,"10-byte message"
-,,,,,,,,,
-"Transition from one d-block to two per message",,,,,,,,,
-5,10,84,84,FALSE,0,0,FALSE,,"1 dblk exact fit"
-6,10,85,85,FALSE,0,0,FALSE,,"1 dblk + 1 byte"
-7,10,84,84,TRUE,0,0,FALSE,,"1 dblk exact fit"
-8,10,85,85,TRUE,0,0,FALSE,,"1 dblk + 1 byte"
-,,,,,,,,,
-"Transition from one s-block to two per message",,,,,,,,,
-9,10,468,468,FALSE,0,0,FALSE,,"1 sblk exact fit"
-10,10,469,469,FALSE,0,0,FALSE,,"1 sblk + 1 byte"
-11,10,468,468,TRUE,0,0,FALSE,,"1 sblk exact fit"
-12,10,469,469,TRUE,0,0,FALSE,,"1 sblk + 1 byte"
-,,,,,,,,,
-"Transition from first page to second",,,,,,,,,
-13,8,4052,4052,FALSE,0,0,FALSE,,"8 * 1/8 page; Total = 1 page exact fit"
-14,9,4052,4052,FALSE,0,0,FALSE,,"9 * 1/8 page"
-15,8,4053,4053,FALSE,0,0,FALSE,,"8 * (1/8 page + 1 byte)"
-16,8,3924,3924,TRUE,0,0,FALSE,,"8 * (1/8 page - 1 dblk for deq record); Total = 1 page exact fit with deqs"
-17,9,3924,3924,TRUE,0,0,FALSE,,"9 * (1/8 page - 1 dblk for deq record)"
-18,8,3925,3925,TRUE,0,0,FALSE,,"8 * (1/8 page - 1 dblk for deq record + 1 byte)"
-,,,,,,,,,
-"Page cache rollover (from page 32 back to page 0) - no dequeues as exact sizes are needed and dequeues are non-deterministic",,,,,,,,,
-19,32,32724,32724,FALSE,0,0,FALSE,,"32 * (1 page exact fit); Total = entire cache exactly"
-20,33,32724,32724,FALSE,0,0,FALSE,,"33 * (1 page exact fit); Total = entire cache + reuse of 1 page"
-21,22,49108,49108,FALSE,0,0,FALSE,,"22 * 1.5 pages"
-22,22,48980,48980,TRUE,0,0,FALSE,,"22 * (1.5 pages including 1 sblk for deq record)"
-,,,,,,,,,
-"File transition (from file 0000 to 0001) - no dequeues as exact sizes are needed and dequeues are non-deterministic",,,,,,,,,
-23,48,32724,32724,FALSE,0,0,FALSE,,"48 * (1 page exact fit); Total = entire file exactly"
-24,49,32724,32724,FALSE,0,0,FALSE,,"49 * (1 page exact fit); Total = entire file + 1 page"
-25,20,81876,81876,FALSE,0,0,FALSE,,"20 * (2.5 pages); Total = entire file + 2 pages"
-26,20,81748,81748,TRUE,0,0,FALSE,,"20 * (2.5 pages including 1 sblk for deq record); Total = entire file + 2 pages"
-,,,,,,,,,
-"File rollover (from file 0007 to 0000) - RHM_WRONLY req'd for auto-dequeue == FALSE",,,,,,,,,
-27,16,786388,786388,FALSE,FALSE,FALSE,FALSE,,"16 * (24 pages = ½ file); Total = 8 files exactly"
-28,16,786260,786260,TRUE,0,0,FALSE,,"16 * (24 pages = ½ file); Total = 8 files exactly"
-29,17,786260,786260,TRUE,0,0,FALSE,,"17 * (24 pages = ½ file); Total = 8 files + file 0 overwritten by ½ file"
-30,16,786261,786261,TRUE,0,0,FALSE,,"16 * (24 pages + 1 byte); Total = 8 files + file 0 overwritten by 16 sblks"
-31,32,786260,786260,TRUE,0,0,FALSE,,"32 * (24 pages = ½ file); Total = 16 files exactly, all files overwritten once"
-32,33,786260,786260,TRUE,0,0,FALSE,,"33 * (24 pages = ½ file); Total = 16 ½ files, all files overwritten once + file 0 overwritten again by ½ file"
-33,32,786261,786261,TRUE,0,0,FALSE,,"32 * (24 pages + 1 byte); All files overwritten once + file 0 overwritten again by 32 sblks"
-,,,,,,,,,
-"Multi-page messages (large messages) - tests various paths in encoder; no dequeues required to test this functionality.",,,,,,,,,
-34,16,32724,32724,FALSE,0,0,FALSE,,"16 * (1 page exact fit)"
-35,16,32725,32725,FALSE,0,0,FALSE,,"16 * (1 page + 1 byte): tail split"
-36,16,32735,32735,FALSE,0,0,FALSE,,"16 * (1 page + 11 bytes): tail split"
-37,16,32736,32736,FALSE,0,0,FALSE,,"16 * (1 page + 12 bytes): tail separated exactly"
-38,16,32737,32737,FALSE,0,0,FALSE,,"16 * (1 page + 13 bytes): data split"
-39,16,65492,65492,FALSE,0,0,FALSE,,"16 * (2 pages exact fit)"
-40,16,65493,65493,FALSE,0,0,FALSE,,"16 * (2 pages + 1 byte): tail split"
-41,16,65503,65503,FALSE,0,0,FALSE,,"16 * (2 pages + 11 bytes): tail split"
-42,16,65504,65504,FALSE,0,0,FALSE,,"16 * (2 pages + 12 bytes): tail separated exactly"
-43,16,65505,65505,FALSE,0,0,FALSE,,"16 * (2 pages + 13 bytes) data split"
-44,16,131028,131028,FALSE,0,0,FALSE,,"16 * (4 pages exact fit)"
-45,16,131029,131029,FALSE,0,0,FALSE,,"16 * (4 pages + 1 byte: tail split)"
-46,16,131039,131039,FALSE,0,0,FALSE,,"16 * (4 pages + 1 byte: tail split)"
-47,16,131040,131040,FALSE,0,0,FALSE,,"16 * (4 pages + 12 bytes: tail separated)"
-48,16,131041,131041,FALSE,0,0,FALSE,,"16 * (4 pages + 13 bytes: data split)"
-49,16,114644,114644,FALSE,0,0,FALSE,,"16 * (3.5 pages)"
-50,16,114645,114645,FALSE,0,0,FALSE,,"16 * (3.5 pages + 1 byte)"
+,,,,,,,"Msg size",,"Xid size",,,,"enq-size",,"deq-size",,"txn-size",,
+"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"
+,,,,,,,,,,,,,,,,,,,
+"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]"
+,,,,,,,,,,,,,,,,,,,
+"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]"
+,,,,,,,,,,,,,,,,,,,
+"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]"
+,,,,,,,,,,,,,,,,,,,
+"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]"
+,,,,,,,,,,,,,,,,,,,
+"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]"
+,,,,,,,,,,,,,,,,,,,
+"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 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,1,17,0,786388,786388,0,0,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file"
+71,"L",0.5,16,0,16,1,786389,786389,0,0,FALSE,FALSE,786433,6145,0,0,0,0,"24 pages + 1 byte"
+72,"L",0.5,16,0,16,0,786132,786132,256,256,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file [txn]"
+73,"L",0.5,16,1,17,0,786132,786132,256,256,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file [txn]"
+74,"L",0.5,16,0,16,1,786133,786133,256,256,FALSE,FALSE,786433,6145,0,0,0,0,"24 pages + 1 byte [txn]"
+75,"L",0.25,32,0,32,0,786388,786388,0,0,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file"
+76,"L",0.25,32,1,33,0,786388,786388,0,0,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file"
+77,"L",0.25,32,0,32,1,786389,786389,0,0,FALSE,FALSE,786433,6145,0,0,0,0,"24 pages + 1 byte"
+78,"L",0.25,32,0,32,0,786132,786132,256,256,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file [txn]"
+79,"L",0.25,32,1,33,0,786132,786132,256,256,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file [txn]"
+80,"L",0.25,32,0,32,1,786133,786133,256,256,FALSE,FALSE,786433,6145,0,0,0,0,"24 pages + 1 byte [txn]"
+81,"L",0.5,16,0,16,0,786260,786260,0,0,TRUE,FALSE,786304,6143,32,1,0,0,"24 pages incl deq = ½ file [deq]"
+82,"L",0.5,16,1,17,0,786260,786260,0,0,TRUE,FALSE,786304,6143,32,1,0,0,"24 pages incl deq = ½ file [deq]"
+83,"L",0.5,16,0,16,1,786261,786261,0,0,TRUE,FALSE,786305,6144,32,1,0,0,"24 pages incl deq + 1 byte [deq]"
+84,"L",0.5,16,0,16,0,785364,785364,256,256,TRUE,FALSE,785664,6138,300,3,292,3,"24 pages incl deq & txn = ½ file [deq txn]"
+85,"L",0.5,16,1,17,0,785364,785364,256,256,TRUE,FALSE,785664,6138,300,3,292,3,"24 pages incl deq & txn = ½ file [deq txn]"
+86,"L",0.5,16,0,16,1,785365,785365,256,256,TRUE,FALSE,785665,6139,300,3,292,3,"24 pages incl deq & txn + 1 byte [deq txn]"
+87,"L",0.25,32,0,32,0,786260,786260,0,0,TRUE,FALSE,786304,6143,32,1,0,0,"24 pages incl deq = ½ file [deq]"
+88,"L",0.25,32,1,33,0,786260,786260,0,0,TRUE,FALSE,786304,6143,32,1,0,0,"24 pages incl deq = ½ file [deq]"
+89,"L",0.25,32,0,32,1,786261,786261,0,0,TRUE,FALSE,786305,6144,32,1,0,0,"24 pages incl deq + 1 byte [deq]"
+90,"L",0.25,32,0,32,0,785364,785364,256,256,TRUE,FALSE,785664,6138,300,3,292,3,"24 pages incl deq & txn = ½ file [deq txn]"
+91,"L",0.25,32,1,33,0,785364,785364,256,256,TRUE,FALSE,785664,6138,300,3,292,3,"24 pages incl deq & txn = ½ file [deq txn]"
+92,"L",0.25,32,0,32,1,785365,785365,256,256,TRUE,FALSE,785665,6139,300,3,292,3,"24 pages incl deq & txn + 1 byte [deq txn]"
+,,,,,,,,,,,,,,,,,,,
+"Multi-page messages (large messages) - tests various paths in encoder.",,,,,,,,,,,,,,,,,,,
+93,"L",1,16,0,16,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"data 1 page"
+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)"
+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]"
+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)"
+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]"
+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)"
+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]"
+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]"
+130,"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]"
+131,"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]"
+132,"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]"
+133,"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]"
+134,"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]"
+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]"

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-04 19:54:30 UTC (rev 964)
+++ store/trunk/cpp/tests/jrnl/wtests.csv	2007-10-05 20:46:46 UTC (rev 965)
@@ -1,139 +1,255 @@
-"Initialize only",,,,,,,,,
-0,0,0,0,FALSE,0,0,FALSE,,"No messages"
-,,,,,,,,,
-"Within first block, page, file",,,,,,,,,
-1,1,10,10,FALSE,0,0,FALSE,,"1 * 10-byte message"
-2,10,10,10,FALSE,0,0,FALSE,,"10 * 10-byte message"
-3,1,10,10,FALSE,0,0,TRUE,,"1 * 10-byte message, transient"
-4,10,10,10,FALSE,0,0,TRUE,,"10 * 10-byte message, transient"
-5,1,10,10,FALSE,10,10,FALSE,,"1 * 10-byte message, txn"
-6,10,10,10,FALSE,10,10,FALSE,,"10 * 10-byte message, txn"
-7,1,10,10,FALSE,10,10,TRUE,,"1 * 10-byte message, txn, transient"
-8,10,10,10,FALSE,10,10,TRUE,,"10 * 10-byte message, txn, transient"
-9,1,10,10,TRUE,0,0,FALSE,,"1 * 10-byte message, deq"
-10,10,10,10,TRUE,0,0,FALSE,,"10 * 10-byte message, deq"
-11,1,10,10,TRUE,0,0,TRUE,,"1 * 10-byte message, transient, deq"
-12,10,10,10,TRUE,0,0,TRUE,,"10 * 10-byte message, transient, deq"
-13,1,10,10,TRUE,10,10,FALSE,,"1 * 10-byte message, txn, deq"
-14,10,10,10,TRUE,10,10,FALSE,,"10 * 10-byte message, txn, deq"
-15,1,10,10,TRUE,10,10,TRUE,,"1 * 10-byte message, txn, transient, deq"
-16,10,10,10,TRUE,10,10,TRUE,,"10 * 10-byte message, txn, transient, deq"
-,,,,,,,,,
-"Transition from one d-block to two per message",,,,,,,,,
-17,10,84,84,FALSE,0,0,FALSE,,"1 dblk exact fit"
-18,10,85,85,FALSE,0,0,FALSE,,"1 dblk + 1 byte"
-19,10,58,58,FALSE,26,26,FALSE,,"1 dblk exact fit, txn"
-20,10,59,59,FALSE,26,26,FALSE,,"1 dblk + 1 byte, txn"
-,,,,,,,,,
-"Transition from one s-block to two per message",,,,,,,,,
-21,10,468,468,FALSE,0,0,FALSE,,"1 sblk exact fit"
-22,10,469,469,FALSE,0,0,FALSE,,"1 sblk + 1 byte"
-23,10,442,442,FALSE,26,26,FALSE,,"1 sblk exact fit, txn"
-24,10,443,443,FALSE,26,26,FALSE,,"1 sblk + 1 byte, txn"
-,,,,,,,,,
-"Transition from first page to second",,,,,,,,,
-25,8,4052,4052,FALSE,0,0,FALSE,,"8 * 1/8 page; Total = 1 page exact fit"
-26,9,4052,4052,FALSE,0,0,FALSE,,"9 * 1/8 page"
-27,8,4053,4053,FALSE,0,0,FALSE,,"8 * (1/8 page + 1 byte)"
-28,8,3796,3796,FALSE,256,256,FALSE,,"8 * 1/8 page; Total = 1 page exact fit, txn"
-29,9,3796,3796,FALSE,256,256,FALSE,,"9 * 1/8 page, txn"
-30,8,3797,3797,FALSE,256,256,FALSE,,"8 * (1/8 page + 1 byte), txn"
-,,,,,,,,,
-"Page cache rollover (from page 32 back to page 0) - no dequeues as exact sizes are needed and dequeues are non-deterministic",,,,,,,,,
-31,32,32724,32724,FALSE,0,0,FALSE,,"32 * (1 page exact fit); Total = entire cache exactly"
-32,33,32724,32724,FALSE,0,0,FALSE,,"33 * (1 page exact fit); Total = entire cache + reuse of 1 page"
-33,22,49108,49108,FALSE,0,0,FALSE,,"22 * 1.5 pages"
-34,32,32468,32468,FALSE,256,256,FALSE,,"32 * (1 page exact fit); Total = entire cache exactly, txn"
-35,33,32468,32468,FALSE,256,256,FALSE,,"33 * (1 page exact fit); Total = entire cache + reuse of 1 page, txn"
-36,22,48852,48852,FALSE,256,256,FALSE,,"22 * 1.5 pages, txn"
-,,,,,,,,,
-"File transition (from file 0000 to 0001) - no dequeues as exact sizes are needed and dequeues are non-deterministic",,,,,,,,,
-37,48,32724,32724,FALSE,0,0,FALSE,,"48 * (1 page exact fit); Total = entire file exactly"
-38,49,32724,32724,FALSE,0,0,FALSE,,"49 * (1 page exact fit); Total = entire file + 1 page"
-39,20,81876,81876,FALSE,0,0,FALSE,,"20 * (2.5 pages); Total = entire file + 2 pages"
-40,48,32468,32468,FALSE,256,256,FALSE,,"48 * (1 page exact fit); Total = entire file exactly, txn"
-41,49,32468,32468,FALSE,256,256,FALSE,,"49 * (1 page exact fit); Total = entire file + 1 page, txn"
-42,20,81620,81620,FALSE,256,256,FALSE,,"20 * (2.5 pages); Total = entire file + 2 pages, txn"
-,,,,,,,,,
-"File rollover (from file 0007 to 0000) - RHM_WRONLY req'd for auto-dequeue == FALSE",,,,,,,,,
-43,16,786388,786388,FALSE,0,0,FALSE,,"16 * (24 pages = ½ file); Total = 8 files exactly"
-44,17,786388,786388,FALSE,0,0,FALSE,,"17 * (24 pages = ½ file); Total = 8 files + file 0 overwritten by ½ file"
-45,16,786389,786389,FALSE,0,0,FALSE,,"16 * (24 pages + 1 byte); Total = 8 files + file 0 overwritten by 16 sblks"
-46,32,786388,786388,FALSE,0,0,FALSE,,"32 * (24 pages = ½ file); Total = 16 files exactly, all files overwritten once"
-47,33,786388,786388,FALSE,0,0,FALSE,,"33 * (24 pages = ½ file); Total = 16 ½ files, all files overwritten once + file 0 overwritten again by ½ file"
-48,32,786389,786389,FALSE,0,0,FALSE,,"32 * (24 pages + 1 byte); All files overwritten once + file 0 overwritten again by 32 sblks"
-49,16,786132,786132,FALSE,256,256,FALSE,,"16 * (24 pages = ½ file); Total = 8 files exactly, txn"
-50,17,786132,786132,FALSE,256,256,FALSE,,"17 * (24 pages = ½ file); Total = 8 files + file 0 overwritten by ½ file, txn"
-51,16,786133,786133,FALSE,256,256,FALSE,,"16 * (24 pages + 1 byte); Total = 8 files + file 0 overwritten by 16 sblks, txn"
-52,32,786132,786132,FALSE,256,256,FALSE,,"32 * (24 pages = ½ file); Total = 16 files exactly, all files overwritten once, txn"
-53,33,786132,786132,FALSE,256,256,FALSE,,"33 * (24 pages = ½ file); Total = 16 ½ files, all files overwritten once + file 0 overwritten again by ½ file, txn"
-54,32,786133,786133,FALSE,256,256,FALSE,,"32 * (24 pages + 1 byte); All files overwritten once + file 0 overwritten again by 32 sblks, txn"
-,,,,,,,,,
-"Multi-page messages (large messages) - tests various paths in encoder; no dequeues required to test this functionality.",,,,,,,,,
-55,16,10,10,FALSE,32724,32724,FALSE,,"16 * (xid 1 page exact fit)"
-56,16,10,10,FALSE,32725,32725,FALSE,,"16 * (xid 1 page + 1 byte): tail split"
-57,16,10,10,FALSE,32735,32735,FALSE,,"16 * (xid 1 page + 11 bytes): tail split"
-58,16,10,10,FALSE,32736,32736,FALSE,,"16 * (xid 1 page + 12 bytes): tail separated exactly"
-59,16,10,10,FALSE,32737,32737,FALSE,,"16 * (xid 1 page + 13 bytes): data split"
-60,16,10,10,FALSE,65492,65492,FALSE,,"16 * (xid 2 pages exact fit)"
-61,16,10,10,FALSE,65493,65493,FALSE,,"16 * (xid 2 pages + 1 byte): tail split"
-62,16,10,10,FALSE,65503,65503,FALSE,,"16 * (xid 2 pages + 11 bytes): tail split"
-63,16,10,10,FALSE,65504,65504,FALSE,,"16 * (xid 2 pages + 12 bytes): tail separated exactly"
-64,16,10,10,FALSE,65505,65505,FALSE,,"16 * (xid 2 pages + 13 bytes) data split"
-65,16,32724,32724,FALSE,0,0,FALSE,,"16 * (1 page exact fit)"
-66,16,32725,32725,FALSE,0,0,FALSE,,"16 * (1 page + 1 byte): tail split"
-67,16,32735,32735,FALSE,0,0,FALSE,,"16 * (1 page + 11 bytes): tail split"
-68,16,32736,32736,FALSE,0,0,FALSE,,"16 * (1 page + 12 bytes): tail separated exactly"
-69,16,32737,32737,FALSE,0,0,FALSE,,"16 * (1 page + 13 bytes): data split"
-70,16,65492,65492,FALSE,0,0,FALSE,,"16 * (2 pages exact fit)"
-71,16,65493,65493,FALSE,0,0,FALSE,,"16 * (2 pages + 1 byte): tail split"
-72,16,65503,65503,FALSE,0,0,FALSE,,"16 * (2 pages + 11 bytes): tail split"
-73,16,65504,65504,FALSE,0,0,FALSE,,"16 * (2 pages + 12 bytes): tail separated exactly"
-74,16,65505,65505,FALSE,0,0,FALSE,,"16 * (2 pages + 13 bytes) data split"
-75,16,131028,131028,FALSE,0,0,FALSE,,"16 * (4 pages exact fit)"
-76,16,131029,131029,FALSE,0,0,FALSE,,"16 * (4 pages + 1 byte: tail split)"
-77,16,131039,131039,FALSE,0,0,FALSE,,"16 * (4 pages + 1 byte: tail split)"
-78,16,131040,131040,FALSE,0,0,FALSE,,"16 * (4 pages + 12 bytes: tail separated)"
-79,16,131041,131041,FALSE,0,0,FALSE,,"16 * (4 pages + 13 bytes: data split)"
-80,16,114644,114644,FALSE,0,0,FALSE,,"16 * (3.5 pages)"
-81,16,114645,114645,FALSE,0,0,FALSE,,"16 * (3.5 pages + 1 byte)"
-,,,,,,,,,
-"Large (multi-megabyte) messages - RHM_WRONLY req'd for auto-dequeue == FALSE",,,,,,,,,
-82,32,1572820,1572820,FALSE,0,0,FALSE,,"32 * (48 pages = 1 file exactly)"
-83,32,1572821,1572821,FALSE,0,0,FALSE,,"32 * (48 pages + 1 byte)"
-84,32,1605588,1605588,FALSE,0,0,FALSE,,"32 * (49 pages = 1 file + 1 page)"
-85,16,3145684,3145684,FALSE,0,0,FALSE,,"16 * (96 pages = 2 files exactly)"
-86,16,3145685,3145685,FALSE,0,0,FALSE,,"16 * (96 pages + 1 byte)"
-87,16,3178452,3178452,FALSE,0,0,FALSE,,"16 * (97 pages = 2 files + 1 page"
-88,8,6291412,6291412,FALSE,0,0,FALSE,,"8 * (192 pages = 4 files exactly)"
-89,8,6291413,6291413,FALSE,0,0,FALSE,,"8 * (192 pages + 1 byte)"
-90,8,6324180,6324180,FALSE,0,0,FALSE,,"8 * (193 pages = 4 files + 1 page)"
-91,32,1572692,1572692,TRUE,0,0,FALSE,,"32 * (48 pages including 1 sblk for deq record = 1 file exactly)"
-92,32,1572693,1572693,TRUE,0,0,FALSE,,"32 * (48 pages including 1 sblk for deq record + 1 byte)"
-93,32,1605460,1605460,TRUE,0,0,FALSE,,"32 * (49 pages including 1 sblk for deq record = 1 file + 1 page)"
-94,16,3145556,3145556,TRUE,0,0,FALSE,,"16 * (96 pages including 1 sblk for deq record = 2 files exactly)"
-95,16,3145557,3145557,TRUE,0,0,FALSE,,"16 * (96 pages including 1 sblk for deq record + 1 byte)"
-96,16,3178324,3178324,TRUE,0,0,FALSE,,"16 * (97 pages including 1 sblk for deq record = 2 files + 1 page"
-97,8,6291284,6291284,TRUE,0,0,FALSE,,"8 * (192 pages including 1 sblk for deq record = 4 files exactly)"
-98,8,6291285,6291285,TRUE,0,0,FALSE,,"8 * (192 pages including 1 sblk for deq record + 1 byte)"
-99,8,6324052,6324052,TRUE,0,0,FALSE,,"8 * (193 pages including 1 sblk for deq record = 4 files + 1 page)"
-,,,,,,,,,
-"High volume tests of random message lengths - RHM_WRONLY req'd for auto-dequeue == FALSE",,,,,,,,,
-100,5000000,0,84,FALSE,0,0,FALSE,,"1 dblk max"
-101,3000000,0,340,FALSE,0,0,FALSE,,"3 dblks max"
-102,1600000,0,1236,FALSE,0,0,FALSE,,"10 dblks max"
-103,600000,0,3796,FALSE,0,0,FALSE,,"30 dblks max"
-104,200000,0,12756,FALSE,0,0,FALSE,,"100 dblks max"
-105,60000,0,38356,FALSE,0,0,FALSE,,"300 dblks max"
-106,20000,0,127956,FALSE,0,0,FALSE,,"1000 dblks max"
-107,2500000,0,84,TRUE,0,0,FALSE,,"1 dblk max"
-108,1500000,0,340,TRUE,0,0,FALSE,,"3 dblks max"
-109,800000,0,1236,TRUE,0,0,FALSE,,"10 dblks max"
-110,300000,0,3796,TRUE,0,0,FALSE,,"30 dblks max"
-111,100000,0,12756,TRUE,0,0,FALSE,,"100 dblks max"
-112,30000,0,38356,TRUE,0,0,FALSE,,"300 dblks max"
-113,10000,0,127956,TRUE,0,0,FALSE,,"1000 dblks max"
-,,,,,,,,,
-"STANDARD PERFORMANCE BENCHMARK: 10,000,000 writes, data=212b (2 dblks)",,,,,,,,,
-114,10000000,212,212,FALSE,0,0,FALSE,,"2 dblks"
-115,10000000,212,212,TRUE,0,0,FALSE,,"2 dblks"
+,,,,,,,"Msg size",,"Xid size",,,,"enq-size",,"deq-size",,"txn-size",,
+"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"
+,,,,,,,,,,,,,,,,,,,
+"Simple message  combinations of persistent/transient, dequeued/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 [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]"
+,,,,,,,,,,,,,,,,,,,
+"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"
+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",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",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",,,,,,,,,,,,,,,,,,,
+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]"
+,,,,,,,,,,,,,,,,,,,
+"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 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,1,17,0,786388,786388,0,0,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file"
+71,"L",0.5,16,0,16,1,786389,786389,0,0,FALSE,FALSE,786433,6145,0,0,0,0,"24 pages + 1 byte"
+72,"L",0.5,16,0,16,0,786132,786132,256,256,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file [txn]"
+73,"L",0.5,16,1,17,0,786132,786132,256,256,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file [txn]"
+74,"L",0.5,16,0,16,1,786133,786133,256,256,FALSE,FALSE,786433,6145,0,0,0,0,"24 pages + 1 byte [txn]"
+75,"L",0.25,32,0,32,0,786388,786388,0,0,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file"
+76,"L",0.25,32,1,33,0,786388,786388,0,0,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file"
+77,"L",0.25,32,0,32,1,786389,786389,0,0,FALSE,FALSE,786433,6145,0,0,0,0,"24 pages + 1 byte"
+78,"L",0.25,32,0,32,0,786132,786132,256,256,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file [txn]"
+79,"L",0.25,32,1,33,0,786132,786132,256,256,FALSE,FALSE,786432,6144,0,0,0,0,"24 pages = ½ file [txn]"
+80,"L",0.25,32,0,32,1,786133,786133,256,256,FALSE,FALSE,786433,6145,0,0,0,0,"24 pages + 1 byte [txn]"
+81,"L",0.5,16,0,16,0,786260,786260,0,0,TRUE,FALSE,786304,6143,32,1,0,0,"24 pages incl deq = ½ file [deq]"
+82,"L",0.5,16,1,17,0,786260,786260,0,0,TRUE,FALSE,786304,6143,32,1,0,0,"24 pages incl deq = ½ file [deq]"
+83,"L",0.5,16,0,16,1,786261,786261,0,0,TRUE,FALSE,786305,6144,32,1,0,0,"24 pages incl deq + 1 byte [deq]"
+84,"L",0.5,16,0,16,0,785364,785364,256,256,TRUE,FALSE,785664,6138,300,3,292,3,"24 pages incl deq & txn = ½ file [deq txn]"
+85,"L",0.5,16,1,17,0,785364,785364,256,256,TRUE,FALSE,785664,6138,300,3,292,3,"24 pages incl deq & txn = ½ file [deq txn]"
+86,"L",0.5,16,0,16,1,785365,785365,256,256,TRUE,FALSE,785665,6139,300,3,292,3,"24 pages incl deq & txn + 1 byte [deq txn]"
+87,"L",0.25,32,0,32,0,786260,786260,0,0,TRUE,FALSE,786304,6143,32,1,0,0,"24 pages incl deq = ½ file [deq]"
+88,"L",0.25,32,1,33,0,786260,786260,0,0,TRUE,FALSE,786304,6143,32,1,0,0,"24 pages incl deq = ½ file [deq]"
+89,"L",0.25,32,0,32,1,786261,786261,0,0,TRUE,FALSE,786305,6144,32,1,0,0,"24 pages incl deq + 1 byte [deq]"
+90,"L",0.25,32,0,32,0,785364,785364,256,256,TRUE,FALSE,785664,6138,300,3,292,3,"24 pages incl deq & txn = ½ file [deq txn]"
+91,"L",0.25,32,1,33,0,785364,785364,256,256,TRUE,FALSE,785664,6138,300,3,292,3,"24 pages incl deq & txn = ½ file [deq txn]"
+92,"L",0.25,32,0,32,1,785365,785365,256,256,TRUE,FALSE,785665,6139,300,3,292,3,"24 pages incl deq & txn + 1 byte [deq txn]"
+,,,,,,,,,,,,,,,,,,,
+"Multi-page messages (large messages) - tests various paths in encoder.",,,,,,,,,,,,,,,,,,,
+93,"L",1,16,0,16,0,32724,32724,0,0,FALSE,FALSE,32768,256,0,0,0,0,"data 1 page"
+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)"
+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]"
+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)"
+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]"
+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)"
+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]"
+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]"
+130,"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]"
+131,"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]"
+132,"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]"
+133,"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]"
+134,"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]"
+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]"
+,,,,,,,,,,,,,,,,,,,
+"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]"
+,,,,,,,,,,,,,,,,,,,
+"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]"
+,,,,,,,,,,,,,,,,,,,
+"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)"




More information about the rhmessaging-commits mailing list