You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kp...@apache.org on 2008/08/19 21:37:39 UTC
svn commit: r687140 - in /incubator/qpid/trunk/qpid/cpp/src:
qpid/framing/Array.h tests/txtest.cpp
Author: kpvdr
Date: Tue Aug 19 12:37:39 2008
New Revision: 687140
URL: http://svn.apache.org/viewvc?rev=687140&view=rev
Log:
Missing DTX recover code for --dtx mode in txtest
Modified:
incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Array.h
incubator/qpid/trunk/qpid/cpp/src/tests/txtest.cpp
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Array.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Array.h?rev=687140&r1=687139&r2=687140&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Array.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/Array.h Tue Aug 19 12:37:39 2008
@@ -54,7 +54,7 @@
void add(ValuePtr value);
template <class T>
- void collect(std::vector<T>& out)
+ void collect(std::vector<T>& out) const
{
for (ValueVector::const_iterator i = values.begin(); i != values.end(); ++i) {
out.push_back((*i)->get<T>());
Modified: incubator/qpid/trunk/qpid/cpp/src/tests/txtest.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/txtest.cpp?rev=687140&r1=687139&r2=687140&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/txtest.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/txtest.cpp Tue Aug 19 12:37:39 2008
@@ -31,6 +31,8 @@
#include "qpid/client/Message.h"
#include "qpid/client/AsyncSession.h"
#include "qpid/client/SubscriptionManager.h"
+#include "qpid/framing/Array.h"
+#include "qpid/framing/Buffer.h"
using namespace qpid;
using namespace qpid::client;
@@ -231,6 +233,33 @@
subs.setFlowControl(SubscriptionManager::UNLIMITED, SubscriptionManager::UNLIMITED, false);
subs.setAcceptMode(1/*not-required*/);
+ // Recover DTX transactions (if any)
+ if (opts.dtx) {
+ std::vector<std::string> inDoubtXids;
+ framing::DtxRecoverResult dtxRes = session.dtxRecover().get();
+ const framing::Array& xidArr = dtxRes.getInDoubt();
+ xidArr.collect(inDoubtXids);
+
+ if (inDoubtXids.size()) {
+ std::cout << "Recovering DTX in-doubt transaction(s):" << std::endl;
+ framing::StructHelper decoder;
+ framing::Xid xid;
+ // abort even, commit odd transactions
+// for (std::vector<std::string>::const_iterator i = inDoubtXids.begin(), int cnt = 1; i < inDoubtXids.end(); i++, cnt++) {
+ for (unsigned i = 0; i < inDoubtXids.size(); i++) {
+ decoder.decode(xid, inDoubtXids[i]);
+ std::cout << (i%2 ? " * aborting " : " * committing ");
+ xid.print(std::cout);
+ std::cout << std::endl;
+ if (i%2) {
+ session.dtxRollback(arg::xid=xid);
+ } else {
+ session.dtxCommit(arg::xid=xid);
+ }
+ }
+ }
+ }
+
StringSet drained;
//drain each queue and verify the correct set of messages are available
for (StringSet::iterator i = queues.begin(); i != queues.end(); i++) {