[rhmessaging-commits] rhmessaging commits: r2229 - store/trunk/cpp/lib.

rhmessaging-commits at lists.jboss.org rhmessaging-commits at lists.jboss.org
Fri Jul 25 16:19:53 EDT 2008


Author: kpvdr
Date: 2008-07-25 16:19:52 -0400 (Fri, 25 Jul 2008)
New Revision: 2229

Modified:
   store/trunk/cpp/lib/BdbMessageStore.cpp
   store/trunk/cpp/lib/PreparedTransaction.cpp
   store/trunk/cpp/lib/PreparedTransaction.h
Log:
Bugfix for 456524: "Broker crashes during recovery when XA tx are indoubt"

Modified: store/trunk/cpp/lib/BdbMessageStore.cpp
===================================================================
--- store/trunk/cpp/lib/BdbMessageStore.cpp	2008-07-25 19:39:57 UTC (rev 2228)
+++ store/trunk/cpp/lib/BdbMessageStore.cpp	2008-07-25 20:19:52 UTC (rev 2229)
@@ -757,18 +757,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/trunk/cpp/lib/PreparedTransaction.cpp
===================================================================
--- store/trunk/cpp/lib/PreparedTransaction.cpp	2008-07-25 19:39:57 UTC (rev 2228)
+++ store/trunk/cpp/lib/PreparedTransaction.cpp	2008-07-25 20:19:52 UTC (rev 2229)
@@ -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/trunk/cpp/lib/PreparedTransaction.h
===================================================================
--- store/trunk/cpp/lib/PreparedTransaction.h	2008-07-25 19:39:57 UTC (rev 2228)
+++ store/trunk/cpp/lib/PreparedTransaction.h	2008-07-25 20:19:52 UTC (rev 2229)
@@ -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