[rhmessaging-commits] rhmessaging commits: r2230 - store/branches/mrg-1.0/cpp/lib.
rhmessaging-commits at lists.jboss.org
rhmessaging-commits at lists.jboss.org
Fri Jul 25 16:43:46 EDT 2008
Author: kpvdr
Date: 2008-07-25 16:43:46 -0400 (Fri, 25 Jul 2008)
New Revision: 2230
Modified:
store/branches/mrg-1.0/cpp/lib/BdbMessageStore.cpp
store/branches/mrg-1.0/cpp/lib/PreparedTransaction.cpp
store/branches/mrg-1.0/cpp/lib/PreparedTransaction.h
Log:
Backport of trunk r.2229: Bugfix for 456524: "Broker crashes during recovery when XA tx are indoubt"
Modified: store/branches/mrg-1.0/cpp/lib/BdbMessageStore.cpp
===================================================================
--- store/branches/mrg-1.0/cpp/lib/BdbMessageStore.cpp 2008-07-25 20:19:52 UTC (rev 2229)
+++ store/branches/mrg-1.0/cpp/lib/BdbMessageStore.cpp 2008-07-25 20:43:46 UTC (rev 2230)
@@ -731,18 +731,17 @@
msg->decodeContent(contentBuff);
}
- if (PreparedTransaction::isLocked(prepared, queue->getPersistenceId(), dtokp.rid()) ) {
- std::string xid((char*)xidbuff, xidbuffSize);
- TplRecoverMapCitr citr = tplRecoverMap.find(xid);
- if (xid.size() > 0 && citr == tplRecoverMap.end()) THROW_STORE_EXCEPTION("XID not found in tplRecoverMap");
- if (xid.size() > 0 && citr->second.deq_flag) { // deq present in prepared list, this xid is part of incomplete txn commit/abort
- if (citr->second.commit_flag)
- queue->recover(msg);
+ PreparedTransaction::list::iterator i = PreparedTransaction::getLockedPreparedTransaction(prepared, queue->getPersistenceId(), dtokp.rid());
+ if (i == prepared.end()) { // not locked
+ queue->recover(msg);
+ } else {
+ TplRecoverMapCitr citr = tplRecoverMap.find(i->xid);
+ if (citr == tplRecoverMap.end()) THROW_STORE_EXCEPTION("XID not found in tplRecoverMap");
+ if (citr->second.deq_flag) { // deq present in prepared list, this xid is part of incomplete txn commit/abort
+ if (citr->second.commit_flag) queue->recover(msg); // treat as non-tx, roll forward (else aborted, throw away)
} else {
messages[dtokp.rid()] = msg;
}
- } else {
- queue->recover(msg);
}
dtokp.reset();
Modified: store/branches/mrg-1.0/cpp/lib/PreparedTransaction.cpp
===================================================================
--- store/branches/mrg-1.0/cpp/lib/PreparedTransaction.cpp 2008-07-25 20:19:52 UTC (rev 2229)
+++ store/branches/mrg-1.0/cpp/lib/PreparedTransaction.cpp 2008-07-25 20:43:46 UTC (rev 2230)
@@ -65,6 +65,16 @@
return false;
}
+PreparedTransaction::list::iterator PreparedTransaction::getLockedPreparedTransaction(PreparedTransaction::list& txns, queue_id queue, message_id message)
+{
+ for (PreparedTransaction::list::iterator i = txns.begin(); i != txns.end(); i++) {
+ if (i->isLocked(queue, message)) {
+ return i;
+ }
+ }
+ return txns.end();
+}
+
PreparedTransaction::PreparedTransaction(const std::string& _xid,
LockedMappings::shared_ptr _enqueues,
LockedMappings::shared_ptr _dequeues)
Modified: store/branches/mrg-1.0/cpp/lib/PreparedTransaction.h
===================================================================
--- store/branches/mrg-1.0/cpp/lib/PreparedTransaction.h 2008-07-25 20:19:52 UTC (rev 2229)
+++ store/branches/mrg-1.0/cpp/lib/PreparedTransaction.h 2008-07-25 20:43:46 UTC (rev 2230)
@@ -67,6 +67,7 @@
PreparedTransaction(const std::string& xid, LockedMappings::shared_ptr enqueues, LockedMappings::shared_ptr dequeues);
bool isLocked(queue_id queue, message_id message);
static bool isLocked(PreparedTransaction::list& txns, queue_id queue, message_id message);
+ static PreparedTransaction::list::iterator getLockedPreparedTransaction(PreparedTransaction::list& txns, queue_id queue, message_id message);
};
}}
More information about the rhmessaging-commits
mailing list