summaryrefslogtreecommitdiff
path: root/ndb
diff options
context:
space:
mode:
Diffstat (limited to 'ndb')
-rw-r--r--ndb/src/ndbapi/NdbScanOperation.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/ndb/src/ndbapi/NdbScanOperation.cpp b/ndb/src/ndbapi/NdbScanOperation.cpp
index 90e3a63c53d..a36d47c3471 100644
--- a/ndb/src/ndbapi/NdbScanOperation.cpp
+++ b/ndb/src/ndbapi/NdbScanOperation.cpp
@@ -1513,6 +1513,66 @@ NdbScanOperation::close_impl(TransporterFacade* tp, bool forceSend){
return -1;
}
+ bool holdLock = false;
+ if (theSCAN_TABREQ)
+ {
+ ScanTabReq * req = CAST_PTR(ScanTabReq, theSCAN_TABREQ->getDataPtrSend());
+ holdLock = ScanTabReq::getHoldLockFlag(req->requestInfo);
+ }
+
+ /**
+ * When using locks, force close of scan directly
+ */
+ if (holdLock && theError.code == 0 &&
+ (m_sent_receivers_count + m_conf_receivers_count + m_api_receivers_count))
+ {
+ TransporterFacade * tp = TransporterFacade::instance();
+ NdbApiSignal tSignal(theNdb->theMyRef);
+ tSignal.setSignal(GSN_SCAN_NEXTREQ);
+
+ Uint32* theData = tSignal.getDataPtrSend();
+ Uint64 transId = theNdbCon->theTransactionId;
+ theData[0] = theNdbCon->theTCConPtr;
+ theData[1] = 1;
+ theData[2] = transId;
+ theData[3] = (Uint32) (transId >> 32);
+
+ tSignal.setLength(4);
+ int ret = tp->sendSignal(&tSignal, nodeId);
+ if (ret)
+ {
+ setErrorCode(4008);
+ return -1;
+ }
+ checkForceSend(forceSend);
+
+ /**
+ * If no receiver is outstanding...
+ * set it to 1 as execCLOSE_SCAN_REP resets it
+ */
+ m_sent_receivers_count = m_sent_receivers_count ? m_sent_receivers_count : 1;
+
+ while(theError.code == 0 && (m_sent_receivers_count + m_conf_receivers_count))
+ {
+ theNdb->theImpl->theWaiter.m_node = nodeId;
+ theNdb->theImpl->theWaiter.m_state = WAIT_SCAN;
+ int return_code = theNdb->receiveResponse(WAITFOR_SCAN_TIMEOUT);
+ switch(return_code){
+ case 0:
+ break;
+ case -1:
+ setErrorCode(4008);
+ case -2:
+ m_api_receivers_count = 0;
+ m_conf_receivers_count = 0;
+ m_sent_receivers_count = 0;
+ theNdbCon->theReleaseOnClose = true;
+ return -1;
+ }
+ }
+ return 0;
+ }
+
/**
* Wait for outstanding
*/