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

rhmessaging-commits at lists.jboss.org rhmessaging-commits at lists.jboss.org
Thu Nov 15 17:14:50 EST 2007


Author: kpvdr
Date: 2007-11-15 17:14:50 -0500 (Thu, 15 Nov 2007)
New Revision: 1322

Modified:
   store/trunk/cpp/lib/BdbMessageStore.cpp
   store/trunk/cpp/lib/BdbMessageStore.h
   store/trunk/cpp/lib/BindingDbt.h
   store/trunk/cpp/lib/BufferValue.h
   store/trunk/cpp/lib/Cursor.h
   store/trunk/cpp/lib/DataTokenImpl.h
   store/trunk/cpp/lib/JournalImpl.h
   store/trunk/cpp/lib/StoreException.h
   store/trunk/cpp/lib/jrnl/data_tok.hpp
   store/trunk/cpp/lib/jrnl/deq_rec.hpp
   store/trunk/cpp/lib/jrnl/enq_map.hpp
   store/trunk/cpp/lib/jrnl/enq_rec.hpp
   store/trunk/cpp/lib/jrnl/jcntl.cpp
   store/trunk/cpp/lib/jrnl/jcntl.hpp
   store/trunk/cpp/lib/jrnl/jdir.cpp
   store/trunk/cpp/lib/jrnl/jdir.hpp
   store/trunk/cpp/lib/jrnl/jinf.hpp
   store/trunk/cpp/lib/jrnl/rcvdat.hpp
   store/trunk/cpp/lib/jrnl/rmgr.cpp
   store/trunk/cpp/lib/jrnl/rmgr.hpp
   store/trunk/cpp/lib/jrnl/txn_map.hpp
   store/trunk/cpp/lib/jrnl/txn_rec.hpp
   store/trunk/cpp/lib/jrnl/wmgr.hpp
   store/trunk/cpp/lib/jrnl/wrfc.hpp
Log:
Bugfix to journal recover. Also made all destructors virtual to try to solve problem of qpidd coring when handling top-level exception... - but to no avail, unfortunately.

Modified: store/trunk/cpp/lib/BdbMessageStore.cpp
===================================================================
--- store/trunk/cpp/lib/BdbMessageStore.cpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/BdbMessageStore.cpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -483,8 +483,8 @@
         
 //std::cout << jc->dirname() <<"-queueName:" << queue->getName() << "-enq count:" << jc->get_enq_cnt() << std::endl;
 		
+        unsigned aio_sleep_cnt = 0;
 		while (read) {
-
             rhm::journal::iores res = jc->read_data_record(&dbuff, dbuffSize, &xidbuff, xidbuffSize, transientFlag, externalFlag, &dtokp);
     		readSize = dtokp.dsize();
 		
@@ -530,9 +530,12 @@
 						::free(xidbuff);
 					else if (dbuff)
 						::free(dbuff);
+                    aio_sleep_cnt = 0;
                     break;
 		        }
                 case rhm::journal::RHM_IORES_AIO_WAIT:
+                    if (++aio_sleep_cnt > MAX_AIO_SLEEPS)
+                        THROW_STORE_EXCEPTION("Timeout waiting for AIO");
                     ::usleep(AIO_SLEEP_TIME);
                     break;
                 case rhm::journal::RHM_IORES_EMPTY:
@@ -936,6 +939,7 @@
 	    dtokp->set_rid(message.getPersistenceId()); // set the messageID into the Journal header (record-id)
 
             bool written = false;
+            unsigned aio_sleep_cnt = 0;
             while (!written)
             {
 	            JournalImpl* jc = static_cast<JournalImpl*>(queue->getExternalQueueStore());
@@ -958,12 +962,17 @@
                     case rhm::journal::RHM_IORES_SUCCESS:
                         if (dtokp.get()->wstate() >= DataTokenImpl::ENQ_SUBM)
                             written = true;
+                        aio_sleep_cnt = 0;
                         break;
                     case rhm::journal::RHM_IORES_AIO_WAIT:
+                        if (++aio_sleep_cnt > MAX_AIO_SLEEPS)
+                            THROW_STORE_EXCEPTION("Timeout waiting for AIO");
                         usleep(AIO_SLEEP_TIME); // TODO move sleep to wait for IO in get events
                         jc->get_wr_events();
                         break;
                     case rhm::journal::RHM_IORES_FULL:
+// Temporary error msg till exception handler core problem solved...
+std::cerr << "Error storing message -- Journal full for queue " << queue->getName() << std::endl << std::flush;
         		        THROW_STORE_FULL_EXCEPTION("Error storing message -- Journal full :" + queue->getName());
                         break;
                     default:
@@ -1064,6 +1073,8 @@
 		tid = txn->getXid();
 	}
 
