📄 simulatedblock.cpp
字号:
lsout(ndbout_c("loop: %d secNo: %d secCount: %d sz: %d", loop, secNo, secCount, sz)); /** * Store fragment id */ secNos[secCount] = info.m_fragmentId; Uint32 fragInfo = info.m_fragInfo; info.m_fragInfo = 2; switch(loop){ case Unknown: if(secNo >= 0){ lsout(ndbout_c("Unknown - Full")); /** * Not finished */ break; } // Fall through lsout(ndbout_c("Unknown - Done")); info.m_status = FragmentSendInfo::SendComplete; ndbassert(fragInfo == 2); fragInfo = 3; case Full: break; } signal->header.m_noOfSections = 0; signal->header.m_fragmentInfo = fragInfo; sendSignal(info.m_nodeReceiverGroup, info.m_gsn, signal, sigLen + secCount + 1, (JobBufferLevel)info.m_prio, signalPtr, secCount); if(fragInfo == 3){ /** * This is the last signal */ g_sectionSegmentPool.release(info.m_theDataSection.p[sigLen]); }}voidSimulatedBlock::sendFragmentedSignal(BlockReference ref, GlobalSignalNumber gsn, Signal* signal, Uint32 length, JobBufferLevel jbuf, Callback & c, Uint32 messageSize){ bool res = true; Ptr<FragmentSendInfo> ptr; res = c_segmentedFragmentSendList.seize(ptr); ndbrequire(res); res = sendFirstFragment(* ptr.p, NodeReceiverGroup(ref), gsn, signal, length, jbuf, messageSize); ndbrequire(res); if(ptr.p->m_status == FragmentSendInfo::SendComplete){ c_segmentedFragmentSendList.release(ptr); if(c.m_callbackFunction != 0) execute(signal, c, 0); return; } ptr.p->m_callback = c; if(!c_fragSenderRunning){ c_fragSenderRunning = true; ContinueFragmented * sig = (ContinueFragmented*)signal->getDataPtrSend(); sig->line = __LINE__; sendSignal(reference(), GSN_CONTINUE_FRAGMENTED, signal, 1, JBB); }}voidSimulatedBlock::sendFragmentedSignal(NodeReceiverGroup rg, GlobalSignalNumber gsn, Signal* signal, Uint32 length, JobBufferLevel jbuf, Callback & c, Uint32 messageSize){ bool res = true; Ptr<FragmentSendInfo> ptr; res = c_segmentedFragmentSendList.seize(ptr); ndbrequire(res); res = sendFirstFragment(* ptr.p, rg, gsn, signal, length, jbuf, messageSize); ndbrequire(res); if(ptr.p->m_status == FragmentSendInfo::SendComplete){ c_segmentedFragmentSendList.release(ptr); if(c.m_callbackFunction != 0) execute(signal, c, 0); return; } ptr.p->m_callback = c; if(!c_fragSenderRunning){ c_fragSenderRunning = true; ContinueFragmented * sig = (ContinueFragmented*)signal->getDataPtrSend(); sig->line = __LINE__; sendSignal(reference(), GSN_CONTINUE_FRAGMENTED, signal, 1, JBB); }}SimulatedBlock::Callback SimulatedBlock::TheEmptyCallback = {0, 0};voidSimulatedBlock::sendFragmentedSignal(BlockReference ref, GlobalSignalNumber gsn, Signal* signal, Uint32 length, JobBufferLevel jbuf, LinearSectionPtr ptr[3], Uint32 noOfSections, Callback & c, Uint32 messageSize){ bool res = true; Ptr<FragmentSendInfo> tmp; res = c_linearFragmentSendList.seize(tmp); ndbrequire(res); res = sendFirstFragment(* tmp.p, NodeReceiverGroup(ref), gsn, signal, length, jbuf, ptr, noOfSections, messageSize); ndbrequire(res); if(tmp.p->m_status == FragmentSendInfo::SendComplete){ c_linearFragmentSendList.release(tmp); if(c.m_callbackFunction != 0) execute(signal, c, 0); return; } tmp.p->m_callback = c; if(!c_fragSenderRunning){ c_fragSenderRunning = true; ContinueFragmented * sig = (ContinueFragmented*)signal->getDataPtrSend(); sig->line = __LINE__; sendSignal(reference(), GSN_CONTINUE_FRAGMENTED, signal, 1, JBB); }}voidSimulatedBlock::sendFragmentedSignal(NodeReceiverGroup rg, GlobalSignalNumber gsn, Signal* signal, Uint32 length, JobBufferLevel jbuf, LinearSectionPtr ptr[3], Uint32 noOfSections, Callback & c, Uint32 messageSize){ bool res = true; Ptr<FragmentSendInfo> tmp; res = c_linearFragmentSendList.seize(tmp); ndbrequire(res); res = sendFirstFragment(* tmp.p, rg, gsn, signal, length, jbuf, ptr, noOfSections, messageSize); ndbrequire(res); if(tmp.p->m_status == FragmentSendInfo::SendComplete){ c_linearFragmentSendList.release(tmp); if(c.m_callbackFunction != 0) execute(signal, c, 0); return; } tmp.p->m_callback = c; if(!c_fragSenderRunning){ c_fragSenderRunning = true; ContinueFragmented * sig = (ContinueFragmented*)signal->getDataPtrSend(); sig->line = __LINE__; sendSignal(reference(), GSN_CONTINUE_FRAGMENTED, signal, 1, JBB); }}NodeInfo &SimulatedBlock::setNodeInfo(NodeId nodeId) { ndbrequire(nodeId > 0 && nodeId < MAX_NODES); return globalData.m_nodeInfo[nodeId];}void SimulatedBlock::execUTIL_CREATE_LOCK_REF(Signal* signal){ ljamEntry(); c_mutexMgr.execUTIL_CREATE_LOCK_REF(signal);}void SimulatedBlock::execUTIL_CREATE_LOCK_CONF(Signal* signal){ ljamEntry(); c_mutexMgr.execUTIL_CREATE_LOCK_CONF(signal);}void SimulatedBlock::execUTIL_DESTORY_LOCK_REF(Signal* signal){ ljamEntry(); c_mutexMgr.execUTIL_DESTORY_LOCK_REF(signal);}void SimulatedBlock::execUTIL_DESTORY_LOCK_CONF(Signal* signal){ ljamEntry(); c_mutexMgr.execUTIL_DESTORY_LOCK_CONF(signal);}void SimulatedBlock::execUTIL_LOCK_REF(Signal* signal){ ljamEntry(); c_mutexMgr.execUTIL_LOCK_REF(signal);}void SimulatedBlock::execUTIL_LOCK_CONF(Signal* signal){ ljamEntry(); c_mutexMgr.execUTIL_LOCK_CONF(signal);}void SimulatedBlock::execUTIL_UNLOCK_REF(Signal* signal){ ljamEntry(); c_mutexMgr.execUTIL_UNLOCK_REF(signal);}void SimulatedBlock::execUTIL_UNLOCK_CONF(Signal* signal){ ljamEntry(); c_mutexMgr.execUTIL_UNLOCK_CONF(signal);}voidSimulatedBlock::ignoreMutexUnlockCallback(Signal* signal, Uint32 ptrI, Uint32 retVal){ c_mutexMgr.release(ptrI);}void UpgradeStartup::installEXEC(SimulatedBlock* block){ SimulatedBlock::ExecFunction * a = block->theExecArray; switch(block->number()){ case QMGR: a[UpgradeStartup::GSN_CM_APPCHG] = &SimulatedBlock::execUPGRADE; break; case CNTR: a[UpgradeStartup::GSN_CNTR_MASTERREF] = &SimulatedBlock::execUPGRADE; a[UpgradeStartup::GSN_CNTR_MASTERCONF] = &SimulatedBlock::execUPGRADE; break; }}voidSimulatedBlock::execUPGRADE(Signal* signal){ Uint32 gsn = signal->header.theVerId_signalNumber; switch(gsn){ case UpgradeStartup::GSN_CM_APPCHG: UpgradeStartup::execCM_APPCHG(* this, signal); break; case UpgradeStartup::GSN_CNTR_MASTERREF: UpgradeStartup::execCNTR_MASTER_REPLY(* this, signal); break; case UpgradeStartup::GSN_CNTR_MASTERCONF: UpgradeStartup::execCNTR_MASTER_REPLY(* this, signal); break; }}voidSimulatedBlock::fsRefError(Signal* signal, Uint32 line, const char *msg) { const FsRef *fsRef = (FsRef*)signal->getDataPtr(); Uint32 errorCode = fsRef->errorCode; Uint32 osErrorCode = fsRef->osErrorCode; char msg2[100]; sprintf(msg2, "%s: %s. OS errno: %u", getBlockName(number()), msg, osErrorCode); progError(line, errorCode, msg2);}voidSimulatedBlock::execFSWRITEREF(Signal* signal) { fsRefError(signal, __LINE__, "File system write failed");}voidSimulatedBlock::execFSREADREF(Signal* signal) { fsRefError(signal, __LINE__, "File system read failed");}voidSimulatedBlock::execFSCLOSEREF(Signal* signal) { fsRefError(signal, __LINE__, "File system close failed");}voidSimulatedBlock::execFSOPENREF(Signal* signal) { fsRefError(signal, __LINE__, "File system open failed");}voidSimulatedBlock::execFSREMOVEREF(Signal* signal) { fsRefError(signal, __LINE__, "File system remove failed");}voidSimulatedBlock::execFSSYNCREF(Signal* signal) { fsRefError(signal, __LINE__, "File system sync failed");}voidSimulatedBlock::execFSAPPENDREF(Signal* signal) { fsRefError(signal, __LINE__, "File system append failed");}#ifdef VM_TRACEvoidSimulatedBlock::clear_global_variables(){ Ptr<void> ** tmp = m_global_variables; while(* tmp != 0){ (* tmp)->i = RNIL; (* tmp)->p = 0; tmp++; }}voidSimulatedBlock::init_globals_list(void ** tmp, size_t cnt){ m_global_variables = new Ptr<void> * [cnt+1]; for(size_t i = 0; i<cnt; i++){ m_global_variables[i] = (Ptr<void>*)tmp[i]; } m_global_variables[cnt] = 0;}#endif#include "KeyDescriptor.hpp"Uint32SimulatedBlock::xfrm_key(Uint32 tab, const Uint32* src, Uint32 *dst, Uint32 dstSize, Uint32 keyPartLen[MAX_ATTRIBUTES_IN_INDEX]) const{ const KeyDescriptor * desc = g_key_descriptor_pool.getPtr(tab); const Uint32 noOfKeyAttr = desc->noOfKeyAttr; Uint32 i = 0; Uint32 srcPos = 0; Uint32 dstPos = 0; while (i < noOfKeyAttr) { const KeyDescriptor::KeyAttr& keyAttr = desc->keyAttr[i]; Uint32 dstWords = xfrm_attr(keyAttr.attributeDescriptor, keyAttr.charsetInfo, src, srcPos, dst, dstPos, dstSize); keyPartLen[i++] = dstWords; if (unlikely(dstWords == 0)) return 0; } return dstPos;}Uint32SimulatedBlock::xfrm_attr(Uint32 attrDesc, CHARSET_INFO* cs, const Uint32* src, Uint32 & srcPos, Uint32* dst, Uint32 & dstPos, Uint32 dstSize) const{ Uint32 srcBytes = AttributeDescriptor::getSizeInBytes(attrDesc); Uint32 srcWords = (srcBytes + 3) / 4; Uint32 dstWords = ~0; uchar* dstPtr = (uchar*)&dst[dstPos]; const uchar* srcPtr = (const uchar*)&src[srcPos]; if (cs == NULL) { jam(); memcpy(dstPtr, srcPtr, srcWords << 2); dstWords = srcWords; } else { jam(); Uint32 typeId = AttributeDescriptor::getType(attrDesc); Uint32 lb, len; bool ok = NdbSqlUtil::get_var_length(typeId, srcPtr, srcBytes, lb, len); if (unlikely(!ok)) return 0; Uint32 xmul = cs->strxfrm_multiply; if (xmul == 0) xmul = 1; /* * Varchar end-spaces are ignored in comparisons. To get same hash * we blank-pad to maximum length via strnxfrm. */ Uint32 dstLen = xmul * (srcBytes - lb); ndbrequire(dstLen <= ((dstSize - dstPos) << 2)); int n = NdbSqlUtil::strnxfrm_bug7284(cs, dstPtr, dstLen, srcPtr + lb, len); if (unlikely(n == -1)) return 0; while ((n & 3) != 0) { dstPtr[n++] = 0; } dstWords = (n >> 2); } dstPos += dstWords; srcPos += srcWords; return dstWords;}Uint32SimulatedBlock::create_distr_key(Uint32 tableId, Uint32 *data, const Uint32 keyPartLen[MAX_ATTRIBUTES_IN_INDEX]) const { const KeyDescriptor* desc = g_key_descriptor_pool.getPtr(tableId); const Uint32 noOfKeyAttr = desc->noOfKeyAttr; Uint32 noOfDistrKeys = desc->noOfDistrKeys; Uint32 *src = data; Uint32 *dst = data; Uint32 i = 0; Uint32 dstPos = 0; if(keyPartLen) { while (i < noOfKeyAttr && noOfDistrKeys) { Uint32 attr = desc->keyAttr[i].attributeDescriptor; Uint32 len = keyPartLen[i]; if(AttributeDescriptor::getDKey(attr)) { noOfDistrKeys--; memmove(dst+dstPos, src, len << 2); dstPos += len; } src += len; i++; } } else { while (i < noOfKeyAttr && noOfDistrKeys) { Uint32 attr = desc->keyAttr[i].attributeDescriptor; Uint32 len = AttributeDescriptor::getSizeInWords(attr); if(AttributeDescriptor::getDKey(attr)) { noOfDistrKeys--; memmove(dst+dstPos, src, len << 2); dstPos += len; } src += len; i++; } } return dstPos;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -