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.