+    unsigned aio_sleep_cnt = 0;
+    unsigned busy_sleep_cnt = 0;
     while (!written)
     {
          rhm::journal::iores dres;
@@ -1079,14 +1090,19 @@
          switch (dres)
          {
              case rhm::journal::RHM_IORES_SUCCESS:
-
+                 aio_sleep_cnt = 0;
+                 busy_sleep_cnt = 0;
                  written = true;
                  break;
              case rhm::journal::RHM_IORES_AIO_WAIT:
+                 if (++aio_sleep_cnt > MAX_AIO_SLEEPS)
+                     THROW_STORE_EXCEPTION("Timeout waiting for AIO");
                  usleep(AIO_SLEEP_TIME); // TODO add sleep time to get events call as option
                  jc->get_wr_events();
                  break;
              case rhm::journal::RHM_IORES_BUSY:
+                 if (++busy_sleep_cnt > MAX_AIO_SLEEPS)
+                     THROW_STORE_EXCEPTION("Timeout waiting for AIO");
                  usleep(AIO_SLEEP_TIME); // TODO add sleep time to get events call as option
                  break;
              default:

Modified: store/trunk/cpp/lib/BdbMessageStore.h
===================================================================
--- store/trunk/cpp/lib/BdbMessageStore.h	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/BdbMessageStore.h	2007-11-15 22:14:50 UTC (rev 1322)
@@ -131,7 +131,7 @@
         public:
             BdbMessageStore(const char* envpath = 0);
 			bool init(const std::string& dir, const bool async, const bool force = false);
-            ~BdbMessageStore();
+            virtual ~BdbMessageStore();
 
             void truncate();
 

Modified: store/trunk/cpp/lib/BindingDbt.h
===================================================================
--- store/trunk/cpp/lib/BindingDbt.h	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/BindingDbt.h	2007-11-15 22:14:50 UTC (rev 1322)
@@ -49,7 +49,7 @@
                const std::string& k, 
                const qpid::framing::FieldTable& a);
 
-    ~BindingDbt();
+    virtual ~BindingDbt();
 
 };
 

Modified: store/trunk/cpp/lib/BufferValue.h
===================================================================
--- store/trunk/cpp/lib/BufferValue.h	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/BufferValue.h	2007-11-15 22:14:50 UTC (rev 1322)
@@ -40,7 +40,7 @@
     
     BufferValue(u_int32_t size, u_int64_t offset);
     BufferValue(const qpid::broker::Persistable& p);
-    ~BufferValue();
+    virtual ~BufferValue();
 };
 
 }}

Modified: store/trunk/cpp/lib/Cursor.h
===================================================================
--- store/trunk/cpp/lib/Cursor.h	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/Cursor.h	2007-11-15 22:14:50 UTC (rev 1322)
@@ -34,7 +34,7 @@
     Dbc* cursor;
 public:
     Cursor() : cursor(0) {}
-    ~Cursor() { if(cursor) cursor->close(); }
+    virtual ~Cursor() { if(cursor) cursor->close(); }
     void open(Db& db, DbTxn* txn, u_int32_t flags = 0) { db.cursor(txn, &cursor, flags); }
     void close() { if(cursor) cursor->close(); cursor = 0; }
     Dbc* get() { return cursor; }

Modified: store/trunk/cpp/lib/DataTokenImpl.h
===================================================================
--- store/trunk/cpp/lib/DataTokenImpl.h	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/DataTokenImpl.h	2007-11-15 22:14:50 UTC (rev 1322)
@@ -33,7 +33,7 @@
         {
         public:
             DataTokenImpl();
-            ~DataTokenImpl();
+            virtual ~DataTokenImpl();
         };
 
         } // namespace bdbstore

Modified: store/trunk/cpp/lib/JournalImpl.h
===================================================================
--- store/trunk/cpp/lib/JournalImpl.h	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/JournalImpl.h	2007-11-15 22:14:50 UTC (rev 1322)
@@ -87,7 +87,7 @@
                         const std::string& journalBaseFilename,
                         const qpid::sys::Duration getEventsTimeout,
                         const qpid::sys::Duration flushTimeout);
-            ~JournalImpl();
+            virtual ~JournalImpl();
 
             void recover(std::deque<journal::data_tok*>* rd_dtokl, const journal::aio_cb rd_cb,
 			        std::deque<journal::data_tok*>* wr_dtokl, const journal::aio_cb wr_cb,

Modified: store/trunk/cpp/lib/StoreException.h
===================================================================
--- store/trunk/cpp/lib/StoreException.h	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/StoreException.h	2007-11-15 22:14:50 UTC (rev 1322)
@@ -33,8 +33,8 @@
 public:
     StoreException(const std::string& _text) : text(_text) {}
     StoreException(const std::string& _text, DbException& cause) : text(_text + ": " + cause.what()) {}
-    ~StoreException() throw() {}
-    const char* what() const throw() { return text.c_str(); }
+    virtual ~StoreException() throw() {}
+    virtual const char* what() const throw() { return text.c_str(); }
 };
 
 class StoreFullException : public StoreException 
@@ -42,7 +42,7 @@
 public:
     StoreFullException(const std::string& _text) : StoreException(_text) {}
     StoreFullException(const std::string& _text, DbException& cause) : StoreException(_text, cause) {}
-    ~StoreFullException() throw() {}
+    virtual ~StoreFullException() throw() {}
 
 };
 

Modified: store/trunk/cpp/lib/jrnl/data_tok.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/data_tok.hpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/data_tok.hpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -117,7 +117,7 @@
 
     public:
         data_tok();
-        ~data_tok();
+        virtual ~data_tok();
 
         inline size_t refcnt(void) { return _ref_cnt;}
 	    inline void ref(void) { _ref_cnt++; }

Modified: store/trunk/cpp/lib/jrnl/deq_rec.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/deq_rec.hpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/deq_rec.hpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -66,7 +66,7 @@
         // constructor used for write operations, where xid already exists
         deq_rec(const u_int64_t rid, const u_int64_t drid, const void* const xidp,
                 const size_t xidlen);
-        ~deq_rec();
+        virtual ~deq_rec();
 
         // Prepare instance for use in reading data from journal
         void reset();

Modified: store/trunk/cpp/lib/jrnl/enq_map.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/enq_map.hpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/enq_map.hpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -69,7 +69,7 @@
 
     public:
         enq_map();
-        ~enq_map();
+        virtual ~enq_map();
 
         void insert_fid(const u_int64_t rid, const u_int16_t fid) throw (jexception);
         void insert_fid(const u_int64_t rid, const u_int16_t fid, const bool locked)

Modified: store/trunk/cpp/lib/jrnl/enq_rec.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/enq_rec.hpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/enq_rec.hpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -76,7 +76,7 @@
         /**
         * \brief Destructor
         */
-        ~enq_rec();
+        virtual ~enq_rec();
 
         // Prepare instance for use in reading data from journal, xid and data will be allocated
         void reset();

Modified: store/trunk/cpp/lib/jrnl/jcntl.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jcntl.cpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/jcntl.cpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -136,6 +136,9 @@
     _tmap.clear();
     rcvr_janalyze(_rcvdat, prep_txn_list);
 
+// Debug info, but may be useful to print with a flag
+//_rcvdat.print();
+
     if (_datafh)
     {
         for (u_int32_t i=0; i<JRNL_NUM_FILES; i++)
@@ -178,6 +181,7 @@
     _rrfc.initialize(JRNL_NUM_FILES, (nlfh**)_datafh, _rcvdat._ffid);
     _rmgr.recover_complete();
     _readonly_flag = false;
+//std::cout << "Journal revovery complete." << std::endl;
 }
 
 void 
