diff options
Diffstat (limited to 'cpp/src/tests/storePerftools/asyncPerf/SimpleTransactionContext.cpp')
-rw-r--r-- | cpp/src/tests/storePerftools/asyncPerf/SimpleTransactionContext.cpp | 240 |
1 files changed, 0 insertions, 240 deletions
diff --git a/cpp/src/tests/storePerftools/asyncPerf/SimpleTransactionContext.cpp b/cpp/src/tests/storePerftools/asyncPerf/SimpleTransactionContext.cpp deleted file mode 100644 index 2aea14bc21..0000000000 --- a/cpp/src/tests/storePerftools/asyncPerf/SimpleTransactionContext.cpp +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/** - * \file SimpleTransactionContext.cpp - */ - -#include "SimpleTransactionContext.h" - -#include "TransactionAsyncContext.h" - -#include "qpid/asyncStore/AsyncStoreImpl.h" - -#include <uuid/uuid.h> - -namespace tests { -namespace storePerftools { -namespace asyncPerf { - -SimpleTransactionContext::SimpleTransactionContext(const std::string& xid) : - qpid::broker::TransactionContext(), - m_xid(xid), - m_tpcFlag(!xid.empty()), - m_store(0), - m_txnHandle(0), - m_prepared(false), - m_enqueuedMsgs() -{ - if (!m_tpcFlag) { - setLocalXid(); - } -//std::cout << "*TXN* begin: xid=" << getXid() << "; 2PC=" << (is2pc()?"T":"F") << std::endl; -} - -SimpleTransactionContext::SimpleTransactionContext(qpid::asyncStore::AsyncStoreImpl* store, - const std::string& xid) : - m_store(store), - m_prepared(false), - m_enqueuedMsgs() -{ -//std::cout << "*TXN* begin: xid=" << getXid() << "; 2PC=" << (is2pc()?"T":"F") << std::endl; - if (m_store != 0) { - m_txnHandle = store->createTxnHandle(xid); - } -} - -SimpleTransactionContext::~SimpleTransactionContext() -{} - -// static -/* -void -SimpleTransactionContext::handleAsyncResult(const qpid::broker::AsyncResult* res, - qpid::broker::BrokerAsyncContext* bc) -{ - if (bc && res) { - TransactionAsyncContext* tac = dynamic_cast<TransactionAsyncContext*>(bc); - if (res->errNo) { - // TODO: Handle async failure here - std::cerr << "Transaction xid=\"" << tac->getTransactionContext()->getXid() << "\": Operation " << tac->getOpStr() << ": failure " - << res->errNo << " (" << res->errMsg << ")" << std::endl; - } else { - // Handle async success here - switch(tac->getOpCode()) { - case qpid::asyncStore::AsyncOperation::TXN_PREPARE: - tac->getTransactionContext()->prepareComplete(tac); - break; - case qpid::asyncStore::AsyncOperation::TXN_COMMIT: - tac->getTransactionContext()->commitComplete(tac); - break; - case qpid::asyncStore::AsyncOperation::TXN_ABORT: - tac->getTransactionContext()->abortComplete(tac); - break; - default: - std::ostringstream oss; - oss << "tests::storePerftools::asyncPerf::SimpleTransactionContext::handleAsyncResult(): Unknown async operation: " << tac->getOpCode(); - throw qpid::Exception(oss.str()); - }; - } - } - if (bc) delete bc; - if (res) delete res; -} -*/ - -const qpid::broker::TxnHandle& -SimpleTransactionContext::getHandle() const -{ - return m_txnHandle; -} - -qpid::broker::TxnHandle& -SimpleTransactionContext::getHandle() -{ - return m_txnHandle; -} - -bool -SimpleTransactionContext::is2pc() const -{ - return m_tpcFlag; -} - -const std::string& -SimpleTransactionContext::getXid() const -{ - return m_xid; -} - -void -SimpleTransactionContext::addEnqueuedMsg(QueuedMessage* qm) -{ - qpid::sys::ScopedLock<qpid::sys::Mutex> l(m_enqueuedMsgsMutex); - m_enqueuedMsgs.push_back(qm); -} - -void -SimpleTransactionContext::prepare() -{ - if (m_tpcFlag) { - localPrepare(); - m_prepared = true; - } - std::ostringstream oss; - oss << "SimpleTransactionContext::prepare(): xid=\"" << getXid() - << "\": Transaction Error: called prepare() on local transaction"; - throw qpid::Exception(oss.str()); -} - -void -SimpleTransactionContext::abort() -{ - // TODO: Check the following XA transaction semantics: - // Assuming 2PC aborts can occur without a prepare. Do local prepare if not already prepared. - if (!m_prepared) { - localPrepare(); - } - if (m_store != 0) { -// m_store->submitAbort(m_txnHandle, -// &handleAsyncResult, -// dynamic_cast<qpid::broker::BrokerAsyncContext*>(new TransactionAsyncContext(this, qpid::asyncStore::AsyncOperation::TXN_ABORT))); - } -//std::cout << "*TXN* abort: xid=" << m_txnHandle.getXid() << "; 2PC=" << (m_txnHandle.is2pc()?"T":"F") << std::endl; -} - -void -SimpleTransactionContext::commit() -{ - if (is2pc()) { - if (!m_prepared) { - std::ostringstream oss; - oss << "SimpleTransactionContext::abort(): xid=\"" << getXid() - << "\": Transaction Error: called commit() without prepare() on 2PC transaction"; - throw qpid::Exception(oss.str()); - } - } else { - localPrepare(); - } - if (m_store != 0) { -// m_store->submitCommit(m_txnHandle, -// &handleAsyncResult, -// dynamic_cast<qpid::broker::BrokerAsyncContext*>(new TransactionAsyncContext(this, qpid::asyncStore::AsyncOperation::TXN_COMMIT))); - } -//std::cout << "*TXN* commit: xid=" << m_txnHandle.getXid() << "; 2PC=" << (m_txnHandle.is2pc()?"T":"F") << std::endl; -} - - -// private -void -SimpleTransactionContext::localPrepare() -{ - if (m_store != 0) { -// m_store->submitPrepare(m_txnHandle, -// &handleAsyncResult, -// dynamic_cast<qpid::broker::BrokerAsyncContext*>(new TransactionAsyncContext(this, qpid::asyncStore::AsyncOperation::TXN_PREPARE))); - } -//std::cout << "*TXN* localPrepare: xid=" << m_txnHandle.getXid() << "; 2PC=" << (m_txnHandle.is2pc()?"T":"F") << std::endl; -} - -// private -void -SimpleTransactionContext::setLocalXid() -{ - uuid_t uuid; - // TODO: Valgrind warning: Possible race condition in uuid_generate_random() - is it thread-safe, and if not, does it matter? - // If this race condition affects the randomness of the UUID, then there could be a problem here. - ::uuid_generate_random(uuid); - char uuidStr[37]; // 36-char uuid + trailing '\0' - ::uuid_unparse(uuid, uuidStr); - m_xid.assign(uuidStr); -} - -// private -void -SimpleTransactionContext::prepareComplete(const TransactionAsyncContext* /*tc*/) -{ - qpid::sys::ScopedLock<qpid::sys::Mutex> l(m_enqueuedMsgsMutex); -// while (!m_enqueuedMsgs.empty()) { -// m_enqueuedMsgs.front()->clearTransaction(); -// m_enqueuedMsgs.pop_front(); -// } -//std::cout << "~~~~~ Transaction xid=\"" << tc->m_tc->getXid() << "\": prepareComplete()" << std::endl << std::flush; -// assert(tc->getTransactionContext().get() == this); -} - - -// private -void -SimpleTransactionContext::abortComplete(const TransactionAsyncContext* tc) -{ -//std::cout << "~~~~~ Transaction xid=\"" << tc->m_tc->getXid() << "\": abortComplete()" << std::endl << std::flush; - assert(tc->getTransactionContext().get() == this); -} - - -// private -void -SimpleTransactionContext::commitComplete(const TransactionAsyncContext* tc) -{ -//std::cout << "~~~~~ Transaction xid=\"" << tc->m_tc->getXid() << "\": commitComplete()" << std::endl << std::flush; - assert(tc->getTransactionContext().get() == this); -} - -}}} // namespace tests::storePerftools::asyncPerf |