mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 14:02:32 +01:00
ndb - bug#20442
force close of scan (of outstanding scan_frag)
This commit is contained in:
parent
c59fac93c4
commit
0ff6b66425
1 changed files with 60 additions and 0 deletions
|
@ -1503,6 +1503,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
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue