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

rhmessaging-commits at lists.jboss.org rhmessaging-commits at lists.jboss.org
Fri May 16 10:32:46 EDT 2008


Author: kpvdr
Date: 2008-05-16 10:32:46 -0400 (Fri, 16 May 2008)
New Revision: 2059

Modified:
   store/trunk/cpp/lib/JournalImpl.cpp
   store/trunk/cpp/lib/jrnl/rmgr.cpp
   store/trunk/cpp/lib/jrnl/wmgr.cpp
Log:
Logic fix for BZ446096 "flow to disk not working with journal". This fixes the JERR_RMGR_UNKNOWNMAGIC exception.

Modified: store/trunk/cpp/lib/JournalImpl.cpp
===================================================================
--- store/trunk/cpp/lib/JournalImpl.cpp	2008-05-15 23:03:35 UTC (rev 2058)
+++ store/trunk/cpp/lib/JournalImpl.cpp	2008-05-16 14:32:46 UTC (rev 2059)
@@ -237,20 +237,22 @@
             ::free(_datap);
             _datap = 0;
         }
-        _dlen = 0;
-        _dtok.reset();
-        _dtok.set_rid(rid);
-        _dtok.set_wstate(DataTokenImpl::ENQ);
         _external = false;
         size_t xlen = 0;
         bool transient = false;
         bool done = false;
+        bool rid_found = false;
         unsigned aio_sleep_cnt = 0;
         while (!done)
         {
-            iores res = read_data_record(&_datap, _dlen, &_xidp, xlen, transient, _external,
-                    &_dtok);
-            if (res == journal::RHM_IORES_SUCCESS) {
+            _dlen = 0;
+            _dtok.reset();
+            _dtok.set_wstate(DataTokenImpl::ENQ);
+            _dtok.set_rid(0);
+            iores res = read_data_record(&_datap, _dlen, &_xidp, xlen, transient, _external, &_dtok);
+            bool rid_low = _dtok.rid() < rid;
+            rid_found = _dtok.rid() == rid;
+            if (res == journal::RHM_IORES_SUCCESS && !rid_low) {
                 done = true;
             } else if (res == journal::RHM_IORES_PAGE_AIOWAIT) {
                 if (++aio_sleep_cnt <= MAX_AIO_SLEEPS) {
@@ -262,12 +264,17 @@
                     ss << "; exceeded maximum wait time";
                     throw jexception(0, ss.str().c_str(), "JournalImpl", "loadMsgContent");
                 }
-            } else {
+            } else if (!rid_low) {
                 std::stringstream ss;
                 ss << "read_data_record() returned " << journal::iores_str(res);
                 throw jexception(0, ss.str().c_str(), "JournalImpl", "loadMsgContent");
             }
         }
+        if (!rid_found) {
+            std::stringstream ss;
+            ss << "read_data_record() was unable to find rid " << rid << "; last rid found was " << _dtok.rid();
+            throw jexception(0, ss.str().c_str(), "JournalImpl", "loadMsgContent");
+        }
     }
     if (_external)
         return false;

Modified: store/trunk/cpp/lib/jrnl/rmgr.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/rmgr.cpp	2008-05-15 23:03:35 UTC (rev 2058)
+++ store/trunk/cpp/lib/jrnl/rmgr.cpp	2008-05-16 14:32:46 UTC (rev 2059)
@@ -89,8 +89,8 @@
 }
 
 iores
-rmgr::read(void** const datapp, std::size_t& dsize, void** const xidpp, std::size_t& xidsize, bool& transient,
-        bool& external, data_tok* dtokp)
+rmgr::read(void** const datapp, std::size_t& dsize, void** const xidpp, std::size_t& xidsize,
+        bool& transient, bool& external, data_tok* dtokp)
 {
     iores res = pre_read_check(dtokp);
     if (res != RHM_IORES_SUCCESS)

Modified: store/trunk/cpp/lib/jrnl/wmgr.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/wmgr.cpp	2008-05-15 23:03:35 UTC (rev 2058)
+++ store/trunk/cpp/lib/jrnl/wmgr.cpp	2008-05-16 14:32:46 UTC (rev 2059)
@@ -117,9 +117,9 @@
 }
 
 iores
-wmgr::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)
+wmgr::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)
 {
     if (xid_len)
         assert(xid_ptr != 0);




More information about the rhmessaging-commits mailing list