@@ -406,9 +410,11 @@
         while (rcvr_get_next_record(fid, &ifs, rd));
 		std::vector<std::string> xid_list;
 		_tmap.xid_list(xid_list);
-		for (std::vector<std::string>::iterator itr = xid_list.begin(); itr != xid_list.end(); itr++)
+		for (std::vector<std::string>::iterator itr = xid_list.begin(); itr != xid_list.end();
+                itr++)
 		{
-		    std::vector<std::string>::const_iterator pitr = std::find(prep_txn_list.begin(), prep_txn_list.end(), *itr);
+		    std::vector<std::string>::const_iterator pitr = std::find(prep_txn_list.begin(),
+                    prep_txn_list.end(), *itr);
 			if (pitr == prep_txn_list.end())
 				_tmap.get_remove_tdata_list(*itr);
 		} 
@@ -422,7 +428,9 @@
     bool done = false;
     void* xidp = NULL;
     hdr h;
-    jfile_cycle(fid, ifsp, rd, true);
+    if (!jfile_cycle(fid, ifsp, rd, true))
+        return false;
+    std::streampos read_pos = ifsp->tellg();
     ifsp->read((char*)&h, sizeof(hdr));
     switch(h._magic)
     {
@@ -432,7 +440,8 @@
                 while (!done)
                 {
                     done = er.rcv_decode(h, ifsp, cum_size_read);
-                    jfile_cycle(fid, ifsp, rd, false);
+                    if (!jfile_cycle(fid, ifsp, rd, true))
+                        return false;
                 }
 //std::cout << " E";
                 if (!er.is_transient()) // Ignore transient msgs
@@ -460,7 +469,8 @@
                 while (!done)
                 {
                     done = dr.rcv_decode(h, ifsp, cum_size_read);
-                    jfile_cycle(fid, ifsp, rd, false);
+                    if (!jfile_cycle(fid, ifsp, rd, true))
+                        return false;
                 }
 //std::cout << " D";
                 if (dr.xid_size())
@@ -501,7 +511,8 @@
                 while (!done)
                 {
                    done = ar.rcv_decode(h, ifsp, cum_size_read);
-                    jfile_cycle(fid, ifsp, rd, false);
+                    if (!jfile_cycle(fid, ifsp, rd, true))
+                        return false;
                 }
 //std::cout << " A";
                 // Delete this txn from tmap, unlock any locked records in emap
@@ -535,7 +546,8 @@
                 while (!done)
                 {
                     done = cr.rcv_decode(h, ifsp, cum_size_read);
-                    jfile_cycle(fid, ifsp, rd, false);
+                    if (!jfile_cycle(fid, ifsp, rd, true))
+                        return false;
                 }
 //std::cout << " C";
                 // Delete this txn from tmap, process records into emap
@@ -574,6 +586,7 @@
         default:
             std::stringstream ss;
             ss << std::hex << std::setfill('0') << "Magic=0x" << std::setw(8) << h._magic;
+            ss << " fid=" << fid << " foffs=0x" << std::setw(8) << read_pos;
             throw jexception(jerrno::JERR_JCNTL_UNKNOWNMAGIC, ss.str().c_str(), "jcntl",
                     "rcvr_get_next_record");
     }
