Commit a016cd9e authored by unknown's avatar unknown
Browse files

ndb - bug#21941

  Fix so that scans closed before execute are removed from "scans to send list"


ndb/include/ndbapi/NdbTransaction.hpp:
  Fix so that scans closed before execute are removed from "scans to send list"
ndb/src/ndbapi/NdbScanOperation.cpp:
  Fix so that scans closed before execute are removed from "scans to send list"
ndb/src/ndbapi/NdbTransaction.cpp:
  Fix so that scans closed before execute are removed from "scans to send list"
parent dc8649ba
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -657,6 +657,9 @@ private:
  // Release all cursor operations in connection
  void releaseOps(NdbOperation*);	
  void releaseScanOperations(NdbIndexScanOperation*);	
  bool releaseScanOperation(NdbIndexScanOperation** listhead,
			    NdbIndexScanOperation** listtail,
			    NdbIndexScanOperation* op);
  void releaseExecutedScanOperation(NdbIndexScanOperation*);
  
  // Set the transaction identity of the transaction
+20 −2
Original line number Diff line number Diff line
@@ -678,9 +678,27 @@ void NdbScanOperation::close(bool forceSend, bool releaseOp)
  theNdbCon = NULL;
  m_transConnection = NULL;

  if (releaseOp && tTransCon) {
  if (tTransCon) 
  {
    NdbIndexScanOperation* tOp = (NdbIndexScanOperation*)this;
    tTransCon->releaseExecutedScanOperation(tOp);

    bool ret = true;
    if (theStatus != WaitResponse)
    {
      /**
       * Not executed yet
       */
      ret = 
	tTransCon->releaseScanOperation(&tTransCon->m_theFirstScanOperation,
					&tTransCon->m_theLastScanOperation,
					tOp);
    }
    else if (releaseOp)
    {
      ret = tTransCon->releaseScanOperation(&tTransCon->m_firstExecutedScanOp,
					    0, tOp);
    }
    assert(ret);
  }
  
  tCon->theScanningOp = 0;
+48 −17
Original line number Diff line number Diff line
@@ -978,27 +978,58 @@ void
NdbTransaction::releaseExecutedScanOperation(NdbIndexScanOperation* cursorOp)
{
  DBUG_ENTER("NdbTransaction::releaseExecutedScanOperation");
  DBUG_PRINT("enter", ("this=0x%x op=0x%x", (UintPtr)this, (UintPtr)cursorOp))
  DBUG_PRINT("enter", ("this=0x%x op=0x%x", (UintPtr)this, (UintPtr)cursorOp));
  
  // here is one reason to make op lists doubly linked
  if (m_firstExecutedScanOp == cursorOp) {
    m_firstExecutedScanOp = (NdbIndexScanOperation*)cursorOp->theNext;
    cursorOp->release();
    theNdb->releaseScanOperation(cursorOp);
  } else if (m_firstExecutedScanOp != NULL) {
    NdbIndexScanOperation* tOp = m_firstExecutedScanOp;
    while (tOp->theNext != NULL) {
      if (tOp->theNext == cursorOp) {
        tOp->theNext = cursorOp->theNext;
        cursorOp->release();
        theNdb->releaseScanOperation(cursorOp);
  releaseScanOperation(&m_firstExecutedScanOp, 0, cursorOp);
  
  DBUG_VOID_RETURN;
}//NdbTransaction::releaseExecutedScanOperation()

bool
NdbTransaction::releaseScanOperation(NdbIndexScanOperation** listhead,
				     NdbIndexScanOperation** listtail,
				     NdbIndexScanOperation* op)
{
  if (* listhead == op)
  {
    * listhead = (NdbIndexScanOperation*)op->theNext;
    if (listtail && *listtail == op)
    {
      assert(* listhead == 0);
      * listtail = 0;
    }
      
  }
  else
  {
    NdbIndexScanOperation* tmp = * listhead;
    while (tmp != NULL)
    {
      if (tmp->theNext == op)
      {
	tmp->theNext = (NdbIndexScanOperation*)op->theNext;
	if (listtail && *listtail == op)
	{
	  assert(op->theNext == 0);
	  *listtail = tmp;
	}
	break;
      }
      tOp = (NdbIndexScanOperation*)tOp->theNext;
      tmp = (NdbIndexScanOperation*)tmp->theNext;
    }
    if (tmp == NULL)
      op = NULL;
  }
  
  if (op != NULL)
  {
    op->release();
    theNdb->releaseScanOperation(op);
    return true;
  }
  
  return false;
}
  DBUG_VOID_RETURN;
}//NdbTransaction::releaseExecutedScanOperation()

/*****************************************************************************
NdbOperation* getNdbOperation(const char* aTableName);