diff options
Diffstat (limited to 'storage/ndb/src/kernel/blocks/dbtup/DbtupBuffer.cpp')
-rw-r--r-- | storage/ndb/src/kernel/blocks/dbtup/DbtupBuffer.cpp | 275 |
1 files changed, 0 insertions, 275 deletions
diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupBuffer.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupBuffer.cpp deleted file mode 100644 index 2f8151acca1..00000000000 --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupBuffer.cpp +++ /dev/null @@ -1,275 +0,0 @@ -/* Copyright (c) 2003-2007 MySQL AB - Use is subject to license terms - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; version 2 of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ - -#define DBTUP_C -#define DBTUP_BUFFER_CPP -#include "Dbtup.hpp" -#include <RefConvert.hpp> -#include <ndb_limits.h> -#include <pc.hpp> -#include <signaldata/TransIdAI.hpp> - -void Dbtup::execSEND_PACKED(Signal* signal) -{ - Uint16 hostId; - Uint32 i; - Uint32 TpackedListIndex= cpackedListIndex; - jamEntry(); - for (i= 0; i < TpackedListIndex; i++) { - jam(); - hostId= cpackedList[i]; - ndbrequire((hostId - 1) < (MAX_NODES - 1)); // Also check not zero - Uint32 TpacketTA= hostBuffer[hostId].noOfPacketsTA; - if (TpacketTA != 0) { - jam(); - BlockReference TBref= numberToRef(API_PACKED, hostId); - Uint32 TpacketLen= hostBuffer[hostId].packetLenTA; - MEMCOPY_NO_WORDS(&signal->theData[0], - &hostBuffer[hostId].packetBufferTA[0], - TpacketLen); - sendSignal(TBref, GSN_TRANSID_AI, signal, TpacketLen, JBB); - hostBuffer[hostId].noOfPacketsTA= 0; - hostBuffer[hostId].packetLenTA= 0; - } - hostBuffer[hostId].inPackedList= false; - }//for - cpackedListIndex= 0; -} - -void Dbtup::bufferTRANSID_AI(Signal* signal, BlockReference aRef, - Uint32 Tlen) -{ - if (Tlen == 3) - return; - - Uint32 hostId= refToNode(aRef); - Uint32 Theader= ((refToBlock(aRef) << 16)+(Tlen-3)); - - ndbrequire(hostId < MAX_NODES); - Uint32 TpacketLen= hostBuffer[hostId].packetLenTA; - Uint32 TnoOfPackets= hostBuffer[hostId].noOfPacketsTA; - Uint32 sig0= signal->theData[0]; - Uint32 sig1= signal->theData[1]; - Uint32 sig2= signal->theData[2]; - - BlockReference TBref= numberToRef(API_PACKED, hostId); - - if ((Tlen + TpacketLen + 1) <= 25) { -// ---------------------------------------------------------------- -// There is still space in the buffer. We will copy it into the -// buffer. -// ---------------------------------------------------------------- - jam(); - updatePackedList(signal, hostId); - } else if (false && TnoOfPackets == 1) { -// ---------------------------------------------------------------- -// The buffer is full and there was only one packet buffered. We -// will send this as a normal signal. -// ---------------------------------------------------------------- - Uint32 TnewRef= numberToRef((hostBuffer[hostId].packetBufferTA[0] >> 16), - hostId); - MEMCOPY_NO_WORDS(&signal->theData[0], - &hostBuffer[hostId].packetBufferTA[1], - TpacketLen - 1); - sendSignal(TnewRef, GSN_TRANSID_AI, signal, (TpacketLen - 1), JBB); - TpacketLen= 0; - TnoOfPackets= 0; - } else { -// ---------------------------------------------------------------- -// The buffer is full but at least two packets. Send those in -// packed form. -// ---------------------------------------------------------------- - MEMCOPY_NO_WORDS(&signal->theData[0], - &hostBuffer[hostId].packetBufferTA[0], - TpacketLen); - sendSignal(TBref, GSN_TRANSID_AI, signal, TpacketLen, JBB); - TpacketLen= 0; - TnoOfPackets= 0; - } -// ---------------------------------------------------------------- -// Copy the signal into the buffer -// ---------------------------------------------------------------- - hostBuffer[hostId].packetBufferTA[TpacketLen + 0]= Theader; - hostBuffer[hostId].packetBufferTA[TpacketLen + 1]= sig0; - hostBuffer[hostId].packetBufferTA[TpacketLen + 2]= sig1; - hostBuffer[hostId].packetBufferTA[TpacketLen + 3]= sig2; - hostBuffer[hostId].noOfPacketsTA= TnoOfPackets + 1; - hostBuffer[hostId].packetLenTA= Tlen + TpacketLen + 1; - MEMCOPY_NO_WORDS(&hostBuffer[hostId].packetBufferTA[TpacketLen + 4], - &signal->theData[25], - Tlen - 3); -} - -void Dbtup::updatePackedList(Signal* signal, Uint16 hostId) -{ - if (hostBuffer[hostId].inPackedList == false) { - Uint32 TpackedListIndex= cpackedListIndex; - jam(); - hostBuffer[hostId].inPackedList= true; - cpackedList[TpackedListIndex]= hostId; - cpackedListIndex= TpackedListIndex + 1; - } -} - -/* ---------------------------------------------------------------- */ -/* ----------------------- SEND READ ATTRINFO --------------------- */ -/* ---------------------------------------------------------------- */ -void Dbtup::sendReadAttrinfo(Signal* signal, - KeyReqStruct *req_struct, - Uint32 ToutBufIndex, - const Operationrec *regOperPtr) -{ - if(ToutBufIndex == 0) - return; - - const BlockReference recBlockref= req_struct->rec_blockref; - const Uint32 block= refToBlock(recBlockref); - const Uint32 nodeId= refToNode(recBlockref); - - bool connectedToNode= getNodeInfo(nodeId).m_connected; - const Uint32 type= getNodeInfo(nodeId).m_type; - bool is_api= (type >= NodeInfo::API && type <= NodeInfo::MGM); - bool old_dest= (getNodeInfo(nodeId).m_version < MAKE_VERSION(3,5,0)); - Uint32 TpacketLen= hostBuffer[nodeId].packetLenTA; - Uint32 TpacketTA= hostBuffer[nodeId].noOfPacketsTA; - - if (ERROR_INSERTED(4006) && (nodeId != getOwnNodeId())){ - // Use error insert to turn routing on - jam(); - connectedToNode= false; - } - - Uint32 sig0= req_struct->tc_operation_ptr; - Uint32 sig1= req_struct->trans_id1; - Uint32 sig2= req_struct->trans_id2; - - TransIdAI * transIdAI= (TransIdAI *)signal->getDataPtrSend(); - transIdAI->connectPtr= sig0; - transIdAI->transId[0]= sig1; - transIdAI->transId[1]= sig2; - - if (connectedToNode){ - /** - * Own node -> execute direct - */ - if(nodeId != getOwnNodeId()){ - jam(); - - /** - * Send long sig - */ - if (ToutBufIndex >= 22 && is_api && !old_dest) { - jam(); - /** - * Flush buffer so that order is maintained - */ - if (TpacketTA != 0) { - jam(); - BlockReference TBref = numberToRef(API_PACKED, nodeId); - MEMCOPY_NO_WORDS(&signal->theData[0], - &hostBuffer[nodeId].packetBufferTA[0], - TpacketLen); - sendSignal(TBref, GSN_TRANSID_AI, signal, TpacketLen, JBB); - hostBuffer[nodeId].noOfPacketsTA = 0; - hostBuffer[nodeId].packetLenTA = 0; - transIdAI->connectPtr = sig0; - transIdAI->transId[0] = sig1; - transIdAI->transId[1] = sig2; - }//if - LinearSectionPtr ptr[3]; - ptr[0].p= &signal->theData[25]; - ptr[0].sz= ToutBufIndex; - sendSignal(recBlockref, GSN_TRANSID_AI, signal, 3, JBB, ptr, 1); - return; - } - - /** - * short sig + api -> buffer - */ -#ifndef NDB_NO_DROPPED_SIGNAL - if (ToutBufIndex < 22 && is_api){ - jam(); - bufferTRANSID_AI(signal, recBlockref, 3+ToutBufIndex); - return; - } -#endif - - /** - * rest -> old send sig - */ - Uint32 * src= signal->theData+25; - if (ToutBufIndex >= 22){ - do { - jam(); - MEMCOPY_NO_WORDS(&signal->theData[3], src, 22); - sendSignal(recBlockref, GSN_TRANSID_AI, signal, 25, JBB); - ToutBufIndex -= 22; - src += 22; - } while(ToutBufIndex >= 22); - } - - if (ToutBufIndex > 0){ - jam(); - MEMCOPY_NO_WORDS(&signal->theData[3], src, ToutBufIndex); - sendSignal(recBlockref, GSN_TRANSID_AI, signal, 3+ToutBufIndex, JBB); - } - return; - } - EXECUTE_DIRECT(block, GSN_TRANSID_AI, signal, 3 + ToutBufIndex); - jamEntry(); - return; - } - - /** - * If this node does not have a direct connection - * to the receiving node we want to send the signals - * routed via the node that controls this read - */ - Uint32 routeBlockref= req_struct->TC_ref; - - if (true){ // TODO is_api && !old_dest){ - jam(); - transIdAI->attrData[0]= recBlockref; - LinearSectionPtr ptr[3]; - ptr[0].p= &signal->theData[25]; - ptr[0].sz= ToutBufIndex; - sendSignal(routeBlockref, GSN_TRANSID_AI_R, signal, 4, JBB, ptr, 1); - return; - } - - /** - * Fill in a TRANSID_AI signal, use last word to store - * final destination and send it to route node - * as signal TRANSID_AI_R (R as in Routed) - */ - Uint32 tot= ToutBufIndex; - Uint32 sent= 0; - Uint32 maxLen= TransIdAI::DataLength - 1; - while (sent < tot) { - jam(); - Uint32 dataLen= (tot - sent > maxLen) ? maxLen : tot - sent; - Uint32 sigLen= dataLen + TransIdAI::HeaderLength + 1; - MEMCOPY_NO_WORDS(&transIdAI->attrData, - &signal->theData[25+sent], - dataLen); - // Set final destination in last word - transIdAI->attrData[dataLen]= recBlockref; - - sendSignal(routeBlockref, GSN_TRANSID_AI_R, - signal, sigLen, JBB); - sent += dataLen; - } -} |