@@ -588,8 +601,9 @@
     {
         if (ifsp->eof() || !ifsp->good())
         {
+            rd._eo = ifsp->tellg(); // remember file offset before closing
+            rd._lfid = fid++;
             ifsp->close();
-            fid++;
             if (fid >= JRNL_NUM_FILES)
                 fid = 0;
             if (fid == rd._ffid) // used up all journal files

Modified: store/trunk/cpp/lib/jrnl/jcntl.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jcntl.hpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/jcntl.hpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -159,7 +159,7 @@
         /**
         * \brief Destructor.
         */
-         ~jcntl();
+         virtual ~jcntl();
 
         /**
         * \brief Initialize the journal for storing data.

Modified: store/trunk/cpp/lib/jrnl/jdir.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jdir.cpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/jdir.cpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -52,6 +52,9 @@
         _base_filename(_base_filename)
 {}
 
+jdir::~jdir()
+{}
+
 // === create_dir ===
 
 void

Modified: store/trunk/cpp/lib/jrnl/jdir.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jdir.hpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/jdir.hpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -70,6 +70,8 @@
         *     and sub-directories.
         */
         jdir(const std::string& dirname, const std::string& base_filename);
+        
+        virtual ~jdir();
 
 
         /**
@@ -152,17 +154,14 @@
 
 
         /**
-        * \brief Clear the journal directory of files matching the base filename
-        *     by moving them into a subdirectory. This fn uses the dirname and base_filename
-        *     that were set on construction.
+        * \brief ??
         *
         * \exception ??
         */
         void verify_dir() throw (jexception);
 
         /**
-        * \brief Clear the directory dirname of journal files matching base_filename
-        *     by moving them into a subdirectory.
+        * \brief ??
         *
         * \param dirname C-string containing name of journal directory.
         * \param base_filename C-string containing base filename of journal files to be matched
@@ -173,8 +172,7 @@
         static void verify_dir(const char* dirname, const char* base_filename) throw (jexception);
 
         /**
-        * \brief Clear the directory dirname of journal files matching base_filename
-        *     by moving them into a subdirectory.
+        * \brief ??
         *
         * \param dirname String containing name of journal directory.
         * \param base_filename String containing base filename of journal files to be matched
@@ -247,7 +245,6 @@
         *     for moving into subdirectory.
         *
         * \exception ??
-        *
         */
         static std::string create_bak_dir(const std::string& dirname,
                 const std::string& base_filename) throw (jexception);

Modified: store/trunk/cpp/lib/jrnl/jinf.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jinf.hpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/jinf.hpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -71,7 +71,7 @@
         // constructor for writing jinf file
         jinf(const std::string& jid, const std::string& jdir, const std::string& base_filename,
             const timespec& ts);
-        ~jinf();
+        virtual ~jinf();
 
         void validate() throw (jexception);
         const u_int16_t analyze() throw (jexception);

Modified: store/trunk/cpp/lib/jrnl/rcvdat.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/rcvdat.hpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/rcvdat.hpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -59,6 +59,7 @@
                     _h_rid(0),
                     _enq_cnt_list(JRNL_NUM_FILES, 0)
             {}
+
             void reset()
             {
                 _empty=true;
@@ -70,16 +71,22 @@
                 for (unsigned f=0; f<_enq_cnt_list.size(); f++)
                     _enq_cnt_list[f] = 0;
             }
+
             void print()
             {
-                std::cout << "_empty=" << (_empty?"T":"F") << std::endl;
-                std::cout << "_ffid=" << _ffid << std::endl;
-                std::cout << "_fro=" << _fro << std::endl;
-                std::cout << "_lfid=" << _lfid << std::endl;
-                std::cout << "_eo=" << _eo << std::endl;
-                std::cout << "_h_rid=" << _h_rid << std::endl;
+                std::cout << "Recovery jorunal file analysis summary:" << std::endl;
+                std::cout << "  Journal empty (_empty) = " << (_empty ? "TRUE" : "FALSE") <<
+                        std::endl;
+                std::cout << "  First fid (_ffid) = " << _ffid << std::endl;
+                std::cout << "  First record offset in first fid (_fro) = 0x" << std::hex << _fro <<
+                        std::dec << " (" << (_fro/JRNL_DBLK_SIZE) << " dblks)" << std::endl;
+                std::cout << "  Last fid (_lfid) = " << _lfid << std::endl;
+                std::cout << "  End offset (_eo) = 0x" << std::hex << _eo << std::dec << " ("  <<
+                        (_eo/JRNL_DBLK_SIZE) << " dblks)" << std::endl;
+                std::cout << "  Highest rid (_h_rid) = " << _h_rid << std::endl;
+                std::cout << "  Enqueued records (txn & non-txn):" << std::endl;
                 for (unsigned i=0; i<_enq_cnt_list.size(); i++)
-                    std::cout << "_enq_cnt_list[" << i << "]=" << _enq_cnt_list[i] << std::endl;
+                    std::cout << "    File " << i << ": " << _enq_cnt_list[i] << std::endl;
             }
         };
 }

