diff options
Diffstat (limited to 'storage/ndb/src/kernel/vm/testLongSig/testLongSig.cpp')
-rw-r--r-- | storage/ndb/src/kernel/vm/testLongSig/testLongSig.cpp | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/storage/ndb/src/kernel/vm/testLongSig/testLongSig.cpp b/storage/ndb/src/kernel/vm/testLongSig/testLongSig.cpp new file mode 100644 index 00000000000..1d1fb8ebc82 --- /dev/null +++ b/storage/ndb/src/kernel/vm/testLongSig/testLongSig.cpp @@ -0,0 +1,333 @@ +/* Copyright (C) 2003 MySQL AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +#include <ndb_global.h> +#include <editline/editline.h> +#include <SignalSender.hpp> + +void +print_help(){ + ndbout << "The test menu" << endl; + ndbout << "1 - Sending of long signals w/ segmented sections" << endl; + ndbout << "2 - As 1 but using receiver group" << endl; + ndbout << "3 - Sending of long signals w/ linear sections" << endl; + ndbout << "4 - As 3 but using receiver group" << endl; + ndbout << "5 - Sending of manually fragmented signals w/ segmented sections" + << endl; + ndbout << "6 - As 5 but using receiver group" << endl; + ndbout << "7 - Sending of manually fragmented signals w/ linear sections" + << endl; + ndbout << "8 - As but using receiver group" << endl; + + ndbout << "9 - Sending of CONTINUEB fragmented signals w/ segmented sections" + << endl; + ndbout << "10 - As 9 but using receiver group" << endl; + ndbout << "11 - Sending of CONTINUEB fragmented signals w/ linear sections" + << endl; + ndbout << "12 - As but using receiver group" << endl; + ndbout << "13 - Send 100 * 1000 25 len signals wo/ sections" << endl; + ndbout << "r - Recive signal from anyone" << endl; + ndbout << "a - Run tests 1 - 12 with variable sizes - 10 loops" << endl; + ndbout << "b - Run tests 1 - 12 with variable sizes - 100 loops" << endl; + ndbout << "c - Run tests 1 - 12 with variable sizes - 1000k loops" << endl; +} + +void runTest(SignalSender &, Uint32 i, bool verbose); + +static +int +randRange(Uint32 min, Uint32 max){ + float r = rand(); + float f = (max - min + 1); + float d = (float)RAND_MAX + 1.0; + return min + (int)(f * r / d); +} + +static +int +randRange(const Uint32 odds[], Uint32 count){ + Uint32 val = randRange((Uint32)0, 100); + + Uint32 i = 0; + Uint32 sum = 0; + while(sum <= val && i < count){ + sum += odds[i]; + i++; + } + return i - 1; +} + +int +main(void){ + + srand(NdbTick_CurrentMillisecond()); +#if 0 + for(int i = 0; i<100; i++) + ndbout_c("randRange(0, 3) = %d", randRange(0, 3)); + return 0; +#endif + SignalSender ss; + + ndbout << "Connecting..."; + if(!ss.connect(30)){ + ndbout << "failed" << endl << "Exiting" << endl; + return 0; + } + ndbout << "done" << endl; + ndbout_c("Connected as block=%d node=%d", + refToBlock(ss.getOwnRef()), refToNode(ss.getOwnRef())); + + Uint32 data[25]; + Uint32 sec0[70]; + Uint32 sec1[123]; + Uint32 sec2[10]; + + data[0] = ss.getOwnRef(); + data[1] = 1; + data[2] = 76; + data[3] = 1; + data[4] = 1; + data[5] = 70; + data[6] = 123; + data[7] = 10; + const Uint32 theDataLen = 18; + + for(Uint32 i = 0; i<70; i++) + sec0[i] = i; + + for(Uint32 i = 0; i<123; i++) + sec1[i] = 70+i; + + for(Uint32 i = 0; i<10; i++) + sec2[i] = (i + 1)*(i + 1); + + SimpleSignal signal1; + signal1.set(ss, 0, CMVMI, GSN_TESTSIG, theDataLen + 2); + signal1.header.m_noOfSections = 1; + signal1.header.m_fragmentInfo = 1; + + memcpy(&signal1.theData[0], data, 4 * theDataLen ); + signal1.theData[theDataLen + 0] = 0; + signal1.theData[theDataLen + 1] = 7; // FragmentId + + signal1.ptr[0].sz = 60; + signal1.ptr[0].p = &sec0[0]; + + SimpleSignal signal2; + + Uint32 idx = 0; + memcpy(&signal2.theData[0], data, 4 * theDataLen ); + signal2.theData[theDataLen + idx] = 0; idx++; + signal2.theData[theDataLen + idx] = 1; idx++; + //signal2.theData[theDataLen + idx] = 2; idx++; + signal2.theData[theDataLen + idx] = 7; idx++; // FragmentId + + signal2.set(ss, 0, CMVMI, GSN_TESTSIG, theDataLen + idx); + signal2.header.m_fragmentInfo = 3; + signal2.header.m_noOfSections = idx - 1; + + signal2.ptr[0].sz = 10; + signal2.ptr[0].p = &sec0[60]; + + signal2.ptr[1].sz = 123; + signal2.ptr[1].p = &sec1[0]; + + signal2.ptr[2].sz = 10; + signal2.ptr[2].p = &sec2[0]; + + char * buf; + while((buf = readline("Enter command: "))){ + add_history(buf); + data[1] = atoi(buf); + if(strcmp(buf, "r") == 0){ + SimpleSignal * ret1 = ss.waitFor(); + (* ret1).print(); + delete ret1; + continue; + } + if(strcmp(buf, "a") == 0){ + runTest(ss, 10, true); + print_help(); + continue; + } + if(strcmp(buf, "b") == 0){ + runTest(ss, 100, false); + print_help(); + continue; + } + if(strcmp(buf, "c") == 0){ + runTest(ss, 1000000, false); + print_help(); + continue; + } + + if(data[1] >= 1 && data[1] <= 12){ + Uint32 nodeId = ss.getAliveNode(); + ndbout_c("Sending 2 fragmented to node %d", nodeId); + ss.sendSignal(nodeId, &signal1); + ss.sendSignal(nodeId, &signal2); + + if(data[1] >= 5){ + continue; + } + ndbout_c("Waiting for signal from %d", nodeId); + + SimpleSignal * ret1 = ss.waitFor((Uint16)nodeId); + (* ret1).print(); + Uint32 count = ret1->theData[4] - 1; + delete ret1; + while(count > 0){ + ndbout << "Waiting for " << count << " signals... "; + SimpleSignal * ret1 = ss.waitFor(); + ndbout_c("received from node %d", + refToNode(ret1->header.theSendersBlockRef)); + (* ret1).print(); + delete ret1; + count--; + } + } else if (data[1] == 13) { + const Uint32 count = 3500; + const Uint32 loop = 1000; + + signal1.set(ss, 0, CMVMI, GSN_TESTSIG, 25); + signal1.header.m_fragmentInfo = 0; + signal1.header.m_noOfSections = 0; + signal1.theData[1] = 14; + signal1.theData[3] = 0; // Print + signal1.theData[8] = count; + signal1.theData[9] = loop; + Uint32 nodeId = ss.getAliveNode(); + ndbout_c("Sending 25 len signal to node %d", nodeId); + ss.sendSignal(nodeId, &signal1); + + Uint32 total; + { + SimpleSignal * ret1 = ss.waitFor((Uint16)nodeId); + ndbout_c("received from node %d", + refToNode(ret1->header.theSendersBlockRef)); + total = ret1->theData[10] - 1; + delete ret1; + } + + do { + ndbout << "Waiting for " << total << " signals... " << flush; + SimpleSignal * ret1 = ss.waitFor((Uint16)nodeId); + ndbout_c("received from node %d", + refToNode(ret1->header.theSendersBlockRef)); + delete ret1; + total --; + } while(total > 0); + } else { + print_help(); + } + } + ndbout << "Exiting" << endl; +}; + +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); + } + } + } +} |