int NdbInfoScanOperation::sendDBINFO_SCANREQ(void) { DBUG_ENTER("NdbInfoScanOperation::sendDBINFO_SCANREQ"); SimpleSignal ss; DbinfoScanReq * req = CAST_PTR(DbinfoScanReq, ss.getDataPtrSend()); // API Identifiers req->resultData = m_result_data; req->transId[0] = m_transid0; req->transId[1] = m_transid1; req->resultRef = m_result_ref; // Scan parameters req->tableId = m_table->getTableId(); req->colBitmap[0] = ~0; req->colBitmap[1] = ~0; req->requestInfo = 0; req->maxRows = m_max_rows; req->maxBytes = m_max_bytes; DBUG_PRINT("info", ("max rows: %d, max bytes: %d", m_max_rows, m_max_bytes)); // Scan result req->returnedRows = 0; // Cursor data Uint32* cursor_ptr = DbinfoScan::getCursorPtrSend(req); for (unsigned i = 0; i < m_cursor.size(); i++) { *cursor_ptr = m_cursor[i]; DBUG_PRINT("info", ("cursor[%u]: 0x%x", i, m_cursor[i])); cursor_ptr++; } req->cursor_sz = m_cursor.size(); m_cursor.clear(); assert((m_rows_received == 0 && m_rows_confirmed == (Uint32)~0) || // first m_rows_received == m_rows_confirmed); // subsequent // No rows recieved in this batch yet m_rows_received = 0; // Number of rows returned by batch is not yet known m_rows_confirmed = ~0; assert(m_node_id); Uint32 len = DbinfoScanReq::SignalLength + req->cursor_sz; if (m_signal_sender->sendSignal(m_node_id, ss, DBINFO, GSN_DBINFO_SCANREQ, len) != SEND_OK) { m_state = Error; DBUG_RETURN(NdbInfo::ERR_ClusterFailure); } DBUG_RETURN(0); }
SendStatus SignalSender::sendSignal(Uint16 nodeId, SimpleSignal& sig, Uint16 recBlock, Uint16 gsn, Uint32 len) { sig.set(*this, TestOrd::TraceAPI, recBlock, gsn, len); return sendSignal(nodeId, &sig); }
NodeBitmask SignalSender::broadcastSignal(NodeBitmask mask, SimpleSignal& sig, Uint16 recBlock, Uint16 gsn, Uint32 len) { sig.set(*this, TestOrd::TraceAPI, recBlock, gsn, len); NodeBitmask result; for(Uint32 i = 0; i < MAX_NODES; i++) { if(mask.get(i) && sendSignal(i, &sig) == SEND_OK) result.set(i); } return result; }
int SignalSender::sendFragmentedSignal(Uint16 nodeId, SimpleSignal& sig, Uint16 recBlock, Uint16 gsn, Uint32 len) { sig.set(*this, TestOrd::TraceAPI, recBlock, gsn, len); int ret = raw_sendFragmentedSignal(&sig.header, nodeId, &sig.ptr[0], sig.header.m_noOfSections); if (ret == 0) { do_forceSend(); return SEND_OK; } return SEND_DISCONNECTED; }
void runTest(SignalSender & ss, Uint32 count, bool verbose){ SimpleSignal sig; Uint32 sec0[256]; Uint32 sec1[256]; Uint32 sec2[256]; for(Uint32 i = 0; i<256; i++){ sec0[i] = i; sec1[i] = i + i; sec2[i] = i * i; } sig.theData[0] = ss.getOwnRef(); sig.theData[1] = 1; // TestType sig.theData[2] = 128; // FragSize sig.theData[3] = 0; // Print sig.theData[4] = 1; // RetCount sig.ptr[0].p = &sec0[0]; sig.ptr[1].p = &sec1[0]; sig.ptr[2].p = &sec2[0]; for(unsigned loop = 0; loop < count; loop++){ const Uint32 odds[] = { 5, 40, 30, 25 }; const Uint32 secs = randRange(odds, 4); sig.ptr[0].sz = randRange(1, 256); sig.ptr[1].sz = randRange(1, 256); sig.ptr[2].sz = randRange(1, 256); sig.header.m_noOfSections = secs; const Uint32 len = 5 + (secs > 0 ? 1 : 0) * (25 - 5 - 7); sig.set(ss, 0, CMVMI, GSN_TESTSIG, len); ndbout << "Loop " << loop << " #secs = " << secs << " sizes = [ "; unsigned min = 256; unsigned max = 0; unsigned sum = 0; for(unsigned i = 0; i<secs; i++){ const Uint32 sz = sig.ptr[i].sz; ndbout << sz << " "; min = (min < sz ? min : sz); max = (max > sz ? max : sz); sum += sz; sig.theData[5+i] = sz; } ndbout_c("] len = %d", len); for(int test = 1; test <= 12; test++){ sig.theData[1] = test; Uint32 nodeId = ss.getAliveNode(); if(verbose){ ndbout << " Test " << test << " node " << nodeId << "..."; fflush(stdout); } SendStatus r = ss.sendSignal(nodeId, &sig); assert(r == SEND_OK); if(test < 5){ SimpleSignal * ret1 = ss.waitFor((Uint16)nodeId); Uint32 count = ret1->theData[4] - 1; delete ret1; while(count > 0){ SimpleSignal * ret1 = ss.waitFor(); delete ret1; count--; } if(verbose) ndbout << "done" << endl; } else { Uint32 nodes = ss.getNoOfConnectedNodes(); Uint32 sum2 = 0; if((test & 1) == 1) nodes = 1; while(nodes > 0){ SimpleSignal * ret = ss.waitFor(); if(ret->header.m_fragmentInfo == 0){ for(Uint32 i = 0; i<ret->header.m_noOfSections; i++) sum2 += ret->ptr[i].sz; } else { for(Uint32 i = 0; i<ret->header.m_noOfSections; i++) if(ret->theData[i] != 3) sum2 += ret->ptr[i].sz; } if(ret->header.m_fragmentInfo == 0 || ret->header.m_fragmentInfo == 3){ nodes--; } delete ret; } if(verbose) ndbout_c("done sum=%d sum2=%d", sum, sum2); } } } }