Modified: store/trunk/cpp/lib/jrnl/rmgr.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/rmgr.cpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/rmgr.cpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -262,6 +262,7 @@
 //std::cout << " g" << std::flush;
         if (_page_cb_arr[_pg_index]._state != AIO_COMPLETE)
         {
+//std::cout << "[" << _pg_index << "]=" << page_state_str(_page_cb_arr[_pg_index]._state) << std::flush;
             aio_cycle();
             return RHM_IORES_AIO_WAIT;
         }
@@ -346,8 +347,8 @@
                             ss << "rid=0x" << std::setw(16) << _hdr._rid;
                             ss << "; dtok_rid=" << std::setw(16) << dtokp->rid();
                             ss << "; dtok_id=0x" << std::setw(8) << dtokp->id();
-                            throw jexception(jerrno::JERR_RMGR_RIDMISMATCH, ss.str().c_str(), "rmgr",
-                                    "read");
+                            throw jexception(jerrno::JERR_RMGR_RIDMISMATCH, ss.str().c_str(),
+                                    "rmgr", "read");
                         }
                     }
                     else
@@ -692,7 +693,7 @@
     for (int16_t i=0; i<num_uninit; i++)
     {
         if (_rrfc.empty()) // Nothing to do; this file not yet written to
-            break;        
+            break;
             
         // If this is the first read from a file, increase the read pointers to beyond fhdr
         // or consume fhdr here for analysis (not req'd at present)

Modified: store/trunk/cpp/lib/jrnl/rmgr.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/rmgr.hpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/rmgr.hpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -65,7 +65,7 @@
         rmgr(jcntl* jc, enq_map& emap, txn_map& tmap, rrfc& rrfc);
         rmgr(jcntl* jc, enq_map& emap, txn_map& tmap, rrfc& rrfc,
                 std::deque<data_tok*>* const dtokl) throw (jexception);
-        ~rmgr();
+        virtual ~rmgr();
 
         void initialize(std::deque<data_tok*>* const dtoklp, const aio_cb rd_cb) throw (jexception);
         const iores get(const u_int64_t& rid, const size_t& dsize, const size_t& dsize_avail,

Modified: store/trunk/cpp/lib/jrnl/txn_map.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/txn_map.hpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/txn_map.hpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -77,7 +77,7 @@
 
     public:
         txn_map();
-        ~txn_map();
+        virtual ~txn_map();
 
         const bool insert_txn_data(const std::string& xid, const txn_data& td) throw (jexception);
         const txn_data_list get_tdata_list(const std::string& xid) throw (jexception);

Modified: store/trunk/cpp/lib/jrnl/txn_rec.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/txn_rec.hpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/txn_rec.hpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -66,7 +66,7 @@
         // constructor used for write operations, where xid already exists
         txn_rec(const u_int32_t magic, const u_int64_t rid, const void* const xidp,
                 const size_t xidlen);
-        ~txn_rec();
+        virtual ~txn_rec();
 
         // Prepare instance for use in reading data from journal
         void reset(const u_int32_t magic);

Modified: store/trunk/cpp/lib/jrnl/wmgr.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/wmgr.hpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/wmgr.hpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -99,7 +99,7 @@
         wmgr(jcntl* jc, enq_map& emap, txn_map& tmap, wrfc& wrfc,
                 std::deque<data_tok*>* const dtoklp, const u_int32_t max_dtokpp,
                 const u_int32_t max_iowait_us) throw (jexception);
-        ~wmgr();
+        virtual ~wmgr();
 
         void initialize(std::deque<data_tok*>* const dtoklp, aio_cb wr_cb,
                 const u_int32_t max_dtokpp, const u_int32_t max_iowait_us) throw (jexception);

Modified: store/trunk/cpp/lib/jrnl/wrfc.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/wrfc.hpp	2007-11-15 20:57:45 UTC (rev 1321)
+++ store/trunk/cpp/lib/jrnl/wrfc.hpp	2007-11-15 22:14:50 UTC (rev 1322)
@@ -60,7 +60,7 @@
 
     public:
         wrfc();
-        ~wrfc();
+        virtual ~wrfc();
 
         /**
         * \brief Initialize the controller.




More information about the rhmessaging-commits mailing list