From 14979cb59ebf11033e73073d0cdb04d52dcc5d55 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 16 Jun 2004 13:27:35 +0200 Subject: [PATCH] wl1671 - bug fixes ndb/include/ndbapi/NdbConnection.hpp: Made releaseCompletedOpertions private and introduced NdbConnection::restart instead. This methods basically check a bunch of status flags before calling releaseCompletedOperations ndb/src/kernel/blocks/dblqh/DblqhMain.cpp: Introduced MARKRE_TRACE Fixed bug on not releasing marker at execABORT ndb/src/ndbapi/NdbConnection.cpp: Made releaseCompletedOpertions private and introduced NdbConnection::restart instead. This methods basically check a bunch of status flags before calling releaseCompletedOperations ndb/src/ndbapi/Ndbif.cpp: Use MARKER_TRACE ndb/test/src/HugoTransactions.cpp: Use restart instead of releaseCompletedOperations ndb/test/src/UtilTransactions.cpp: Use restart instead of releaseCompletedOperations ndb/tools/delete_all.cpp: Use restart instead of releaseCompletedOperations --- ndb/include/ndbapi/NdbConnection.hpp | 18 +++++++++---- ndb/src/kernel/blocks/dblqh/DblqhMain.cpp | 32 ++++++++++++++++++++++- ndb/src/ndbapi/NdbConnection.cpp | 18 ++++++++++++- ndb/src/ndbapi/Ndbif.cpp | 4 +-- ndb/test/src/HugoTransactions.cpp | 2 +- ndb/test/src/UtilTransactions.cpp | 4 +-- ndb/tools/delete_all.cpp | 2 +- 7 files changed, 67 insertions(+), 13 deletions(-) diff --git a/ndb/include/ndbapi/NdbConnection.hpp b/ndb/include/ndbapi/NdbConnection.hpp index bf5a4f6f0e5..42e011419dd 100644 --- a/ndb/include/ndbapi/NdbConnection.hpp +++ b/ndb/include/ndbapi/NdbConnection.hpp @@ -309,6 +309,16 @@ public: */ void close(); + /** + * Restart transaction + * + * Once a transaction has been completed successfully + * it can be started again wo/ calling closeTransaction/startTransaction + * + * Note this method also releases completed operations + */ + int restart(); + /** @} *********************************************************************/ /** @@ -417,16 +427,14 @@ public: */ const NdbOperation * getNextCompletedOperation(const NdbOperation * op)const; + /** @} *********************************************************************/ + +private: /** * Release completed operations */ void releaseCompletedOperations(); - - /** @} *********************************************************************/ - -private: - typedef Uint64 TimeMillis_t; /************************************************************************** * These methods are service methods to other classes in the NDBAPI. * diff --git a/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp b/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp index 2a744ea746a..4f21b66b4d0 100644 --- a/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp +++ b/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp @@ -64,6 +64,8 @@ #define DEBUG(x) #endif +//#define MARKER_TRACE 1 + const Uint32 NR_ScanNo = 0; void Dblqh::execACC_COM_BLOCK(Signal* signal) @@ -2404,6 +2406,9 @@ Dblqh::execREMOVE_MARKER_ORD(Signal* signal) CommitAckMarkerPtr removedPtr; m_commitAckMarkerHash.release(removedPtr, key); ndbrequire(removedPtr.i != RNIL); +#ifdef MARKER_TRACE + ndbout_c("Rem marker[%.8x %.8x]", key.transid1, key.transid2); +#endif } @@ -3198,6 +3203,9 @@ void Dblqh::execLQHKEYREQ(Signal* signal) CommitAckMarkerPtr tmp; #ifdef VM_TRACE +#ifdef MARKER_TRACE + ndbout_c("Add marker[%.8x %.8x]", markerPtr.p->transid1, markerPtr.p->transid2); +#endif ndbrequire(!m_commitAckMarkerHash.find(tmp, * markerPtr.p)); #endif m_commitAckMarkerHash.add(markerPtr); @@ -5668,7 +5676,23 @@ void Dblqh::execABORT(Signal* signal) }//if regTcPtr->abortState = TcConnectionrec::ABORT_FROM_TC; regTcPtr->activeCreat = ZFALSE; + + const Uint32 commitAckMarker = regTcPtr->commitAckMarker; + if(commitAckMarker != RNIL){ + jam(); +#ifdef MARKER_TRACE + { + CommitAckMarkerPtr tmp; + m_commitAckMarkerHash.getPtr(tmp, commitAckMarker); + ndbout_c("Ab2 marker[%.8x %.8x]", tmp.p->transid1, tmp.p->transid2); + } +#endif + m_commitAckMarkerHash.release(commitAckMarker); + regTcPtr->commitAckMarker = RNIL; + } + abortStateHandlerLab(signal); + return; }//Dblqh::execABORT() @@ -6026,7 +6050,13 @@ void Dblqh::abortCommonLab(Signal* signal) * There is no NR ongoing and we have a marker */ jam(); - +#ifdef MARKER_TRACE + { + CommitAckMarkerPtr tmp; + m_commitAckMarkerHash.getPtr(tmp, commitAckMarker); + ndbout_c("Abo marker[%.8x %.8x]", tmp.p->transid1, tmp.p->transid2); + } +#endif m_commitAckMarkerHash.release(commitAckMarker); regTcPtr->commitAckMarker = RNIL; } diff --git a/ndb/src/ndbapi/NdbConnection.cpp b/ndb/src/ndbapi/NdbConnection.cpp index 5aaf14302a6..68979d92559 100644 --- a/ndb/src/ndbapi/NdbConnection.cpp +++ b/ndb/src/ndbapi/NdbConnection.cpp @@ -193,6 +193,23 @@ NdbConnection::setErrorCode(int anErrorCode) theError.code = anErrorCode; }//NdbConnection::setErrorCode() +int +NdbConnection::restart(){ + if(theCompletionStatus == CompletedSuccess){ + releaseCompletedOperations(); + Uint64 tTransid = theNdb->theFirstTransId; + theTransactionId = tTransid; + if((Uint32)tTransid == ((Uint32)~0)){ + theNdb->theFirstTransId = (tTransid >> 32) << 32; + } else { + theNdb->theFirstTransId = tTransid + 1; + } + theCompletionStatus = NotCompleted; + return 0; + } + return -1; +} + /***************************************************************************** void handleExecuteCompletion(void); @@ -1307,7 +1324,6 @@ from other transactions. if (tCommitFlag == 1) { theCommitStatus = Committed; theGlobalCheckpointId = tGCI; - theTransactionId++; } else if ((tNoComp >= tNoSent) && (theLastExecOpInList->theCommitIndicator == 1)){ /**********************************************************************/ diff --git a/ndb/src/ndbapi/Ndbif.cpp b/ndb/src/ndbapi/Ndbif.cpp index 92723431860..ea2c5be4f7f 100644 --- a/ndb/src/ndbapi/Ndbif.cpp +++ b/ndb/src/ndbapi/Ndbif.cpp @@ -1308,8 +1308,8 @@ void NdbConnection::sendTC_COMMIT_ACK(NdbApiSignal * aSignal, Uint32 transId1, Uint32 transId2, Uint32 aTCRef){ -#if 0 - ndbout_c("Sending TC_COMMIT_ACK(0x%x, 0x%x) to -> %d", +#ifdef MARKER_TRACE + ndbout_c("Sending TC_COMMIT_ACK(0x%.8x, 0x%.8x) to -> %d", transId1, transId2, refToNode(aTCRef)); diff --git a/ndb/test/src/HugoTransactions.cpp b/ndb/test/src/HugoTransactions.cpp index 7c26baa3ec2..d374f52a76a 100644 --- a/ndb/test/src/HugoTransactions.cpp +++ b/ndb/test/src/HugoTransactions.cpp @@ -654,7 +654,7 @@ HugoTransactions::scanUpdateRecords3(Ndb* pNdb, if(check != -1){ check = pTrans->execute(Commit); - pTrans->releaseCompletedOperations(); + pTrans->restart(); } const NdbError err = pTrans->getNdbError(); diff --git a/ndb/test/src/UtilTransactions.cpp b/ndb/test/src/UtilTransactions.cpp index 8963e580bca..a5a61cd0a34 100644 --- a/ndb/test/src/UtilTransactions.cpp +++ b/ndb/test/src/UtilTransactions.cpp @@ -412,7 +412,7 @@ UtilTransactions::clearTable3(Ndb* pNdb, if(check != -1){ check = pTrans->execute(Commit); - pTrans->releaseCompletedOperations(); + pTrans->restart(); } err = pTrans->getNdbError(); @@ -536,7 +536,7 @@ UtilTransactions::copyTableData(Ndb* pNdb, } while((eof = rs->nextResult(false)) == 0); check = pTrans->execute(Commit); - pTrans->releaseCompletedOperations(); + pTrans->restart(); if( check == -1 ) { const NdbError err = pTrans->getNdbError(); ERR(err); diff --git a/ndb/tools/delete_all.cpp b/ndb/tools/delete_all.cpp index dabd9a0e8fa..5110947c6a2 100644 --- a/ndb/tools/delete_all.cpp +++ b/ndb/tools/delete_all.cpp @@ -143,7 +143,7 @@ int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism) if(check != -1){ check = pTrans->execute(Commit); - pTrans->releaseCompletedOperations(); + pTrans->restart(); } err = pTrans->getNdbError();