[qpid-cpp] All patches.
Darryl L. Pierce
mcpierce at fedoraproject.org
Mon Feb 24 13:59:04 UTC 2014
commit 2aaceb559a3e73f864def5a73d0f94f89304b6b3
Author: Darryl L. Pierce <mcpierce at gmail.com>
Date: Fri Feb 21 16:37:12 2014 -0500
All patches.
...JIRA-qpidd.service-file-for-use-on-Fedora.patch | 58 +
...ix-for-recovery-ambiguity-issue-other-cod.patch | 5363 ++++++++++++++++++++
...rovide-the-right-Perl-packages-in-top-lev.patch | 39 +
...ix-Ruby-Perl-bindings-when-built-with-Wer.patch | 184 +
4 files changed, 5644 insertions(+), 0 deletions(-)
---
diff --git a/0001-NO-JIRA-qpidd.service-file-for-use-on-Fedora.patch b/0001-NO-JIRA-qpidd.service-file-for-use-on-Fedora.patch
new file mode 100644
index 0000000..f636fad
--- /dev/null
+++ b/0001-NO-JIRA-qpidd.service-file-for-use-on-Fedora.patch
@@ -0,0 +1,58 @@
+From 3f1ab5d5984c5f3ce25a4dace8a7546a2b618df1 Mon Sep 17 00:00:00 2001
+From: "Darryl L. Pierce" <mcpierce at gmail.com>
+Date: Wed, 3 Apr 2013 10:07:37 -0400
+Subject: [PATCH 1/4] NO-JIRA: qpidd.service file for use on Fedora
+
+This patch provides the needed systemd file for running the Qpid broker
+as a service.
+---
+ qpid/cpp/etc/qpidd-primary.service | 15 +++++++++++++++
+ qpid/cpp/etc/qpidd.service | 14 ++++++++++++++
+ 2 files changed, 29 insertions(+)
+ create mode 100644 qpid/cpp/etc/qpidd-primary.service
+ create mode 100644 qpid/cpp/etc/qpidd.service
+
+diff --git a/qpid/cpp/etc/qpidd-primary.service b/qpid/cpp/etc/qpidd-primary.service
+new file mode 100644
+index 0000000..f15168c
+--- /dev/null
++++ b/qpid/cpp/etc/qpidd-primary.service
+@@ -0,0 +1,15 @@
++[Unit]
++Description=An AMQP message broker cluster primary daemon.
++Documentation=man:qpidd(1) http://qpid.apache.org/
++Requires=network.target
++After=network.target
++
++[Service]
++User=qpidd
++Group=qpidd
++Type=simple
++EnvironmentFile=/etc/sysconfig/qpidd
++ExecStart=/usr/sbin/qpid-ha -b localhost:$QPID_PORT promote
++
++[Install]
++WantedBy=multi-user.target
+diff --git a/qpid/cpp/etc/qpidd.service b/qpid/cpp/etc/qpidd.service
+new file mode 100644
+index 0000000..10a99d1
+--- /dev/null
++++ b/qpid/cpp/etc/qpidd.service
+@@ -0,0 +1,14 @@
++[Unit]
++Description=An AMQP message broker daemon.
++Documentation=man:qpidd(1) http://qpid.apache.org/
++Requires=network.target
++After=network.target
++
++[Service]
++User=qpidd
++Group=qpidd
++Type=simple
++ExecStart=/usr/sbin/qpidd --config /etc/qpid/qpidd.conf
++
++[Install]
++WantedBy=multi-user.target
+--
+1.8.5.3
+
diff --git a/0002-QPID-4984-Fix-for-recovery-ambiguity-issue-other-cod.patch b/0002-QPID-4984-Fix-for-recovery-ambiguity-issue-other-cod.patch
new file mode 100644
index 0000000..2182af3
--- /dev/null
+++ b/0002-QPID-4984-Fix-for-recovery-ambiguity-issue-other-cod.patch
@@ -0,0 +1,5363 @@
+From af5030f948bdf5aba098c5ce137811ff97c436ea Mon Sep 17 00:00:00 2001
+From: kpvdr <kpvdr at 13f79535-47bb-0310-9956-ffa450edef68>
+Date: Thu, 14 Nov 2013 20:39:32 +0000
+Subject: [PATCH 2/4] QPID-4984: Fix for recovery ambiguity issue, other code
+ tidy-ups
+
+git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1542066 13f79535-47bb-0310-9956-ffa450edef68
+---
+ qpid/cpp/src/qpid/legacystore/MessageStoreImpl.cpp | 2 +-
+ qpid/cpp/src/qpid/linearstore/BindingDbt.h | 6 +-
+ qpid/cpp/src/qpid/linearstore/BufferValue.h | 6 +-
+ qpid/cpp/src/qpid/linearstore/Cursor.h | 6 +-
+ qpid/cpp/src/qpid/linearstore/DataTokenImpl.h | 8 +-
+ qpid/cpp/src/qpid/linearstore/ISSUES | 7 +-
+ qpid/cpp/src/qpid/linearstore/IdDbt.h | 6 +-
+ qpid/cpp/src/qpid/linearstore/IdSequence.h | 6 +-
+ qpid/cpp/src/qpid/linearstore/JournalImpl.cpp | 14 +-
+ qpid/cpp/src/qpid/linearstore/JournalImpl.h | 46 ++--
+ qpid/cpp/src/qpid/linearstore/JournalLogImpl.cpp | 6 +-
+ qpid/cpp/src/qpid/linearstore/JournalLogImpl.h | 14 +-
+ qpid/cpp/src/qpid/linearstore/MessageStoreImpl.cpp | 114 +++++----
+ qpid/cpp/src/qpid/linearstore/MessageStoreImpl.h | 24 +-
+ .../cpp/src/qpid/linearstore/PreparedTransaction.h | 6 +-
+ qpid/cpp/src/qpid/linearstore/StoreException.h | 6 +-
+ qpid/cpp/src/qpid/linearstore/TxnCtxt.cpp | 10 +-
+ qpid/cpp/src/qpid/linearstore/TxnCtxt.h | 6 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/AtomicCounter.h | 11 +-
+ .../src/qpid/linearstore/jrnl/EmptyFilePool.cpp | 5 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePool.h | 18 +-
+ .../qpid/linearstore/jrnl/EmptyFilePoolManager.cpp | 13 +-
+ .../qpid/linearstore/jrnl/EmptyFilePoolManager.h | 5 +-
+ .../linearstore/jrnl/EmptyFilePoolPartition.cpp | 5 +-
+ .../qpid/linearstore/jrnl/EmptyFilePoolPartition.h | 18 +-
+ .../src/qpid/linearstore/jrnl/EmptyFilePoolTypes.h | 12 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/JournalFile.cpp | 59 ++++-
+ qpid/cpp/src/qpid/linearstore/jrnl/JournalFile.h | 28 ++-
+ qpid/cpp/src/qpid/linearstore/jrnl/JournalLog.cpp | 5 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/JournalLog.h | 11 +-
+ .../qpid/linearstore/jrnl/LinearFileController.cpp | 16 +-
+ .../qpid/linearstore/jrnl/LinearFileController.h | 14 +-
+ .../src/qpid/linearstore/jrnl/RecoveryManager.cpp | 269 +++++++++++++--------
+ .../src/qpid/linearstore/jrnl/RecoveryManager.h | 19 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/aio.h | 15 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/aio_callback.h | 31 ++-
+ qpid/cpp/src/qpid/linearstore/jrnl/cvar.h | 15 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/data_tok.cpp | 57 +----
+ qpid/cpp/src/qpid/linearstore/jrnl/data_tok.h | 46 +---
+ qpid/cpp/src/qpid/linearstore/jrnl/deq_rec.cpp | 119 +++------
+ qpid/cpp/src/qpid/linearstore/jrnl/deq_rec.h | 98 +++-----
+ qpid/cpp/src/qpid/linearstore/jrnl/enq_map.cpp | 9 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/enq_map.h | 24 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/enq_rec.cpp | 120 ++-------
+ qpid/cpp/src/qpid/linearstore/jrnl/enq_rec.h | 114 ++++-----
+ qpid/cpp/src/qpid/linearstore/jrnl/enums.h | 55 +----
+ qpid/cpp/src/qpid/linearstore/jrnl/jcfg.h | 6 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/jcntl.cpp | 13 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/jcntl.h | 24 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/jdir.cpp | 9 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/jdir.h | 24 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/jerrno.cpp | 9 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/jerrno.h | 24 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/jexception.cpp | 9 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/jexception.h | 25 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/jrec.cpp | 81 +------
+ qpid/cpp/src/qpid/linearstore/jrnl/jrec.h | 223 +++++++----------
+ qpid/cpp/src/qpid/linearstore/jrnl/pmgr.cpp | 9 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/pmgr.h | 27 +--
+ qpid/cpp/src/qpid/linearstore/jrnl/slock.h | 15 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/smutex.h | 15 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/time_ns.cpp | 10 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/time_ns.h | 15 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/txn_map.cpp | 9 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/txn_map.h | 24 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/txn_rec.cpp | 109 +++------
+ qpid/cpp/src/qpid/linearstore/jrnl/txn_rec.h | 91 +++----
+ qpid/cpp/src/qpid/linearstore/jrnl/utils/deq_hdr.c | 6 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/utils/deq_hdr.h | 14 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/utils/enq_hdr.c | 4 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/utils/enq_hdr.h | 14 +-
+ .../cpp/src/qpid/linearstore/jrnl/utils/file_hdr.c | 33 ++-
+ .../cpp/src/qpid/linearstore/jrnl/utils/file_hdr.h | 25 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_hdr.c | 17 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_hdr.h | 17 +-
+ .../cpp/src/qpid/linearstore/jrnl/utils/rec_tail.c | 13 +-
+ .../cpp/src/qpid/linearstore/jrnl/utils/rec_tail.h | 22 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/utils/txn_hdr.c | 4 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/utils/txn_hdr.h | 16 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/wmgr.cpp | 17 +-
+ qpid/cpp/src/qpid/linearstore/jrnl/wmgr.h | 251 ++++++++++---------
+ 81 files changed, 1217 insertions(+), 1511 deletions(-)
+
+diff --git a/qpid/cpp/src/qpid/legacystore/MessageStoreImpl.cpp b/qpid/cpp/src/qpid/legacystore/MessageStoreImpl.cpp
+index 67b8b52..7863940 100644
+--- a/qpid/cpp/src/qpid/legacystore/MessageStoreImpl.cpp
++++ b/qpid/cpp/src/qpid/legacystore/MessageStoreImpl.cpp
+@@ -115,7 +115,7 @@ u_int32_t MessageStoreImpl::chkJrnlWrPageCacheSize(const u_int32_t param, const
+ // For zero value, use default
+ p = JRNL_WMGR_DEF_PAGE_SIZE * JRNL_DBLK_SIZE * JRNL_SBLK_SIZE / 1024;
+ QPID_LOG(warning, "parameter " << paramName << " (" << param << ") must be a power of 2 between 1 and 128; changing this parameter to default value (" << p << ")");
+- } else if ( p > 128 || p & (p-1) ) {
++ } else if ( p > 128 || (p & (p-1)) ) {
+ // For any positive value that is not a power of 2, use closest value
+ if (p < 6) p = 4;
+ else if (p < 12) p = 8;
+diff --git a/qpid/cpp/src/qpid/linearstore/BindingDbt.h b/qpid/cpp/src/qpid/linearstore/BindingDbt.h
+index 7297ea7..e5d61de 100644
+--- a/qpid/cpp/src/qpid/linearstore/BindingDbt.h
++++ b/qpid/cpp/src/qpid/linearstore/BindingDbt.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_BINDINGDBT_H
+-#define QPID_LEGACYSTORE_BINDINGDBT_H
++#ifndef QPID_LINEARSTORE_BINDINGDBT_H
++#define QPID_LINEARSTORE_BINDINGDBT_H
+
+ #include "db-inc.h"
+ #include "qpid/broker/PersistableExchange.h"
+@@ -53,4 +53,4 @@ public:
+
+ }}
+
+-#endif // ifndef QPID_LEGACYSTORE_BINDINGDBT_H
++#endif // ifndef QPID_LINEARSTORE_BINDINGDBT_H
+diff --git a/qpid/cpp/src/qpid/linearstore/BufferValue.h b/qpid/cpp/src/qpid/linearstore/BufferValue.h
+index 5af1ac6..daeb813 100644
+--- a/qpid/cpp/src/qpid/linearstore/BufferValue.h
++++ b/qpid/cpp/src/qpid/linearstore/BufferValue.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_BUFFERVALUE_H
+-#define QPID_LEGACYSTORE_BUFFERVALUE_H
++#ifndef QPID_LINEARSTORE_BUFFERVALUE_H
++#define QPID_LINEARSTORE_BUFFERVALUE_H
+
+ #include "db-inc.h"
+ #include "qpid/broker/Persistable.h"
+@@ -43,4 +43,4 @@ public:
+
+ }}
+
+-#endif // ifndef QPID_LEGACYSTORE_BUFFERVALUE_H
++#endif // ifndef QPID_LINEARSTORE_BUFFERVALUE_H
+diff --git a/qpid/cpp/src/qpid/linearstore/Cursor.h b/qpid/cpp/src/qpid/linearstore/Cursor.h
+index c7e7f34..0287803 100644
+--- a/qpid/cpp/src/qpid/linearstore/Cursor.h
++++ b/qpid/cpp/src/qpid/linearstore/Cursor.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_CURSOR_H
+-#define QPID_LEGACYSTORE_CURSOR_H
++#ifndef QPID_LINEARSTORE_CURSOR_H
++#define QPID_LINEARSTORE_CURSOR_H
+
+ #include <boost/shared_ptr.hpp>
+ #include "db-inc.h"
+@@ -47,4 +47,4 @@ public:
+
+ }}
+
+-#endif // ifndef QPID_LEGACYSTORE_CURSOR_H
++#endif // ifndef QPID_LINEARSTORE_CURSOR_H
+diff --git a/qpid/cpp/src/qpid/linearstore/DataTokenImpl.h b/qpid/cpp/src/qpid/linearstore/DataTokenImpl.h
+index 17de01d..154dacc 100644
+--- a/qpid/cpp/src/qpid/linearstore/DataTokenImpl.h
++++ b/qpid/cpp/src/qpid/linearstore/DataTokenImpl.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_DATATOKENIMPL_H
+-#define QPID_LEGACYSTORE_DATATOKENIMPL_H
++#ifndef QPID_LINEARSTORE_DATATOKENIMPL_H
++#define QPID_LINEARSTORE_DATATOKENIMPL_H
+
+ #include "qpid/linearstore/jrnl/data_tok.h"
+ #include "qpid/broker/PersistableMessage.h"
+@@ -29,7 +29,7 @@
+ namespace qpid{
+ namespace linearstore{
+
+-class DataTokenImpl : public qpid::qls_jrnl::data_tok, public qpid::RefCounted
++class DataTokenImpl : public qpid::linearstore::journal::data_tok, public qpid::RefCounted
+ {
+ private:
+ boost::intrusive_ptr<qpid::broker::PersistableMessage> sourceMsg;
+@@ -44,4 +44,4 @@ class DataTokenImpl : public qpid::qls_jrnl::data_tok, public qpid::RefCounted
+ } // namespace msgstore
+ } // namespace mrg
+
+-#endif // ifndef QPID_LEGACYSTORE_DATATOKENIMPL_H
++#endif // ifndef QPID_LINEARSTORE_DATATOKENIMPL_H
+diff --git a/qpid/cpp/src/qpid/linearstore/ISSUES b/qpid/cpp/src/qpid/linearstore/ISSUES
+index f1c12f1..575fef3 100644
+--- a/qpid/cpp/src/qpid/linearstore/ISSUES
++++ b/qpid/cpp/src/qpid/linearstore/ISSUES
+@@ -22,8 +22,8 @@ LinearStore issues:
+ Store:
+ ------
+
+-1. Overwrite identity: When recovering a previously used file, if the write boundary coincides with old record start,
+- no way of discriminating old from new at boundary (used to use OWI).
++1. (SOLVED) Overwrite identity: When recovering a previously used file, if the write boundary coincides with old record
++ start, no way of discriminating old from new at boundary (used to use OWI).
+
+ 2. Recycling files while in use not working, however, files are recovered to EFP during recovery. Must solve #1 first.
+
+@@ -31,6 +31,9 @@ Store:
+
+ 4. Rework qpid management parameters and controls.
+
++5. Consistent logging: rework logging to provide uniform and consistent logging from store (both logging level and
++ places where logging occurs).
++
+ Tests
+ -----
+
+diff --git a/qpid/cpp/src/qpid/linearstore/IdDbt.h b/qpid/cpp/src/qpid/linearstore/IdDbt.h
+index f8bb064..c726449 100644
+--- a/qpid/cpp/src/qpid/linearstore/IdDbt.h
++++ b/qpid/cpp/src/qpid/linearstore/IdDbt.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_IDDBT_H
+-#define QPID_LEGACYSTORE_IDDBT_H
++#ifndef QPID_LINEARSTORE_IDDBT_H
++#define QPID_LINEARSTORE_IDDBT_H
+
+ #include "db-inc.h"
+
+@@ -39,4 +39,4 @@ public:
+
+ }}
+
+-#endif // ifndef QPID_LEGACYSTORE_IDDBT_H
++#endif // ifndef QPID_LINEARSTORE_IDDBT_H
+diff --git a/qpid/cpp/src/qpid/linearstore/IdSequence.h b/qpid/cpp/src/qpid/linearstore/IdSequence.h
+index 11b31a2..17996ee 100644
+--- a/qpid/cpp/src/qpid/linearstore/IdSequence.h
++++ b/qpid/cpp/src/qpid/linearstore/IdSequence.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_IDSEQUENCE_H
+-#define QPID_LEGACYSTORE_IDSEQUENCE_H
++#ifndef QPID_LINEARSTORE_IDSEQUENCE_H
++#define QPID_LINEARSTORE_IDSEQUENCE_H
+
+ #include "qpid/framing/amqp_types.h"
+ #include "qpid/sys/Mutex.h"
+@@ -40,4 +40,4 @@ public:
+
+ }}
+
+-#endif // ifndef QPID_LEGACYSTORE_IDSEQUENCE_H
++#endif // ifndef QPID_LINEARSTORE_IDSEQUENCE_H
+diff --git a/qpid/cpp/src/qpid/linearstore/JournalImpl.cpp b/qpid/cpp/src/qpid/linearstore/JournalImpl.cpp
+index 4f90466..354fca4 100644
+--- a/qpid/cpp/src/qpid/linearstore/JournalImpl.cpp
++++ b/qpid/cpp/src/qpid/linearstore/JournalImpl.cpp
+@@ -36,7 +36,7 @@
+ #include "qmf/org/apache/qpid/linearstore/EventFull.h"
+ #include "qmf/org/apache/qpid/linearstore/EventRecovered.h"
+
+-using namespace qpid::qls_jrnl;
++using namespace qpid::linearstore::journal;
+ using namespace qpid::linearstore;
+ using qpid::management::ManagementAgent;
+ namespace _qmf = qmf::org::apache::qpid::linearstore;
+@@ -128,10 +128,10 @@ JournalImpl::initManagement(qpid::management::ManagementAgent* a)
+
+
+ void
+-JournalImpl::initialize(qpid::qls_jrnl::EmptyFilePool* efpp_,
++JournalImpl::initialize(qpid::linearstore::journal::EmptyFilePool* efpp_,
+ const uint16_t wcache_num_pages,
+ const uint32_t wcache_pgsize_sblks,
+- qpid::qls_jrnl::aio_callback* const cbp)
++ qpid::linearstore::journal::aio_callback* const cbp)
+ {
+ // efpp->createJournal(_jdir);
+ // QLS_LOG2(notice, _jid, "Initialized");
+@@ -167,10 +167,10 @@ JournalImpl::recover(/*const uint16_t num_jfiles,
+ const bool auto_expand,
+ const uint16_t ae_max_jfiles,
+ const uint32_t jfsize_sblks,*/
+- boost::shared_ptr<qpid::qls_jrnl::EmptyFilePoolManager> efpm,
++ boost::shared_ptr<qpid::linearstore::journal::EmptyFilePoolManager> efpm,
+ const uint16_t wcache_num_pages,
+ const uint32_t wcache_pgsize_sblks,
+- qpid::qls_jrnl::aio_callback* const cbp,
++ qpid::linearstore::journal::aio_callback* const cbp,
+ boost::ptr_list<PreparedTransaction>* prep_tx_list_ptr,
+ uint64_t& highest_rid,
+ uint64_t queue_id)
+@@ -463,12 +463,12 @@ JournalImpl::handleIoResult(const iores r)
+ writeActivityFlag = true;
+ switch (r)
+ {
+- case qpid::qls_jrnl::RHM_IORES_SUCCESS:
++ case qpid::linearstore::journal::RHM_IORES_SUCCESS:
+ return;
+ default:
+ {
+ std::ostringstream oss;
+- oss << "Unexpected I/O response (" << qpid::qls_jrnl::iores_str(r) << ").";
++ oss << "Unexpected I/O response (" << qpid::linearstore::journal::iores_str(r) << ").";
+ QLS_LOG2(error, _jid, oss.str());
+ THROW_STORE_FULL_EXCEPTION(oss.str());
+ }
+diff --git a/qpid/cpp/src/qpid/linearstore/JournalImpl.h b/qpid/cpp/src/qpid/linearstore/JournalImpl.h
+index ba62b1d..59050e3 100644
+--- a/qpid/cpp/src/qpid/linearstore/JournalImpl.h
++++ b/qpid/cpp/src/qpid/linearstore/JournalImpl.h
+@@ -41,14 +41,14 @@ namespace qpid{
+ namespace sys {
+ class Timer;
+ }
+-namespace qls_jrnl {
+-class EmptyFilePool;
+-}
+
+ namespace linearstore{
+
+ class JournalImpl;
+ class JournalLogImpl;
++namespace journal {
++ class EmptyFilePool;
++}
+
+ class InactivityFireEvent : public qpid::sys::TimerTask
+ {
+@@ -74,7 +74,7 @@ class GetEventsFireEvent : public qpid::sys::TimerTask
+ inline void cancel() { qpid::sys::Mutex::ScopedLock sl(_gefe_lock); _parent = 0; }
+ };
+
+-class JournalImpl : public qpid::broker::ExternalQueueStore, public qpid::qls_jrnl::jcntl, public qpid::qls_jrnl::aio_callback
++class JournalImpl : public qpid::broker::ExternalQueueStore, public qpid::linearstore::journal::jcntl, public qpid::linearstore::journal::aio_callback
+ {
+ public:
+ typedef boost::function<void (JournalImpl&)> DeleteCallback;
+@@ -110,26 +110,26 @@ class JournalImpl : public qpid::broker::ExternalQueueStore, public qpid::qls_jr
+
+ void initManagement(qpid::management::ManagementAgent* agent);
+
+- void initialize(qpid::qls_jrnl::EmptyFilePool* efp,
++ void initialize(qpid::linearstore::journal::EmptyFilePool* efp,
+ const uint16_t wcache_num_pages,
+ const uint32_t wcache_pgsize_sblks,
+- qpid::qls_jrnl::aio_callback* const cbp);
++ qpid::linearstore::journal::aio_callback* const cbp);
+
+- inline void initialize(qpid::qls_jrnl::EmptyFilePool* efpp,
++ inline void initialize(qpid::linearstore::journal::EmptyFilePool* efpp,
+ const uint16_t wcache_num_pages,
+ const uint32_t wcache_pgsize_sblks) {
+ initialize(efpp, wcache_num_pages, wcache_pgsize_sblks, this);
+ }
+
+- void recover(boost::shared_ptr<qpid::qls_jrnl::EmptyFilePoolManager> efpm,
++ void recover(boost::shared_ptr<qpid::linearstore::journal::EmptyFilePoolManager> efpm,
+ const uint16_t wcache_num_pages,
+ const uint32_t wcache_pgsize_sblks,
+- qpid::qls_jrnl::aio_callback* const cbp,
++ qpid::linearstore::journal::aio_callback* const cbp,
+ boost::ptr_list<PreparedTransaction>* prep_tx_list_ptr,
+ uint64_t& highest_rid,
+ uint64_t queue_id);
+
+- inline void recover(boost::shared_ptr<qpid::qls_jrnl::EmptyFilePoolManager> efpm,
++ inline void recover(boost::shared_ptr<qpid::linearstore::journal::EmptyFilePoolManager> efpm,
+ const uint16_t wcache_num_pages,
+ const uint32_t wcache_pgsize_sblks,
+ boost::ptr_list<PreparedTransaction>* prep_tx_list_ptr,
+@@ -142,38 +142,38 @@ class JournalImpl : public qpid::broker::ExternalQueueStore, public qpid::qls_jr
+
+ // Overrides for write inactivity timer
+ void enqueue_data_record(const void* const data_buff, const size_t tot_data_len,
+- const size_t this_data_len, qpid::qls_jrnl::data_tok* dtokp,
++ const size_t this_data_len, qpid::linearstore::journal::data_tok* dtokp,
+ const bool transient = false);
+
+- void enqueue_extern_data_record(const size_t tot_data_len, qpid::qls_jrnl::data_tok* dtokp,
++ void enqueue_extern_data_record(const size_t tot_data_len, qpid::linearstore::journal::data_tok* dtokp,
+ const bool transient = false);
+
+ void enqueue_txn_data_record(const void* const data_buff, const size_t tot_data_len,
+- const size_t this_data_len, qpid::qls_jrnl::data_tok* dtokp, const std::string& xid,
++ const size_t this_data_len, qpid::linearstore::journal::data_tok* dtokp, const std::string& xid,
+ const bool transient = false);
+
+- void enqueue_extern_txn_data_record(const size_t tot_data_len, qpid::qls_jrnl::data_tok* dtokp,
++ void enqueue_extern_txn_data_record(const size_t tot_data_len, qpid::linearstore::journal::data_tok* dtokp,
+ const std::string& xid, const bool transient = false);
+
+- void dequeue_data_record(qpid::qls_jrnl::data_tok* const dtokp, const bool txn_coml_commit = false);
++ void dequeue_data_record(qpid::linearstore::journal::data_tok* const dtokp, const bool txn_coml_commit = false);
+
+- void dequeue_txn_data_record(qpid::qls_jrnl::data_tok* const dtokp, const std::string& xid, const bool txn_coml_commit = false);
++ void dequeue_txn_data_record(qpid::linearstore::journal::data_tok* const dtokp, const std::string& xid, const bool txn_coml_commit = false);
+
+- void txn_abort(qpid::qls_jrnl::data_tok* const dtokp, const std::string& xid);
++ void txn_abort(qpid::linearstore::journal::data_tok* const dtokp, const std::string& xid);
+
+- void txn_commit(qpid::qls_jrnl::data_tok* const dtokp, const std::string& xid);
++ void txn_commit(qpid::linearstore::journal::data_tok* const dtokp, const std::string& xid);
+
+ void stop(bool block_till_aio_cmpl = false);
+
+ // Overrides for get_events timer
+- qpid::qls_jrnl::iores flush(const bool block_till_aio_cmpl = false);
++ qpid::linearstore::journal::iores flush(const bool block_till_aio_cmpl = false);
+
+ // TimerTask callback
+ void getEventsFire();
+ void flushFire();
+
+ // AIO callbacks
+- virtual void wr_aio_cb(std::vector<qpid::qls_jrnl::data_tok*>& dtokl);
++ virtual void wr_aio_cb(std::vector<qpid::linearstore::journal::data_tok*>& dtokl);
+ virtual void rd_aio_cb(std::vector<uint16_t>& pil);
+
+ qpid::management::ManagementObject::shared_ptr GetManagementObject (void) const
+@@ -194,7 +194,7 @@ class JournalImpl : public qpid::broker::ExternalQueueStore, public qpid::qls_jr
+ timer.add(getEventsFireEventsPtr);
+ getEventsTimerSetFlag = true;
+ }
+- void handleIoResult(const qpid::qls_jrnl::iores r);
++ void handleIoResult(const qpid::linearstore::journal::iores r);
+
+ // Management instrumentation callbacks overridden from jcntl
+ inline void instr_incr_outstanding_aio_cnt() {
+@@ -222,9 +222,9 @@ class TplJournalImpl : public JournalImpl
+ virtual ~TplJournalImpl() {}
+
+ // Special version of read_data_record that ignores transactions - needed when reading the TPL
+- inline qpid::qls_jrnl::iores read_data_record(void** const datapp, std::size_t& dsize,
++ inline qpid::linearstore::journal::iores read_data_record(void** const datapp, std::size_t& dsize,
+ void** const xidpp, std::size_t& xidsize, bool& transient, bool& external,
+- qpid::qls_jrnl::data_tok* const dtokp) {
++ qpid::linearstore::journal::data_tok* const dtokp) {
+ return JournalImpl::read_data_record(datapp, dsize, xidpp, xidsize, transient, external, dtokp, true);
+ }
+ }; // class TplJournalImpl
+diff --git a/qpid/cpp/src/qpid/linearstore/JournalLogImpl.cpp b/qpid/cpp/src/qpid/linearstore/JournalLogImpl.cpp
+index b7935b1..85e9775 100644
+--- a/qpid/cpp/src/qpid/linearstore/JournalLogImpl.cpp
++++ b/qpid/cpp/src/qpid/linearstore/JournalLogImpl.cpp
+@@ -24,11 +24,11 @@
+ namespace qpid {
+ namespace linearstore {
+
+-JournalLogImpl::JournalLogImpl(const qpid::qls_jrnl::JournalLog::log_level_t logLevelThreshold) : qpid::qls_jrnl::JournalLog(logLevelThreshold) {}
++JournalLogImpl::JournalLogImpl(const qpid::linearstore::journal::JournalLog::log_level_t logLevelThreshold) : qpid::linearstore::journal::JournalLog(logLevelThreshold) {}
+ JournalLogImpl::~JournalLogImpl() {}
+
+ void
+-JournalLogImpl::log(const qpid::qls_jrnl::JournalLog::log_level_t level,
++JournalLogImpl::log(const qpid::linearstore::journal::JournalLog::log_level_t level,
+ const std::string& log_stmt) const {
+ switch (level) {
+ case LOG_CRITICAL: QPID_LOG(critical, "Linear Store: " << log_stmt); break;
+@@ -42,7 +42,7 @@ JournalLogImpl::log(const qpid::qls_jrnl::JournalLog::log_level_t level,
+ }
+
+ void
+-JournalLogImpl::log(const qpid::qls_jrnl::JournalLog::log_level_t level,
++JournalLogImpl::log(const qpid::linearstore::journal::JournalLog::log_level_t level,
+ const std::string& jid,
+ const std::string& log_stmt) const {
+ switch (level) {
+diff --git a/qpid/cpp/src/qpid/linearstore/JournalLogImpl.h b/qpid/cpp/src/qpid/linearstore/JournalLogImpl.h
+index 43c2d7d..538b383 100644
+--- a/qpid/cpp/src/qpid/linearstore/JournalLogImpl.h
++++ b/qpid/cpp/src/qpid/linearstore/JournalLogImpl.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_LOG_H
+-#define QPID_LEGACYSTORE_LOG_H
++#ifndef QPID_LINEARSTORE_LOG_H
++#define QPID_LINEARSTORE_LOG_H
+
+ #include "qpid/linearstore/jrnl/JournalLog.h"
+ #include "qpid/log/Statement.h"
+@@ -31,18 +31,18 @@
+ namespace qpid {
+ namespace linearstore {
+
+-class JournalLogImpl : public qpid::qls_jrnl::JournalLog
++class JournalLogImpl : public qpid::linearstore::journal::JournalLog
+ {
+ public:
+- JournalLogImpl(const qpid::qls_jrnl::JournalLog::log_level_t logLevelThreshold);
++ JournalLogImpl(const qpid::linearstore::journal::JournalLog::log_level_t logLevelThreshold);
+ virtual ~JournalLogImpl();
+- virtual void log(const qpid::qls_jrnl::JournalLog::log_level_t logLevel,
++ virtual void log(const qpid::linearstore::journal::JournalLog::log_level_t logLevel,
+ const std::string& logStatement) const;
+- virtual void log(const qpid::qls_jrnl::JournalLog::log_level_t logLevel,
++ virtual void log(const qpid::linearstore::journal::JournalLog::log_level_t logLevel,
+ const std::string& journalId,
+ const std::string& logStatement) const;
+ };
+
+ }} // namespace qpid::linearstore
+
+-#endif // QPID_LEGACYSTORE_LOG_H
++#endif // QPID_LINEARSTORE_LOG_H
+diff --git a/qpid/cpp/src/qpid/linearstore/MessageStoreImpl.cpp b/qpid/cpp/src/qpid/linearstore/MessageStoreImpl.cpp
+index 100c892..3d06ada 100644
+--- a/qpid/cpp/src/qpid/linearstore/MessageStoreImpl.cpp
++++ b/qpid/cpp/src/qpid/linearstore/MessageStoreImpl.cpp
+@@ -72,7 +72,7 @@ MessageStoreImpl::MessageStoreImpl(qpid::broker::Broker* broker_, const char* en
+ isInit(false),
+ envPath(envpath_),
+ broker(broker_),
+- jrnlLog(qpid::qls_jrnl::JournalLog::LOG_NOTICE),
++ jrnlLog(qpid::linearstore::journal::JournalLog::LOG_NOTICE),
+ mgmtObject(),
+ agent(0)
+ {}
+@@ -119,13 +119,13 @@ uint16_t MessageStoreImpl::getJrnlWrNumPages(const uint32_t wrPageSizeKib_)
+ }
+ }
+
+-qpid::qls_jrnl::efpPartitionNumber_t MessageStoreImpl::chkEfpPartition(const qpid::qls_jrnl::efpPartitionNumber_t partition_,
++qpid::linearstore::journal::efpPartitionNumber_t MessageStoreImpl::chkEfpPartition(const qpid::linearstore::journal::efpPartitionNumber_t partition_,
+ const std::string& /*paramName_*/) {
+ // TODO: check against list of existing partitions, throw if not found
+ return partition_;
+ }
+
+-qpid::qls_jrnl::efpDataSize_kib_t MessageStoreImpl::chkEfpFileSizeKiB(const qpid::qls_jrnl::efpDataSize_kib_t efpFileSizeKib_,
++qpid::linearstore::journal::efpDataSize_kib_t MessageStoreImpl::chkEfpFileSizeKiB(const qpid::linearstore::journal::efpDataSize_kib_t efpFileSizeKib_,
+ const std::string& paramName_) {
+ uint8_t rem = efpFileSizeKib_ % uint64_t(QLS_SBLK_SIZE_KIB);
+ if (rem != 0) {
+@@ -171,8 +171,8 @@ bool MessageStoreImpl::init(const qpid::Options* options_)
+ {
+ // Extract and check options
+ const StoreOptions* opts = static_cast<const StoreOptions*>(options_);
+- qpid::qls_jrnl::efpPartitionNumber_t efpPartition = chkEfpPartition(opts->efpPartition, "efp-partition");
+- qpid::qls_jrnl::efpDataSize_kib_t efpFilePoolSize_kib = chkEfpFileSizeKiB(opts->efpFileSizeKib, "efp-file-size");
++ qpid::linearstore::journal::efpPartitionNumber_t efpPartition = chkEfpPartition(opts->efpPartition, "efp-partition");
++ qpid::linearstore::journal::efpDataSize_kib_t efpFilePoolSize_kib = chkEfpFileSizeKiB(opts->efpFileSizeKib, "efp-file-size");
+ uint32_t jrnlWrCachePageSizeKib = chkJrnlWrPageCacheSize(opts->wCachePageSizeKib, "wcache-page-size");
+ uint32_t tplJrnlWrCachePageSizeKib = chkJrnlWrPageCacheSize(opts->tplWCachePageSizeKib, "tpl-wcache-page-size");
+
+@@ -182,8 +182,8 @@ bool MessageStoreImpl::init(const qpid::Options* options_)
+
+ // These params, taken from options, are assumed to be correct and verified
+ bool MessageStoreImpl::init(const std::string& storeDir_,
+- qpid::qls_jrnl::efpPartitionNumber_t efpPartition_,
+- qpid::qls_jrnl::efpDataSize_kib_t efpFileSize_kib_,
++ qpid::linearstore::journal::efpPartitionNumber_t efpPartition_,
++ qpid::linearstore::journal::efpDataSize_kib_t efpFileSize_kib_,
+ const bool truncateFlag_,
+ uint32_t wCachePageSizeKib_,
+ uint32_t tplWCachePageSizeKib_)
+@@ -230,7 +230,7 @@ void MessageStoreImpl::init()
+ }
+
+ try {
+- qpid::qls_jrnl::jdir::create_dir(getBdbBaseDir());
++ qpid::linearstore::journal::jdir::create_dir(getBdbBaseDir());
+
+ dbenv.reset(new DbEnv(0));
+ dbenv->set_errpfx("linearstore");
+@@ -282,7 +282,7 @@ void MessageStoreImpl::init()
+ THROW_STORE_EXCEPTION_2("BDB exception occurred while initializing store", e);
+ } catch (const StoreException&) {
+ throw;
+- } catch (const qpid::qls_jrnl::jexception& e) {
++ } catch (const qpid::linearstore::journal::jexception& e) {
+ QLS_LOG(error, "Journal Exception occurred while initializing store: " << e);
+ THROW_STORE_EXCEPTION_2("Journal Exception occurred while initializing store", e.what());
+ } catch (...) {
+@@ -291,7 +291,7 @@ void MessageStoreImpl::init()
+ }
+ } while (!isInit);
+
+- efpMgr.reset(new qpid::qls_jrnl::EmptyFilePoolManager(getStoreTopLevelDir(),
++ efpMgr.reset(new qpid::linearstore::journal::EmptyFilePoolManager(getStoreTopLevelDir(),
+ defaultEfpPartitionNumber,
+ defaultEfpFileSize_kib,
+ jrnlLog));
+@@ -337,9 +337,9 @@ void MessageStoreImpl::truncateInit()
+
+ // TODO: Linearstore: harvest all discareded journal files into the empy file pool(s).
+
+- qpid::qls_jrnl::jdir::delete_dir(getBdbBaseDir());
+- qpid::qls_jrnl::jdir::delete_dir(getJrnlBaseDir());
+- qpid::qls_jrnl::jdir::delete_dir(getTplBaseDir());
++ qpid::linearstore::journal::jdir::delete_dir(getBdbBaseDir());
++ qpid::linearstore::journal::jdir::delete_dir(getJrnlBaseDir());
++ qpid::linearstore::journal::jdir::delete_dir(getTplBaseDir());
+ QLS_LOG(notice, "Store directory " << getStoreTopLevelDir() << " was truncated.");
+ init();
+ }
+@@ -349,7 +349,7 @@ void MessageStoreImpl::chkTplStoreInit()
+ // Prevent multiple threads from late-initializing the TPL
+ qpid::sys::Mutex::ScopedLock sl(tplInitLock);
+ if (!tplStorePtr->is_ready()) {
+- qpid::qls_jrnl::jdir::create_dir(getTplBaseDir());
++ qpid::linearstore::journal::jdir::create_dir(getTplBaseDir());
+ tplStorePtr->initialize(/*tplNumJrnlFiles, false, 0, tplJrnlFsizeSblks,*/ getEmptyFilePool(defaultEfpPartitionNumber, defaultEfpFileSize_kib), tplWCacheNumPages, tplWCachePgSizeSblks);
+ if (mgmtObject.get() != 0) mgmtObject->set_tplIsInitialized(true);
+ }
+@@ -379,7 +379,7 @@ MessageStoreImpl::~MessageStoreImpl()
+ closeDbs();
+ } catch (const DbException& e) {
+ QLS_LOG(error, "Error closing BDB databases: " << e.what());
+- } catch (const qpid::qls_jrnl::jexception& e) {
++ } catch (const qpid::linearstore::journal::jexception& e) {
+ QLS_LOG(error, "Error: " << e.what());
+ } catch (const std::exception& e) {
+ QLS_LOG(error, "Error: " << e.what());
+@@ -420,7 +420,7 @@ void MessageStoreImpl::create(qpid::broker::PersistableQueue& queue_,
+ queue_.setExternalQueueStore(dynamic_cast<qpid::broker::ExternalQueueStore*>(jQueue));
+ try {
+ jQueue->initialize(getEmptyFilePool(args_), wCacheNumPages, wCachePgSizeSblks);
+- } catch (const qpid::qls_jrnl::jexception& e) {
++ } catch (const qpid::linearstore::journal::jexception& e) {
+ THROW_STORE_EXCEPTION(std::string("Queue ") + queue_.getName() + ": create() failed: " + e.what());
+ }
+ try {
+@@ -432,28 +432,28 @@ void MessageStoreImpl::create(qpid::broker::PersistableQueue& queue_,
+ }
+ }
+
+-qpid::qls_jrnl::EmptyFilePool*
+-MessageStoreImpl::getEmptyFilePool(const qpid::qls_jrnl::efpPartitionNumber_t efpPartitionNumber_,
+- const qpid::qls_jrnl::efpDataSize_kib_t efpFileSizeKib_) {
+- qpid::qls_jrnl::EmptyFilePool* efpp = efpMgr->getEmptyFilePool(efpPartitionNumber_, efpFileSizeKib_);
++qpid::linearstore::journal::EmptyFilePool*
++MessageStoreImpl::getEmptyFilePool(const qpid::linearstore::journal::efpPartitionNumber_t efpPartitionNumber_,
++ const qpid::linearstore::journal::efpDataSize_kib_t efpFileSizeKib_) {
++ qpid::linearstore::journal::EmptyFilePool* efpp = efpMgr->getEmptyFilePool(efpPartitionNumber_, efpFileSizeKib_);
+ if (efpp == 0) {
+ std::ostringstream oss;
+ oss << "Partition=" << efpPartitionNumber_ << "; EfpFileSize=" << efpFileSizeKib_ << " KiB";
+- throw qpid::qls_jrnl::jexception(qpid::qls_jrnl::jerrno::JERR_EFP_NOEFP, oss.str(), "MessageStoreImpl", "getEmptyFilePool");
++ throw qpid::linearstore::journal::jexception(qpid::linearstore::journal::jerrno::JERR_EFP_NOEFP, oss.str(), "MessageStoreImpl", "getEmptyFilePool");
+ }
+ return efpp;
+ }
+
+-qpid::qls_jrnl::EmptyFilePool*
++qpid::linearstore::journal::EmptyFilePool*
+ MessageStoreImpl::getEmptyFilePool(const qpid::framing::FieldTable& args_) {
+ qpid::framing::FieldTable::ValuePtr value;
+- qpid::qls_jrnl::efpPartitionNumber_t localEfpPartition = defaultEfpPartitionNumber;
++ qpid::linearstore::journal::efpPartitionNumber_t localEfpPartition = defaultEfpPartitionNumber;
+ value = args_.get("qpid.efp_partition");
+ if (value.get() != 0 && !value->empty() && value->convertsTo<int>()) {
+ localEfpPartition = chkEfpPartition((uint32_t)value->get<int>(), "qpid.efp_partition");
+ }
+
+- qpid::qls_jrnl::efpDataSize_kib_t localEfpFileSizeKib = defaultEfpFileSize_kib;
++ qpid::linearstore::journal::efpDataSize_kib_t localEfpFileSizeKib = defaultEfpFileSize_kib;
+ value = args_.get("qpid.efp_file_size");
+ if (value.get() != 0 && !value->empty() && value->convertsTo<int>()) {
+ localEfpFileSizeKib = chkEfpFileSizeKiB((uint32_t)value->get<int>(),"qpid.efp_file_size" );
+@@ -694,7 +694,6 @@ void MessageStoreImpl::recoverQueues(TxnCtxt& txn,
+ txn_list& prepared,
+ message_index& messages)
+ {
+- QLS_LOG(info, "*** MessageStoreImpl::recoverQueues()");
+ Cursor queues;
+ queues.open(queueDb, txn.get());
+
+@@ -731,7 +730,7 @@ void MessageStoreImpl::recoverQueues(TxnCtxt& txn,
+ long rcnt = 0L; // recovered msg count
+ long idcnt = 0L; // in-doubt msg count
+ uint64_t thisHighestRid = 0ULL;
+- jQueue->recover(boost::dynamic_pointer_cast<qpid::qls_jrnl::EmptyFilePoolManager>(efpMgr), wCacheNumPages, wCachePgSizeSblks, &prepared, thisHighestRid, key.id);
++ jQueue->recover(boost::dynamic_pointer_cast<qpid::linearstore::journal::EmptyFilePoolManager>(efpMgr), wCacheNumPages, wCachePgSizeSblks, &prepared, thisHighestRid, key.id);
+
+ // Check for changes to queue store settings qpid.file_count and qpid.file_size resulting
+ // from recovery of a store that has had its size changed externally by the resize utility.
+@@ -757,7 +756,7 @@ void MessageStoreImpl::recoverQueues(TxnCtxt& txn,
+ recoverMessages(txn, registry, queue, prepared, messages, rcnt, idcnt);
+ QLS_LOG(info, "Recovered queue \"" << queueName << "\": " << rcnt << " messages recovered; " << idcnt << " messages in-doubt.");
+ jQueue->recover_complete(); // start journal.
+- } catch (const qpid::qls_jrnl::jexception& e) {
++ } catch (const qpid::linearstore::journal::jexception& e) {
+ THROW_STORE_EXCEPTION(std::string("Queue ") + queueName + ": recoverQueues() failed: " + e.what());
+ }
+ //read all messages: done on a per queue basis if using Journal
+@@ -869,7 +868,6 @@ void MessageStoreImpl::recoverMessages(TxnCtxt& /*txn*/,
+ long& rcnt,
+ long& idcnt)
+ {
+- QLS_LOG(info, "*** MessageStoreImpl::recoverMessages() queue=\"" << queue->getName() << "\"");
+ size_t preambleLength = sizeof(uint32_t)/*header size*/;
+
+ JournalImpl* jc = static_cast<JournalImpl*>(queue->getExternalQueueStore());
+@@ -894,11 +892,11 @@ void MessageStoreImpl::recoverMessages(TxnCtxt& /*txn*/,
+ try {
+ unsigned aio_sleep_cnt = 0;
+ while (read) {
+- qpid::qls_jrnl::iores res = jc->read_data_record(&dbuff, dbuffSize, &xidbuff, xidbuffSize, transientFlag, externalFlag, &dtok);
++ qpid::linearstore::journal::iores res = jc->read_data_record(&dbuff, dbuffSize, &xidbuff, xidbuffSize, transientFlag, externalFlag, &dtok);
+
+ switch (res)
+ {
+- case qpid::qls_jrnl::RHM_IORES_SUCCESS: {
++ case qpid::linearstore::journal::RHM_IORES_SUCCESS: {
+ msg_count++;
+ qpid::broker::RecoverableMessage::shared_ptr msg;
+ char* data = (char*)dbuff;
+@@ -948,11 +946,11 @@ void MessageStoreImpl::recoverMessages(TxnCtxt& /*txn*/,
+ }
+ } else {
+ // Enqueue and/or dequeue tx
+- qpid::qls_jrnl::txn_map& tmap = jc->get_txn_map();
+- qpid::qls_jrnl::txn_data_list txnList = tmap.get_tdata_list(xid); // txnList will be empty if xid not found
++ qpid::linearstore::journal::txn_map& tmap = jc->get_txn_map();
++ qpid::linearstore::journal::txn_data_list txnList = tmap.get_tdata_list(xid); // txnList will be empty if xid not found
+ bool enq = false;
+ bool deq = false;
+- for (qpid::qls_jrnl::tdl_itr j = txnList.begin(); j<txnList.end(); j++) {
++ for (qpid::linearstore::journal::tdl_itr j = txnList.begin(); j<txnList.end(); j++) {
+ if (j->enq_flag_ && j->rid_ == rid) enq = true;
+ else if (!j->enq_flag_ && j->drid_ == rid) deq = true;
+ }
+@@ -977,21 +975,21 @@ void MessageStoreImpl::recoverMessages(TxnCtxt& /*txn*/,
+ aio_sleep_cnt = 0;
+ break;
+ }
+- case qpid::qls_jrnl::RHM_IORES_PAGE_AIOWAIT:
++ case qpid::linearstore::journal::RHM_IORES_PAGE_AIOWAIT:
+ if (++aio_sleep_cnt > MAX_AIO_SLEEPS)
+ THROW_STORE_EXCEPTION("Timeout waiting for AIO in MessageStoreImpl::recoverMessages()");
+ ::usleep(AIO_SLEEP_TIME_US);
+ break;
+- case qpid::qls_jrnl::RHM_IORES_EMPTY:
++ case qpid::linearstore::journal::RHM_IORES_EMPTY:
+ read = false;
+ break; // done with all messages. (add call in jrnl to test that _emap is empty.)
+ default:
+ std::ostringstream oss;
+- oss << "recoverMessages(): Queue: " << queue->getName() << ": Unexpected return from journal read: " << qpid::qls_jrnl::iores_str(res);
++ oss << "recoverMessages(): Queue: " << queue->getName() << ": Unexpected return from journal read: " << qpid::linearstore::journal::iores_str(res);
+ THROW_STORE_EXCEPTION(oss.str());
+ } // switch
+ } // while
+- } catch (const qpid::qls_jrnl::jexception& e) {
++ } catch (const qpid::linearstore::journal::jexception& e) {
+ THROW_STORE_EXCEPTION(std::string("Queue ") + queue->getName() + ": recoverMessages() failed: " + e.what());
+ }
+ }
+@@ -1000,7 +998,7 @@ qpid::broker::RecoverableMessage::shared_ptr MessageStoreImpl::getExternMessage(
+ uint64_t /*messageId*/,
+ unsigned& /*headerSize*/)
+ {
+- throw qpid::qls_jrnl::jexception(qpid::qls_jrnl::jerrno::JERR__NOTIMPL, "MessageStoreImpl", "getExternMessage");
++ throw qpid::linearstore::journal::jexception(qpid::linearstore::journal::jerrno::JERR__NOTIMPL, "MessageStoreImpl", "getExternMessage");
+ }
+
+ int MessageStoreImpl::enqueueMessage(TxnCtxt& txn_,
+@@ -1036,9 +1034,8 @@ int MessageStoreImpl::enqueueMessage(TxnCtxt& txn_,
+
+ void MessageStoreImpl::readTplStore()
+ {
+- QLS_LOG(info, "*** MessageStoreImpl::readTplStore()");
+ tplRecoverMap.clear();
+- qpid::qls_jrnl::txn_map& tmap = tplStorePtr->get_txn_map();
++ qpid::linearstore::journal::txn_map& tmap = tplStorePtr->get_txn_map();
+ DataTokenImpl dtok;
+ void* dbuff = NULL; size_t dbuffSize = 0;
+ void* xidbuff = NULL; size_t xidbuffSize = 0;
+@@ -1050,9 +1047,9 @@ void MessageStoreImpl::readTplStore()
+ while (!done) {
+ dtok.reset();
+ dtok.set_wstate(DataTokenImpl::ENQ);
+- qpid::qls_jrnl::iores res = tplStorePtr->read_data_record(&dbuff, dbuffSize, &xidbuff, xidbuffSize, transientFlag, externalFlag, &dtok);
++ qpid::linearstore::journal::iores res = tplStorePtr->read_data_record(&dbuff, dbuffSize, &xidbuff, xidbuffSize, transientFlag, externalFlag, &dtok);
+ switch (res) {
+- case qpid::qls_jrnl::RHM_IORES_SUCCESS: {
++ case qpid::linearstore::journal::RHM_IORES_SUCCESS: {
+ // Every TPL record contains both data and an XID
+ assert(dbuffSize>0);
+ assert(xidbuffSize>0);
+@@ -1060,7 +1057,7 @@ void MessageStoreImpl::readTplStore()
+ bool is2PC = *(static_cast<char*>(dbuff)) != 0;
+
+ // Check transaction details; add to recover map
+- qpid::qls_jrnl::txn_data_list txnList = tmap.get_tdata_list(xid); // txnList will be empty if xid not found
++ qpid::linearstore::journal::txn_data_list txnList = tmap.get_tdata_list(xid); // txnList will be empty if xid not found
+ if (!txnList.empty()) { // xid found in tmap
+ unsigned enqCnt = 0;
+ unsigned deqCnt = 0;
+@@ -1070,7 +1067,7 @@ void MessageStoreImpl::readTplStore()
+ // Note: will apply to both 1PC and 2PC transactions.
+ bool commitFlag = true;
+
+- for (qpid::qls_jrnl::tdl_itr j = txnList.begin(); j<txnList.end(); j++) {
++ for (qpid::linearstore::journal::tdl_itr j = txnList.begin(); j<txnList.end(); j++) {
+ if (j->enq_flag_) {
+ rid = j->rid_;
+ enqCnt++;
+@@ -1088,31 +1085,30 @@ void MessageStoreImpl::readTplStore()
+ aio_sleep_cnt = 0;
+ break;
+ }
+- case qpid::qls_jrnl::RHM_IORES_PAGE_AIOWAIT:
++ case qpid::linearstore::journal::RHM_IORES_PAGE_AIOWAIT:
+ if (++aio_sleep_cnt > MAX_AIO_SLEEPS)
+ THROW_STORE_EXCEPTION("Timeout waiting for AIO in MessageStoreImpl::recoverTplStore()");
+ ::usleep(AIO_SLEEP_TIME_US);
+ break;
+- case qpid::qls_jrnl::RHM_IORES_EMPTY:
++ case qpid::linearstore::journal::RHM_IORES_EMPTY:
+ done = true;
+ break; // done with all messages. (add call in jrnl to test that _emap is empty.)
+ default:
+ std::ostringstream oss;
+- oss << "readTplStore(): Unexpected result from journal read: " << qpid::qls_jrnl::iores_str(res);
++ oss << "readTplStore(): Unexpected result from journal read: " << qpid::linearstore::journal::iores_str(res);
+ THROW_STORE_EXCEPTION(oss.str());
+ } // switch
+ }
+- } catch (const qpid::qls_jrnl::jexception& e) {
++ } catch (const qpid::linearstore::journal::jexception& e) {
+ THROW_STORE_EXCEPTION(std::string("TPL recoverTplStore() failed: ") + e.what());
+ }
+ }
+
+ void MessageStoreImpl::recoverTplStore()
+ {
+- QLS_LOG(info, "*** MessageStoreImpl::recoverTplStore()");
+- if (qpid::qls_jrnl::jdir::exists(tplStorePtr->jrnl_dir())) {
++ if (qpid::linearstore::journal::jdir::exists(tplStorePtr->jrnl_dir())) {
+ uint64_t thisHighestRid = 0ULL;
+- tplStorePtr->recover(boost::dynamic_pointer_cast<qpid::qls_jrnl::EmptyFilePoolManager>(efpMgr), tplWCacheNumPages, tplWCachePgSizeSblks, 0, thisHighestRid, 0);
++ tplStorePtr->recover(boost::dynamic_pointer_cast<qpid::linearstore::journal::EmptyFilePoolManager>(efpMgr), tplWCacheNumPages, tplWCachePgSizeSblks, 0, thisHighestRid, 0);
+ if (highestRid == 0ULL)
+ highestRid = thisHighestRid;
+ else if (thisHighestRid - highestRid < 0x8000000000000000ULL) // RFC 1982 comparison for unsigned 64-bit
+@@ -1127,7 +1123,6 @@ void MessageStoreImpl::recoverTplStore()
+
+ void MessageStoreImpl::recoverLockedMappings(txn_list& txns)
+ {
+- QLS_LOG(info, "*** MessageStoreImpl::recoverLockedMappings()");
+ if (!tplStorePtr->is_ready())
+ recoverTplStore();
+
+@@ -1143,7 +1138,6 @@ void MessageStoreImpl::recoverLockedMappings(txn_list& txns)
+
+ void MessageStoreImpl::collectPreparedXids(std::set<std::string>& xids)
+ {
+- QLS_LOG(info, "*** MessageStoreImpl::collectPreparedXids()");
+ if (tplStorePtr->is_ready()) {
+ readTplStore();
+ } else {
+@@ -1158,18 +1152,18 @@ void MessageStoreImpl::collectPreparedXids(std::set<std::string>& xids)
+
+ void MessageStoreImpl::stage(const boost::intrusive_ptr<qpid::broker::PersistableMessage>& /*msg*/)
+ {
+- throw qpid::qls_jrnl::jexception(qpid::qls_jrnl::jerrno::JERR__NOTIMPL, "MessageStoreImpl", "stage");
++ throw qpid::linearstore::journal::jexception(qpid::linearstore::journal::jerrno::JERR__NOTIMPL, "MessageStoreImpl", "stage");
+ }
+
+ void MessageStoreImpl::destroy(qpid::broker::PersistableMessage& /*msg*/)
+ {
+- throw qpid::qls_jrnl::jexception(qpid::qls_jrnl::jerrno::JERR__NOTIMPL, "MessageStoreImpl", "destroy");
++ throw qpid::linearstore::journal::jexception(qpid::linearstore::journal::jerrno::JERR__NOTIMPL, "MessageStoreImpl", "destroy");
+ }
+
+ void MessageStoreImpl::appendContent(const boost::intrusive_ptr<const qpid::broker::PersistableMessage>& /*msg*/,
+ const std::string& /*data*/)
+ {
+- throw qpid::qls_jrnl::jexception(qpid::qls_jrnl::jerrno::JERR__NOTIMPL, "MessageStoreImpl", "appendContent");
++ throw qpid::linearstore::journal::jexception(qpid::linearstore::journal::jerrno::JERR__NOTIMPL, "MessageStoreImpl", "appendContent");
+ }
+
+ void MessageStoreImpl::loadContent(const qpid::broker::PersistableQueue& /*queue*/,
+@@ -1178,7 +1172,7 @@ void MessageStoreImpl::loadContent(const qpid::broker::PersistableQueue& /*queue
+ uint64_t /*offset*/,
+ uint32_t /*length*/)
+ {
+- throw qpid::qls_jrnl::jexception(qpid::qls_jrnl::jerrno::JERR__NOTIMPL, "MessageStoreImpl", "loadContent");
++ throw qpid::linearstore::journal::jexception(qpid::linearstore::journal::jerrno::JERR__NOTIMPL, "MessageStoreImpl", "loadContent");
+ }
+
+ void MessageStoreImpl::flush(const qpid::broker::PersistableQueue& queue_)
+@@ -1193,7 +1187,7 @@ void MessageStoreImpl::flush(const qpid::broker::PersistableQueue& queue_)
+ // TODO: check if this result should be used...
+ /*mrg::journal::iores res =*/ jc->flush();
+ }
+- } catch (const qpid::qls_jrnl::jexception& e) {
++ } catch (const qpid::linearstore::journal::jexception& e) {
+ THROW_STORE_EXCEPTION(std::string("Queue ") + qn + ": flush() failed: " + e.what() );
+ }
+ }
+@@ -1268,7 +1262,7 @@ void MessageStoreImpl::store(const qpid::broker::PersistableQueue* queue_,
+ } else {
+ THROW_STORE_EXCEPTION(std::string("MessageStoreImpl::store() failed: queue NULL."));
+ }
+- } catch (const qpid::qls_jrnl::jexception& e) {
++ } catch (const qpid::linearstore::journal::jexception& e) {
+ THROW_STORE_EXCEPTION(std::string("Queue ") + queue_->getName() + ": MessageStoreImpl::store() failed: " +
+ e.what());
+ }
+@@ -1328,7 +1322,7 @@ void MessageStoreImpl::async_dequeue(qpid::broker::TransactionContext* ctxt_,
+ } else {
+ jc->dequeue_txn_data_record(ddtokp.get(), tid);
+ }
+- } catch (const qpid::qls_jrnl::jexception& e) {
++ } catch (const qpid::linearstore::journal::jexception& e) {
+ ddtokp->release();
+ THROW_STORE_EXCEPTION(std::string("Queue ") + queue_.getName() + ": async_dequeue() failed: " + e.what());
+ }
+diff --git a/qpid/cpp/src/qpid/linearstore/MessageStoreImpl.h b/qpid/cpp/src/qpid/linearstore/MessageStoreImpl.h
+index a136f0b..fd2ab60 100644
+--- a/qpid/cpp/src/qpid/linearstore/MessageStoreImpl.h
++++ b/qpid/cpp/src/qpid/linearstore/MessageStoreImpl.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_MESSAGESTOREIMPL_H
+-#define QPID_LEGACYSTORE_MESSAGESTOREIMPL_H
++#ifndef QPID_LINEARSTORE_MESSAGESTOREIMPL_H
++#define QPID_LINEARSTORE_MESSAGESTOREIMPL_H
+
+ #include <iomanip>
+ #include <string>
+@@ -133,8 +133,8 @@ class MessageStoreImpl : public qpid::broker::MessageStore, public qpid::managem
+ IdSequence generalIdSequence;
+ IdSequence messageIdSequence;
+ std::string storeDir;
+- qpid::qls_jrnl::efpPartitionNumber_t defaultEfpPartitionNumber;
+- qpid::qls_jrnl::efpDataSize_kib_t defaultEfpFileSize_kib;
++ qpid::linearstore::journal::efpPartitionNumber_t defaultEfpPartitionNumber;
++ qpid::linearstore::journal::efpDataSize_kib_t defaultEfpFileSize_kib;
+ bool truncateFlag;
+ uint32_t wCachePgSizeSblks;
+ uint16_t wCacheNumPages;
+@@ -145,7 +145,7 @@ class MessageStoreImpl : public qpid::broker::MessageStore, public qpid::managem
+ const char* envPath;
+ qpid::broker::Broker* broker;
+ JournalLogImpl jrnlLog;
+- boost::shared_ptr<qpid::qls_jrnl::EmptyFilePoolManager> efpMgr;
++ boost::shared_ptr<qpid::linearstore::journal::EmptyFilePoolManager> efpMgr;
+
+ qmf::org::apache::qpid::linearstore::Store::shared_ptr mgmtObject;
+ qpid::management::ManagementAgent* agent;
+@@ -156,9 +156,9 @@ class MessageStoreImpl : public qpid::broker::MessageStore, public qpid::managem
+ const std::string& paramName/*,
+ const uint16_t jrnlFsizePgs*/);
+ static uint16_t getJrnlWrNumPages(const uint32_t wrPageSizeKiB);
+- static qpid::qls_jrnl::efpPartitionNumber_t chkEfpPartition(const qpid::qls_jrnl::efpPartitionNumber_t partition,
++ static qpid::linearstore::journal::efpPartitionNumber_t chkEfpPartition(const qpid::linearstore::journal::efpPartitionNumber_t partition,
+ const std::string& paramName);
+- static qpid::qls_jrnl::efpDataSize_kib_t chkEfpFileSizeKiB(const qpid::qls_jrnl::efpDataSize_kib_t efpFileSizeKiB,
++ static qpid::linearstore::journal::efpDataSize_kib_t chkEfpFileSizeKiB(const qpid::linearstore::journal::efpDataSize_kib_t efpFileSizeKiB,
+ const std::string& paramName);
+
+ void init();
+@@ -233,8 +233,8 @@ class MessageStoreImpl : public qpid::broker::MessageStore, public qpid::managem
+ // journal functions
+ void createJrnlQueue(const qpid::broker::PersistableQueue& queue);
+ std::string getJrnlDir(const std::string& queueName);
+- qpid::qls_jrnl::EmptyFilePool* getEmptyFilePool(const qpid::qls_jrnl::efpPartitionNumber_t p, const qpid::qls_jrnl::efpDataSize_kib_t s);
+- qpid::qls_jrnl::EmptyFilePool* getEmptyFilePool(const qpid::framing::FieldTable& args);
++ qpid::linearstore::journal::EmptyFilePool* getEmptyFilePool(const qpid::linearstore::journal::efpPartitionNumber_t p, const qpid::linearstore::journal::efpDataSize_kib_t s);
++ qpid::linearstore::journal::EmptyFilePool* getEmptyFilePool(const qpid::framing::FieldTable& args);
+ std::string getStoreTopLevelDir();
+ std::string getJrnlBaseDir();
+ std::string getBdbBaseDir();
+@@ -268,8 +268,8 @@ class MessageStoreImpl : public qpid::broker::MessageStore, public qpid::managem
+ bool init(const qpid::Options* options);
+
+ bool init(const std::string& dir,
+- qpid::qls_jrnl::efpPartitionNumber_t efpPartition = defEfpPartition,
+- qpid::qls_jrnl::efpDataSize_kib_t efpFileSizeKib = defEfpFileSizeKib,
++ qpid::linearstore::journal::efpPartitionNumber_t efpPartition = defEfpPartition,
++ qpid::linearstore::journal::efpDataSize_kib_t efpFileSizeKib = defEfpFileSizeKib,
+ const bool truncateFlag = false,
+ uint32_t wCachePageSize = defWCachePageSizeKib,
+ uint32_t tplWCachePageSize = defTplWCachePageSizeKib);
+@@ -365,4 +365,4 @@ class MessageStoreImpl : public qpid::broker::MessageStore, public qpid::managem
+ } // namespace msgstore
+ } // namespace mrg
+
+-#endif // ifndef QPID_LEGACYSTORE_MESSAGESTOREIMPL_H
++#endif // ifndef QPID_LINEARSTORE_MESSAGESTOREIMPL_H
+diff --git a/qpid/cpp/src/qpid/linearstore/PreparedTransaction.h b/qpid/cpp/src/qpid/linearstore/PreparedTransaction.h
+index 9888342..9e401c2 100644
+--- a/qpid/cpp/src/qpid/linearstore/PreparedTransaction.h
++++ b/qpid/cpp/src/qpid/linearstore/PreparedTransaction.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_PREPAREDTRANSACTION_H
+-#define QPID_LEGACYSTORE_PREPAREDTRANSACTION_H
++#ifndef QPID_LINEARSTORE_PREPAREDTRANSACTION_H
++#define QPID_LINEARSTORE_PREPAREDTRANSACTION_H
+
+ #include <list>
+ #include <map>
+@@ -72,4 +72,4 @@ struct PreparedTransaction
+
+ }}
+
+-#endif // ifndef QPID_LEGACYSTORE_PREPAREDTRANSACTION_H
++#endif // ifndef QPID_LINEARSTORE_PREPAREDTRANSACTION_H
+diff --git a/qpid/cpp/src/qpid/linearstore/StoreException.h b/qpid/cpp/src/qpid/linearstore/StoreException.h
+index 9accfd0..5d577d5 100644
+--- a/qpid/cpp/src/qpid/linearstore/StoreException.h
++++ b/qpid/cpp/src/qpid/linearstore/StoreException.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_STOREEXCEPTION_H
+-#define QPID_LEGACYSTORE_STOREEXCEPTION_H
++#ifndef QPID_LINEARSTORE_STOREEXCEPTION_H
++#define QPID_LINEARSTORE_STOREEXCEPTION_H
+
+ #include "qpid/linearstore/IdDbt.h"
+ #include <boost/format.hpp>
+@@ -53,4 +53,4 @@ public:
+
+ }}
+
+-#endif // ifndef QPID_LEGACYSTORE_STOREEXCEPTION_H
++#endif // ifndef QPID_LINEARSTORE_STOREEXCEPTION_H
+diff --git a/qpid/cpp/src/qpid/linearstore/TxnCtxt.cpp b/qpid/cpp/src/qpid/linearstore/TxnCtxt.cpp
+index 022d9c1..945f190 100644
+--- a/qpid/cpp/src/qpid/linearstore/TxnCtxt.cpp
++++ b/qpid/cpp/src/qpid/linearstore/TxnCtxt.cpp
+@@ -52,7 +52,7 @@ void TxnCtxt::commitTxn(JournalImpl* jc, bool commit) {
+ } else {
+ jc->txn_abort(dtokp.get(), getXid());
+ }
+- } catch (const qpid::qls_jrnl::jexception& e) {
++ } catch (const qpid::linearstore::journal::jexception& e) {
+ THROW_STORE_EXCEPTION(std::string("Error commit") + e.what());
+ }
+ }
+@@ -104,10 +104,10 @@ void TxnCtxt::sync() {
+ if (preparedXidStorePtr)
+ jrnl_flush(preparedXidStorePtr);
+ for (ipqItr i = impactedQueues.begin(); i != impactedQueues.end(); i++)
+- jrnl_sync(static_cast<JournalImpl*>(*i), &qpid::qls_jrnl::jcntl::_aio_cmpl_timeout);
++ jrnl_sync(static_cast<JournalImpl*>(*i), &qpid::linearstore::journal::jcntl::_aio_cmpl_timeout);
+ if (preparedXidStorePtr)
+- jrnl_sync(preparedXidStorePtr, &qpid::qls_jrnl::jcntl::_aio_cmpl_timeout);
+- } catch (const qpid::qls_jrnl::jexception& e) {
++ jrnl_sync(preparedXidStorePtr, &qpid::linearstore::journal::jcntl::_aio_cmpl_timeout);
++ } catch (const qpid::linearstore::journal::jexception& e) {
+ THROW_STORE_EXCEPTION(std::string("Error during txn sync: ") + e.what());
+ }
+ }
+@@ -122,7 +122,7 @@ void TxnCtxt::jrnl_sync(JournalImpl* jc, timespec* timeout) {
+ if (!jc || jc->is_txn_synced(getXid()))
+ return;
+ while (jc->get_wr_aio_evt_rem()) {
+- if (jc->get_wr_events(timeout) == qpid::qls_jrnl::jerrno::AIO_TIMEOUT && timeout)
++ if (jc->get_wr_events(timeout) == qpid::linearstore::journal::jerrno::AIO_TIMEOUT && timeout)
+ THROW_STORE_EXCEPTION(std::string("Error: timeout waiting for TxnCtxt::jrnl_sync()"));
+ }
+ }
+diff --git a/qpid/cpp/src/qpid/linearstore/TxnCtxt.h b/qpid/cpp/src/qpid/linearstore/TxnCtxt.h
+index 4c009d7..5a4350b 100644
+--- a/qpid/cpp/src/qpid/linearstore/TxnCtxt.h
++++ b/qpid/cpp/src/qpid/linearstore/TxnCtxt.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_TXNCTXT_H
+-#define QPID_LEGACYSTORE_TXNCTXT_H
++#ifndef QPID_LINEARSTORE_TXNCTXT_H
++#define QPID_LINEARSTORE_TXNCTXT_H
+
+ #include "db-inc.h"
+ #include <memory>
+@@ -112,6 +112,6 @@ class TPCTxnCtxt : public TxnCtxt, public qpid::broker::TPCTransactionContext
+
+ }}
+
+-#endif // ifndef QPID_LEGACYSTORE_TXNCTXT_H
++#endif // ifndef QPID_LINEARSTORE_TXNCTXT_H
+
+
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/AtomicCounter.h b/qpid/cpp/src/qpid/linearstore/jrnl/AtomicCounter.h
+index 82d38e7..7181a43 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/AtomicCounter.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/AtomicCounter.h
+@@ -19,14 +19,15 @@
+ *
+ */
+
+-#ifndef QPID_LINEARSTORE_ATOMICCOUNTER_H_
+-#define QPID_LINEARSTORE_ATOMICCOUNTER_H_
++#ifndef QPID_LINEARSTORE_JOURNAL_ATOMICCOUNTER_H_
++#define QPID_LINEARSTORE_JOURNAL_ATOMICCOUNTER_H_
+
+ #include "qpid/linearstore/jrnl/slock.h"
+ #include <string>
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+
+ template <class T>
+ class AtomicCounter
+@@ -127,6 +128,6 @@ public:
+ }
+ };
+
+-}} // namespace qpid::qls_jrnl
++}}} // namespace qpid::qls_jrnl
+
+-#endif // QPID_LINEARSTORE_ATOMICCOUNTER_H_
++#endif // QPID_LINEARSTORE_JOURNAL_ATOMICCOUNTER_H_
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePool.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePool.cpp
+index 015c2cb..da3d63f 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePool.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePool.cpp
+@@ -38,7 +38,8 @@
+ //#include <iostream> // DEBUG
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+
+ EmptyFilePool::EmptyFilePool(const std::string& efpDirectory,
+ const EmptyFilePoolPartition* partitionPtr,
+@@ -338,4 +339,4 @@ int EmptyFilePool::moveEmptyFile(const std::string& from,
+ return 0;
+ }
+
+-}} // namespace qpid::qls_jrnl
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePool.h b/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePool.h
+index cb6887a..a866d0d 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePool.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePool.h
+@@ -19,15 +19,14 @@
+ *
+ */
+
+-#ifndef QPID_QLS_JRNL_EMPTYFILEPOOL_H_
+-#define QPID_QLS_JRNL_EMPTYFILEPOOL_H_
++#ifndef QPID_LINEARSTORE_JOURNAL_EMPTYFILEPOOL_H_
++#define QPID_LINEARSTORE_JOURNAL_EMPTYFILEPOOL_H_
+
+ namespace qpid {
+-namespace qls_jrnl {
+-
++namespace linearstore {
++namespace journal {
+ class EmptyFilePool;
+-
+-}} // namespace qpid::qls_jrnl
++}}}
+
+ #include <deque>
+ #include "qpid/linearstore/jrnl/EmptyFilePoolTypes.h"
+@@ -35,7 +34,8 @@ namespace qls_jrnl {
+ #include <string>
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+ class EmptyFilePoolPartition;
+ class jdir;
+ class JournalFile;
+@@ -92,6 +92,6 @@ protected:
+ const std::string& toFqPath);
+ };
+
+-}} // namespace qpid::qls_jrnl
++}}}
+
+-#endif /* QPID_QLS_JRNL_EMPTYFILEPOOL_H_ */
++#endif /* QPID_LINEARSTORE_JOURNAL_EMPTYFILEPOOL_H_ */
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolManager.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolManager.cpp
+index 3c2d7d6..4b86023 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolManager.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolManager.cpp
+@@ -31,7 +31,8 @@
+ //#include <iostream> // DEBUG
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+
+ EmptyFilePoolManager::EmptyFilePoolManager(const std::string& qlsStorePath,
+ const efpPartitionNumber_t defaultPartitionNumber,
+@@ -92,8 +93,8 @@ void EmptyFilePoolManager::findEfpPartitions() {
+ }
+
+ journalLogRef_.log(JournalLog::LOG_NOTICE, "EFP Manager initialization complete");
+- std::vector<qpid::qls_jrnl::EmptyFilePoolPartition*> partitionList;
+- std::vector<qpid::qls_jrnl::EmptyFilePool*> filePoolList;
++ std::vector<qpid::linearstore::journal::EmptyFilePoolPartition*> partitionList;
++ std::vector<qpid::linearstore::journal::EmptyFilePool*> filePoolList;
+ getEfpPartitions(partitionList);
+ if (partitionList.size() == 0) {
+ journalLogRef_.log(JournalLog::LOG_WARN, "NO EFP PARTITIONS FOUND! No queue creation is possible.");
+@@ -101,14 +102,14 @@ void EmptyFilePoolManager::findEfpPartitions() {
+ std::stringstream oss;
+ oss << "> EFP Partitions found: " << partitionList.size();
+ journalLogRef_.log(JournalLog::LOG_INFO, oss.str());
+- for (std::vector<qpid::qls_jrnl::EmptyFilePoolPartition*>::const_iterator i=partitionList.begin(); i!= partitionList.end(); ++i) {
++ for (std::vector<qpid::linearstore::journal::EmptyFilePoolPartition*>::const_iterator i=partitionList.begin(); i!= partitionList.end(); ++i) {
+ filePoolList.clear();
+ (*i)->getEmptyFilePools(filePoolList);
+ std::stringstream oss;
+ oss << " * Partition " << (*i)->getPartitionNumber() << " containing " << filePoolList.size()
+ << " pool" << (filePoolList.size()>1 ? "s" : "") << " at \'" << (*i)->getPartitionDirectory() << "\'";
+ journalLogRef_.log(JournalLog::LOG_INFO, oss.str());
+- for (std::vector<qpid::qls_jrnl::EmptyFilePool*>::const_iterator j=filePoolList.begin(); j!=filePoolList.end(); ++j) {
++ for (std::vector<qpid::linearstore::journal::EmptyFilePool*>::const_iterator j=filePoolList.begin(); j!=filePoolList.end(); ++j) {
+ std::ostringstream oss;
+ oss << " - EFP \'" << (*j)->dataSize_kib() << "k\' containing " << (*j)->numEmptyFiles() <<
+ " files of size " << (*j)->dataSize_kib() << " KiB totaling " << (*j)->cumFileSize_kib() << " KiB";
+@@ -208,4 +209,4 @@ uint16_t EmptyFilePoolManager::getNumEfpPartitions() const {
+ return partitionMap_.size();
+ }
+
+-}} // namespace qpid::qls_jrnl
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolManager.h b/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolManager.h
+index d5fab82..1b1f293 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolManager.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolManager.h
+@@ -27,7 +27,8 @@
+ #include "qpid/linearstore/jrnl/smutex.h"
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+
+ class EmptyFilePoolManager
+ {
+@@ -66,6 +67,6 @@ public:
+ uint16_t getNumEfpPartitions() const;
+ };
+
+-}} // namespace qpid::qls_jrnl
++}}}
+
+ #endif /* QPID_QLS_JRNL_EMPTYFILEPOOLMANAGER_H_ */
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolPartition.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolPartition.cpp
+index d38db60..2d84ba4 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolPartition.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolPartition.cpp
+@@ -31,7 +31,8 @@
+ //#include <iostream> // DEBUG
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+
+ // static
+ const std::string EmptyFilePoolPartition::s_efpTopLevelDir_("efp"); // Sets the top-level efp dir within a partition
+@@ -151,4 +152,4 @@ void EmptyFilePoolPartition::validatePartitionDir() {
+ // TODO: other validity checks here
+ }
+
+-}} // namespace qpid::qls_jrnl
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolPartition.h b/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolPartition.h
+index a9ca36d..9a2b5a5 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolPartition.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolPartition.h
+@@ -19,15 +19,14 @@
+ *
+ */
+
+-#ifndef QPID_QLS_JRNL_EMPTYFILEPOOLPARTITION_H_
+-#define QPID_QLS_JRNL_EMPTYFILEPOOLPARTITION_H_
++#ifndef QPID_LINEARSTORE_JOURNAL_EMPTYFILEPOOLPARTITION_H_
++#define QPID_LINEARSTORE_JOURNAL_EMPTYFILEPOOLPARTITION_H_
+
+ namespace qpid {
+-namespace qls_jrnl {
+-
++namespace linearstore {
++namespace journal {
+ class EmptyFilePoolPartition;
+-
+-}} // namespace qpid::qls_jrnl
++}}}
+
+ #include "qpid/linearstore/jrnl/EmptyFilePool.h"
+ #include "qpid/linearstore/jrnl/EmptyFilePoolTypes.h"
+@@ -37,7 +36,8 @@ namespace qls_jrnl {
+ #include <vector>
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+ class JournalLog;
+
+ class EmptyFilePoolPartition
+@@ -75,6 +75,6 @@ protected:
+ void validatePartitionDir();
+ };
+
+-}} // namespace qpid::qls_jrnl
++}}}
+
+-#endif /* QPID_QLS_JRNL_EMPTYFILEPOOLPARTITION_H_ */
++#endif /* QPID_LINEARSTORE_JOURNAL_EMPTYFILEPOOLPARTITION_H_ */
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolTypes.h b/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolTypes.h
+index 2f9693f..d8e8225 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolTypes.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/EmptyFilePoolTypes.h
+@@ -19,15 +19,16 @@
+ *
+ */
+
+-#ifndef QPID_QLS_JRNL_EMPTYFILEPOOLTYPES_H_
+-#define QPID_QLS_JRNL_EMPTYFILEPOOLTYPES_H_
++#ifndef QPID_LINEARSTORE_JOURNAL_EMPTYFILEPOOLTYPES_H_
++#define QPID_LINEARSTORE_JOURNAL_EMPTYFILEPOOLTYPES_H_
+
+ #include <iostream>
+ #include <stdint.h>
+ #include <utility> // std::pair
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+
+ typedef uint64_t efpDataSize_kib_t; ///< Size of data part of file (excluding file header) in kib
+ typedef uint64_t efpFileSize_kib_t; ///< Size of file (header + data) in kib
+@@ -41,9 +42,10 @@ typedef struct efpIdentity_t {
+ efpDataSize_kib_t ds_;
+ efpIdentity_t() : pn_(0), ds_(0) {}
+ efpIdentity_t(efpPartitionNumber_t pn, efpDataSize_kib_t ds) : pn_(pn), ds_(ds) {}
++ efpIdentity_t(const efpIdentity_t& ei) : pn_(ei.pn_), ds_(ei.ds_) {}
+ friend std::ostream& operator<<(std::ostream& os, efpIdentity_t& id) { os << "[" << id.pn_ << "," << id.ds_ << "]"; return os; }
+ } efpIdentity_t;
+
+-}} // namespace qpid::qls_jrnl
++}}}
+
+-#endif /* QPID_QLS_JRNL_EMPTYFILEPOOLTYPES_H_ */
++#endif /* QPID_LINEARSTORE_JOURNAL_EMPTYFILEPOOLTYPES_H_ */
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/JournalFile.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/JournalFile.cpp
+index 3de7b6c..1e6c10e 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/JournalFile.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/JournalFile.cpp
+@@ -31,18 +31,23 @@
+ //#include <iostream> // DEBUG
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+
+ JournalFile::JournalFile(const std::string& fqFileName,
+- const ::file_hdr_t& fileHeader) :
++ const efpIdentity_t& efpIdentity,
++ const uint64_t fileSeqNum) :
++ efpIdentity_(efpIdentity),
+ fqFileName_(fqFileName),
+- fileSeqNum_(fileHeader._file_number),
++ fileSeqNum_(fileSeqNum),
++ serial_(getRandom64()),
++ firstRecordOffset_(0ULL),
+ fileHandle_(-1),
+ fileCloseFlag_(false),
+ fileHeaderBasePtr_ (0),
+ fileHeaderPtr_(0),
+ aioControlBlockPtr_(0),
+- fileSize_dblks_(((fileHeader._data_size_kib * 1024) + (QLS_JRNL_FHDR_RES_SIZE_SBLKS * QLS_SBLK_SIZE_BYTES)) / QLS_DBLK_SIZE_BYTES),
++ fileSize_dblks_(((efpIdentity.ds_ * 1024) + (QLS_JRNL_FHDR_RES_SIZE_SBLKS * QLS_SBLK_SIZE_BYTES)) / QLS_DBLK_SIZE_BYTES),
+ enqueuedRecordCount_("JournalFile::enqueuedRecordCount", 0),
+ submittedDblkCount_("JournalFile::submittedDblkCount", 0),
+ completedDblkCount_("JournalFile::completedDblkCount", 0),
+@@ -50,16 +55,18 @@ JournalFile::JournalFile(const std::string& fqFileName,
+ {}
+
+ JournalFile::JournalFile(const std::string& fqFileName,
+- const uint64_t fileSeqNum,
+- const efpDataSize_kib_t efpDataSize_kib) :
++ const ::file_hdr_t& fileHeader) :
++ efpIdentity_(fileHeader._efp_partition, fileHeader._data_size_kib),
+ fqFileName_(fqFileName),
+- fileSeqNum_(fileSeqNum),
++ fileSeqNum_(fileHeader._file_number),
++ serial_(fileHeader._rhdr._serial),
++ firstRecordOffset_(fileHeader._fro),
+ fileHandle_(-1),
+ fileCloseFlag_(false),
+ fileHeaderBasePtr_ (0),
+ fileHeaderPtr_(0),
+ aioControlBlockPtr_(0),
+- fileSize_dblks_(((efpDataSize_kib * 1024) + (QLS_JRNL_FHDR_RES_SIZE_SBLKS * QLS_SBLK_SIZE_BYTES)) / QLS_DBLK_SIZE_BYTES),
++ fileSize_dblks_(((fileHeader._data_size_kib * 1024) + (QLS_JRNL_FHDR_RES_SIZE_SBLKS * QLS_SBLK_SIZE_BYTES)) / QLS_DBLK_SIZE_BYTES),
+ enqueuedRecordCount_("JournalFile::enqueuedRecordCount", 0),
+ submittedDblkCount_("JournalFile::submittedDblkCount", 0),
+ completedDblkCount_("JournalFile::completedDblkCount", 0),
+@@ -108,6 +115,10 @@ uint64_t JournalFile::getFileSeqNum() const {
+ return fileSeqNum_;
+ }
+
++uint64_t JournalFile::getSerial() const {
++ return serial_;
++}
++
+ int JournalFile::open() {
+ fileHandle_ = ::open(fqFileName_.c_str(), O_WRONLY | O_DIRECT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); // 0644 -rw-r--r--
+ if (fileHandle_ < 0) {
+@@ -141,10 +152,12 @@ void JournalFile::asyncFileHeaderWrite(io_context_t ioContextPtr,
+ const uint64_t recordId,
+ const uint64_t firstRecordOffset,
+ const std::string queueName) {
++ firstRecordOffset_ = firstRecordOffset;
+ ::file_hdr_create(fileHeaderPtr_, QLS_FILE_MAGIC, QLS_JRNL_VERSION, QLS_JRNL_FHDR_RES_SIZE_SBLKS, efpPartitionNumber, efpDataSize_kib);
+ ::file_hdr_init(fileHeaderBasePtr_,
+ QLS_JRNL_FHDR_RES_SIZE_SBLKS * QLS_SBLK_SIZE_KIB * 1024,
+ userFlags,
++ serial_,
+ recordId,
+ firstRecordOffset,
+ fileSeqNum_,
+@@ -208,6 +221,18 @@ uint16_t JournalFile::decrOutstandingAioOperationCount() {
+ return r;
+ }
+
++efpIdentity_t JournalFile::getEfpIdentity() const {
++ return efpIdentity_;
++}
++
++uint64_t JournalFile::getFirstRecordOffset() const {
++ return firstRecordOffset_;
++}
++
++void JournalFile::setFirstRecordOffset(const uint64_t firstRecordOffset) {
++ firstRecordOffset_ = firstRecordOffset;
++}
++
+ // --- Status helper functions ---
+
+ bool JournalFile::isEmpty() const {
+@@ -253,6 +278,22 @@ const std::string JournalFile::getFileName() const {
+ return fqFileName_.substr(fqFileName_.rfind('/')+1);
+ }
+
++//static
++uint64_t JournalFile::getRandom64() {
++ int randomData = ::open("/dev/random", O_RDONLY);
++ if (randomData < 0) {
++ throw jexception(); // TODO: Complete exception details
++ }
++ uint64_t randomNumber;
++ ::size_t size = sizeof(randomNumber);
++ ::ssize_t result = ::read(randomData, (char*)&randomNumber, size);
++ if (result < 0 || result != ssize_t(size)) {
++ throw jexception(); // TODO: Complete exception details
++ }
++ ::close(randomData);
++ return randomNumber;
++}
++
+ bool JournalFile::isOpen() const {
+ return fileHandle_ >= 0;
+ }
+@@ -298,4 +339,4 @@ bool JournalFile::isFullAndComplete() const {
+ }
+
+
+-}} // namespace qpid::qls_jrnl
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/JournalFile.h b/qpid/cpp/src/qpid/linearstore/jrnl/JournalFile.h
+index 0abbc7b..687b2c4 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/JournalFile.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/JournalFile.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LINEARSTORE_JOURNALFILE_H_
+-#define QPID_LINEARSTORE_JOURNALFILE_H_
++#ifndef QPID_LINEARSTORE_JOURNAL_JOURNALFILE_H_
++#define QPID_LINEARSTORE_JOURNAL_JOURNALFILE_H_
+
+ #include "qpid/linearstore/jrnl/aio.h"
+ #include "qpid/linearstore/jrnl/AtomicCounter.h"
+@@ -31,13 +31,17 @@
+ class file_hdr_t;
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+
+ class JournalFile
+ {
+ protected:
++ const efpIdentity_t efpIdentity_;
+ const std::string fqFileName_;
+ const uint64_t fileSeqNum_;
++ const uint64_t serial_;
++ uint64_t firstRecordOffset_;
+ int fileHandle_;
+ bool fileCloseFlag_;
+ void* fileHeaderBasePtr_;
+@@ -51,11 +55,13 @@ protected:
+ AtomicCounter<uint16_t> outstandingAioOpsCount_; ///< Outstanding AIO operations on this file
+
+ public:
++ // Constructor for creating new file with known fileSeqNum and random serial
+ JournalFile(const std::string& fqFileName,
+- const ::file_hdr_t& fileHeader);
++ const efpIdentity_t& efpIdentity,
++ const uint64_t fileSeqNum);
++ // Constructor for recovery in which fileSeqNum and serial are recovered from fileHeader param
+ JournalFile(const std::string& fqFileName,
+- const uint64_t fileSeqNum,
+- const efpDataSize_kib_t efpDataSize_kib);
++ const ::file_hdr_t& fileHeader);
+ virtual ~JournalFile();
+
+ void initialize(const uint32_t completedDblkCount);
+@@ -63,6 +69,7 @@ public:
+
+ const std::string getFqFileName() const;
+ uint64_t getFileSeqNum() const;
++ uint64_t getSerial() const;
+
+ int open();
+ void close();
+@@ -87,6 +94,10 @@ public:
+ uint16_t getOutstandingAioOperationCount() const;
+ uint16_t decrOutstandingAioOperationCount();
+
++ efpIdentity_t getEfpIdentity() const;
++ uint64_t getFirstRecordOffset() const;
++ void setFirstRecordOffset(const uint64_t firstRecordOffset);
++
+ // Status helper functions
+ bool isEmpty() const; ///< True if no writes of any kind have occurred
+ bool isNoEnqueuedRecordsRemaining() const; ///< True when all enqueued records (or parts) have been dequeued
+@@ -97,6 +108,7 @@ public:
+ protected:
+ const std::string getDirectory() const;
+ const std::string getFileName() const;
++ static uint64_t getRandom64();
+ bool isOpen() const;
+
+ uint32_t getSubmittedDblkCount() const;
+@@ -114,6 +126,6 @@ protected:
+ bool isFullAndComplete() const; ///< True if all submitted dblks have returned from AIO
+ };
+
+-}} // namespace qpid::qls_jrnl
++}}}
+
+-#endif // QPID_LINEARSTORE_JOURNALFILE_H_
++#endif // QPID_LINEARSTORE_JOURNAL_JOURNALFILE_H_
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/JournalLog.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/JournalLog.cpp
+index 15222e3..96a6432 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/JournalLog.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/JournalLog.cpp
+@@ -23,7 +23,8 @@
+ #include <iostream>
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+
+ JournalLog::JournalLog(log_level_t logLevelThreshold) : logLevelThreshold_(logLevelThreshold) {}
+
+@@ -58,4 +59,4 @@ const char* JournalLog::log_level_str(log_level_t logLevel) {
+ return "<log level unknown>";
+ }
+
+-}} // namespace qpid::qls_jrnl
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/JournalLog.h b/qpid/cpp/src/qpid/linearstore/jrnl/JournalLog.h
+index b5fcdbc..cf503cb 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/JournalLog.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/JournalLog.h
+@@ -19,13 +19,14 @@
+ *
+ */
+
+-#ifndef QPID_LINEARSTORE_JOURNALLOG_H_
+-#define QPID_LINEARSTORE_JOURNALLOG_H_
++#ifndef QPID_LINEARSTORE_JOURNAL_JOURNALLOG_H_
++#define QPID_LINEARSTORE_JOURNAL_JOURNALLOG_H_
+
+ #include <string>
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+
+ class JournalLog
+ {
+@@ -54,6 +55,6 @@ public:
+ static const char* log_level_str(const log_level_t logLevel);
+ };
+
+-}} // namespace qpid::qls_jrnl
++}}}
+
+-#endif // QPID_LINEARSTORE_JOURNALLOG_H_
++#endif // QPID_LINEARSTORE_JOURNAL_JOURNALLOG_H_
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/LinearFileController.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/LinearFileController.cpp
+index 2c1327d..9daebab 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/LinearFileController.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/LinearFileController.cpp
+@@ -32,7 +32,8 @@
+ //#include <iostream> // DEBUG
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+
+ LinearFileController::LinearFileController(jcntl& jcntlRef) :
+ jcntlRef_(jcntlRef),
+@@ -90,7 +91,7 @@ void LinearFileController::pullEmptyFileFromEfp() {
+ currentJournalFilePtr_->close();
+ std::string ef = emptyFilePoolPtr_->takeEmptyFile(journalDirectory_); // Moves file from EFP only, returns new file name
+ //std::cout << "*** LinearFileController::pullEmptyFileFromEfp() qn=" << jcntlRef.id() << " ef=" << ef << std::endl; // DEBUG
+- addJournalFile(ef, getNextFileSeqNum(), emptyFilePoolPtr_->dataSize_kib(), 0);
++ addJournalFile(ef, emptyFilePoolPtr_->getIdentity(), getNextFileSeqNum(), 0);
+ }
+
+ void LinearFileController::purgeEmptyFilesToEfp() {
+@@ -149,6 +150,11 @@ uint64_t LinearFileController::getCurrentFileSeqNum() const {
+ return currentJournalFilePtr_->getFileSeqNum();
+ }
+
++uint64_t LinearFileController::getCurrentSerial() const {
++ assertCurrentJournalFileValid("getCurrentSerial");
++ return currentJournalFilePtr_->getSerial();
++}
++
+ bool LinearFileController::isEmpty() const {
+ assertCurrentJournalFileValid("isEmpty");
+ return currentJournalFilePtr_->isEmpty();
+@@ -173,10 +179,10 @@ const std::string LinearFileController::status(const uint8_t indentDepth) const
+ // --- protected functions ---
+
+ void LinearFileController::addJournalFile(const std::string& fileName,
++ const efpIdentity_t& efpIdentity,
+ const uint64_t fileNumber,
+- const uint32_t fileSize_kib,
+ const uint32_t completedDblkCount) {
+- JournalFile* jfp = new JournalFile(fileName, fileNumber, fileSize_kib);
++ JournalFile* jfp = new JournalFile(fileName, efpIdentity, fileNumber);
+ addJournalFile(jfp, completedDblkCount);
+ }
+
+@@ -219,4 +225,4 @@ void LinearFileController::purgeEmptyFilesToEfpNoLock() {
+ }
+ }
+
+-}} // namespace qpid::qls_jrnl
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/LinearFileController.h b/qpid/cpp/src/qpid/linearstore/jrnl/LinearFileController.h
+index 83d360d..1e8d9c9 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/LinearFileController.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/LinearFileController.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LINEARSTORE_LINEARFILECONTROLLER_H_
+-#define QPID_LINEARSTORE_LINEARFILECONTROLLER_H_
++#ifndef QPID_LINEARSTORE_JOURNAL_LINEARFILECONTROLLER_H_
++#define QPID_LINEARSTORE_JOURNAL_LINEARFILECONTROLLER_H_
+
+ #include <deque>
+ #include "qpid/linearstore/jrnl/AtomicCounter.h"
+@@ -31,7 +31,8 @@ typedef struct io_context* io_context_t;
+ typedef struct iocb aio_cb;
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+
+ class EmptyFilePool;
+ class jcntl;
+@@ -90,6 +91,7 @@ public:
+ uint32_t dataSize_dblks);
+
+ uint64_t getCurrentFileSeqNum() const;
++ uint64_t getCurrentSerial() const;
+ bool isEmpty() const;
+
+ // Debug aid
+@@ -97,8 +99,8 @@ public:
+
+ protected:
+ void addJournalFile(const std::string& fileName,
++ const efpIdentity_t& efpIdentity,
+ const uint64_t fileNumber,
+- const uint32_t fileSize_kib,
+ const uint32_t completedDblkCount);
+ void assertCurrentJournalFileValid(const char* const functionName) const;
+ bool checkCurrentJournalFileValid() const;
+@@ -110,6 +112,6 @@ protected:
+ typedef void (LinearFileController::*lfcAddJournalFileFn)(JournalFile* journalFilePtr,
+ const uint32_t completedDblkCount);
+
+-}} // namespace qpid::qls_jrnl
++}}}
+
+-#endif // QPID_LINEARSTORE_LINEARFILECONTROLLER_H_
++#endif // QPID_LINEARSTORE_JOURNAL_LINEARFILECONTROLLER_H_
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/RecoveryManager.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/RecoveryManager.cpp
+index cba5607..361ee1a 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/RecoveryManager.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/RecoveryManager.cpp
+@@ -44,8 +44,8 @@
+ #include <vector>
+
+ namespace qpid {
+-namespace qls_jrnl
+-{
++namespace linearstore {
++namespace journal {
+
+ RecoveryManager::RecoveryManager(const std::string& journalDirectory,
+ const std::string& queuename,
+@@ -63,6 +63,7 @@ RecoveryManager::RecoveryManager(const std::string& journalDirectory,
+ highestRecordId_(0ULL),
+ highestFileNumber_(0ULL),
+ lastFileFullFlag_(false),
++ currentSerial_(0),
+ efpFileSize_kib_(0)
+ {}
+
+@@ -154,9 +155,10 @@ bool RecoveryManager::readNextRemainingRecord(void** const dataPtrPtr,
+ }
+ enq_map::emap_data_struct_t eds;
+ enqueueMapRef_.get_data(*recordIdListConstItr_, eds);
+- uint64_t fileNumber = eds._pfid;
+- currentJournalFileConstItr_ = fileNumberMap_.find(fileNumber);
+- getNextFile(false);
++ if (!inFileStream_.is_open() || currentJournalFileConstItr_->first != eds._pfid) {
++ getFile(eds._pfid, false);
++ }
++//std::cout << " " << eds._pfid << std::hex << ",0x" << eds._file_posn << std::flush; // DEBUG
+
+ inFileStream_.seekg(eds._file_posn, std::ifstream::beg);
+ if (!inFileStream_.good()) {
+@@ -174,7 +176,10 @@ bool RecoveryManager::readNextRemainingRecord(void** const dataPtrPtr,
+ // check flags
+ transient = ::is_enq_transient(&enqueueHeader);
+ external = ::is_enq_external(&enqueueHeader);
+-
++//char magicBuff[5]; // DEBUG
++//::memcpy(magicBuff, &enqueueHeader, 4); // DEBUG
++//magicBuff[4] = 0; // DEBUG
++//std::cout << std::hex << ":" << (char*)magicBuff << ",rid=0x" << enqueueHeader._rhdr._rid << ",xs=0x" << enqueueHeader._xidsize << ",ds=0x" << enqueueHeader._dsize << std::dec << std::flush; // DEBUG
+ // read xid
+ xidSize = enqueueHeader._xidsize;
+ *xidPtrPtr = ::malloc(xidSize);
+@@ -217,57 +222,75 @@ void RecoveryManager::setLinearFileControllerJournals(lfcAddJournalFileFn fnPtr,
+ }
+ }
+
+-std::string RecoveryManager::toString(const std::string& jid,
+- bool compact) {
++std::string RecoveryManager::toString(const std::string& jid) {
+ std::ostringstream oss;
+- if (compact) {
+- oss << "Recovery journal analysis (jid=\"" << jid << "\"):";
+- oss << " jfl=[";
+- for (fileNumberMapConstItr_t i=fileNumberMap_.begin(); i!=fileNumberMap_.end(); ++i) {
+- if (i!=fileNumberMap_.begin()) {
+- oss << " ";
+- }
+- std::string fqFileName = i->second->getFqFileName();
+- oss << i->first << ":" << fqFileName.substr(fqFileName.rfind('/')+1);
+- }
+- oss << "] ecl=[ ";
+- for (fileNumberMapConstItr_t j=fileNumberMap_.begin(); j!=fileNumberMap_.end(); ++j) {
+- if (j!=fileNumberMap_.begin()) {
+- oss << " ";
+- }
+- oss << j->second->getEnqueuedRecordCount();
++ oss << "Recovery journal analysis (jid=\"" << jid << "\"):" << std::endl;
++ oss << " Number of journal files = " << fileNumberMap_.size() << std::endl;
++ oss << " Journal File List:" << std::endl;
++ for (fileNumberMapConstItr_t k=fileNumberMap_.begin(); k!=fileNumberMap_.end(); ++k) {
++ std::string fqFileName = k->second->getFqFileName();
++ oss << " " << k->first << ": " << fqFileName.substr(fqFileName.rfind('/')+1) << std::endl;
++ }
++ oss << " Enqueue Counts: [ ";
++ for (fileNumberMapConstItr_t l=fileNumberMap_.begin(); l!=fileNumberMap_.end(); ++l) {
++ if (l != fileNumberMap_.begin()) {
++ oss << ", ";
+ }
+- oss << " ] empty=" << (journalEmptyFlag_ ? "T" : "F");
+- oss << " fro=0x" << std::hex << firstRecordOffset_ << std::dec << " (" << (firstRecordOffset_/QLS_DBLK_SIZE_BYTES) << " dblks)";
+- oss << " eo=0x" << std::hex << endOffset_ << std::dec << " (" << (endOffset_/QLS_DBLK_SIZE_BYTES) << " dblks)";
+- oss << " hrid=0x" << std::hex << highestRecordId_ << std::dec;
+- oss << " hfnum=0x" << std::hex << highestFileNumber_ << std::dec;
+- oss << " lffull=" << (lastFileFullFlag_ ? "T" : "F");
++ oss << l->second->getEnqueuedRecordCount();
++ }
++ oss << " ]" << std::endl;
++ oss << " Journal empty = " << (journalEmptyFlag_ ? "TRUE" : "FALSE") << std::endl;
++ oss << " First record offset in first file = 0x" << std::hex << firstRecordOffset_ <<
++ std::dec << " (" << (firstRecordOffset_/QLS_DBLK_SIZE_BYTES) << " dblks)" << std::endl;
++ oss << " End offset = 0x" << std::hex << endOffset_ << std::dec << " (" <<
++ (endOffset_/QLS_DBLK_SIZE_BYTES) << " dblks)" << std::endl;
++ oss << " Highest rid = 0x" << std::hex << highestRecordId_ << std::dec << std::endl;
++ oss << " Highest file number = 0x" << std::hex << highestFileNumber_ << std::dec << std::endl;
++ oss << " Last file full = " << (lastFileFullFlag_ ? "TRUE" : "FALSE") << std::endl;
++ oss << " Enqueued records (txn & non-txn):" << std::endl;
++ return oss.str();
++}
++
++std::string RecoveryManager::toLog(const std::string& jid, const int indent) {
++ std::string indentStr(indent, ' ');
++ std::ostringstream oss;
++ oss << std::endl << indentStr << "Journal recovery analysis (jid=\"" << jid << "\"):" << std::endl;
++ if (journalEmptyFlag_) {
++ oss << indentStr << "<Journal empty, no journal files found>" << std::endl;
+ } else {
+- oss << "Recovery journal analysis (jid=\"" << jid << "\"):" << std::endl;
+- oss << " Number of journal files = " << fileNumberMap_.size() << std::endl;
+- oss << " Journal File List:" << std::endl;
++ oss << indentStr << std::setw(7) << "file_id"
++ << std::setw(43) << "file_name"
++ << std::setw(16) << "fro"
++ << std::setw(12) << "record_cnt"
++ << std::setw(5) << "ptn"
++ << std::setw(10) << "efp"
++ << std::endl;
++ oss << indentStr << std::setw(7) << "-------"
++ << std::setw(43) << "-----------------------------------------"
++ << std::setw(16) << "--------------"
++ << std::setw(12) << "----------"
++ << std::setw(5) << "---"
++ << std::setw(10) << "--------"
++ << std::endl;
+ for (fileNumberMapConstItr_t k=fileNumberMap_.begin(); k!=fileNumberMap_.end(); ++k) {
+ std::string fqFileName = k->second->getFqFileName();
+- oss << " " << k->first << ": " << fqFileName.substr(fqFileName.rfind('/')+1) << std::endl;
+- }
+- oss << " Enqueue Counts: [ " << std::endl;
+- for (fileNumberMapConstItr_t l=fileNumberMap_.begin(); l!=fileNumberMap_.end(); ++l) {
+- if (l != fileNumberMap_.begin()) {
+- oss << ", ";
+- }
+- oss << l->second->getEnqueuedRecordCount();
++ std::ostringstream fro;
++ fro << std::hex << "0x" << k->second->getFirstRecordOffset();
++ oss << indentStr << std::setw(7) << k->first
++ << std::setw(43) << fqFileName.substr(fqFileName.rfind('/')+1)
++ << std::setw(16) << fro.str()
++ << std::setw(12) << k->second->getEnqueuedRecordCount()
++ << std::setw(5) << k->second->getEfpIdentity().pn_
++ << std::setw(9) << k->second->getEfpIdentity().ds_ << "k"
++ << std::endl;
+ }
+- oss << " ]" << std::endl;
+- oss << " Journal empty = " << (journalEmptyFlag_ ? "TRUE" : "FALSE") << std::endl;
+- oss << " First record offset in first file = 0x" << std::hex << firstRecordOffset_ <<
++ oss << indentStr << "First record offset in first file = 0x" << std::hex << firstRecordOffset_ <<
+ std::dec << " (" << (firstRecordOffset_/QLS_DBLK_SIZE_BYTES) << " dblks)" << std::endl;
+- oss << " End offset = 0x" << std::hex << endOffset_ << std::dec << " (" <<
++ oss << indentStr << "End offset in last file = 0x" << std::hex << endOffset_ << std::dec << " (" <<
+ (endOffset_/QLS_DBLK_SIZE_BYTES) << " dblks)" << std::endl;
+- oss << " Highest rid = 0x" << std::hex << highestRecordId_ << std::dec << std::endl;
+- oss << " Highest file number = 0x" << std::hex << highestFileNumber_ << std::dec << std::endl;
+- oss << " Last file full = " << (lastFileFullFlag_ ? "TRUE" : "FALSE") << std::endl;
+- oss << " Enqueued records (txn & non-txn):" << std::endl;
++ oss << indentStr << "Highest rid found = 0x" << std::hex << highestRecordId_ << std::dec << std::endl;
++ oss << indentStr << "Last file full = " << (lastFileFullFlag_ ? "TRUE" : "FALSE") << std::endl;
++ oss << indentStr << "Enqueued records (txn & non-txn):";
+ }
+ return oss.str();
+ }
+@@ -355,9 +378,9 @@ void RecoveryManager::checkJournalAlignment(const std::streampos recordPosition)
+ }
+
+ bool RecoveryManager::decodeRecord(jrec& record,
+- std::size_t& cumulativeSizeRead,
+- ::rec_hdr_t& headerRecord,
+- std::streampos& fileOffset)
++ std::size_t& cumulativeSizeRead,
++ ::rec_hdr_t& headerRecord,
++ std::streampos& fileOffset)
+ {
+ std::streampos start_file_offs = fileOffset;
+
+@@ -370,15 +393,18 @@ bool RecoveryManager::decodeRecord(jrec& record,
+ bool done = false;
+ while (!done) {
+ try {
+- done = record.rcv_decode(headerRecord, &inFileStream_, cumulativeSizeRead);
++ done = record.decode(headerRecord, &inFileStream_, cumulativeSizeRead);
+ }
+ catch (const jexception& e) {
++ journalLogRef_.log(JournalLog::LOG_INFO, queueName_, e.what());
+ checkJournalAlignment(start_file_offs);
+ return false;
+ }
+- if (!done && !getNextFile(false)) {
+- checkJournalAlignment(start_file_offs);
+- return false;
++ if (!done && needNextFile()) {
++ if (!getNextFile(false)) {
++ checkJournalAlignment(start_file_offs);
++ return false;
++ }
+ }
+ }
+ return true;
+@@ -392,45 +418,50 @@ uint64_t RecoveryManager::getCurrentFileNumber() const {
+ return currentJournalFileConstItr_->first;
+ }
+
+-bool RecoveryManager::getNextFile(bool jumpToFirstRecordOffsetFlag) {
++bool RecoveryManager::getFile(const uint64_t fileNumber, bool jumpToFirstRecordOffsetFlag) {
+ if (inFileStream_.is_open()) {
+- if (inFileStream_.eof() || !inFileStream_.good()) {
+- inFileStream_.clear();
+- endOffset_ = inFileStream_.tellg(); // remember file offset before closing
+- if (endOffset_ == -1) {
+- std::ostringstream oss;
+- oss << "tellg() failure: fail=" << (inFileStream_.fail()?"T":"F") << " bad=" << (inFileStream_.bad()?"T":"F");
+- throw jexception(jerrno::JERR_RCVM_STREAMBAD, oss.str(), "RecoveryManager", "getNextFile");
+- }
+- inFileStream_.close();
+- if (++currentJournalFileConstItr_ == fileNumberMap_.end()) {
+- return false;
+- }
+- }
+- }
+- if (!inFileStream_.is_open()) {
++ inFileStream_.close();
++//std::cout << " f=" << getCurrentFileName() << "]" << std::flush; // DEBUG
+ inFileStream_.clear(); // clear eof flag, req'd for older versions of c++
+- inFileStream_.open(getCurrentFileName().c_str(), std::ios_base::in | std::ios_base::binary);
+- if (!inFileStream_.good()) {
+- throw jexception(jerrno::JERR__FILEIO, getCurrentFileName(), "RecoveryManager", "getNextFile");
+- }
++ }
++ currentJournalFileConstItr_ = fileNumberMap_.find(fileNumber);
++ if (currentJournalFileConstItr_ == fileNumberMap_.end()) {
++ return false;
++ }
++ inFileStream_.open(getCurrentFileName().c_str(), std::ios_base::in | std::ios_base::binary);
++ if (!inFileStream_.good()) {
++ throw jexception(jerrno::JERR__FILEIO, getCurrentFileName(), "RecoveryManager", "getFile");
++ }
++//std::cout << " [F=" << getCurrentFileName() << std::flush; // DEBUG
+
+- // Read file header
+- file_hdr_t fhdr;
+- inFileStream_.read((char*)&fhdr, sizeof(fhdr));
+- checkFileStreamOk(true);
+- if (fhdr._rhdr._magic == QLS_FILE_MAGIC) {
+- firstRecordOffset_ = fhdr._fro;
+- std::streamoff foffs = jumpToFirstRecordOffsetFlag ? firstRecordOffset_ : QLS_SBLK_SIZE_BYTES;
+- inFileStream_.seekg(foffs);
+- } else {
+- inFileStream_.close();
+- if (currentJournalFileConstItr_ == fileNumberMap_.begin()) {
+- journalEmptyFlag_ = true;
+- }
++ if (!readFileHeader()) {
++ return false;
++ }
++ std::streamoff foffs = jumpToFirstRecordOffsetFlag ? firstRecordOffset_ : QLS_JRNL_FHDR_RES_SIZE_SBLKS * QLS_SBLK_SIZE_BYTES;
++ inFileStream_.seekg(foffs);
++ return true;
++}
++
++bool RecoveryManager::getNextFile(bool jumpToFirstRecordOffsetFlag) {
++ if (inFileStream_.is_open()) {
++ inFileStream_.close();
++//std::cout << " .f=" << getCurrentFileName() << "]" << std::flush; // DEBUG
++ if (++currentJournalFileConstItr_ == fileNumberMap_.end()) {
+ return false;
+ }
++ inFileStream_.clear(); // clear eof flag, req'd for older versions of c++
++ }
++ inFileStream_.open(getCurrentFileName().c_str(), std::ios_base::in | std::ios_base::binary);
++ if (!inFileStream_.good()) {
++ throw jexception(jerrno::JERR__FILEIO, getCurrentFileName(), "RecoveryManager", "getNextFile");
++ }
++//std::cout << " [.F=" << getCurrentFileName() << std::flush; // DEBUG
++
++ if (!readFileHeader()) {
++ return false;
+ }
++ std::streamoff foffs = jumpToFirstRecordOffsetFlag ? firstRecordOffset_ : QLS_JRNL_FHDR_RES_SIZE_SBLKS * QLS_SBLK_SIZE_BYTES;
++ inFileStream_.seekg(foffs);
+ return true;
+ }
+
+@@ -443,7 +474,7 @@ bool RecoveryManager::getNextRecordHeader()
+ bool hdr_ok = false;
+ std::streampos file_pos;
+ while (!hdr_ok) {
+- if (!inFileStream_.is_open()) {
++ if (needNextFile()) {
+ if (!getNextFile(true)) {
+ return false;
+ }
+@@ -458,8 +489,10 @@ bool RecoveryManager::getNextRecordHeader()
+ if (inFileStream_.gcount() == sizeof(rec_hdr_t)) {
+ hdr_ok = true;
+ } else {
+- if (!getNextFile(true)) {
+- return false;
++ if (needNextFile()) {
++ if (!getNextFile(true)) {
++ return false;
++ }
+ }
+ }
+ }
+@@ -468,6 +501,10 @@ bool RecoveryManager::getNextRecordHeader()
+ case QLS_ENQ_MAGIC:
+ {
+ //std::cout << " 0x" << std::hex << file_pos << ".e.0x" << h._rid << std::dec << std::flush; // DEBUG
++ if (::rec_hdr_check(&h, QLS_ENQ_MAGIC, QLS_JRNL_VERSION, currentSerial_) != 0) {
++ endOffset_ = file_pos;
++ return false;
++ }
+ enq_rec er;
+ uint64_t start_fid = getCurrentFileNumber(); // fid may increment in decode() if record folds over file boundary
+ if (!decodeRecord(er, cum_size_read, h, file_pos)) {
+@@ -502,6 +539,10 @@ bool RecoveryManager::getNextRecordHeader()
+ case QLS_DEQ_MAGIC:
+ {
+ //std::cout << " 0x" << std::hex << file_pos << ".d.0x" << h._rid << std::dec << std::flush; // DEBUG
++ if (::rec_hdr_check(&h, QLS_DEQ_MAGIC, QLS_JRNL_VERSION, currentSerial_) != 0) {
++ endOffset_ = file_pos;
++ return false;
++ }
+ deq_rec dr;
+ uint16_t start_fid = getCurrentFileNumber(); // fid may increment in decode() if record folds over file boundary
+ if (!decodeRecord(dr, cum_size_read, h, file_pos)) {
+@@ -534,6 +575,10 @@ bool RecoveryManager::getNextRecordHeader()
+ case QLS_TXA_MAGIC:
+ {
+ //std::cout << " 0x" << std::hex << file_pos << ".a.0x" << h._rid << std::dec << std::flush; // DEBUG
++ if (::rec_hdr_check(&h, QLS_TXA_MAGIC, QLS_JRNL_VERSION, currentSerial_) != 0) {
++ endOffset_ = file_pos;
++ return false;
++ }
+ txn_rec ar;
+ if (!decodeRecord(ar, cum_size_read, h, file_pos)) {
+ return false;
+@@ -558,6 +603,10 @@ bool RecoveryManager::getNextRecordHeader()
+ case QLS_TXC_MAGIC:
+ {
+ //std::cout << " 0x" << std::hex << file_pos << ".c.0x" << h._rid << std::dec << std::flush; // DEBUG
++ if (::rec_hdr_check(&h, QLS_TXC_MAGIC, QLS_JRNL_VERSION, currentSerial_) != 0) {
++ endOffset_ = file_pos;
++ return false;
++ }
+ txn_rec cr;
+ if (!decodeRecord(cr, cum_size_read, h, file_pos)) {
+ return false;
+@@ -593,8 +642,10 @@ bool RecoveryManager::getNextRecordHeader()
+ uint32_t rec_dblks = jrec::size_dblks(sizeof(::rec_hdr_t));
+ inFileStream_.ignore(rec_dblks * QLS_DBLK_SIZE_BYTES - sizeof(::rec_hdr_t));
+ checkFileStreamOk(false);
+- if (!getNextFile(false)) {
+- return false;
++ if (needNextFile()) {
++ if (!getNextFile(false)) {
++ return false;
++ }
+ }
+ }
+ break;
+@@ -611,6 +662,13 @@ bool RecoveryManager::getNextRecordHeader()
+ return true;
+ }
+
++bool RecoveryManager::needNextFile() {
++ if (inFileStream_.is_open()) {
++ return inFileStream_.eof() || inFileStream_.tellg() >= std::streampos(efpFileSize_kib_ * 1024);
++ }
++ return true;
++}
++
+ void RecoveryManager::readJournalData(char* target,
+ const std::streamsize readSize) {
+ std::streamoff bytesRead = 0;
+@@ -624,7 +682,9 @@ void RecoveryManager::readJournalData(char* target,
+ inFileStream_.read(target + bytesRead, readSize - bytesRead);
+ std::streamoff thisReadSize = inFileStream_.gcount();
+ if (thisReadSize < readSize) {
+- getNextFile(false);
++ if (needNextFile()) {
++ getNextFile(false);
++ }
+ file_pos = inFileStream_.tellg();
+ if (file_pos == std::streampos(-1)) {
+ std::ostringstream oss;
+@@ -636,6 +696,23 @@ void RecoveryManager::readJournalData(char* target,
+ }
+ }
+
++bool RecoveryManager::readFileHeader() {
++ file_hdr_t fhdr;
++ inFileStream_.read((char*)&fhdr, sizeof(fhdr));
++ checkFileStreamOk(true);
++ if (::file_hdr_check(&fhdr, QLS_FILE_MAGIC, QLS_JRNL_VERSION, efpFileSize_kib_) != 0) {
++ firstRecordOffset_ = fhdr._fro;
++ currentSerial_ = fhdr._rhdr._serial;
++ } else {
++ inFileStream_.close();
++ if (currentJournalFileConstItr_ == fileNumberMap_.begin()) {
++ journalEmptyFlag_ = true;
++ }
++ return false;
++ }
++ return true;
++}
++
+ // static private
+ void RecoveryManager::readJournalFileHeader(const std::string& journalFileName,
+ ::file_hdr_t& fileHeaderRef,
+@@ -670,4 +747,4 @@ void RecoveryManager::removeEmptyFiles(EmptyFilePool* emptyFilePoolPtr) {
+ }
+ }
+
+-}} // namespace qpid::qls_jrnl
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/RecoveryManager.h b/qpid/cpp/src/qpid/linearstore/jrnl/RecoveryManager.h
+index 3cacd7c..7655eb6 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/RecoveryManager.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/RecoveryManager.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LINEARSTORE_RECOVERYSTATE_H_
+-#define QPID_LINEARSTORE_RECOVERYSTATE_H_
++#ifndef QPID_LINEARSTORE_JOURNAL_RECOVERYSTATE_H_
++#define QPID_LINEARSTORE_JOURNAL_RECOVERYSTATE_H_
+
+ #include <deque>
+ #include <fstream>
+@@ -33,7 +33,8 @@ struct file_hdr_t;
+ struct rec_hdr_t;
+
+ namespace qpid {
+-namespace qls_jrnl {
++namespace linearstore {
++namespace journal {
+
+ class data_tok;
+ class enq_map;
+@@ -72,6 +73,7 @@ protected:
+ bool lastFileFullFlag_; ///< Last file is full
+
+ // State for recovery of individual enqueued records
++ uint64_t currentSerial_;
+ uint32_t efpFileSize_kib_;
+ fileNumberMapConstItr_t currentJournalFileConstItr_;
+ std::string currentFileName_;
+@@ -104,8 +106,8 @@ public:
+ bool ignore_pending_txns);
+ void setLinearFileControllerJournals(lfcAddJournalFileFn fnPtr,
+ LinearFileController* lfcPtr);
+- std::string toString(const std::string& jid,
+- bool compact = true);
++ std::string toString(const std::string& jid);
++ std::string toLog(const std::string& jid, const int indent);
+ protected:
+ void analyzeJournalFileHeaders(efpIdentity_t& efpIdentity);
+ void checkFileStreamOk(bool checkEof);
+@@ -116,8 +118,11 @@ protected:
+ std::streampos& fileOffset);
+ std::string getCurrentFileName() const;
+ uint64_t getCurrentFileNumber() const;
++ bool getFile(const uint64_t fileNumber, bool jumpToFirstRecordOffsetFlag);
+ bool getNextFile(bool jumpToFirstRecordOffsetFlag);
+ bool getNextRecordHeader();
++ bool needNextFile();
++ bool readFileHeader();
+ void readJournalData(char* target, const std::streamsize size);
+ void removeEmptyFiles(EmptyFilePool* emptyFilePoolPtr);
+
+@@ -126,6 +131,6 @@ protected:
+ std::string& queueName);
+ };
+
+-}} // namespace qpid::qls_jrnl
++}}}
+
+-#endif // QPID_LINEARSTORE_RECOVERYSTATE_H_
++#endif // QPID_LINEARSTORE_JOURNAL_RECOVERYSTATE_H_
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/aio.h b/qpid/cpp/src/qpid/linearstore/jrnl/aio.h
+index 7be5b83..3a4a762 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/aio.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/aio.h
+@@ -19,17 +19,16 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_AIO_H
+-#define QPID_LEGACYSTORE_JRNL_AIO_H
++#ifndef QPID_LINEARSTORE_JOURNAL_AIO_H
++#define QPID_LINEARSTORE_JOURNAL_AIO_H
+
+ #include <libaio.h>
+ #include <cstring>
+ #include <string.h>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ typedef iocb aio_cb;
+ typedef io_event aio_event;
+@@ -135,6 +134,6 @@ public:
+ }
+ };
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_AIO_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_AIO_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/aio_callback.h b/qpid/cpp/src/qpid/linearstore/jrnl/aio_callback.h
+index 975d114..f21b626 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/aio_callback.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/aio_callback.h
+@@ -19,27 +19,26 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_AIO_CALLBACK_H
+-#define QPID_LEGACYSTORE_JRNL_AIO_CALLBACK_H
++#ifndef QPID_LINEARSTORE_JOURNAL_AIO_CALLBACK_H
++#define QPID_LINEARSTORE_JOURNAL_AIO_CALLBACK_H
+
+ #include <stdint.h>
+ #include <vector>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+- class data_tok;
++class data_tok;
+
+- class aio_callback
+- {
+- public:
+- virtual ~aio_callback() {}
+- virtual void wr_aio_cb(std::vector<data_tok*>& dtokl) = 0;
+- virtual void rd_aio_cb(std::vector<uint16_t>& pil) = 0;
+- };
++class aio_callback
++{
++public:
++ virtual ~aio_callback() {}
++ virtual void wr_aio_cb(std::vector<data_tok*>& dtokl) = 0;
++ virtual void rd_aio_cb(std::vector<uint16_t>& pil) = 0;
++};
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_AIO_CALLBACK_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_AIO_CALLBACK_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/cvar.h b/qpid/cpp/src/qpid/linearstore/jrnl/cvar.h
+index c22dcb8..243c817 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/cvar.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/cvar.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_CVAR_H
+-#define QPID_LEGACYSTORE_JRNL_CVAR_H
++#ifndef QPID_LINEARSTORE_JOURNAL_CVAR_H
++#define QPID_LINEARSTORE_JOURNAL_CVAR_H
+
+ #include <cstring>
+ #include "qpid/linearstore/jrnl/jerrno.h"
+@@ -30,10 +30,9 @@
+ #include <pthread.h>
+ #include <sstream>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ // Ultra-simple thread condition variable class
+ class cvar
+@@ -71,6 +70,6 @@ namespace qls_jrnl
+ }
+ };
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_CVAR_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_CVAR_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/data_tok.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/data_tok.cpp
+index ab2a763..a07a89b 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/data_tok.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/data_tok.cpp
+@@ -27,10 +27,9 @@
+ #include "qpid/linearstore/jrnl/slock.h"
+ #include <sstream>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ // Static members
+
+@@ -39,10 +38,8 @@ smutex data_tok::_mutex;
+
+ data_tok::data_tok():
+ _wstate(NONE),
+-// _rstate(UNREAD),
+ _dsize(0),
+ _dblks_written(0),
+-// _dblks_read(0),
+ _pg_cnt(0),
+ _fid(0),
+ _rid(0),
+@@ -106,58 +103,12 @@ data_tok::wstate_str(write_state wstate)
+ return "<wstate unknown>";
+ }
+
+-/*
+-const char*
+-data_tok::rstate_str() const
+-{
+- return rstate_str(_rstate);
+-}
+-*/
+-
+-/*
+-const char*
+-data_tok::rstate_str(read_state rstate)
+-{
+- switch (rstate)
+- {
+- case NONE:
+- return "NONE";
+- case READ_PART:
+- return "READ_PART";
+- case SKIP_PART:
+- return "SKIP_PART";
+- case READ:
+- return "READ";
+- // Not using default: forces compiler to ensure all cases are covered.
+- }
+- return "<rstate unknown>";
+-}
+-*/
+-
+-/*
+-void
+-data_tok::set_rstate(const read_state rstate)
+-{
+- if (_wstate != ENQ && rstate != UNREAD)
+- {
+- std::ostringstream oss;
+- oss << "Attempted to change read state to " << rstate_str(rstate);
+- oss << " while write state is not enqueued (wstate ENQ); wstate=" << wstate_str() << ".";
+- throw jexception(jerrno::JERR_DTOK_ILLEGALSTATE, oss.str(), "data_tok",
+- "set_rstate");
+- }
+- _rstate = rstate;
+-}
+-*/
+-
+ void
+ data_tok::reset()
+ {
+ _wstate = NONE;
+-// _rstate = UNREAD;
+ _dsize = 0;
+ _dblks_written = 0;
+-// _dblks_read = 0;
+ _pg_cnt = 0;
+ _fid = 0;
+ _rid = 0;
+@@ -185,4 +136,4 @@ data_tok::status_str() const
+ return oss.str();
+ }
+
+-}}
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/data_tok.h b/qpid/cpp/src/qpid/linearstore/jrnl/data_tok.h
+index 39dc1c4..f727243 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/data_tok.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/data_tok.h
+@@ -19,15 +19,14 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_DATA_TOK_H
+-#define QPID_LEGACYSTORE_JRNL_DATA_TOK_H
++#ifndef QPID_LINEARSTORE_JOURNAL_DATA_TOK_H
++#define QPID_LINEARSTORE_JOURNAL_DATA_TOK_H
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+ class data_tok;
+-}}
++}}}
+
+ #include <cassert>
+ #include <cstddef>
+@@ -35,10 +34,9 @@ class data_tok;
+ #include <pthread.h>
+ #include <string>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ /**
+ * \class data_tok
+@@ -72,25 +70,13 @@ namespace qls_jrnl
+ COMMITTED
+ };
+
+-/*
+- enum read_state
+- {
+- UNREAD, ///< Data block not read
+- READ_PART, ///< Data block is part-read; waiting for page buffer to fill
+- SKIP_PART, ///< Prev. dequeued dblock is part-skipped; waiting for page buffer to fill
+- READ ///< Data block is fully read
+- };
+-*/
+-
+ protected:
+ static smutex _mutex;
+ static uint64_t _cnt;
+ uint64_t _icnt;
+ write_state _wstate; ///< Enqueued / dequeued state of data
+-// read_state _rstate; ///< Read state of data
+ std::size_t _dsize; ///< Data size in bytes
+ uint32_t _dblks_written; ///< Data blocks read/written
+-// uint32_t _dblks_read; ///< Data blocks read/written
+ uint32_t _pg_cnt; ///< Page counter - incr for each page containing part of data
+ uint64_t _fid; ///< FID containing header of enqueue record
+ uint64_t _rid; ///< RID of data set by enqueue operation
+@@ -106,16 +92,11 @@ namespace qls_jrnl
+ inline write_state wstate() const { return _wstate; }
+ const char* wstate_str() const;
+ static const char* wstate_str(write_state wstate);
+-// inline read_state rstate() const { return _rstate; }
+-// const char* rstate_str() const;
+-// static const char* rstate_str(read_state rstate);
+ inline bool is_writable() const { return _wstate == NONE || _wstate == ENQ_PART; }
+ inline bool is_enqueued() const { return _wstate == ENQ; }
+ inline bool is_readable() const { return _wstate == ENQ; }
+-// inline bool is_read() const { return _rstate == READ; }
+ inline bool is_dequeueable() const { return _wstate == ENQ || _wstate == DEQ_PART; }
+ inline void set_wstate(const write_state wstate) { _wstate = wstate; }
+-// void set_rstate(const read_state rstate);
+ inline std::size_t dsize() const { return _dsize; }
+ inline void set_dsize(std::size_t dsize) { _dsize = dsize; }
+
+@@ -124,10 +105,6 @@ namespace qls_jrnl
+ { _dblks_written += dblks_written; }
+ inline void set_dblocks_written(uint32_t dblks_written) { _dblks_written = dblks_written; }
+
+-// inline uint32_t dblocks_read() const { return _dblks_read; }
+-// inline void incr_dblocks_read(uint32_t dblks_read) { _dblks_read += dblks_read; }
+-// inline void set_dblocks_read(uint32_t dblks_read) { _dblks_read = dblks_read; }
+-
+ inline uint32_t pg_cnt() const { return _pg_cnt; }
+ inline uint32_t incr_pg_cnt() { return ++_pg_cnt; }
+ inline uint32_t decr_pg_cnt() { assert(_pg_cnt != 0); return --_pg_cnt; }
+@@ -154,7 +131,6 @@ namespace qls_jrnl
+ std::string status_str() const;
+ };
+
+-} // namespace qls_jrnl
+-} // namespace jrnl
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_DATA_TOK_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_DATA_TOK_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/deq_rec.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/deq_rec.cpp
+index e7b4365..013ada1 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/deq_rec.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/deq_rec.cpp
+@@ -19,87 +19,43 @@
+ *
+ */
+
+-/**
+- * \file deq_rec.cpp
+- *
+- * Qpid asynchronous store plugin library
+- *
+- * This file contains the code for the mrg::journal::deq_rec (journal dequeue
+- * record) class. See comments in file deq_rec.h for details.
+- *
+- * \author Kim van der Riet
+- */
+-
+ #include "qpid/linearstore/jrnl/deq_rec.h"
+-#include "qpid/linearstore/jrnl/utils/deq_hdr.h"
+-#include "qpid/linearstore/jrnl/utils/rec_tail.h"
+
+ #include <cassert>
+-#include <cerrno>
+-#include <cstdlib>
+ #include <cstring>
+ #include <iomanip>
+-#include "qpid/linearstore/jrnl/jerrno.h"
+ #include "qpid/linearstore/jrnl/jexception.h"
+-#include <sstream>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ deq_rec::deq_rec():
+-// _deq_hdr(QLS_DEQ_MAGIC, QLS_JRNL_VERSION, 0, 0, 0, false),
+ _xidp(0),
+ _buff(0)
+-// _deq_tail(_deq_hdr)
+ {
+- ::deq_hdr_init(&_deq_hdr, QLS_DEQ_MAGIC, QLS_JRNL_VERSION, 0, 0, 0, 0);
++ ::deq_hdr_init(&_deq_hdr, QLS_DEQ_MAGIC, QLS_JRNL_VERSION, 0, 0, 0, 0, 0);
+ ::rec_tail_copy(&_deq_tail, &_deq_hdr._rhdr, 0);
+ }
+
+-deq_rec::deq_rec(const uint64_t rid, const uint64_t drid, const void* const xidp,
+- const std::size_t xidlen, const bool txn_coml_commit):
+-// _deq_hdr(QLS_DEQ_MAGIC, QLS_JRNL_VERSION, rid, drid, xidlen, owi, txn_coml_commit),
+- _xidp(xidp),
+- _buff(0)
+-// _deq_tail(_deq_hdr)
+-{
+- ::deq_hdr_init(&_deq_hdr, QLS_DEQ_MAGIC, QLS_JRNL_VERSION, 0, rid, drid, xidlen);
+- ::rec_tail_copy(&_deq_tail, &_deq_hdr._rhdr, 0);
+- ::set_txn_coml_commit(&_deq_hdr, txn_coml_commit);
+-}
+-
+ deq_rec::~deq_rec()
+ {
+ clean();
+ }
+
+ void
+-deq_rec::reset()
+-{
+- _deq_hdr._rhdr._rid = 0;
+-// _deq_hdr.set_owi(false);
+- ::set_txn_coml_commit(&_deq_hdr, false);
+- _deq_hdr._deq_rid = 0;
+- _deq_hdr._xidsize = 0;
+- _deq_tail._checksum = 0;
+- _deq_tail._rid = 0;
+- _xidp = 0;
+- _buff = 0;
+-}
+-
+-void
+-deq_rec::reset(const uint64_t rid, const uint64_t drid, const void* const xidp,
+- const std::size_t xidlen, const bool txn_coml_commit)
++deq_rec::reset(const uint64_t serial, const uint64_t rid, const uint64_t drid, const void* const xidp,
++ const std::size_t xidlen, const bool txn_coml_commit)
+ {
++ _deq_hdr._rhdr._serial = serial;
+ _deq_hdr._rhdr._rid = rid;
+ ::set_txn_coml_commit(&_deq_hdr, txn_coml_commit);
+ _deq_hdr._deq_rid = drid;
+ _deq_hdr._xidsize = xidlen;
+- _deq_tail._rid = rid;
+ _xidp = xidp;
+ _buff = 0;
++ _deq_tail._serial = serial;
++ _deq_tail._rid = rid;
+ }
+
+ uint32_t
+@@ -329,17 +285,15 @@ deq_rec::decode(rec_hdr_t& h, void* rptr, uint32_t rec_offs_dblks, uint32_t max_
+ }
+
+ bool
+-deq_rec::rcv_decode(rec_hdr_t h, std::ifstream* ifsp, std::size_t& rec_offs)
++deq_rec::decode(::rec_hdr_t& h, std::ifstream* ifsp, std::size_t& rec_offs)
+ {
++ uint32_t checksum = 0UL; // TODO: Add checksum math
+ if (rec_offs == 0)
+ {
+ //_deq_hdr.hdr_copy(h);
+ ::rec_hdr_copy(&_deq_hdr._rhdr, &h);
+- ifsp->read((char*)&_deq_hdr._deq_rid, sizeof(uint64_t));
+- ifsp->read((char*)&_deq_hdr._xidsize, sizeof(std::size_t));
+-#if defined(JRNL_32_BIT)
+- ifsp->ignore(sizeof(uint32_t)); // _filler0
+-#endif
++ ifsp->read((char*)&_deq_hdr._deq_rid, sizeof(_deq_hdr._deq_rid));
++ ifsp->read((char*)&_deq_hdr._xidsize, sizeof(_deq_hdr._xidsize));
+ rec_offs = sizeof(_deq_hdr);
+ // Read header, allocate (if req'd) for xid
+ if (_deq_hdr._xidsize)
+@@ -382,9 +336,21 @@ deq_rec::rcv_decode(rec_hdr_t h, std::ifstream* ifsp, std::size_t& rec_offs)
+ }
+ }
+ ifsp->ignore(rec_size_dblks() * QLS_DBLK_SIZE_BYTES - rec_size());
+- if (_deq_hdr._xidsize)
+- chk_tail(); // Throws if tail invalid or record incomplete
+ assert(!ifsp->fail() && !ifsp->bad());
++ if (_deq_hdr._xidsize) {
++ int res = ::rec_tail_check(&_deq_tail, &_deq_hdr._rhdr, checksum);
++ if (res != 0) {
++ std::stringstream oss;
++ switch (res) {
++ case 1: oss << std::hex << "Magic: expected 0x" << ~_deq_hdr._rhdr._magic << "; found 0x" << _deq_tail._xmagic; break;
++ case 2: oss << std::hex << "Serial: expected 0x" << _deq_hdr._rhdr._serial << "; found 0x" << _deq_tail._serial; break;
++ case 3: oss << std::hex << "Record Id: expected 0x" << _deq_hdr._rhdr._rid << "; found 0x" << _deq_tail._rid; break;
++ case 4: oss << std::hex << "Checksum: expected 0x" << checksum << "; found 0x" << _deq_tail._checksum; break;
++ default: oss << "Unknown error " << res;
++ }
++ throw jexception(jerrno::JERR_JREC_BADRECTAIL, oss.str(), "deq_rec", "decode"); // TODO: Don't throw exception, log info
++ }
++ }
+ return true;
+ }
+
+@@ -427,38 +393,9 @@ deq_rec::rec_size() const
+ }
+
+ void
+-deq_rec::chk_hdr() const
+-{
+- jrec::chk_hdr(_deq_hdr._rhdr);
+- if (_deq_hdr._rhdr._magic != QLS_DEQ_MAGIC)
+- {
+- std::ostringstream oss;
+- oss << std::hex << std::setfill('0');
+- oss << "deq magic: rid=0x" << std::setw(16) << _deq_hdr._rhdr._rid;
+- oss << ": expected=0x" << std::setw(8) << QLS_DEQ_MAGIC;
+- oss << " read=0x" << std::setw(2) << (int)_deq_hdr._rhdr._magic;
+- throw jexception(jerrno::JERR_JREC_BADRECHDR, oss.str(), "deq_rec", "chk_hdr");
+- }
+-}
+-
+-void
+-deq_rec::chk_hdr(uint64_t rid) const
+-{
+- chk_hdr();
+- jrec::chk_rid(_deq_hdr._rhdr, rid);
+-}
+-
+-void
+-deq_rec::chk_tail() const
+-{
+- jrec::chk_tail(_deq_tail, _deq_hdr._rhdr);
+-}
+-
+-void
+ deq_rec::clean()
+ {
+ // clean up allocated memory here
+ }
+
+-} // namespace journal
+-} // namespace mrg
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/deq_rec.h b/qpid/cpp/src/qpid/linearstore/jrnl/deq_rec.h
+index 12ba6af..b494189 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/deq_rec.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/deq_rec.h
+@@ -19,73 +19,51 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_DEQ_REQ_H
+-#define QPID_LEGACYSTORE_JRNL_DEQ_REQ_H
++#ifndef QPID_LINEARSTORE_JOURNAL_DEQ_REQ_H
++#define QPID_LINEARSTORE_JOURNAL_DEQ_REQ_H
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
+-class deq_rec;
+-}}
+-
+-#include <cstddef>
+-#include "qpid/linearstore/jrnl/utils/deq_hdr.h"
+ #include "qpid/linearstore/jrnl/jrec.h"
++#include "qpid/linearstore/jrnl/utils/deq_hdr.h"
++#include "qpid/linearstore/jrnl/utils/rec_tail.h"
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+- /**
+- * \class deq_rec
+- * \brief Class to handle a single journal dequeue record.
+- */
+- class deq_rec : public jrec
+- {
+- private:
+- deq_hdr_t _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_t _deq_tail; ///< Record tail, only encoded if XID is present
++/**
++* \class deq_rec
++* \brief Class to handle a single journal dequeue record.
++*/
++class deq_rec : public jrec
++{
++private:
++ ::deq_hdr_t _deq_hdr; ///< Local instance of dequeue header struct
++ const void* _xidp; ///< xid pointer for encoding (writing to disk)
++ void* _buff; ///< Pointer to buffer to receive data read from disk
++ ::rec_tail_t _deq_tail; ///< Local instance of enqueue tail struct, only encoded if XID is present
+
+- public:
+- // constructor used for read operations and xid will have memory allocated
+- deq_rec();
+- // constructor used for write operations, where xid already exists
+- deq_rec(const uint64_t rid, const uint64_t drid, const void* const xidp,
+- const std::size_t xidlen, const bool txn_coml_commit);
+- virtual ~deq_rec();
++public:
++ deq_rec();
++ virtual ~deq_rec();
+
+- // Prepare instance for use in reading data from journal
+- void reset();
+- // Prepare instance for use in writing data to journal
+- void reset(const uint64_t rid, const uint64_t drid, const void* const xidp,
+- const std::size_t xidlen, const bool txn_coml_commit);
+- uint32_t encode(void* wptr, uint32_t rec_offs_dblks, uint32_t max_size_dblks);
+- uint32_t decode(rec_hdr_t& h, void* rptr, uint32_t rec_offs_dblks,
+- uint32_t max_size_dblks);
+- // Decode used for recover
+- bool rcv_decode(rec_hdr_t h, std::ifstream* ifsp, std::size_t& rec_offs);
++ void reset(const uint64_t serial, const uint64_t rid, const uint64_t drid, const void* const xidp,
++ const std::size_t xidlen, const bool txn_coml_commit);
++ uint32_t encode(void* wptr, uint32_t rec_offs_dblks, uint32_t max_size_dblks);
++ bool decode(::rec_hdr_t& h, std::ifstream* ifsp, std::size_t& rec_offs);
+
+- inline bool is_txn_coml_commit() const { return ::is_txn_coml_commit(&_deq_hdr); }
+- inline uint64_t rid() const { return _deq_hdr._rhdr._rid; }
+- inline uint64_t deq_rid() const { return _deq_hdr._deq_rid; }
+- std::size_t get_xid(void** const xidpp);
+- std::string& str(std::string& str) const;
+- inline std::size_t data_size() const { return 0; } // This record never carries data
+- std::size_t xid_size() const;
+- std::size_t rec_size() const;
++ inline bool is_txn_coml_commit() const { return ::is_txn_coml_commit(&_deq_hdr); }
++ inline uint64_t rid() const { return _deq_hdr._rhdr._rid; }
++ inline uint64_t deq_rid() const { return _deq_hdr._deq_rid; }
++ std::size_t get_xid(void** const xidpp);
++ std::string& str(std::string& str) const;
++ inline std::size_t data_size() const { return 0; } // This record never carries data
++ std::size_t xid_size() const;
++ std::size_t rec_size() const;
+
+- private:
+- virtual void chk_hdr() const;
+- virtual void chk_hdr(uint64_t rid) const;
+- virtual void chk_tail() const;
+- virtual void clean();
+- }; // class deq_rec
++private:
++ virtual void clean();
++};
+
+-} // namespace journal
+-} // namespace mrg
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_DEQ_REQ_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_DEQ_REQ_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/enq_map.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/enq_map.cpp
+index 3bc4950..010968b 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/enq_map.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/enq_map.cpp
+@@ -27,10 +27,9 @@
+ #include <sstream>
+
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ // static return/error codes
+ int16_t enq_map::EMAP_DUP_RID = -3;
+@@ -183,4 +182,4 @@ enq_map::pfid_list(std::vector<uint64_t>& fv)
+ }
+ }
+
+-}}
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/enq_map.h b/qpid/cpp/src/qpid/linearstore/jrnl/enq_map.h
+index 659e3bd..aff839a 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/enq_map.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/enq_map.h
+@@ -19,15 +19,14 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_ENQ_MAP_H
+-#define QPID_LEGACYSTORE_JRNL_ENQ_MAP_H
++#ifndef QPID_LINEARSTORE_JOURNAL_ENQ_MAP_H
++#define QPID_LINEARSTORE_JOURNAL_ENQ_MAP_H
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+ class enq_map;
+-}}
++}}}
+
+ #include "qpid/linearstore/jrnl/jexception.h"
+ #include "qpid/linearstore/jrnl/smutex.h"
+@@ -35,10 +34,9 @@ class enq_map;
+ #include <pthread.h>
+ #include <vector>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ /**
+ * \class enq_map
+@@ -107,6 +105,6 @@ namespace qls_jrnl
+ void pfid_list(std::vector<uint64_t>& fv);
+ };
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_ENQ_MAP_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_ENQ_MAP_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/enq_rec.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/enq_rec.cpp
+index 9b845b8..00d26d7 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/enq_rec.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/enq_rec.cpp
+@@ -22,45 +22,22 @@
+ #include "qpid/linearstore/jrnl/enq_rec.h"
+
+ #include <cassert>
+-#include <cerrno>
+-#include <cstdlib>
+ #include <cstring>
+ #include <iomanip>
+-#include "qpid/linearstore/jrnl/jerrno.h"
+ #include "qpid/linearstore/jrnl/jexception.h"
+-#include <sstream>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+-// Constructor used for read operations, where buf contains preallocated space to receive data.
+ enq_rec::enq_rec():
+ jrec(), // superclass
+- //_enq_hdr(QLS_ENQ_MAGIC, QLS_JRNL_VERSION, 0, 0, 0, false, false),
+ _xidp(0),
+ _data(0),
+ _buff(0)
+- //_enq_tail(_enq_hdr)
+-{
+- ::enq_hdr_init(&_enq_hdr, QLS_ENQ_MAGIC, QLS_JRNL_VERSION, 0, 0, 0, false);
+- ::rec_tail_copy(&_enq_tail, &_enq_hdr._rhdr, 0);
+-}
+-
+-// Constructor used for transactional write operations, where dbuf contains data to be written.
+-enq_rec::enq_rec(const uint64_t rid, const void* const dbuf, const std::size_t dlen,
+- const void* const xidp, const std::size_t xidlen, const bool transient):
+- jrec(), // superclass
+- //_enq_hdr(QLS_ENQ_MAGIC, QLS_JRNL_VERSION, rid, xidlen, dlen, owi, transient),
+- _xidp(xidp),
+- _data(dbuf),
+- _buff(0)
+- //_enq_tail(_enq_hdr)
+ {
+- ::enq_hdr_init(&_enq_hdr, QLS_ENQ_MAGIC, QLS_JRNL_VERSION, 0, rid, xidlen, dlen);
++ ::enq_hdr_init(&_enq_hdr, QLS_ENQ_MAGIC, QLS_JRNL_VERSION, 0, 0, 0, 0, false);
+ ::rec_tail_copy(&_enq_tail, &_enq_hdr._rhdr, 0);
+- ::set_enq_transient(&_enq_hdr, transient);
+ }
+
+ enq_rec::~enq_rec()
+@@ -68,28 +45,11 @@ enq_rec::~enq_rec()
+ clean();
+ }
+
+-// Prepare instance for use in reading data from journal, where buf contains preallocated space
+-// to receive data.
+-void
+-enq_rec::reset()
+-{
+- _enq_hdr._rhdr._rid = 0;
+- ::set_enq_transient(&_enq_hdr, false);
+- _enq_hdr._xidsize = 0;
+- _enq_hdr._dsize = 0;
+- _xidp = 0;
+- _data = 0;
+- _buff = 0;
+- _enq_tail._rid = 0;
+-}
+-
+-// Prepare instance for use in writing transactional data to journal, where dbuf contains data to
+-// be written.
+ void
+-enq_rec::reset(const uint64_t rid, const void* const dbuf, const std::size_t dlen,
+- const void* const xidp, const std::size_t xidlen, const bool transient,
+- const bool external)
++enq_rec::reset(const uint64_t serial, const uint64_t rid, const void* const dbuf, const std::size_t dlen,
++ const void* const xidp, const std::size_t xidlen, const bool transient, const bool external)
+ {
++ _enq_hdr._rhdr._serial = serial;
+ _enq_hdr._rhdr._rid = rid;
+ ::set_enq_transient(&_enq_hdr, transient);
+ ::set_enq_external(&_enq_hdr, external);
+@@ -98,6 +58,7 @@ enq_rec::reset(const uint64_t rid, const void* const dbuf, const std::size_t dle
+ _xidp = xidp;
+ _data = dbuf;
+ _buff = 0;
++ _enq_tail._serial = serial;
+ _enq_tail._rid = rid;
+ }
+
+@@ -440,23 +401,18 @@ enq_rec::decode(rec_hdr_t& h, void* rptr, uint32_t rec_offs_dblks, uint32_t max_
+ }
+
+ bool
+-enq_rec::rcv_decode(rec_hdr_t h, std::ifstream* ifsp, std::size_t& rec_offs)
++enq_rec::decode(::rec_hdr_t& h, std::ifstream* ifsp, std::size_t& rec_offs)
+ {
++ uint32_t checksum = 0UL; // TODO: Add checksum math
+ if (rec_offs == 0)
+ {
+ // Read header, allocate (if req'd) for xid
+ //_enq_hdr.hdr_copy(h);
+ ::rec_hdr_copy(&_enq_hdr._rhdr, &h);
+- ifsp->read((char*)&_enq_hdr._xidsize, sizeof(std::size_t));
+-#if defined(JRNL_32_BIT)
+- ifsp->ignore(sizeof(uint32_t)); // _filler0
+-#endif
+- ifsp->read((char*)&_enq_hdr._dsize, sizeof(std::size_t));
+-#if defined(JRNL_32_BIT)
+- ifsp->ignore(sizeof(uint32_t)); // _filler1
+-#endif
++ ifsp->read((char*)&_enq_hdr._xidsize, sizeof(_enq_hdr._xidsize));
++ ifsp->read((char*)&_enq_hdr._dsize, sizeof(_enq_hdr._dsize));
+ rec_offs = sizeof(_enq_hdr);
+- if (_enq_hdr._xidsize)
++ if (_enq_hdr._xidsize > 0)
+ {
+ _buff = std::malloc(_enq_hdr._xidsize);
+ MALLOC_CHK(_buff, "_buff", "enq_rec", "rcv_decode");
+@@ -517,8 +473,19 @@ enq_rec::rcv_decode(rec_hdr_t h, std::ifstream* ifsp, std::size_t& rec_offs)
+ }
+ }
+ ifsp->ignore(rec_size_dblks() * QLS_DBLK_SIZE_BYTES - rec_size());
+- chk_tail(); // Throws if tail invalid or record incomplete
+ assert(!ifsp->fail() && !ifsp->bad());
++ int res = ::rec_tail_check(&_enq_tail, &_enq_hdr._rhdr, checksum);
++ if (res != 0) {
++ std::stringstream oss;
++ switch (res) {
++ case 1: oss << std::hex << "Magic: expected 0x" << ~_enq_hdr._rhdr._magic << "; found 0x" << _enq_tail._xmagic; break;
++ case 2: oss << std::hex << "Serial: expected 0x" << _enq_hdr._rhdr._serial << "; found 0x" << _enq_tail._serial; break;
++ case 3: oss << std::hex << "Record Id: expected 0x" << _enq_hdr._rhdr._rid << "; found 0x" << _enq_tail._rid; break;
++ case 4: oss << std::hex << "Checksum: expected 0x" << checksum << "; found 0x" << _enq_tail._checksum; break;
++ default: oss << "Unknown error " << res;
++ }
++ throw jexception(jerrno::JERR_JREC_BADRECTAIL, oss.str(), "enq_rec", "decode"); // TODO: Don't throw exception, log info
++ }
+ return true;
+ }
+
+@@ -578,44 +545,9 @@ enq_rec::rec_size(const std::size_t xidsize, const std::size_t dsize, const bool
+ }
+
+ void
+-enq_rec::set_rid(const uint64_t rid)
+-{
+- _enq_hdr._rhdr._rid = rid;
+- _enq_tail._rid = rid;
+-}
+-
+-void
+-enq_rec::chk_hdr() const
+-{
+- jrec::chk_hdr(_enq_hdr._rhdr);
+- if (_enq_hdr._rhdr._magic != QLS_ENQ_MAGIC)
+- {
+- std::ostringstream oss;
+- oss << std::hex << std::setfill('0');
+- oss << "enq magic: rid=0x" << std::setw(16) << _enq_hdr._rhdr._rid;
+- oss << ": expected=0x" << std::setw(8) << QLS_ENQ_MAGIC;
+- oss << " read=0x" << std::setw(2) << (int)_enq_hdr._rhdr._magic;
+- throw jexception(jerrno::JERR_JREC_BADRECHDR, oss.str(), "enq_rec", "chk_hdr");
+- }
+-}
+-
+-void
+-enq_rec::chk_hdr(uint64_t rid) const
+-{
+- chk_hdr();
+- jrec::chk_rid(_enq_hdr._rhdr, rid);
+-}
+-
+-void
+-enq_rec::chk_tail() const
+-{
+- jrec::chk_tail(_enq_tail, _enq_hdr._rhdr);
+-}
+-
+-void
+ enq_rec::clean()
+ {
+ // clean up allocated memory here
+ }
+
+-}}
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/enq_rec.h b/qpid/cpp/src/qpid/linearstore/jrnl/enq_rec.h
+index b3502d9..24ed9e9 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/enq_rec.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/enq_rec.h
+@@ -19,86 +19,54 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_ENQ_REC_H
+-#define QPID_LEGACYSTORE_JRNL_ENQ_REC_H
++#ifndef QPID_LINEARSTORE_JOURNAL_ENQ_REC_H
++#define QPID_LINEARSTORE_JOURNAL_ENQ_REC_H
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
+-class enq_rec;
+-}}
+-
+-#include <cstddef>
+-#include "qpid/linearstore/jrnl/utils/enq_hdr.h"
+ #include "qpid/linearstore/jrnl/jrec.h"
++#include "qpid/linearstore/jrnl/utils/enq_hdr.h"
++#include "qpid/linearstore/jrnl/utils/rec_tail.h"
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
+-
+- /**
+- * \class enq_rec
+- * \brief Class to handle a single journal enqueue record.
+- */
+- class enq_rec : public jrec
+- {
+- private:
+- enq_hdr_t _enq_hdr;
+- 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_t _enq_tail;
+-
+- public:
+- /**
+- * \brief Constructor used for read operations.
+- */
+- enq_rec();
+-
+- /**
+- * \brief Constructor used for write operations, where mbuf contains data to be written.
+- */
+- enq_rec(const uint64_t rid, const void* const dbuf, const std::size_t dlen,
+- const void* const xidp, const std::size_t xidlen, const bool transient);
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+- /**
+- * \brief Destructor
+- */
+- virtual ~enq_rec();
++/**
++* \class enq_rec
++* \brief Class to handle a single journal enqueue record.
++*/
++class enq_rec : public jrec
++{
++private:
++ ::enq_hdr_t _enq_hdr; ///< Local instance of enqueue header struct
++ 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_t _enq_tail; ///< Local instance of enqueue tail struct
+
+- // Prepare instance for use in reading data from journal, xid and data will be allocated
+- void reset();
+- // Prepare instance for use in writing data to journal
+- void reset(const uint64_t rid, const void* const dbuf, const std::size_t dlen,
+- const void* const xidp, const std::size_t xidlen, const bool transient,
+- const bool external);
++public:
++ enq_rec();
++ virtual ~enq_rec();
+
+- uint32_t encode(void* wptr, uint32_t rec_offs_dblks, uint32_t max_size_dblks);
+- uint32_t decode(rec_hdr_t& h, void* rptr, uint32_t rec_offs_dblks, uint32_t max_size_dblks);
+- // Decode used for recover
+- bool rcv_decode(rec_hdr_t h, std::ifstream* ifsp, std::size_t& rec_offs);
++ void reset(const uint64_t serial, const uint64_t rid, const void* const dbuf, const std::size_t dlen,
++ const void* const xidp, const std::size_t xidlen, const bool transient, const bool external);
++ uint32_t encode(void* wptr, uint32_t rec_offs_dblks, uint32_t max_size_dblks);
++ bool decode(::rec_hdr_t& h, std::ifstream* ifsp, std::size_t& rec_offs);
+
+- std::size_t get_xid(void** const xidpp);
+- std::size_t get_data(void** const datapp);
+- inline bool is_transient() const { return ::is_enq_transient(&_enq_hdr); }
+- inline bool is_external() const { return ::is_enq_external(&_enq_hdr); }
+- std::string& str(std::string& str) const;
+- inline std::size_t data_size() const { return _enq_hdr._dsize; }
+- inline std::size_t xid_size() const { return _enq_hdr._xidsize; }
+- std::size_t rec_size() const;
+- static std::size_t rec_size(const std::size_t xidsize, const std::size_t dsize, const bool external);
+- inline uint64_t rid() const { return _enq_hdr._rhdr._rid; }
+- void set_rid(const uint64_t rid);
++ std::size_t get_xid(void** const xidpp);
++ std::size_t get_data(void** const datapp);
++ inline bool is_transient() const { return ::is_enq_transient(&_enq_hdr); }
++ inline bool is_external() const { return ::is_enq_external(&_enq_hdr); }
++ std::string& str(std::string& str) const;
++ inline std::size_t data_size() const { return _enq_hdr._dsize; }
++ inline std::size_t xid_size() const { return _enq_hdr._xidsize; }
++ std::size_t rec_size() const;
++ static std::size_t rec_size(const std::size_t xidsize, const std::size_t dsize, const bool external);
++ inline uint64_t rid() const { return _enq_hdr._rhdr._rid; }
+
+- private:
+- void chk_hdr() const;
+- void chk_hdr(uint64_t rid) const;
+- void chk_tail() const;
+- virtual void clean();
+- }; // class enq_rec
++private:
++ virtual void clean();
++};
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_ENQ_REC_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_ENQ_REC_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/enums.h b/qpid/cpp/src/qpid/linearstore/jrnl/enums.h
+index 511a2a4..106f58c 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/enums.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/enums.h
+@@ -19,13 +19,12 @@
+ *
+ */
+
+-#ifndef QPID_LINEARSTORE_JRNL_ENUMS_H
+-#define QPID_LINEARSTORE_JRNL_ENUMS_H
++#ifndef QPID_LINEARSTORE_JOURNAL_ENUMS_H
++#define QPID_LINEARSTORE_JOURNAL_ENUMS_H
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ // TODO: Change this to flags, as multiple of these conditions may exist simultaneously
+ /**
+@@ -37,12 +36,7 @@ namespace qls_jrnl
+ RHM_IORES_PAGE_AIOWAIT, ///< IO operation suspended - next page is waiting for AIO.
+ RHM_IORES_FILE_AIOWAIT, ///< IO operation suspended - next file is waiting for AIO.
+ RHM_IORES_EMPTY, ///< During read operations, nothing further is available to read.
+-// RHM_IORES_RCINVALID, ///< Read page cache is invalid (ie obsolete or uninitialized)
+-// RHM_IORES_ENQCAPTHRESH, ///< Enqueue capacity threshold (limit) reached.
+-// RHM_IORES_FULL, ///< During write operations, the journal files are full.
+-// RHM_IORES_BUSY, ///< Another blocking operation is in progress.
+ RHM_IORES_TXPENDING ///< Operation blocked by pending transaction.
+-// RHM_IORES_NOTIMPL ///< Function is not implemented.
+ };
+ typedef _iores iores;
+
+@@ -54,46 +48,11 @@ namespace qls_jrnl
+ case RHM_IORES_PAGE_AIOWAIT: return "RHM_IORES_PAGE_AIOWAIT";
+ case RHM_IORES_FILE_AIOWAIT: return "RHM_IORES_FILE_AIOWAIT";
+ case RHM_IORES_EMPTY: return "RHM_IORES_EMPTY";
+-// case RHM_IORES_RCINVALID: return "RHM_IORES_RCINVALID";
+-// case RHM_IORES_ENQCAPTHRESH: return "RHM_IORES_ENQCAPTHRESH";
+-// case RHM_IORES_FULL: return "RHM_IORES_FULL";
+-// case RHM_IORES_BUSY: return "RHM_IORES_BUSY";
+ case RHM_IORES_TXPENDING: return "RHM_IORES_TXPENDING";
+-// case RHM_IORES_NOTIMPL: return "RHM_IORES_NOTIMPL";
+ }
+ return "<iores unknown>";
+ }
+
+-/*
+- enum _log_level
+- {
+- LOG_TRACE = 0,
+- LOG_DEBUG,
+- LOG_INFO,
+- LOG_NOTICE,
+- LOG_WARN,
+- LOG_ERROR,
+- LOG_CRITICAL
+- };
+- typedef _log_level log_level_t;
+-
+- static inline const char* log_level_str(log_level_t ll)
+- {
+- switch (ll)
+- {
+- case LOG_TRACE: return "TRACE";
+- case LOG_DEBUG: return "DEBUG";
+- case LOG_INFO: return "INFO";
+- case LOG_NOTICE: return "NOTICE";
+- case LOG_WARN: return "WARN";
+- case LOG_ERROR: return "ERROR";
+- case LOG_CRITICAL: return "CRITICAL";
+- }
+- return "<log level unknown>";
+- }
+-*/
+-
+-
+-}}
++}}}
+
+-#endif // ifndef QPID_LINEARSTORE_JRNL_ENUMS_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_ENUMS_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/jcfg.h b/qpid/cpp/src/qpid/linearstore/jrnl/jcfg.h
+index 432887e..83c61bc 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/jcfg.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/jcfg.h
+@@ -19,8 +19,8 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_JCFG_H
+-#define QPID_LEGACYSTORE_JRNL_JCFG_H
++#ifndef QPID_QLS_JRNL_JCFG_H
++#define QPID_QLS_JRNL_JCFG_H
+
+ #define QLS_SBLK_SIZE_BYTES 4096 /**< Disk softblock size in bytes, should match size used on disk media */
+ #define QLS_AIO_ALIGN_BOUNDARY_BYTES QLS_SBLK_SIZE_BYTES /** Memory alignment boundary used for DMA */
+@@ -55,4 +55,4 @@
+ #define QLS_CLEAN /**< If defined, writes QLS_CLEAN_CHAR to all filled areas on disk */
+ #define QLS_CLEAN_CHAR 0xff /**< Char used to clear empty space on disk */
+
+-#endif /* ifndef QPID_LEGACYSTORE_JRNL_JCFG_H */
++#endif /* ifndef QPID_QLS_JRNL_JCFG_H */
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/jcntl.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/jcntl.cpp
+index f21deea..099c32b 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/jcntl.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/jcntl.cpp
+@@ -38,10 +38,9 @@
+ #include <sstream>
+ #include <unistd.h>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ #define AIO_CMPL_TIMEOUT_SEC 5
+ #define AIO_CMPL_TIMEOUT_NSEC 0
+@@ -132,9 +131,9 @@ jcntl::recover(EmptyFilePoolManager* efpmp,
+ _recoveryManager.analyzeJournals(prep_txn_list_ptr, efpmp, &_emptyFilePoolPtr);
+
+ highest_rid = _recoveryManager.getHighestRecordId();
+- _jrnl_log.log(/*LOG_DEBUG*/JournalLog::LOG_INFO, _jid, _recoveryManager.toString(_jid, true));
++ _jrnl_log.log(/*LOG_DEBUG*/JournalLog::LOG_INFO, _jid, _recoveryManager.toLog(_jid, 5));
+ _linearFileController.initialize(_jdir.dirname(), _emptyFilePoolPtr, _recoveryManager.getHighestFileNumber());
+- _recoveryManager.setLinearFileControllerJournals(&qpid::qls_jrnl::LinearFileController::addJournalFile, &_linearFileController);
++ _recoveryManager.setLinearFileControllerJournals(&qpid::linearstore::journal::LinearFileController::addJournalFile, &_linearFileController);
+ _wmgr.initialize(cbp, wcache_pgsize_sblks, wcache_num_pages, QLS_WMGR_MAXDTOKPP, QLS_WMGR_MAXWAITUS,
+ (_recoveryManager.isLastFileFull() ? 0 : _recoveryManager.getEndOffset()));
+
+@@ -430,4 +429,4 @@ std::cout << "&&&&&& jcntl::handle_aio_wait() " << _wmgr.status_str() << std::en
+ return false;
+ }
+
+-}}
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/jcntl.h b/qpid/cpp/src/qpid/linearstore/jrnl/jcntl.h
+index bb91eac..76d2a98 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/jcntl.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/jcntl.h
+@@ -19,15 +19,14 @@
+ *
+ */
+
+-#ifndef QPID_LINEARSTORE_JRNL_JCNTL_H
+-#define QPID_LINEARSTORE_JRNL_JCNTL_H
++#ifndef QPID_LINEARSTORE_JOURNAL_JCNTL_H
++#define QPID_LINEARSTORE_JOURNAL_JCNTL_H
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+ class jcntl;
+-}}
++}}}
+
+ #include <cstddef>
+ #include <deque>
+@@ -38,10 +37,9 @@ namespace qls_jrnl
+ #include "qpid/linearstore/jrnl/smutex.h"
+ #include "qpid/linearstore/jrnl/wmgr.h"
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+ class EmptyFilePool;
+ class EmptyFilePoolManager;
+
+@@ -570,6 +568,6 @@ namespace qls_jrnl
+ bool handle_aio_wait(const iores res, iores& resout, const data_tok* dtp);
+ };
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LINEARSTORE_JRNL_JCNTL_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_JCNTL_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/jdir.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/jdir.cpp
+index 977c75e..7344930 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/jdir.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/jdir.cpp
+@@ -32,10 +32,9 @@
+ #include <sys/stat.h>
+ #include <unistd.h>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ jdir::jdir(const std::string& dirname/*, const std::string& _base_filename*/):
+ _dirname(dirname)/*,
+@@ -476,4 +475,4 @@ operator<<(std::ostream& os, const jdir* jdirPtr)
+ return os;
+ }
+
+-}}
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/jdir.h b/qpid/cpp/src/qpid/linearstore/jrnl/jdir.h
+index 01a08c5..c13a5f5 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/jdir.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/jdir.h
+@@ -19,25 +19,23 @@
+ *
+ */
+
+-#ifndef QPID_LINEARSTORE_JRNL_JDIR_H
+-#define QPID_LINEARSTORE_JRNL_JDIR_H
++#ifndef QPID_LINEARSTORE_JOURNAL_JDIR_H
++#define QPID_LINEARSTORE_JOURNAL_JDIR_H
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+ class jdir;
+-}}
++}}}
+
+ //#include "qpid/linearstore/jrnl/jinf.h"
+ #include <dirent.h>
+ #include <string>
+ #include <vector>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ /**
+ * \class jdir
+@@ -364,6 +362,6 @@ namespace qls_jrnl
+ static void close_dir(DIR* dir, const std::string& dir_name, const std::string& fn_name);
+ };
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LINEARSTORE_JRNL_JDIR_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_JDIR_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/jerrno.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/jerrno.cpp
+index c8fd2f5..a689660 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/jerrno.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/jerrno.cpp
+@@ -21,10 +21,9 @@
+
+ #include "qpid/linearstore/jrnl/jerrno.h"
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ std::map<uint32_t, const char*> jerrno::_err_map;
+ std::map<uint32_t, const char*>::iterator jerrno::_err_map_itr;
+@@ -214,4 +213,4 @@ jerrno::err_msg(const uint32_t err_no) throw ()
+ return _err_map_itr->second;
+ }
+
+-}}
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/jerrno.h b/qpid/cpp/src/qpid/linearstore/jrnl/jerrno.h
+index 4c7124a..5af0a7a 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/jerrno.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/jerrno.h
+@@ -19,24 +19,22 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_JERRNO_H
+-#define QPID_LEGACYSTORE_JRNL_JERRNO_H
++#ifndef QPID_LINEARSTORE_JOURNAL_JERRNO_H
++#define QPID_LINEARSTORE_JOURNAL_JERRNO_H
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+ class jerrno;
+-}}
++}}}
+
+ #include <map>
+ #include <stdint.h>
+ #include <string>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ /**
+ * \class jerrno
+@@ -144,6 +142,6 @@ namespace qls_jrnl
+ static bool __init();
+ };
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_JERRNO_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_JERRNO_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/jexception.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/jexception.cpp
+index 38ef85d..44e9142 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/jexception.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/jexception.cpp
+@@ -27,10 +27,9 @@
+
+ #define CATLEN(p) MAX_MSG_SIZE - std::strlen(p) - 1
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ jexception::jexception() throw ():
+ std::exception(),
+@@ -168,4 +167,4 @@ operator<<(std::ostream& os, const jexception* jePtr)
+ return os;
+ }
+
+-}}
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/jexception.h b/qpid/cpp/src/qpid/linearstore/jrnl/jexception.h
+index a3a3469..712b357 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/jexception.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/jexception.h
+@@ -19,15 +19,14 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_JEXCEPTION_H
+-#define QPID_LEGACYSTORE_JRNL_JEXCEPTION_H
++#ifndef QPID_LINEARSTORE_JOURNAL_JEXCEPTION_H
++#define QPID_LINEARSTORE_JOURNAL_JEXCEPTION_H
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+ class jexception;
+-}}
++}}}
+
+ #include <cerrno>
+ #include <cstdio>
+@@ -70,10 +69,10 @@ class jexception;
+ ::abort(); \
+ }
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
++
+ /**
+ * \class jexception
+ * \brief Generic journal exception class
+@@ -121,6 +120,6 @@ namespace qls_jrnl
+ friend std::ostream& operator<<(std::ostream& os, const jexception* jePtr);
+ }; // class jexception
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_JEXCEPTION_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_JEXCEPTION_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/jrec.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/jrec.cpp
+index 87e0b0c..45f0197 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/jrec.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/jrec.cpp
+@@ -24,84 +24,15 @@
+ #include <iomanip>
+ #include "qpid/linearstore/jrnl/jerrno.h"
+ #include "qpid/linearstore/jrnl/jexception.h"
++#include "qpid/linearstore/jrnl/utils/rec_hdr.h"
++#include "qpid/linearstore/jrnl/utils/rec_tail.h"
+ #include <sstream>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ jrec::jrec() {}
+ jrec::~jrec() {}
+
+-void
+-jrec::chk_hdr(const rec_hdr_t& hdr)
+-{
+- if (hdr._magic == 0)
+- {
+- std::ostringstream oss;
+- oss << std::hex << std::setfill('0');
+- oss << "enq magic NULL: rid=0x" << hdr._rid;
+- throw jexception(jerrno::JERR_JREC_BADRECHDR, oss.str(), "jrec", "chk_hdr");
+- }
+- if (hdr._version != QLS_JRNL_VERSION)
+- {
+- std::ostringstream oss;
+- oss << std::hex << std::setfill('0');
+- oss << "version: rid=0x" << hdr._rid;
+- oss << ": expected=0x" << std::setw(2) << (int)QLS_JRNL_VERSION;
+- oss << " read=0x" << std::setw(2) << (int)hdr._version;
+- throw jexception(jerrno::JERR_JREC_BADRECHDR, oss.str(), "jrec", "chk_hdr");
+- }
+-//#if defined (JRNL_LITTLE_ENDIAN)
+-// uint8_t endian_flag = RHM_LENDIAN_FLAG;
+-//#else
+-// uint8_t endian_flag = RHM_BENDIAN_FLAG;
+-//#endif
+-// if (hdr._eflag != endian_flag)
+-// {
+-// std::ostringstream oss;
+-// oss << std::hex << std::setfill('0');
+-// oss << "endian_flag: rid=" << hdr._rid;
+-// oss << ": expected=0x" << std::setw(2) << (int)endian_flag;
+-// oss << " read=0x" << std::setw(2) << (int)hdr._eflag;
+-// throw jexception(jerrno::JERR_JREC_BADRECHDR, oss.str(), "jrec", "chk_hdr");
+-// }
+-}
+-
+-void
+-jrec::chk_rid(const rec_hdr_t& hdr, const uint64_t rid)
+-{
+- if (hdr._rid != rid)
+- {
+- std::ostringstream oss;
+- oss << std::hex << std::setfill('0');
+- oss << "rid mismatch: expected=0x" << rid;
+- oss << " read=0x" << hdr._rid;
+- throw jexception(jerrno::JERR_JREC_BADRECHDR, oss.str(), "jrec", "chk_hdr");
+- }
+-}
+-
+-void
+-jrec::chk_tail(const rec_tail_t& tail, const rec_hdr_t& hdr)
+-{
+- if (tail._xmagic != ~hdr._magic)
+- {
+- std::ostringstream oss;
+- oss << std::hex << std::setfill('0');
+- oss << "magic: rid=0x" << hdr._rid;
+- oss << ": expected=0x" << ~hdr._magic;
+- oss << " read=0x" << tail._xmagic;
+- throw jexception(jerrno::JERR_JREC_BADRECTAIL, oss.str(), "jrec", "chk_tail");
+- }
+- if (tail._rid != hdr._rid)
+- {
+- std::ostringstream oss;
+- oss << std::hex << std::setfill('0');
+- oss << "rid: rid=0x" << hdr._rid;
+- oss << ": read=0x" << tail._rid;
+- throw jexception(jerrno::JERR_JREC_BADRECTAIL, oss.str(), "jrec", "chk_tail");
+- }
+-}
+-
+-}}
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/jrec.h b/qpid/cpp/src/qpid/linearstore/jrnl/jrec.h
+index 619cd0b..ef481cc 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/jrec.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/jrec.h
+@@ -19,152 +19,105 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_JREC_H
+-#define QPID_LEGACYSTORE_JRNL_JREC_H
+-
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
+-class jrec;
+-}}
++#ifndef QPID_LINEARSTORE_JOURNAL_JREC_H
++#define QPID_LINEARSTORE_JOURNAL_JREC_H
+
+ #include <cstddef>
+ #include <fstream>
+ #include "qpid/linearstore/jrnl/jcfg.h"
+-#include "qpid/linearstore/jrnl/utils/rec_hdr.h"
+-#include "qpid/linearstore/jrnl/utils/rec_tail.h"
++#include <stdint.h>
+ #include <string>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
++struct rec_hdr_t;
++struct rec_tail_t;
++
++namespace qpid {
++namespace linearstore {
++namespace journal {
++
++/**
++* \class jrec
++* \brief Abstract class for all file jrecords, both data and log. This class establishes
++* the common data format and structure for these jrecords.
++*/
++class jrec
+ {
++public:
++ jrec();
++ virtual ~jrec();
+
+ /**
+- * \class jrec
+- * \brief Abstract class for all file jrecords, both data and log. This class establishes
+- * the common data format and structure for these jrecords.
++ * \brief Encode this instance of jrec into the write buffer at the disk-block-aligned
++ * pointer wptr starting at position rec_offs_dblks in the encoded record to a
++ * maximum size of max_size_dblks.
++ *
++ * This call encodes the content of the data contianed in this instance of jrec into a
++ * disk-softblock-aligned (defined by JRNL_SBLK_SIZE) buffer pointed to by parameter
++ * wptr. No more than paramter max_size_dblks data-blocks may be written to the buffer.
++ * The parameter rec_offs_dblks is the offset in data-blocks within the fully encoded
++ * data block this instance represents at which to start encoding.
++ *
++ * Encoding entails writing the record header (struct enq_hdr), the data and the record tail
++ * (struct enq_tail). The record must be data-block-aligned (defined by JRNL_DBLK_SIZE),
++ * thus any remaining space in the final data-block is ignored; the returned value is the
++ * number of data-blocks consumed from the page by the encode action. Provided the initial
++ * alignment requirements are met, records may be of arbitrary size and may span multiple
++ * data-blocks, disk-blocks and/or pages.
++ *
++ * Since the record size in data-blocks is known, the general usage pattern is to call
++ * encode() as many times as is needed to fully encode the data. Each call to encode()
++ * will encode as much of the record as it can to what remains of the current page cache,
++ * and will return the number of data-blocks actually encoded.
++ *
++ * <b>Example:</b> Assume that record r1 was previously written to page 0, and that this
++ * is an instance representing record r2. Being larger than the page size ps, r2 would span
++ * multiple pages as follows:
++ * <pre>
++ * |<---ps--->|
++ * +----------+----------+----------+----...
++ * | |r2a| r2b | r2c | |
++ * |<-r1-><----------r2----------> |
++ * +----------+----------+----------+----...
++ * page: p0 p1 p2
++ * </pre>
++ * Encoding record r2 will require multiple calls to encode; one for each page which
++ * is involved. Record r2 is divided logically into sections r2a, r2b and r2c at the
++ * points where the page boundaries intersect with the record. Assuming a page size
++ * of ps, the page boundary pointers are represented by their names p0, p1... and the
++ * sizes of the record segments are represented by their names r1, r2a, r2b..., the calls
++ * should be as follows:
++ * <pre>
++ * encode(p0+r1, 0, ps-r1); (returns r2a data-blocks)
++ * encode(p1, r2a, ps); (returns r2b data-blocks which equals ps)
++ * encode(p2, r2a+r2b, ps); (returns r2c data-blocks)
++ * </pre>
++ *
++ * \param wptr Data-block-aligned pointer to position in page buffer where encoding is to
++ * take place.
++ * \param rec_offs_dblks Offset in data-blocks within record from which to start encoding.
++ * \param max_size_dblks Maximum number of data-blocks to write to pointer wptr.
++ * \returns Number of data-blocks encoded.
+ */
+- class jrec
+- {
+- public:
+- jrec();
+- virtual ~jrec();
+-
+- /**
+- * \brief Encode this instance of jrec into the write buffer at the disk-block-aligned
+- * pointer wptr starting at position rec_offs_dblks in the encoded record to a
+- * maximum size of max_size_dblks.
+- *
+- * This call encodes the content of the data contianed in this instance of jrec into a
+- * disk-softblock-aligned (defined by JRNL_SBLK_SIZE) buffer pointed to by parameter
+- * wptr. No more than paramter max_size_dblks data-blocks may be written to the buffer.
+- * The parameter rec_offs_dblks is the offset in data-blocks within the fully encoded
+- * data block this instance represents at which to start encoding.
+- *
+- * Encoding entails writing the record header (struct enq_hdr), the data and the record tail
+- * (struct enq_tail). The record must be data-block-aligned (defined by JRNL_DBLK_SIZE),
+- * thus any remaining space in the final data-block is ignored; the returned value is the
+- * number of data-blocks consumed from the page by the encode action. Provided the initial
+- * alignment requirements are met, records may be of arbitrary size and may span multiple
+- * data-blocks, disk-blocks and/or pages.
+- *
+- * Since the record size in data-blocks is known, the general usage pattern is to call
+- * encode() as many times as is needed to fully encode the data. Each call to encode()
+- * will encode as much of the record as it can to what remains of the current page cache,
+- * and will return the number of data-blocks actually encoded.
+- *
+- * <b>Example:</b> Assume that record r1 was previously written to page 0, and that this
+- * is an instance representing record r2. Being larger than the page size ps, r2 would span
+- * multiple pages as follows:
+- * <pre>
+- * |<---ps--->|
+- * +----------+----------+----------+----...
+- * | |r2a| r2b | r2c | |
+- * |<-r1-><----------r2----------> |
+- * +----------+----------+----------+----...
+- * page: p0 p1 p2
+- * </pre>
+- * Encoding record r2 will require multiple calls to encode; one for each page which
+- * is involved. Record r2 is divided logically into sections r2a, r2b and r2c at the
+- * points where the page boundaries intersect with the record. Assuming a page size
+- * of ps, the page boundary pointers are represented by their names p0, p1... and the
+- * sizes of the record segments are represented by their names r1, r2a, r2b..., the calls
+- * should be as follows:
+- * <pre>
+- * encode(p0+r1, 0, ps-r1); (returns r2a data-blocks)
+- * encode(p1, r2a, ps); (returns r2b data-blocks which equals ps)
+- * encode(p2, r2a+r2b, ps); (returns r2c data-blocks)
+- * </pre>
+- *
+- * \param wptr Data-block-aligned pointer to position in page buffer where encoding is to
+- * take place.
+- * \param rec_offs_dblks Offset in data-blocks within record from which to start encoding.
+- * \param max_size_dblks Maximum number of data-blocks to write to pointer wptr.
+- * \returns Number of data-blocks encoded.
+- */
+- virtual uint32_t encode(void* wptr, uint32_t rec_offs_dblks,
+- uint32_t max_size_dblks) = 0;
+-
+- /**
+- * \brief Decode into this instance of jrec from the read buffer at the disk-block-aligned
+- * pointer rptr starting at position jrec_offs_dblks in the encoded record to a
+- * maximum size of max_size_blks.
+- *
+- * This call decodes a record in the page buffer pointed to by the data-block-aligned
+- * (defined by JRNL_DBLK_SIZE) parameter rptr into this instance of jrec. No more than
+- * paramter max_size_dblks data-blocks may be read from the buffer. The parameter
+- * jrec_offs_dblks is the offset in data-blocks within the encoded record at which to start
+- * decoding.
+- *
+- * Decoding entails reading the record header, the data and the tail. The record is
+- * data-block-aligned (defined by JRNL_DBLK_SIZE); the returned value is the number of
+- * data-blocks read from the buffer by the decode action. As the record data size is only
+- * known once the header is read, the number of calls required to complete reading the
+- * record will depend on the vlaues within this instance which are set when the
+- * header is decoded.
+- *
+- * A non-zero value for jrec_offs_dblks implies that this is not the first call to
+- * decode and the record data will be appended at this offset.
+- *
+- * \param h Reference to instance of struct hdr, already read from page buffer and used
+- * to determine record type
+- * \param rptr Data-block-aligned pointer to position in page buffer where decoding is to
+- * begin.
+- * \param rec_offs_dblks Offset within record from which to start appending the decoded
+- * record.
+- * \param max_size_dblks Maximum number of data-blocks to read from pointer rptr.
+- * \returns Number of data-blocks read (consumed).
+- */
+- virtual uint32_t decode(rec_hdr_t& h, void* rptr, uint32_t rec_offs_dblks,
+- uint32_t max_size_dblks) = 0;
+-
+- virtual bool rcv_decode(rec_hdr_t h, std::ifstream* ifsp, std::size_t& rec_offs) = 0;
++ virtual uint32_t encode(void* wptr, uint32_t rec_offs_dblks, uint32_t max_size_dblks) = 0;
++ virtual bool decode(::rec_hdr_t& h, std::ifstream* ifsp, std::size_t& rec_offs) = 0;
+
+- virtual std::string& str(std::string& str) const = 0;
+- virtual std::size_t data_size() const = 0;
+- virtual std::size_t xid_size() const = 0;
+- virtual std::size_t rec_size() const = 0;
+- inline virtual uint32_t rec_size_dblks() const { return size_dblks(rec_size()); }
+- static inline uint32_t size_dblks(const std::size_t size)
+- { return size_blks(size, QLS_DBLK_SIZE_BYTES); }
+- static inline uint32_t size_sblks(const std::size_t size)
+- { return size_blks(size, QLS_SBLK_SIZE_BYTES); }
+- static inline uint32_t size_blks(const std::size_t size, const std::size_t blksize)
+- { return (size + blksize - 1)/blksize; }
+- virtual uint64_t rid() const = 0;
++ virtual std::string& str(std::string& str) const = 0;
++ virtual std::size_t data_size() const = 0;
++ virtual std::size_t xid_size() const = 0;
++ virtual std::size_t rec_size() const = 0;
++ inline virtual uint32_t rec_size_dblks() const { return size_dblks(rec_size()); }
++ static inline uint32_t size_dblks(const std::size_t size)
++ { return size_blks(size, QLS_DBLK_SIZE_BYTES); }
++ static inline uint32_t size_sblks(const std::size_t size)
++ { return size_blks(size, QLS_SBLK_SIZE_BYTES); }
++ static inline uint32_t size_blks(const std::size_t size, const std::size_t blksize)
++ { return (size + blksize - 1)/blksize; }
++ virtual uint64_t rid() const = 0;
+
+- protected:
+- virtual void chk_hdr() const = 0;
+- virtual void chk_hdr(uint64_t rid) const = 0;
+- virtual void chk_tail() const = 0;
+- static void chk_hdr(const rec_hdr_t& hdr);
+- static void chk_rid(const rec_hdr_t& hdr, uint64_t rid);
+- static void chk_tail(const rec_tail_t& tail, const rec_hdr_t& hdr);
+- virtual void clean() = 0;
+- }; // class jrec
++protected:
++ virtual void clean() = 0;
++};
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_JREC_H
++#endif // ifndef QPID_LINEARSTORE_JRNL_JREC_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/pmgr.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/pmgr.cpp
+index 32b024a..b561c6c 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/pmgr.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/pmgr.cpp
+@@ -29,10 +29,9 @@
+ #include "qpid/linearstore/jrnl/jerrno.h"
+ #include <sstream>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ pmgr::page_cb::page_cb(uint16_t index):
+ _index(index),
+@@ -199,4 +198,4 @@ pmgr::page_state_str(page_state ps)
+ return "<page_state unknown>";
+ }
+
+-}}
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/pmgr.h b/qpid/cpp/src/qpid/linearstore/jrnl/pmgr.h
+index 64143a9..787828a 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/pmgr.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/pmgr.h
+@@ -19,16 +19,15 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_PMGR_H
+-#define QPID_LEGACYSTORE_JRNL_PMGR_H
++#ifndef QPID_LINEARSTORE_JOURNAL_PMGR_H
++#define QPID_LINEARSTORE_JOURNAL_PMGR_H
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+ class pmgr;
+ class jcntl;
+-}}
++}}}
+
+ #include <deque>
+ #include "qpid/linearstore/jrnl/aio.h"
+@@ -40,11 +39,11 @@ namespace qls_jrnl
+ #include "qpid/linearstore/jrnl/txn_map.h"
+ #include "qpid/linearstore/jrnl/txn_rec.h"
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
+-class JournalFile;
++namespace qpid {
++namespace linearstore {
++namespace journal {
++
++ class JournalFile;
+
+ /**
+ * \brief Abstract class for managing either read or write page cache of arbitrary size and
+@@ -122,6 +121,6 @@ class JournalFile;
+ virtual void clean();
+ };
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_PMGR_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_PMGR_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/slock.h b/qpid/cpp/src/qpid/linearstore/jrnl/slock.h
+index bbfee37..b118f71 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/slock.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/slock.h
+@@ -19,17 +19,16 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_SLOCK_H
+-#define QPID_LEGACYSTORE_JRNL_SLOCK_H
++#ifndef QPID_LINEARSTORE_JOURNAL_SLOCK_H
++#define QPID_LINEARSTORE_JOURNAL_SLOCK_H
+
+ #include "qpid/linearstore/jrnl/jexception.h"
+ #include "qpid/linearstore/jrnl/smutex.h"
+ #include <pthread.h>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ // Ultra-simple scoped lock class, auto-releases mutex when it goes out-of-scope
+ class slock
+@@ -68,6 +67,6 @@ namespace qls_jrnl
+ inline bool locked() const { return _locked; }
+ };
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_SLOCK_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_SLOCK_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/smutex.h b/qpid/cpp/src/qpid/linearstore/jrnl/smutex.h
+index 087e197..91520ce 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/smutex.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/smutex.h
+@@ -19,16 +19,15 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_SMUTEX_H
+-#define QPID_LEGACYSTORE_JRNL_SMUTEX_H
++#ifndef QPID_LINEARSTORE_JOURNAL_SMUTEX_H
++#define QPID_LINEARSTORE_JOURNAL_SMUTEX_H
+
+ #include "qpid/linearstore/jrnl/jexception.h"
+ #include <pthread.h>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ // Ultra-simple scoped mutex class that allows a posix mutex to be initialized and destroyed with error checks
+ class smutex
+@@ -47,6 +46,6 @@ namespace qls_jrnl
+ inline pthread_mutex_t* get() const { return &_m; }
+ };
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_SMUTEX_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_SMUTEX_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/time_ns.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/time_ns.cpp
+index 49e9a61..5bb0449 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/time_ns.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/time_ns.cpp
+@@ -23,10 +23,9 @@
+
+ #include <sstream>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ const std::string
+ time_ns::str(int precision) const
+@@ -39,5 +38,4 @@ time_ns::str(int precision) const
+ return oss.str();
+ }
+
+-
+-}}
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/time_ns.h b/qpid/cpp/src/qpid/linearstore/jrnl/time_ns.h
+index 3319573..a228d47 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/time_ns.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/time_ns.h
+@@ -19,17 +19,16 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_TIME_NS_H
+-#define QPID_LEGACYSTORE_JRNL_TIME_NS_H
++#ifndef QPID_LINEARSTORE_JOURNAL_TIME_NS_H
++#define QPID_LINEARSTORE_JOURNAL_TIME_NS_H
+
+ #include <cerrno>
+ #include <ctime>
+ #include <string>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ struct time_ns : public timespec
+ {
+@@ -88,6 +87,6 @@ struct time_ns : public timespec
+ { if(tv_sec == rhs.tv_sec) return tv_nsec <= rhs.tv_nsec; return tv_sec <= rhs.tv_sec; }
+ };
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_TIME_NS_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_TIME_NS_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/txn_map.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/txn_map.cpp
+index 9c32f41..2cc7966 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/txn_map.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/txn_map.cpp
+@@ -27,10 +27,9 @@
+ #include "qpid/linearstore/jrnl/slock.h"
+ #include <sstream>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ // return/error codes
+ int16_t txn_map::TMAP_RID_NOT_FOUND = -2;
+@@ -231,4 +230,4 @@ txn_map::xid_list(std::vector<std::string>& xv)
+ }
+ }
+
+-}}
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/txn_map.h b/qpid/cpp/src/qpid/linearstore/jrnl/txn_map.h
+index 146997a..419e043 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/txn_map.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/txn_map.h
+@@ -19,15 +19,14 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_TXN_MAP_H
+-#define QPID_LEGACYSTORE_JRNL_TXN_MAP_H
++#ifndef QPID_LINEARSTORE_JOURNAL_TXN_MAP_H
++#define QPID_LINEARSTORE_JOURNAL_TXN_MAP_H
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+ class txn_map;
+-}}
++}}}
+
+ #include "qpid/linearstore/jrnl/smutex.h"
+ #include <map>
+@@ -35,10 +34,9 @@ namespace qls_jrnl
+ #include <string>
+ #include <vector>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ /**
+ * \struct txn_data_struct
+@@ -141,6 +139,6 @@ namespace qls_jrnl
+ const txn_data_list get_tdata_list_nolock(const std::string& xid);
+ };
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_TXN_MAP_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_TXN_MAP_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/txn_rec.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/txn_rec.cpp
+index 9525793..33c02c0 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/txn_rec.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/txn_rec.cpp
+@@ -22,38 +22,20 @@
+ #include "qpid/linearstore/jrnl/txn_rec.h"
+
+ #include <cassert>
+-#include <cerrno>
+-#include <cstdlib>
+ #include <cstring>
+ #include <iomanip>
+-#include "qpid/linearstore/jrnl/jerrno.h"
+ #include "qpid/linearstore/jrnl/jexception.h"
+-#include <sstream>
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ txn_rec::txn_rec():
+-// _txn_hdr(),
+ _xidp(0),
+ _buff(0)
+-// _txn_tail()
+-{
+- ::txn_hdr_init(&_txn_hdr, 0, QLS_JRNL_VERSION, 0, 0, 0);
+- ::rec_tail_init(&_txn_tail, 0, 0, 0);
+-}
+-
+-txn_rec::txn_rec(const uint32_t magic, const uint64_t rid, const void* const xidp,
+- const std::size_t xidlen/*, const bool owi*/):
+-// _txn_hdr(magic, RHM_JDAT_VERSION, rid, xidlen, owi),
+- _xidp(xidp),
+- _buff(0)
+-// _txn_tail(_txn_hdr)
+ {
+- ::txn_hdr_init(&_txn_hdr, magic, QLS_JRNL_VERSION, 0, rid, xidlen);
+- ::rec_tail_copy(&_txn_tail, &_txn_hdr._rhdr, 0);
++ ::txn_hdr_init(&_txn_hdr, 0, QLS_JRNL_VERSION, 0, 0, 0, 0);
++ ::rec_tail_init(&_txn_tail, 0, 0, 0, 0);
+ }
+
+ txn_rec::~txn_rec()
+@@ -62,28 +44,17 @@ txn_rec::~txn_rec()
+ }
+
+ void
+-txn_rec::reset(const uint32_t magic)
+-{
+- _txn_hdr._rhdr._magic = magic;
+- _txn_hdr._rhdr._rid = 0;
+- _txn_hdr._xidsize = 0;
+- _xidp = 0;
+- _buff = 0;
+- _txn_tail._xmagic = ~magic;
+- _txn_tail._rid = 0;
+-}
+-
+-void
+-txn_rec::reset(const uint32_t magic, const uint64_t rid, const void* const xidp,
+- const std::size_t xidlen/*, const bool owi*/)
++txn_rec::reset(const bool commitFlag, const uint64_t serial, const uint64_t rid, const void* const xidp,
++ const std::size_t xidlen)
+ {
+- _txn_hdr._rhdr._magic = magic;
++ _txn_hdr._rhdr._magic = commitFlag ? QLS_TXC_MAGIC : QLS_TXA_MAGIC;
++ _txn_hdr._rhdr._serial = serial;
+ _txn_hdr._rhdr._rid = rid;
+-// _txn_hdr.set_owi(owi);
+ _txn_hdr._xidsize = xidlen;
+ _xidp = xidp;
+ _buff = 0;
+- _txn_tail._xmagic = ~magic;
++ _txn_tail._xmagic = ~_txn_hdr._rhdr._magic;
++ _txn_tail._serial = serial;
+ _txn_tail._rid = rid;
+ }
+
+@@ -307,20 +278,15 @@ txn_rec::decode(rec_hdr_t& h, void* rptr, uint32_t rec_offs_dblks, uint32_t max_
+ }
+
+ bool
+-txn_rec::rcv_decode(rec_hdr_t h, std::ifstream* ifsp, std::size_t& rec_offs)
++txn_rec::decode(::rec_hdr_t& h, std::ifstream* ifsp, std::size_t& rec_offs)
+ {
++ uint32_t checksum = 0UL; // TODO: Add checksum math
+ if (rec_offs == 0)
+ {
+ // Read header, allocate for xid
+ //_txn_hdr.hdr_copy(h);
+ ::rec_hdr_copy(&_txn_hdr._rhdr, &h);
+-#if defined(JRNL_BIG_ENDIAN) && defined(JRNL_32_BIT)
+- ifsp->ignore(sizeof(uint32_t)); // _filler0
+-#endif
+- ifsp->read((char*)&_txn_hdr._xidsize, sizeof(std::size_t));
+-#if defined(JRNL_LITTLE_ENDIAN) && defined(JRNL_32_BIT)
+- ifsp->ignore(sizeof(uint32_t)); // _filler0
+-#endif
++ ifsp->read((char*)&_txn_hdr._xidsize, sizeof(_txn_hdr._xidsize));
+ rec_offs = sizeof(txn_hdr_t);
+ _buff = std::malloc(_txn_hdr._xidsize);
+ MALLOC_CHK(_buff, "_buff", "txn_rec", "rcv_decode");
+@@ -358,8 +324,22 @@ txn_rec::rcv_decode(rec_hdr_t h, std::ifstream* ifsp, std::size_t& rec_offs)
+ }
+ }
+ ifsp->ignore(rec_size_dblks() * QLS_DBLK_SIZE_BYTES - rec_size());
+- chk_tail(); // Throws if tail invalid or record incomplete
++ if (::rec_tail_check(&_txn_tail, &_txn_hdr._rhdr, 0)) { // TODO: add checksum
++ throw jexception(jerrno::JERR_JREC_BADRECTAIL); // TODO: complete exception detail
++ }
+ assert(!ifsp->fail() && !ifsp->bad());
++ int res = ::rec_tail_check(&_txn_tail, &_txn_hdr._rhdr, checksum);
++ if (res != 0) {
++ std::stringstream oss;
++ switch (res) {
++ case 1: oss << std::hex << "Magic: expected 0x" << ~_txn_hdr._rhdr._magic << "; found 0x" << _txn_tail._xmagic; break;
++ case 2: oss << std::hex << "Serial: expected 0x" << _txn_hdr._rhdr._serial << "; found 0x" << _txn_tail._serial; break;
++ case 3: oss << std::hex << "Record Id: expected 0x" << _txn_hdr._rhdr._rid << "; found 0x" << _txn_tail._rid; break;
++ case 4: oss << std::hex << "Checksum: expected 0x" << checksum << "; found 0x" << _txn_tail._checksum; break;
++ default: oss << "Unknown error " << res;
++ }
++ throw jexception(jerrno::JERR_JREC_BADRECTAIL, oss.str(), "txn_rec", "decode"); // TODO: Don't throw exception, log info
++ }
+ return true;
+ }
+
+@@ -403,38 +383,9 @@ txn_rec::rec_size() const
+ }
+
+ void
+-txn_rec::chk_hdr() const
+-{
+- jrec::chk_hdr(_txn_hdr._rhdr);
+- if (_txn_hdr._rhdr._magic != QLS_TXA_MAGIC && _txn_hdr._rhdr._magic != QLS_TXC_MAGIC)
+- {
+- std::ostringstream oss;
+- oss << std::hex << std::setfill('0');
+- oss << "dtx magic: rid=0x" << std::setw(16) << _txn_hdr._rhdr._rid;
+- oss << ": expected=(0x" << std::setw(8) << QLS_TXA_MAGIC;
+- oss << " or 0x" << QLS_TXC_MAGIC;
+- oss << ") read=0x" << std::setw(2) << (int)_txn_hdr._rhdr._magic;
+- throw jexception(jerrno::JERR_JREC_BADRECHDR, oss.str(), "txn_rec", "chk_hdr");
+- }
+-}
+-
+-void
+-txn_rec::chk_hdr(uint64_t rid) const
+-{
+- chk_hdr();
+- jrec::chk_rid(_txn_hdr._rhdr, rid);
+-}
+-
+-void
+-txn_rec::chk_tail() const
+-{
+- jrec::chk_tail(_txn_tail, _txn_hdr._rhdr);
+-}
+-
+-void
+ txn_rec::clean()
+ {
+ // clean up allocated memory here
+ }
+
+-}}
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/txn_rec.h b/qpid/cpp/src/qpid/linearstore/jrnl/txn_rec.h
+index 4e9700e..f256891 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/txn_rec.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/txn_rec.h
+@@ -19,70 +19,49 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_TXN_REC_H
+-#define QPID_LEGACYSTORE_JRNL_TXN_REC_H
++#ifndef QPID_LINEARSTORE_JOURNAL_TXN_REC_H
++#define QPID_LINEARSTORE_JOURNAL_TXN_REC_H
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
+-class txn_rec;
+-}}
+-
+-#include <cstddef>
+ #include "qpid/linearstore/jrnl/jrec.h"
+ #include "qpid/linearstore/jrnl/utils/txn_hdr.h"
++#include "qpid/linearstore/jrnl/utils/rec_tail.h"
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+- /**
+- * \class txn_rec
+- * \brief Class to handle a single journal DTX commit or abort record.
+- */
+- class txn_rec : public jrec
+- {
+- private:
+- txn_hdr_t _txn_hdr; ///< transaction header
+- const void* _xidp; ///< xid pointer for encoding (writing to disk)
+- void* _buff; ///< Pointer to buffer to receive data read from disk
+- rec_tail_t _txn_tail; ///< Record tail
++/**
++* \class txn_rec
++* \brief Class to handle a single journal commit or abort record.
++*/
++class txn_rec : public jrec
++{
++private:
++ ::txn_hdr_t _txn_hdr; ///< Local instance of transaction header struct
++ const void* _xidp; ///< xid pointer for encoding (writing to disk)
++ void* _buff; ///< Pointer to buffer to receive data read from disk
++ ::rec_tail_t _txn_tail; ///< Local instance of enqueue tail struct
+
+- public:
+- // constructor used for read operations and xid must have memory allocated
+- txn_rec();
+- // constructor used for write operations, where xid already exists
+- txn_rec(const uint32_t magic, const uint64_t rid, const void* const xidp,
+- const std::size_t xidlen/*, const bool owi*/);
+- virtual ~txn_rec();
++public:
++ txn_rec();
++ virtual ~txn_rec();
+
+- // Prepare instance for use in reading data from journal
+- void reset(const uint32_t magic);
+- // Prepare instance for use in writing data to journal
+- void reset(const uint32_t magic, const uint64_t rid, const void* const xidp,
+- const std::size_t xidlen/*, const bool owi*/);
+- uint32_t encode(void* wptr, uint32_t rec_offs_dblks, uint32_t max_size_dblks);
+- uint32_t decode(rec_hdr_t& h, void* rptr, uint32_t rec_offs_dblks,
+- uint32_t max_size_dblks);
+- // Decode used for recover
+- bool rcv_decode(rec_hdr_t h, std::ifstream* ifsp, std::size_t& rec_offs);
++ void reset(const bool commitFlag, const uint64_t serial, const uint64_t rid, const void* const xidp,
++ const std::size_t xidlen);
++ uint32_t encode(void* wptr, uint32_t rec_offs_dblks, uint32_t max_size_dblks);
++ bool decode(::rec_hdr_t& h, std::ifstream* ifsp, std::size_t& rec_offs);
+
+- std::size_t get_xid(void** const xidpp);
+- std::string& str(std::string& str) const;
+- inline std::size_t data_size() const { return 0; } // This record never carries data
+- std::size_t xid_size() const;
+- std::size_t rec_size() const;
+- inline uint64_t rid() const { return _txn_hdr._rhdr._rid; }
++ std::size_t get_xid(void** const xidpp);
++ std::string& str(std::string& str) const;
++ inline std::size_t data_size() const { return 0; } // This record never carries data
++ std::size_t xid_size() const;
++ std::size_t rec_size() const;
++ inline uint64_t rid() const { return _txn_hdr._rhdr._rid; }
+
+- private:
+- void chk_hdr() const;
+- void chk_hdr(uint64_t rid) const;
+- void chk_tail() const;
+- virtual void clean();
+- }; // class txn_rec
++private:
++ virtual void clean();
++};
+
+-}}
++}}}
+
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_TXN_REC_H
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_TXN_REC_H
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/utils/deq_hdr.c b/qpid/cpp/src/qpid/linearstore/jrnl/utils/deq_hdr.c
+index 0cdab35..144ce41 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/utils/deq_hdr.c
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/utils/deq_hdr.c
+@@ -23,9 +23,9 @@
+
+ /*static const uint16_t DEQ_HDR_TXNCMPLCOMMIT_MASK = 0x10;*/
+
+-void deq_hdr_init(deq_hdr_t* dest, const uint32_t magic, const uint16_t version, const uint16_t uflag, const uint64_t
+- rid, const uint64_t deq_rid, const uint64_t xidsize) {
+- rec_hdr_init(&dest->_rhdr, magic, version, uflag, rid);
++void deq_hdr_init(deq_hdr_t* dest, const uint32_t magic, const uint16_t version, const uint16_t uflag,
++ const uint64_t serial, const uint64_t rid, const uint64_t deq_rid, const uint64_t xidsize) {
++ rec_hdr_init(&dest->_rhdr, magic, version, uflag, serial, rid);
+ dest->_deq_rid = deq_rid;
+ dest->_xidsize = xidsize;
+ }
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/utils/deq_hdr.h b/qpid/cpp/src/qpid/linearstore/jrnl/utils/deq_hdr.h
+index 25cfc71..3392867 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/utils/deq_hdr.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/utils/deq_hdr.h
+@@ -1,5 +1,5 @@
+-#ifndef QPID_LINEARSTORE_JRNL_UTILS_DEQ_HDR_H
+-#define QPID_LINEARSTORE_JRNL_UTILS_DEQ_HDR_H
++#ifndef QPID_LINEARSTORE_JOURNAL_UTILS_DEQ_HDR_H
++#define QPID_LINEARSTORE_JOURNAL_UTILS_DEQ_HDR_H
+ /*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+@@ -42,12 +42,14 @@ extern "C"{
+ * 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 (32 bytes):
++ * Record header info in binary format (40 bytes):
+ * <pre>
+ * 0 7
+ * +---+---+---+---+---+---+---+---+ -+
+ * | magic | ver | flags | |
+- * +---+---+---+---+---+---+---+---+ | struct rec_hdr_t
++ * +---+---+---+---+---+---+---+---+ |
++ * | serial | | struct rec_hdr_t
++ * +---+---+---+---+---+---+---+---+ |
+ * | rid | |
+ * +---+---+---+---+---+---+---+---+ -+
+ * | deq-rid |
+@@ -67,7 +69,7 @@ typedef struct deq_hdr_t {
+ static const uint16_t DEQ_HDR_TXNCMPLCOMMIT_MASK = 0x10;
+
+ void deq_hdr_init(deq_hdr_t* dest, const uint32_t magic, const uint16_t version, const uint16_t uflag,
+- const uint64_t rid, const uint64_t deq_rid, const uint64_t xidsize);
++ const uint64_t serial, const uint64_t rid, const uint64_t deq_rid, const uint64_t xidsize);
+ void deq_hdr_copy(deq_hdr_t* dest, const deq_hdr_t* src);
+ bool is_txn_coml_commit(const deq_hdr_t *dh);
+ void set_txn_coml_commit(deq_hdr_t *dh, const bool commit);
+@@ -78,4 +80,4 @@ void set_txn_coml_commit(deq_hdr_t *dh, const bool commit);
+ }
+ #endif
+
+-#endif /* ifndef QPID_LINEARSTORE_JRNL_UTILS_DEQ_HDR_H */
++#endif /* ifndef QPID_LINEARSTORE_JOURNAL_UTILS_DEQ_HDR_H */
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/utils/enq_hdr.c b/qpid/cpp/src/qpid/linearstore/jrnl/utils/enq_hdr.c
+index b8d2da7..b4e8b62 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/utils/enq_hdr.c
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/utils/enq_hdr.c
+@@ -25,8 +25,8 @@
+ //static const uint16_t ENQ_HDR_EXTERNAL_MASK = 0x20;
+
+ void enq_hdr_init(enq_hdr_t* dest, const uint32_t magic, const uint16_t version, const uint16_t uflag,
+- const uint64_t rid, const uint64_t xidsize, const uint64_t dsize) {
+- rec_hdr_init(&dest->_rhdr, magic, version, uflag, rid);
++ const uint64_t serial, const uint64_t rid, const uint64_t xidsize, const uint64_t dsize) {
++ rec_hdr_init(&dest->_rhdr, magic, version, uflag, serial, rid);
+ dest->_xidsize = xidsize;
+ dest->_dsize = dsize;
+ }
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/utils/enq_hdr.h b/qpid/cpp/src/qpid/linearstore/jrnl/utils/enq_hdr.h
+index 1beaef1..0010879 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/utils/enq_hdr.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/utils/enq_hdr.h
+@@ -1,5 +1,5 @@
+-#ifndef QPID_LINEARSTORE_JRNL_UTILS_ENQ_HDR_H
+-#define QPID_LINEARSTORE_JRNL_UTILS_ENQ_HDR_H
++#ifndef QPID_LINEARSTORE_JOURNAL_UTILS_ENQ_HDR_H
++#define QPID_LINEARSTORE_JOURNAL_UTILS_ENQ_HDR_H
+ /*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+@@ -38,12 +38,14 @@ extern "C"{
+ *
+ * This header precedes all enqueue data in journal files.
+ *
+- * Record header info in binary format (32 bytes):
++ * Record header info in binary format (40 bytes):
+ * <pre>
+ * 0 7
+ * +---+---+---+---+---+---+---+---+ -+
+ * | magic | ver | flags | |
+- * +---+---+---+---+---+---+---+---+ | struct rec_hdr_t
++ * +---+---+---+---+---+---+---+---+ |
++ * | serial | | struct rec_hdr_t
++ * +---+---+---+---+---+---+---+---+ |
+ * | rid | |
+ * +---+---+---+---+---+---+---+---+ -+
+ * | xidsize |
+@@ -64,7 +66,7 @@ static const uint16_t ENQ_HDR_TRANSIENT_MASK = 0x10;
+ static const uint16_t ENQ_HDR_EXTERNAL_MASK = 0x20;
+
+ void enq_hdr_init(enq_hdr_t* dest, const uint32_t magic, const uint16_t version, const uint16_t uflag,
+- const uint64_t rid, const uint64_t xidsize, const uint64_t dsize);
++ const uint64_t serial, const uint64_t rid, const uint64_t xidsize, const uint64_t dsize);
+ void enq_hdr_copy(enq_hdr_t* dest, const enq_hdr_t* src);
+ bool is_enq_transient(const enq_hdr_t *eh);
+ void set_enq_transient(enq_hdr_t *eh, const bool transient);
+@@ -78,4 +80,4 @@ bool validate_enq_hdr(enq_hdr_t *eh, const uint32_t magic, const uint16_t versio
+ }
+ #endif
+
+-#endif /* ifndef QPID_LINEARSTORE_JRNL_UTILS_ENQ_HDR_H */
++#endif /* ifndef QPID_LINEARSTORE_JOURNAL_UTILS_ENQ_HDR_H */
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/utils/file_hdr.c b/qpid/cpp/src/qpid/linearstore/jrnl/utils/file_hdr.c
+index dcc24ba..35b4ea2 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/utils/file_hdr.c
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/utils/file_hdr.c
+@@ -23,8 +23,8 @@
+ #include <string.h>
+
+ void file_hdr_create(file_hdr_t* dest, const uint32_t magic, const uint16_t version, const uint16_t fhdr_size_sblks,
+- const uint16_t efp_partition, const uint64_t file_size) {
+- rec_hdr_init(&dest->_rhdr, magic, version, 0, 0);
++ const uint16_t efp_partition, const uint64_t file_size) {
++ rec_hdr_init(&dest->_rhdr, magic, version, 0, 0, 0);
+ dest->_fhdr_size_sblks = fhdr_size_sblks;
+ dest->_efp_partition = efp_partition;
+ dest->_reserved = 0;
+@@ -36,10 +36,11 @@ void file_hdr_create(file_hdr_t* dest, const uint32_t magic, const uint16_t vers
+ dest->_queue_name_len = 0;
+ }
+
+-int file_hdr_init(void* dest, const uint64_t dest_len, const uint16_t uflag, const uint64_t rid, const uint64_t fro,
+- const uint64_t file_number, const uint16_t queue_name_len, const char* queue_name) {
++int file_hdr_init(void* dest, const uint64_t dest_len, const uint16_t uflag, const uint64_t serial, const uint64_t rid,
++ const uint64_t fro, const uint64_t file_number, const uint16_t queue_name_len, const char* queue_name) {
+ file_hdr_t* fhp = (file_hdr_t*)dest;
+ fhp->_rhdr._uflag = uflag;
++ fhp->_rhdr._serial = serial;
+ fhp->_rhdr._rid = rid;
+ fhp->_fro = fro;
+ fhp->_file_number = file_number;
+@@ -54,6 +55,13 @@ int file_hdr_init(void* dest, const uint64_t dest_len, const uint16_t uflag, con
+ return set_time_now(dest);
+ }
+
++int file_hdr_check(file_hdr_t* hdr, const uint32_t magic, const uint16_t version, const uint64_t data_size_kib) {
++ int res = rec_hdr_check_base(&hdr->_rhdr, magic, version);
++ if (res != 0) return 0;
++ if (hdr->_data_size_kib != data_size_kib) return 3;
++ return 0;
++}
++
+ void file_hdr_copy(file_hdr_t* dest, const file_hdr_t* src) {
+ rec_hdr_copy(&dest->_rhdr, &src->_rhdr);
+ dest->_fhdr_size_sblks = src->_fhdr_size_sblks; // Should this be copied?
+@@ -84,6 +92,23 @@ int is_file_hdr_reset(file_hdr_t* target) {
+ target->_queue_name_len == 0;
+ }
+
++/*
++uint64_t random_64() {
++ int randomData = open("/dev/random", O_RDONLY);
++ if (randomData < 0) {
++ return 0ULL;
++ }
++ uint64_t randomNumber;
++ size_t size = sizeof(randomNumber);
++ ssize_t result = read(randomData, (char*)&randomNumber, size);
++ if (result != size) {
++ randomNumber = 0ULL;
++ }
++ close(randomData);
++ return randomNumber;
++}
++*/
++
+ int set_time_now(file_hdr_t *fh)
+ {
+ struct timespec ts;
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/utils/file_hdr.h b/qpid/cpp/src/qpid/linearstore/jrnl/utils/file_hdr.h
+index 6a53c63..53ca686 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/utils/file_hdr.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/utils/file_hdr.h
+@@ -1,5 +1,5 @@
+-#ifndef QPID_LINEARSTORE_JRNL_UTILS_FILE_HDR_H
+-#define QPID_LINEARSTORE_JRNL_UTILS_FILE_HDR_H
++#ifndef QPID_LINEARSTORE_JOURNAL_UTILS_FILE_HDR_H
++#define QPID_LINEARSTORE_JOURNAL_UTILS_FILE_HDR_H
+ /*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+@@ -41,17 +41,19 @@ extern "C"{
+ * block in the file. The record ID and offset are updated on each overwrite of the
+ * file.
+ *
+- * File header info in binary format (66 bytes + size of file name in octets):
++ * File header info in binary format (74 bytes + size of file name in octets):
+ * <pre>
+ * 0 7
+ * +---+---+---+---+---+---+---+---+ -+
+ * | magic | ver | flags | |
+- * +---+---+---+---+---+---+---+---+ | struct rec_hdr_t
+- * | first rid in file | |
++ * +---+---+---+---+---+---+---+---+ |
++ * | serial | | struct rec_hdr_t
++ * +---+---+---+---+---+---+---+---+ |
++ * | rid | |
+ * +---+---+---+---+---+---+---+---+ -+
+ * | fs | partn | reserved |
+ * +---+---+---+---+---+---+---+---+
+- * | file-size |
++ * | data-size |
+ * +---+---+---+---+---+---+---+---+
+ * | fro |
+ * +---+---+---+---+---+---+---+---+
+@@ -87,10 +89,11 @@ typedef struct file_hdr_t {
+ uint16_t _queue_name_len; /**< Length of the queue name in octets, which follows this struct in the header */
+ } file_hdr_t;
+
+-void file_hdr_create(file_hdr_t* dest, const uint32_t magic, const uint16_t version, const uint16_t fhdr_size_sblks,
+- const uint16_t efp_partition, const uint64_t file_size);
+-int file_hdr_init(void* dest, const uint64_t dest_len, const uint16_t uflag, const uint64_t rid, const uint64_t fro,
+- const uint64_t file_number, const uint16_t queue_name_len, const char* queue_name);
++void file_hdr_create(file_hdr_t* dest, const uint32_t magic, const uint16_t version,
++ const uint16_t fhdr_size_sblks, const uint16_t efp_partition, const uint64_t file_size);
++int file_hdr_init(void* dest, const uint64_t dest_len, const uint16_t uflag, const uint64_t serial, const uint64_t rid,
++ const uint64_t fro, const uint64_t file_number, const uint16_t queue_name_len, const char* queue_name);
++int file_hdr_check(file_hdr_t* hdr, const uint32_t magic, const uint16_t version, const uint64_t data_size_kib);
+ void file_hdr_reset(file_hdr_t* target);
+ int is_file_hdr_reset(file_hdr_t* target);
+ void file_hdr_copy(file_hdr_t* dest, const file_hdr_t* src);
+@@ -103,4 +106,4 @@ void set_time(file_hdr_t *fh, struct timespec *ts);
+ }
+ #endif
+
+-#endif /* ifndef QPID_LINEARSTORE_JRNL_UTILS_FILE_HDR_H */
++#endif /* ifndef QPID_LINEARSTORE_JOURNAL_UTILS_FILE_HDR_H */
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_hdr.c b/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_hdr.c
+index be56068..ad5262f 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_hdr.c
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_hdr.c
+@@ -1,9 +1,10 @@
+ #include "rec_hdr.h"
+
+-void rec_hdr_init(rec_hdr_t* dest, const uint32_t magic, const uint16_t version, const uint16_t uflag, const uint64_t rid) {
++void rec_hdr_init(rec_hdr_t* dest, const uint32_t magic, const uint16_t version, const uint16_t uflag, const uint64_t serial, const uint64_t rid) {
+ dest->_magic = magic;
+ dest->_version = version;
+ dest->_uflag = uflag;
++ dest->_serial = serial;
+ dest->_rid = rid;
+ }
+
+@@ -11,5 +12,19 @@ void rec_hdr_copy(rec_hdr_t* dest, const rec_hdr_t* src) {
+ dest->_magic = src->_magic;
+ dest->_version = src->_version;
+ dest->_uflag = src->_uflag;
++ dest->_serial = src->_serial;
+ dest->_rid = src->_rid;
+ }
++
++int rec_hdr_check_base(rec_hdr_t* header, const uint32_t magic, const uint16_t version) {
++ if (header->_magic != magic) return 1;
++ if (header->_version != version) return 2;
++ return 0;
++}
++
++int rec_hdr_check(rec_hdr_t* header, const uint32_t magic, const uint16_t version, const uint64_t serial) {
++ int res = rec_hdr_check_base(header, magic, version);
++ if (res != 0) return res;
++ if (header->_serial != serial) return 3;
++ return 0;
++}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_hdr.h b/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_hdr.h
+index c843e21..64349b5 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_hdr.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_hdr.h
+@@ -1,5 +1,5 @@
+-#ifndef QPID_LINEARSTORE_JRNL_UTILS_REC_HDR_H
+-#define QPID_LINEARSTORE_JRNL_UTILS_REC_HDR_H
++#ifndef QPID_LINEARSTORE_JOURNAL_UTILS_REC_HDR_H
++#define QPID_LINEARSTORE_JOURNAL_UTILS_REC_HDR_H
+ /*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+@@ -34,11 +34,13 @@ extern "C"{
+ * This includes identification for the file type, the encoding version, endian
+ * indicator and a record ID.
+ *
+- * File header info in binary format (16 bytes):
++ * File header info in binary format (24 bytes):
+ * <pre>
+ * 0 7
+ * +---+---+---+---+---+---+---+---+
+- * | magic | ver | flags |
++ * | magic | ver | uflag |
++ * +---+---+---+---+---+---+---+---+
++ * | serial |
+ * +---+---+---+---+---+---+---+---+
+ * | rid |
+ * +---+---+---+---+---+---+---+---+
+@@ -52,11 +54,14 @@ typedef struct rec_hdr_t {
+ uint32_t _magic; /**< File type identifier (magic number) */
+ uint16_t _version; /**< File encoding version */
+ uint16_t _uflag; /**< User-defined flags */
++ uint64_t _serial; /**< Serial number for this journal file */
+ uint64_t _rid; /**< Record ID (rotating 64-bit counter) */
+ } rec_hdr_t;
+
+-void rec_hdr_init(rec_hdr_t* dest, const uint32_t magic, const uint16_t version, const uint16_t uflag, const uint64_t rid);
++void rec_hdr_init(rec_hdr_t* dest, const uint32_t magic, const uint16_t version, const uint16_t uflag, const uint64_t serial, const uint64_t rid);
+ void rec_hdr_copy(rec_hdr_t* dest, const rec_hdr_t* src);
++int rec_hdr_check_base(rec_hdr_t* header, const uint32_t magic, const uint16_t version);
++int rec_hdr_check(rec_hdr_t* header, const uint32_t magic, const uint16_t version, const uint64_t serial);
+
+ #pragma pack()
+
+@@ -64,4 +69,4 @@ void rec_hdr_copy(rec_hdr_t* dest, const rec_hdr_t* src);
+ }
+ #endif
+
+-#endif /* ifndef QPID_LINEARSTORE_JRNL_UTILS_REC_HDR_H */
++#endif /* ifndef QPID_LINEARSTORE_JOURNAL_UTILS_REC_HDR_H */
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_tail.c b/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_tail.c
+index 2e604eb..88c68e2 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_tail.c
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_tail.c
+@@ -21,14 +21,25 @@
+
+ #include "rec_tail.h"
+
+-void rec_tail_init(rec_tail_t* dest, const uint32_t xmagic, const uint32_t checksum, const uint64_t rid) {
++void rec_tail_init(rec_tail_t* dest, const uint32_t xmagic, const uint32_t checksum, const uint64_t serial,
++ const uint64_t rid) {
+ dest->_xmagic = xmagic;
+ dest->_checksum = checksum;
++ dest->_serial = serial;
+ dest->_rid = rid;
+ }
+
+ void rec_tail_copy(rec_tail_t* dest, const rec_hdr_t* src, const uint32_t checksum) {
+ dest->_xmagic = ~(src->_magic);
+ dest->_checksum = checksum;
++ dest->_serial = src->_serial;
+ dest->_rid = src->_rid;
+ }
++
++int rec_tail_check(const rec_tail_t* tail, const rec_hdr_t* header, const uint32_t checksum) {
++ if (tail->_xmagic != ~header->_magic) return 1;
++ if (tail->_serial != header->_serial) return 2;
++ if (tail->_rid != header->_rid) return 3;
++ if (tail->_checksum != checksum) return 4;
++ return 0;
++}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_tail.h b/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_tail.h
+index 9fbd186..5163580 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_tail.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/utils/rec_tail.h
+@@ -1,5 +1,5 @@
+-#ifndef QPID_LEGACYSTORE_JRNL_UTILS_REC_TAIL_H
+-#define QPID_LEGACYSTORE_JRNL_UTILS_REC_TAIL_H
++#ifndef QPID_LINEARSTORE_JOURNAL_UTILS_REC_TAIL_H
++#define QPID_LINEARSTORE_JOURNAL_UTILS_REC_TAIL_H
+ /*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+@@ -41,26 +41,32 @@ extern "C"{
+ * The checksum is used to verify the xid and/or data portion of the record
+ * on recovery, and excludes the header and tail.
+ *
+- * Record header info in binary format (16 bytes):
++ * Record header info in binary format (24 bytes):
+ * <pre>
+ * 0 7
+ * +---+---+---+---+---+---+---+---+
+ * | ~(magic) | checksum |
+ * +---+---+---+---+---+---+---+---+
++ * | serial |
++ * +---+---+---+---+---+---+---+---+
+ * | rid |
+ * +---+---+---+---+---+---+---+---+
+ *
+- * rid = Record ID
++ * ~(magic) = 1's compliment of magic of matching record header
++ * rid = Record ID of matching record header
+ * </pre>
+ */
+ typedef struct rec_tail_t {
+ uint32_t _xmagic; /**< Binary inverse (1's complement) of hdr magic number */
+- uint32_t _checksum; /**< Checksum of xid and data */
+- uint64_t _rid; /**< ID (rotating 64-bit counter) */
++ uint32_t _checksum; /**< Checksum of xid and data (excluding header itself) */
++ uint64_t _serial; /**< Serial number for this journal file */
++ uint64_t _rid; /**< Record ID (rotating 64-bit counter) */
+ } rec_tail_t;
+
+-void rec_tail_init(rec_tail_t* dest, const uint32_t xmagic, const uint32_t checksum, const uint64_t rid);
++void rec_tail_init(rec_tail_t* dest, const uint32_t xmagic, const uint32_t checksum, const uint64_t serial,
++ const uint64_t rid);
+ void rec_tail_copy(rec_tail_t* dest, const rec_hdr_t* src, const uint32_t checksum);
++int rec_tail_check(const rec_tail_t* tail, const rec_hdr_t* header, const uint32_t checksum);
+
+ #pragma pack()
+
+@@ -68,4 +74,4 @@ void rec_tail_copy(rec_tail_t* dest, const rec_hdr_t* src, const uint32_t checks
+ }
+ #endif
+
+-#endif /* ifnedf QPID_LEGACYSTORE_JRNL_UTILS_REC_TAIL_H */
++#endif /* ifnedf QPID_LINEARSTORE_JOURNAL_UTILS_REC_TAIL_H */
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/utils/txn_hdr.c b/qpid/cpp/src/qpid/linearstore/jrnl/utils/txn_hdr.c
+index 3b94bf3..58d4cde 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/utils/txn_hdr.c
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/utils/txn_hdr.c
+@@ -22,8 +22,8 @@
+ #include "txn_hdr.h"
+
+ void txn_hdr_init(txn_hdr_t* dest, const uint32_t magic, const uint16_t version, const uint16_t uflag,
+- const uint64_t rid, const uint64_t xidsize) {
+- rec_hdr_init(&dest->_rhdr, magic, version, uflag, rid);
++ const uint64_t serial, const uint64_t rid, const uint64_t xidsize) {
++ rec_hdr_init(&dest->_rhdr, magic, version, uflag, serial, rid);
+ dest->_xidsize = xidsize;
+ }
+
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/utils/txn_hdr.h b/qpid/cpp/src/qpid/linearstore/jrnl/utils/txn_hdr.h
+index 02c00e0..442a1d3 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/utils/txn_hdr.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/utils/txn_hdr.h
+@@ -1,5 +1,5 @@
+-#ifndef QPID_LINEARSTORE_JRNL_UTILS_TXN_HDR_H
+-#define QPID_LINEARSTORE_JRNL_UTILS_TXN_HDR_H
++#ifndef QPID_LINEARSTORE_JOURNAL_UTILS_TXN_HDR_H
++#define QPID_LINEARSTORE_JOURNAL_UTILS_TXN_HDR_H
+ /*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+@@ -40,12 +40,14 @@ extern "C"{
+ * Note that this record had its own rid distinct from the rids of the record(s) making up the
+ * transaction it is committing or aborting.
+ *
+- * Record header info in binary format (24 bytes):
++ * Record header info in binary format (32 bytes):
+ * <pre>
+ * 0 7
+ * +---+---+---+---+---+---+---+---+ -+
+- * | magic | v | e | flags | |
+- * +---+---+---+---+---+---+---+---+ | struct rec_hdr_t
++ * | magic | ver | flags | |
++ * +---+---+---+---+---+---+---+---+ |
++ * | serial | | struct rec_hdr_t
++ * +---+---+---+---+---+---+---+---+ |
+ * | rid | |
+ * +---+---+---+---+---+---+---+---+ -+
+ * | xidsize |
+@@ -58,7 +60,7 @@ typedef struct txn_hdr_t {
+ } txn_hdr_t;
+
+ void txn_hdr_init(txn_hdr_t* dest, const uint32_t magic, const uint16_t version, const uint16_t uflag,
+- const uint64_t rid, const uint64_t xidsize);
++ const uint64_t serial, const uint64_t rid, const uint64_t xidsize);
+ void txn_hdr_copy(txn_hdr_t* dest, const txn_hdr_t* src);
+
+ #pragma pack()
+@@ -67,4 +69,4 @@ void txn_hdr_copy(txn_hdr_t* dest, const txn_hdr_t* src);
+ }
+ #endif
+
+-#endif /* ifndef QPID_LINEARSTORE_JRNL_UTILS_TXN_HDR_H */
++#endif /* ifndef QPID_LINEARSTORE_JOURNAL_UTILS_TXN_HDR_H */
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/wmgr.cpp b/qpid/cpp/src/qpid/linearstore/jrnl/wmgr.cpp
+index 991e26a..9f91132 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/wmgr.cpp
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/wmgr.cpp
+@@ -35,10 +35,9 @@
+
+ //#include <iostream> // DEBUG
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+
+ wmgr::wmgr(jcntl* jc,
+ enq_map& emap,
+@@ -150,7 +149,7 @@ wmgr::enqueue(const void* const data_buff,
+ }
+
+ uint64_t rid = (dtokp->external_rid() | cont) ? dtokp->rid() : _lfc.getNextRecordId();
+- _enq_rec.reset(rid, data_buff, tot_data_len, xid_ptr, xid_len, transient, external);
++ _enq_rec.reset(_lfc.getCurrentSerial(), rid, data_buff, tot_data_len, xid_ptr, xid_len, transient, external);
+ if (!cont)
+ {
+ dtokp->set_rid(rid);
+@@ -265,7 +264,7 @@ wmgr::dequeue(data_tok* dtokp,
+ const bool ext_rid = dtokp->external_rid();
+ uint64_t rid = (ext_rid | cont) ? dtokp->rid() : _lfc.getNextRecordId();
+ uint64_t dequeue_rid = (ext_rid | cont) ? dtokp->dequeue_rid() : dtokp->rid();
+- _deq_rec.reset(rid, dequeue_rid, xid_ptr, xid_len/*, _wrfc.owi()*/, txn_coml_commit);
++ _deq_rec.reset(_lfc.getCurrentSerial(), rid, dequeue_rid, xid_ptr, xid_len, txn_coml_commit);
+ if (!cont)
+ {
+ if (!ext_rid)
+@@ -391,7 +390,7 @@ wmgr::abort(data_tok* dtokp,
+ }
+
+ uint64_t rid = (dtokp->external_rid() | cont) ? dtokp->rid() : _lfc.getNextRecordId();
+- _txn_rec.reset(QLS_TXA_MAGIC, rid, xid_ptr, xid_len/*, _wrfc.owi()*/);
++ _txn_rec.reset(false, _lfc.getCurrentSerial(), rid, xid_ptr, xid_len);
+ if (!cont)
+ {
+ dtokp->set_rid(rid);
+@@ -489,7 +488,7 @@ wmgr::commit(data_tok* dtokp,
+ }
+
+ uint64_t rid = (dtokp->external_rid() | cont) ? dtokp->rid() : _lfc.getNextRecordId();
+- _txn_rec.reset(QLS_TXC_MAGIC, rid, xid_ptr, xid_len/*, _wrfc.owi()*/);
++ _txn_rec.reset(true, _lfc.getCurrentSerial(), rid, xid_ptr, xid_len);
+ if (!cont)
+ {
+ dtokp->set_rid(rid);
+@@ -1033,4 +1032,4 @@ wmgr::status_str() const
+
+ const char* wmgr::_op_str[] = {"enqueue", "dequeue", "abort", "commit"};
+
+-}}
++}}}
+diff --git a/qpid/cpp/src/qpid/linearstore/jrnl/wmgr.h b/qpid/cpp/src/qpid/linearstore/jrnl/wmgr.h
+index 6b455fe..0278317 100644
+--- a/qpid/cpp/src/qpid/linearstore/jrnl/wmgr.h
++++ b/qpid/cpp/src/qpid/linearstore/jrnl/wmgr.h
+@@ -19,15 +19,14 @@
+ *
+ */
+
+-#ifndef QPID_LEGACYSTORE_JRNL_WMGR_H
+-#define QPID_LEGACYSTORE_JRNL_WMGR_H
++#ifndef QPID_LINEARSTORE_JOURNAL_WMGR_H
++#define QPID_LINEARSTORE_JOURNAL_WMGR_H
+
+-namespace qpid
+-{
+-namespace qls_jrnl
+-{
++namespace qpid {
++namespace linearstore {
++namespace journal {
+ class wmgr;
+-}}
++}}}
+
+ #include <cstring>
+ #include "qpid/linearstore/jrnl/EmptyFilePoolTypes.h"
+@@ -37,123 +36,123 @@ class wmgr;
+
+ class file_hdr_t;
+
+-namespace qpid
+-{
+-namespace qls_jrnl
++namespace qpid {
++namespace linearstore {
++namespace journal {
++
++class LinearFileController;
++
++/**
++* \brief Class for managing a write page cache of arbitrary size and number of pages.
++*
++* The write page cache works on the principle of caching the write data within a page until
++* that page is either full or flushed; this initiates a single AIO write operation to store
++* the data on disk.
++*
++* The maximum disk throughput is achieved by keeping the write operations of uniform size.
++* Waiting for a page cache to fill achieves this; and in high data volume/throughput situations
++* achieves the optimal disk throughput. Calling flush() forces a write of the current page cache
++* no matter how full it is, and disrupts the uniformity of the write operations. This should
++* normally only be done if throughput drops and there is a danger of a page of unwritten data
++* waiting around for excessive time.
++*
++* The usual tradeoff between data storage latency and throughput performance applies.
++*/
++class wmgr : public pmgr
+ {
+- class LinearFileController;
+-
+- /**
+- * \brief Class for managing a write page cache of arbitrary size and number of pages.
+- *
+- * The write page cache works on the principle of caching the write data within a page until
+- * that page is either full or flushed; this initiates a single AIO write operation to store
+- * the data on disk.
+- *
+- * The maximum disk throughput is achieved by keeping the write operations of uniform size.
+- * Waiting for a page cache to fill achieves this; and in high data volume/throughput situations
+- * achieves the optimal disk throughput. Calling flush() forces a write of the current page cache
+- * no matter how full it is, and disrupts the uniformity of the write operations. This should
+- * normally only be done if throughput drops and there is a danger of a page of unwritten data
+- * waiting around for excessive time.
+- *
+- * The usual tradeoff between data storage latency and throughput performance applies.
+- */
+- class wmgr : public pmgr
+- {
+- private:
+- LinearFileController& _lfc; ///< Linear File Controller ref
+- uint32_t _max_dtokpp; ///< Max data writes per page
+- uint32_t _max_io_wait_us; ///< Max wait in microseconds till submit
+- uint32_t _cached_offset_dblks; ///< Amount of unwritten data in page (dblocks)
+- std::deque<data_tok*> _ddtokl; ///< Deferred dequeue data_tok list
+-
+- // TODO: Convert _enq_busy etc into a proper threadsafe lock
+- // TODO: Convert to enum? Are these encodes mutually exclusive?
+- bool _enq_busy; ///< Flag true if enqueue is in progress
+- bool _deq_busy; ///< Flag true if dequeue is in progress
+- bool _abort_busy; ///< Flag true if abort is in progress
+- bool _commit_busy; ///< Flag true if commit is in progress
+-
+- enum _op_type { WMGR_ENQUEUE = 0, WMGR_DEQUEUE, WMGR_ABORT, WMGR_COMMIT };
+- static const char* _op_str[];
+-
+- 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
+- std::set<std::string> _txn_pending_set; ///< Set containing xids of pending commits/aborts
+-
+- public:
+- wmgr(jcntl* jc,
+- enq_map& emap,
+- txn_map& tmap,
+- LinearFileController& lfc);
+- wmgr(jcntl* jc,
+- enq_map& emap,
+- txn_map& tmap,
+- LinearFileController& lfc,
+- const uint32_t max_dtokpp,
+- const uint32_t max_iowait_us);
+- virtual ~wmgr();
+-
+- void initialize(aio_callback* const cbp,
+- const uint32_t wcache_pgsize_sblks,
+- const uint16_t wcache_num_pages,
+- const uint32_t max_dtokpp,
+- const uint32_t max_iowait_us,
+- std::size_t eo = 0);
+- iores enqueue(const void* const data_buff,
+- const std::size_t tot_data_len,
+- const std::size_t this_data_len,
+- data_tok* dtokp,
+- const void* const xid_ptr,
+- const std::size_t xid_len,
+- const bool transient,
+- const bool external);
+- iores dequeue(data_tok* dtokp,
+- const void* const xid_ptr,
+- const std::size_t xid_len,
+- const bool txn_coml_commit);
+- iores abort(data_tok* dtokp,
+- const void* const xid_ptr,
+- const std::size_t xid_len);
+- iores commit(data_tok* dtokp,
+- const void* const xid_ptr,
+- const std::size_t xid_len);
+- iores flush();
+- int32_t get_events(timespec* const timeout,
+- bool flush);
+- bool is_txn_synced(const std::string& xid);
+- inline bool curr_pg_blocked() const { return _page_cb_arr[_pg_index]._state != UNUSED; }
+- inline uint32_t unflushed_dblks() { return _cached_offset_dblks; }
+-
+- // Debug aid
+- const std::string status_str() const;
+-
+- private:
+- void initialize(aio_callback* const cbp,
+- const uint32_t wcache_pgsize_sblks,
+- const uint16_t wcache_num_pages);
+- iores pre_write_check(const _op_type op,
+- const data_tok* const dtokp,
+- const std::size_t xidsize = 0,
+- const std::size_t dsize = 0,
+- const bool external = false) const;
+- void dequeue_check(const std::string& xid,
+- const uint64_t drid);
+- void file_header_check(const uint64_t rid,
+- const bool cont,
+- const uint32_t rec_dblks_rem);
+- void flush_check(iores& res,
+- bool& cont,
+- bool& done, const uint64_t rid);
+- iores write_flush();
+- void get_next_file();
+- void dblk_roundup();
+- void rotate_page();
+- void clean();
+- };
+-
+-}}
+-
+-#endif // ifndef QPID_LEGACYSTORE_JRNL_WMGR_H
++private:
++ LinearFileController& _lfc; ///< Linear File Controller ref
++ uint32_t _max_dtokpp; ///< Max data writes per page
++ uint32_t _max_io_wait_us; ///< Max wait in microseconds till submit
++ uint32_t _cached_offset_dblks; ///< Amount of unwritten data in page (dblocks)
++ std::deque<data_tok*> _ddtokl; ///< Deferred dequeue data_tok list
++
++ // TODO: Convert _enq_busy etc into a proper threadsafe lock
++ // TODO: Convert to enum? Are these encodes mutually exclusive?
++ bool _enq_busy; ///< Flag true if enqueue is in progress
++ bool _deq_busy; ///< Flag true if dequeue is in progress
++ bool _abort_busy; ///< Flag true if abort is in progress
++ bool _commit_busy; ///< Flag true if commit is in progress
++
++ enum _op_type { WMGR_ENQUEUE = 0, WMGR_DEQUEUE, WMGR_ABORT, WMGR_COMMIT };
++ static const char* _op_str[];
++
++ 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
++ std::set<std::string> _txn_pending_set; ///< Set containing xids of pending commits/aborts
++
++public:
++ wmgr(jcntl* jc,
++ enq_map& emap,
++ txn_map& tmap,
++ LinearFileController& lfc);
++ wmgr(jcntl* jc,
++ enq_map& emap,
++ txn_map& tmap,
++ LinearFileController& lfc,
++ const uint32_t max_dtokpp,
++ const uint32_t max_iowait_us);
++ virtual ~wmgr();
++
++ void initialize(aio_callback* const cbp,
++ const uint32_t wcache_pgsize_sblks,
++ const uint16_t wcache_num_pages,
++ const uint32_t max_dtokpp,
++ const uint32_t max_iowait_us,
++ std::size_t eo = 0);
++ iores enqueue(const void* const data_buff,
++ const std::size_t tot_data_len,
++ const std::size_t this_data_len,
++ data_tok* dtokp,
++ const void* const xid_ptr,
++ const std::size_t xid_len,
++ const bool transient,
++ const bool external);
++ iores dequeue(data_tok* dtokp,
++ const void* const xid_ptr,
++ const std::size_t xid_len,
++ const bool txn_coml_commit);
++ iores abort(data_tok* dtokp,
++ const void* const xid_ptr,
++ const std::size_t xid_len);
++ iores commit(data_tok* dtokp,
++ const void* const xid_ptr,
++ const std::size_t xid_len);
++ iores flush();
++ int32_t get_events(timespec* const timeout,
++ bool flush);
++ bool is_txn_synced(const std::string& xid);
++ inline bool curr_pg_blocked() const { return _page_cb_arr[_pg_index]._state != UNUSED; }
++ inline uint32_t unflushed_dblks() { return _cached_offset_dblks; }
++
++ // Debug aid
++ const std::string status_str() const;
++
++private:
++ void initialize(aio_callback* const cbp,
++ const uint32_t wcache_pgsize_sblks,
++ const uint16_t wcache_num_pages);
++ iores pre_write_check(const _op_type op,
++ const data_tok* const dtokp,
++ const std::size_t xidsize = 0,
++ const std::size_t dsize = 0,
++ const bool external = false) const;
++ void dequeue_check(const std::string& xid,
++ const uint64_t drid);
++ void file_header_check(const uint64_t rid,
++ const bool cont,
++ const uint32_t rec_dblks_rem);
++ void flush_check(iores& res,
++ bool& cont,
++ bool& done, const uint64_t rid);
++ iores write_flush();
++ void get_next_file();
++ void dblk_roundup();
++ void rotate_page();
++ void clean();
++};
++
++}}}
++
++#endif // ifndef QPID_LINEARSTORE_JOURNAL_WMGR_H
+--
+1.8.5.3
+
diff --git a/0003-QPID-5556-Provide-the-right-Perl-packages-in-top-lev.patch b/0003-QPID-5556-Provide-the-right-Perl-packages-in-top-lev.patch
new file mode 100644
index 0000000..0a075f0
--- /dev/null
+++ b/0003-QPID-5556-Provide-the-right-Perl-packages-in-top-lev.patch
@@ -0,0 +1,39 @@
+From c78029b46b7bc5142b679084f0b93f65fd68fa86 Mon Sep 17 00:00:00 2001
+From: "Darryl L. Pierce" <mcpierce at apache.org>
+Date: Mon, 17 Feb 2014 22:03:13 +0000
+Subject: [PATCH 3/4] QPID-5556: Provide the right Perl packages in top-level
+ modules.
+
+git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1569117 13f79535-47bb-0310-9956-ffa450edef68
+---
+ qpid/cpp/bindings/qpid/perl/lib/qpid.pm | 2 ++
+ qpid/cpp/bindings/qpid/perl/lib/qpid_messaging.pm | 2 ++
+ 2 files changed, 4 insertions(+)
+
+diff --git a/qpid/cpp/bindings/qpid/perl/lib/qpid.pm b/qpid/cpp/bindings/qpid/perl/lib/qpid.pm
+index 88b9835..1f8d967 100644
+--- a/qpid/cpp/bindings/qpid/perl/lib/qpid.pm
++++ b/qpid/cpp/bindings/qpid/perl/lib/qpid.pm
+@@ -19,4 +19,6 @@
+
+ use qpid_messaging;
+
++package qpid;
++
+ 1;
+diff --git a/qpid/cpp/bindings/qpid/perl/lib/qpid_messaging.pm b/qpid/cpp/bindings/qpid/perl/lib/qpid_messaging.pm
+index 524bbaa..2948748 100644
+--- a/qpid/cpp/bindings/qpid/perl/lib/qpid_messaging.pm
++++ b/qpid/cpp/bindings/qpid/perl/lib/qpid_messaging.pm
+@@ -32,6 +32,8 @@ use qpid::messaging::Sender;
+ use qpid::messaging::Session;
+ use qpid::messaging::Connection;
+
++package qpid_messaging;
++
+ 1;
+
+ __END__
+--
+1.8.5.3
+
diff --git a/0004-QPID-5499-Fix-Ruby-Perl-bindings-when-built-with-Wer.patch b/0004-QPID-5499-Fix-Ruby-Perl-bindings-when-built-with-Wer.patch
new file mode 100644
index 0000000..2b05500
--- /dev/null
+++ b/0004-QPID-5499-Fix-Ruby-Perl-bindings-when-built-with-Wer.patch
@@ -0,0 +1,184 @@
+From 0855e2c108d2dc0b0514c585890da96a092218ce Mon Sep 17 00:00:00 2001
+From: "Darryl L. Pierce" <mcpierce at apache.org>
+Date: Fri, 7 Feb 2014 13:44:03 +0000
+Subject: [PATCH 4/4] QPID-5499: Fix Ruby/Perl bindings when built with
+ -Werror=format-security
+
+Changed the swig descriptors so that they use a constant format string.
+
+git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1565651 13f79535-47bb-0310-9956-ffa450edef68
+---
+ qpid/cpp/bindings/qmf2/ruby/ruby.i | 2 +-
+ qpid/cpp/bindings/qpid/perl/perl.i | 2 +-
+ qpid/cpp/bindings/qpid/ruby/ruby.i | 42 +++++++++++++++---------------
+ qpid/cpp/include/qpid/swig_perl_typemaps.i | 2 +-
+ qpid/cpp/include/qpid/swig_ruby_typemaps.i | 2 +-
+ 5 files changed, 25 insertions(+), 25 deletions(-)
+
+diff --git a/qpid/cpp/bindings/qmf2/ruby/ruby.i b/qpid/cpp/bindings/qmf2/ruby/ruby.i
+index 0254017..65d0770 100644
+--- a/qpid/cpp/bindings/qmf2/ruby/ruby.i
++++ b/qpid/cpp/bindings/qmf2/ruby/ruby.i
+@@ -30,7 +30,7 @@
+ }
+ catch (qpid::types::Exception& mex) {
+ static VALUE qmferror = rb_define_class("QmfError", rb_eStandardError);
+- rb_raise(qmferror, mex.what());
++ rb_raise(qmferror, "%s", mex.what());
+ }
+ }
+
+diff --git a/qpid/cpp/bindings/qpid/perl/perl.i b/qpid/cpp/bindings/qpid/perl/perl.i
+index 0d118ae..4dc2665 100644
+--- a/qpid/cpp/bindings/qpid/perl/perl.i
++++ b/qpid/cpp/bindings/qpid/perl/perl.i
+@@ -27,7 +27,7 @@
+ $action
+ }
+ catch (qpid::messaging::MessagingException& mex) {
+- Perl_croak(aTHX_ mex.what());
++ Perl_croak(aTHX_ "%s", mex.what());
+ }
+ }
+
+diff --git a/qpid/cpp/bindings/qpid/ruby/ruby.i b/qpid/cpp/bindings/qpid/ruby/ruby.i
+index 34388a2..a2f2ffa 100644
+--- a/qpid/cpp/bindings/qpid/ruby/ruby.i
++++ b/qpid/cpp/bindings/qpid/ruby/ruby.i
+@@ -34,86 +34,86 @@
+ }
+ catch(qpid::messaging::ConnectionError& error) {
+ static VALUE merror = rb_define_class("ConnectionError", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::TransportFailure& error) {
+ static VALUE merror = rb_define_class("TransportFailure", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::TransactionAborted& error) {
+ static VALUE merror = rb_define_class("TransactionAborted", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::TransactionError& error) {
+ static VALUE merror = rb_define_class("TransactionError", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::UnauthorizedAccess& error) {
+ static VALUE merror = rb_define_class("UnauthorizedAccess", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::SessionError& error) {
+ static VALUE merror = rb_define_class("SessionError", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::TargetCapacityExceeded& error) {
+ static VALUE merror = rb_define_class("TargetCapacityExceeded", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::SendError& error) {
+ static VALUE merror = rb_define_class("SendError", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::SenderError& error) {
+ static VALUE merror = rb_define_class("SenderError", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::NoMessageAvailable& error) {
+ static VALUE merror = rb_define_class("NoMessageAvailable", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::FetchError& error) {
+ static VALUE merror = rb_define_class("FetchError", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::ReceiverError& error) {
+ static VALUE merror = rb_define_class("ReceiverError", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::InvalidOptionString& error) {
+ static VALUE merror = rb_define_class("InvalidOptionString", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::KeyError& error) {
+ static VALUE merror = rb_define_class("KeyError", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::AssertionFailed& error) {
+ static VALUE merror = rb_define_class("AssertionFailed", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::NotFound& error) {
+ static VALUE merror = rb_define_class("NotFound", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::ResolutionError& error) {
+ static VALUE merror = rb_define_class("ResolutionError", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::MalformedAddress& error) {
+ static VALUE merror = rb_define_class("MalformedAddress", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::AddressError& error) {
+ static VALUE merror = rb_define_class("AddressError", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::LinkError& error) {
+ static VALUE merror = rb_define_class("LinkError", eMessagingError);
+- rb_raise(merror, error.what());
++ rb_raise(merror, "%s", error.what());
+ }
+ catch(qpid::messaging::MessagingException& error) {
+- rb_raise(eMessagingError, error.what());
++ rb_raise(eMessagingError, "%s", error.what());
+ }
+ }
+
+diff --git a/qpid/cpp/include/qpid/swig_perl_typemaps.i b/qpid/cpp/include/qpid/swig_perl_typemaps.i
+index f1425eb..6c0e6d8 100644
+--- a/qpid/cpp/include/qpid/swig_perl_typemaps.i
++++ b/qpid/cpp/include/qpid/swig_perl_typemaps.i
+@@ -120,7 +120,7 @@
+ }
+ }
+ } catch (qpid::types::Exception& ex) {
+- Perl_croak(aTHX_ ex.what());
++ Perl_croak(aTHX_ "%s", ex.what());
+ }
+
+ if (!result)
+diff --git a/qpid/cpp/include/qpid/swig_ruby_typemaps.i b/qpid/cpp/include/qpid/swig_ruby_typemaps.i
+index 1a07cc8..4e07088 100644
+--- a/qpid/cpp/include/qpid/swig_ruby_typemaps.i
++++ b/qpid/cpp/include/qpid/swig_ruby_typemaps.i
+@@ -106,7 +106,7 @@
+ }
+ } catch (qpid::types::Exception& ex) {
+ static VALUE error = rb_define_class("Error", rb_eStandardError);
+- rb_raise(error, ex.what());
++ rb_raise(error, "%s", ex.what());
+ }
+
+ return result;
+--
+1.8.5.3
+
More information about the scm-commits
mailing list