summaryrefslogtreecommitdiff
path: root/storage/ndb/test/ndbapi/test_event.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/test/ndbapi/test_event.cpp')
-rw-r--r--storage/ndb/test/ndbapi/test_event.cpp2051
1 files changed, 0 insertions, 2051 deletions
diff --git a/storage/ndb/test/ndbapi/test_event.cpp b/storage/ndb/test/ndbapi/test_event.cpp
deleted file mode 100644
index e435c59e457..00000000000
--- a/storage/ndb/test/ndbapi/test_event.cpp
+++ /dev/null
@@ -1,2051 +0,0 @@
-/* Copyright (c) 2003-2008 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 */
-
-#include <NDBT_Test.hpp>
-#include <NDBT_ReturnCodes.h>
-#include <HugoTransactions.hpp>
-#include <UtilTransactions.hpp>
-#include <TestNdbEventOperation.hpp>
-#include <NdbAutoPtr.hpp>
-#include <NdbRestarter.hpp>
-#include <NdbRestarts.hpp>
-#include <signaldata/DumpStateOrd.hpp>
-
-#define GETNDB(ps) ((NDBT_NdbApiStep*)ps)->getNdb()
-
-static int createEvent(Ndb *pNdb, const NdbDictionary::Table &tab,
- bool merge_events = false)
-{
- char eventName[1024];
- sprintf(eventName,"%s_EVENT",tab.getName());
-
- NdbDictionary::Dictionary *myDict = pNdb->getDictionary();
-
- if (!myDict) {
- g_err << "Dictionary not found "
- << pNdb->getNdbError().code << " "
- << pNdb->getNdbError().message << endl;
- return NDBT_FAILED;
- }
-
- NdbDictionary::Event myEvent(eventName);
- myEvent.setTable(tab.getName());
- myEvent.addTableEvent(NdbDictionary::Event::TE_ALL);
- for(int a = 0; a < tab.getNoOfColumns(); a++){
- myEvent.addEventColumn(a);
- }
- myEvent.mergeEvents(merge_events);
-
- int res = myDict->createEvent(myEvent); // Add event to database
-
- if (res == 0)
- myEvent.print();
- else if (myDict->getNdbError().classification ==
- NdbError::SchemaObjectExists)
- {
- g_info << "Event creation failed event exists\n";
- res = myDict->dropEvent(eventName);
- if (res) {
- g_err << "Failed to drop event: "
- << myDict->getNdbError().code << " : "
- << myDict->getNdbError().message << endl;
- return NDBT_FAILED;
- }
- // try again
- res = myDict->createEvent(myEvent); // Add event to database
- if (res) {
- g_err << "Failed to create event (1): "
- << myDict->getNdbError().code << " : "
- << myDict->getNdbError().message << endl;
- return NDBT_FAILED;
- }
- }
- else
- {
- g_err << "Failed to create event (2): "
- << myDict->getNdbError().code << " : "
- << myDict->getNdbError().message << endl;
- return NDBT_FAILED;
- }
-
- return NDBT_OK;
-}
-
-static int dropEvent(Ndb *pNdb, const NdbDictionary::Table &tab)
-{
- char eventName[1024];
- sprintf(eventName,"%s_EVENT",tab.getName());
- NdbDictionary::Dictionary *myDict = pNdb->getDictionary();
- if (!myDict) {
- g_err << "Dictionary not found "
- << pNdb->getNdbError().code << " "
- << pNdb->getNdbError().message << endl;
- return NDBT_FAILED;
- }
- if (myDict->dropEvent(eventName)) {
- g_err << "Failed to drop event: "
- << myDict->getNdbError().code << " : "
- << myDict->getNdbError().message << endl;
- return NDBT_FAILED;
- }
- return NDBT_OK;
-}
-
-static
-NdbEventOperation *createEventOperation(Ndb *ndb,
- const NdbDictionary::Table &tab,
- int do_report_error = 1)
-{
- char buf[1024];
- sprintf(buf, "%s_EVENT", tab.getName());
- NdbEventOperation *pOp= ndb->createEventOperation(buf);
- if (pOp == 0)
- {
- if (do_report_error)
- g_err << "createEventOperation: "
- << ndb->getNdbError().code << " "
- << ndb->getNdbError().message << endl;
- return 0;
- }
- int n_columns= tab.getNoOfColumns();
- for (int j = 0; j < n_columns; j++)
- {
- pOp->getValue(tab.getColumn(j)->getName());
- pOp->getPreValue(tab.getColumn(j)->getName());
- }
- if ( pOp->execute() )
- {
- if (do_report_error)
- g_err << "pOp->execute(): "
- << pOp->getNdbError().code << " "
- << pOp->getNdbError().message << endl;
- ndb->dropEventOperation(pOp);
- return 0;
- }
- return pOp;
-}
-
-static int runCreateEvent(NDBT_Context* ctx, NDBT_Step* step)
-{
- bool merge_events = ctx->getProperty("MergeEvents");
- if (createEvent(GETNDB(step),* ctx->getTab(), merge_events) != 0){
- return NDBT_FAILED;
- }
- return NDBT_OK;
-}
-
-struct receivedEvent {
- Uint32 pk;
- Uint32 count;
- Uint32 event;
-};
-
-static int
-eventOperation(Ndb* pNdb, const NdbDictionary::Table &tab, void* pstats, int records)
-{
- int i;
- const char function[] = "HugoTransactions::eventOperation: ";
- struct receivedEvent* recInsertEvent;
- NdbAutoObjArrayPtr<struct receivedEvent>
- p00( recInsertEvent = new struct receivedEvent[3*records] );
- struct receivedEvent* recUpdateEvent = &recInsertEvent[records];
- struct receivedEvent* recDeleteEvent = &recInsertEvent[2*records];
-
- EventOperationStats &stats = *(EventOperationStats*)pstats;
-
- stats.n_inserts = 0;
- stats.n_deletes = 0;
- stats.n_updates = 0;
- stats.n_consecutive = 0;
- stats.n_duplicates = 0;
- stats.n_inconsistent_gcis = 0;
-
- for (i = 0; i < records; i++) {
- recInsertEvent[i].pk = 0xFFFFFFFF;
- recInsertEvent[i].count = 0;
- recInsertEvent[i].event = 0xFFFFFFFF;
-
- recUpdateEvent[i].pk = 0xFFFFFFFF;
- recUpdateEvent[i].count = 0;
- recUpdateEvent[i].event = 0xFFFFFFFF;
-
- recDeleteEvent[i].pk = 0xFFFFFFFF;
- recDeleteEvent[i].count = 0;
- recDeleteEvent[i].event = 0xFFFFFFFF;
- }
-
- NdbDictionary::Dictionary *myDict = pNdb->getDictionary();
-
- if (!myDict) {
- g_err << function << "Event Creation failedDictionary not found\n";
- return NDBT_FAILED;
- }
-
- int r = 0;
- NdbEventOperation *pOp;
-
- char eventName[1024];
- sprintf(eventName,"%s_EVENT",tab.getName());
- Uint32 noEventColumnName = tab.getNoOfColumns();
-
- g_info << function << "create EventOperation\n";
- pOp = pNdb->createEventOperation(eventName);
- if ( pOp == NULL ) {
- g_err << function << "Event operation creation failed\n";
- return NDBT_FAILED;
- }
-
- g_info << function << "get values\n";
- NdbRecAttr* recAttr[1024];
- NdbRecAttr* recAttrPre[1024];
-
- const NdbDictionary::Table *_table = myDict->getTable(tab.getName());
-
- for (int a = 0; a < noEventColumnName; a++) {
- recAttr[a] = pOp->getValue(_table->getColumn(a)->getName());
- recAttrPre[a] = pOp->getPreValue(_table->getColumn(a)->getName());
- }
-
- // set up the callbacks
- g_info << function << "execute\n";
- if (pOp->execute()) { // This starts changes to "start flowing"
- g_err << function << "operation execution failed: \n";
- g_err << pOp->getNdbError().code << " "
- << pOp->getNdbError().message << endl;
- return NDBT_FAILED;
- }
-
- g_info << function << "ok\n";
-
- int count = 0;
- Uint32 last_inconsitant_gci = 0xEFFFFFF0;
-
- while (r < records){
- //printf("now waiting for event...\n");
- int res = pNdb->pollEvents(1000); // wait for event or 1000 ms
-
- if (res > 0) {
- //printf("got data! %d\n", r);
- NdbEventOperation *tmp;
- while ((tmp= pNdb->nextEvent()))
- {
- assert(tmp == pOp);
- r++;
- count++;
-
- Uint32 gci = pOp->getGCI();
- Uint32 pk = recAttr[0]->u_32_value();
-
- if (!pOp->isConsistent()) {
- if (last_inconsitant_gci != gci) {
- last_inconsitant_gci = gci;
- stats.n_inconsistent_gcis++;
- }
- g_warning << "A node failure has occured and events might be missing\n";
- }
- g_info << function << "GCI " << gci << ": " << count;
- struct receivedEvent* recEvent;
- switch (pOp->getEventType()) {
- case NdbDictionary::Event::TE_INSERT:
- stats.n_inserts++;
- g_info << " INSERT: ";
- recEvent = recInsertEvent;
- break;
- case NdbDictionary::Event::TE_DELETE:
- stats.n_deletes++;
- g_info << " DELETE: ";
- recEvent = recDeleteEvent;
- break;
- case NdbDictionary::Event::TE_UPDATE:
- stats.n_updates++;
- g_info << " UPDATE: ";
- recEvent = recUpdateEvent;
- break;
- default:
- case NdbDictionary::Event::TE_ALL:
- abort();
- }
-
- if ((int)pk < records) {
- recEvent[pk].pk = pk;
- recEvent[pk].count++;
- }
-
- for (i = 1; i < noEventColumnName; i++) {
- if (recAttr[i]->isNULL() >= 0) { // we have a value
- g_info << " post[" << i << "]=";
- if (recAttr[i]->isNULL() == 0) // we have a non-null value
- g_info << recAttr[i]->u_32_value();
- else // we have a null value
- g_info << "NULL";
- }
- if (recAttrPre[i]->isNULL() >= 0) { // we have a value
- g_info << " pre[" << i << "]=";
- if (recAttrPre[i]->isNULL() == 0) // we have a non-null value
- g_info << recAttrPre[i]->u_32_value();
- else // we have a null value
- g_info << "NULL";
- }
- }
- g_info << endl;
- }
- } else
- ;//printf("timed out\n");
- }
-
- g_info << "dropping event operation" << endl;
-
- int res = pNdb->dropEventOperation(pOp);
- if (res != 0) {
- g_err << "operation execution failed\n";
- return NDBT_FAILED;
- }
-
- g_info << " ok" << endl;
-
- if (stats.n_inserts > 0) {
- stats.n_consecutive++;
- }
- if (stats.n_deletes > 0) {
- stats.n_consecutive++;
- }
- if (stats.n_updates > 0) {
- stats.n_consecutive++;
- }
- for (i = 0; i < (Uint32)records/3; i++) {
- if (recInsertEvent[i].pk != i) {
- stats.n_consecutive ++;
- ndbout << "missing insert pk " << i << endl;
- } else if (recInsertEvent[i].count > 1) {
- ndbout << "duplicates insert pk " << i
- << " count " << recInsertEvent[i].count << endl;
- stats.n_duplicates += recInsertEvent[i].count-1;
- }
- if (recUpdateEvent[i].pk != i) {
- stats.n_consecutive ++;
- ndbout << "missing update pk " << i << endl;
- } else if (recUpdateEvent[i].count > 1) {
- ndbout << "duplicates update pk " << i
- << " count " << recUpdateEvent[i].count << endl;
- stats.n_duplicates += recUpdateEvent[i].count-1;
- }
- if (recDeleteEvent[i].pk != i) {
- stats.n_consecutive ++;
- ndbout << "missing delete pk " << i << endl;
- } else if (recDeleteEvent[i].count > 1) {
- ndbout << "duplicates delete pk " << i
- << " count " << recDeleteEvent[i].count << endl;
- stats.n_duplicates += recDeleteEvent[i].count-1;
- }
- }
-
- return NDBT_OK;
-}
-
-int runCreateShadowTable(NDBT_Context* ctx, NDBT_Step* step)
-{
- const NdbDictionary::Table *table= ctx->getTab();
- char buf[1024];
- sprintf(buf, "%s_SHADOW", table->getName());
-
- GETNDB(step)->getDictionary()->dropTable(buf);
- if (GETNDB(step)->getDictionary()->getTable(buf))
- {
- g_err << "unsucessful drop of " << buf << endl;
- return NDBT_FAILED;
- }
-
- NdbDictionary::Table table_shadow(*table);
- table_shadow.setName(buf);
- // TODO should be removed
- // This should work wo/ next line
- //table_shadow.setNodeGroupIds(0, 0);
- GETNDB(step)->getDictionary()->createTable(table_shadow);
- if (GETNDB(step)->getDictionary()->getTable(buf))
- return NDBT_OK;
-
- g_err << "unsucessful create of " << buf << endl;
- return NDBT_FAILED;
-}
-
-int runDropShadowTable(NDBT_Context* ctx, NDBT_Step* step)
-{
- const NdbDictionary::Table *table= ctx->getTab();
- char buf[1024];
- sprintf(buf, "%s_SHADOW", table->getName());
-
- GETNDB(step)->getDictionary()->dropTable(buf);
- return NDBT_OK;
-}
-
-int runCreateDropEventOperation(NDBT_Context* ctx, NDBT_Step* step)
-{
- int loops = ctx->getNumLoops();
- //int records = ctx->getNumRecords();
- HugoTransactions hugoTrans(*ctx->getTab());
- EventOperationStats stats;
-
- //Ndb *pNdb=GETNDB(step);
- const NdbDictionary::Table& tab= *ctx->getTab();
- //NdbEventOperation *pOp;
- char eventName[1024];
- sprintf(eventName,"%s_EVENT",tab.getName());
- //int noEventColumnName = tab.getNoOfColumns();
-
- for (int i= 0; i < loops; i++)
- {
-#if 1
- if (eventOperation(GETNDB(step), tab, (void*)&stats, 0) != 0){
- return NDBT_FAILED;
- }
-#else
- g_info << "create EventOperation\n";
- pOp = pNdb->createEventOperation(eventName);
- if ( pOp == NULL ) {
- g_err << "Event operation creation failed\n";
- return NDBT_FAILED;
- }
-
- g_info << "dropping event operation" << endl;
- int res = pNdb->dropEventOperation(pOp);
- if (res != 0) {
- g_err << "operation execution failed\n";
- return NDBT_FAILED;
- }
-#endif
- }
-
- return NDBT_OK;
-}
-
-int theThreadIdCounter = 0;
-
-int runEventOperation(NDBT_Context* ctx, NDBT_Step* step)
-{
- int tId = theThreadIdCounter++;
- //int loops = ctx->getNumLoops();
- int records = ctx->getNumRecords();
- HugoTransactions hugoTrans(*ctx->getTab());
-
- EventOperationStats stats;
-
- g_info << "***** start Id " << tId << endl;
-
- // sleep(tId);
-
- if (eventOperation(GETNDB(step), *ctx->getTab(), (void*)&stats, 3*records) != 0){
- return NDBT_FAILED;
- }
-
- int ret;
- if (stats.n_inserts == records &&
- stats.n_deletes == records &&
- stats.n_updates == records &&
- stats.n_consecutive == 3 &&
- stats.n_duplicates == 0)
- ret = NDBT_OK;
- else
- ret = NDBT_FAILED;
-
- if (ret == NDBT_FAILED) {
- g_info << "***** end Id " << tId << endl;
- ndbout_c("n_inserts = %d (%d)", stats.n_inserts, records);
- ndbout_c("n_deletes = %d (%d)", stats.n_deletes, records);
- ndbout_c("n_updates = %d (%d)", stats.n_updates, records);
- ndbout_c("n_consecutive = %d (%d)", stats.n_consecutive, 3);
- ndbout_c("n_duplicates = %d (%d)", stats.n_duplicates, 0);
- ndbout_c("n_inconsistent_gcis = %d (%d)", stats.n_inconsistent_gcis, 0);
- }
-
- return ret;
-}
-
-int runEventLoad(NDBT_Context* ctx, NDBT_Step* step)
-{
- int loops = ctx->getNumLoops();
- int records = ctx->getNumRecords();
- HugoTransactions hugoTrans(*ctx->getTab());
-
- sleep(1);
-#if 0
- sleep(5);
- sleep(theThreadIdCounter);
-#endif
- if (hugoTrans.loadTable(GETNDB(step), records, 1, true, loops) != 0){
- return NDBT_FAILED;
- }
- if (hugoTrans.pkUpdateRecords(GETNDB(step), records, 1, loops) != 0){
- return NDBT_FAILED;
- }
- if (hugoTrans.pkDelRecords(GETNDB(step), records, 1, true, loops) != 0){
- return NDBT_FAILED;
- }
- return NDBT_OK;
-}
-
-int runEventMixedLoad(NDBT_Context* ctx, NDBT_Step* step)
-{
- int loops = ctx->getNumLoops();
- int records = ctx->getNumRecords();
- HugoTransactions hugoTrans(*ctx->getTab());
-
- if(ctx->getPropertyWait("LastGCI", ~(Uint32)0))
- {
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
-
- while(loops -- && !ctx->isTestStopped())
- {
- hugoTrans.clearTable(GETNDB(step), 0);
-
- if (hugoTrans.loadTable(GETNDB(step), 3*records, 1, true, 1) != 0){
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
-
- if (hugoTrans.pkDelRecords(GETNDB(step), 3*records, 1, true, 1) != 0){
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
- if (hugoTrans.loadTable(GETNDB(step), records, 1, true, 1) != 0){
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
- if (hugoTrans.pkUpdateRecords(GETNDB(step), records, 1, 1) != 0){
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
- if (hugoTrans.pkUpdateRecords(GETNDB(step), records, 1, 1) != 0){
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
- if (hugoTrans.pkUpdateRecords(GETNDB(step), records, 1, 1) != 0){
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
-
- ctx->setProperty("LastGCI", hugoTrans.m_latest_gci);
- if(ctx->getPropertyWait("LastGCI", ~(Uint32)0))
- {
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
- }
- ctx->stopTest();
- return NDBT_OK;
-}
-
-int runDropEvent(NDBT_Context* ctx, NDBT_Step* step)
-{
- return NDBT_OK;
-}
-
-int runVerify(NDBT_Context* ctx, NDBT_Step* step)
-{
- const NdbDictionary::Table * table= ctx->getTab();
- char buf[1024];
-
- sprintf(buf, "%s_SHADOW", table->getName());
-
- HugoTransactions hugoTrans(*table);
- if (hugoTrans.compare(GETNDB(step), buf, 0))
- {
- return NDBT_FAILED;
- }
-
- return NDBT_OK;
-}
-
-int runEventApplier(NDBT_Context* ctx, NDBT_Step* step)
-{
- DBUG_ENTER("runEventApplier");
-
- int result = NDBT_OK;
- const NdbDictionary::Table * table= ctx->getTab();
- HugoTransactions hugoTrans(* table);
-
- char shadow[1024], buf[1024];
- sprintf(shadow, "%s_SHADOW", table->getName());
- const NdbDictionary::Table * table_shadow;
- if ((table_shadow = GETNDB(step)->getDictionary()->getTable(shadow)) == 0)
- {
- g_err << "Unable to get table " << shadow << endl;
- DBUG_RETURN(NDBT_FAILED);
- }
-
- sprintf(buf, "%s_EVENT", table->getName());
- NdbEventOperation *pOp, *pCreate = 0;
- pCreate = pOp = GETNDB(step)->createEventOperation(buf);
- if ( pOp == NULL ) {
- g_err << "Event operation creation failed on %s" << buf << endl;
- DBUG_RETURN(NDBT_FAILED);
- }
- bool merge_events = ctx->getProperty("MergeEvents");
- pOp->mergeEvents(merge_events);
-
- int i;
- int n_columns= table->getNoOfColumns();
- NdbRecAttr* recAttr[1024];
- NdbRecAttr* recAttrPre[1024];
- for (i = 0; i < n_columns; i++) {
- recAttr[i] = pOp->getValue(table->getColumn(i)->getName());
- recAttrPre[i] = pOp->getPreValue(table->getColumn(i)->getName());
- }
-
- if (pOp->execute()) { // This starts changes to "start flowing"
- g_err << "execute operation execution failed: \n";
- g_err << pOp->getNdbError().code << " "
- << pOp->getNdbError().message << endl;
- result = NDBT_FAILED;
- goto end;
- }
-
- ctx->setProperty("LastGCI", ~(Uint32)0);
- ctx->broadcast();
-
- while(!ctx->isTestStopped())
- {
- int count= 0;
- Uint32 stop_gci= ~0;
- Uint64 curr_gci = 0;
- Ndb* ndb= GETNDB(step);
-
- while(!ctx->isTestStopped() && curr_gci <= stop_gci)
- {
- ndb->pollEvents(100, &curr_gci);
- while ((pOp= ndb->nextEvent()) != 0)
- {
- assert(pOp == pCreate);
-
- if (pOp->getEventType() >=
- NdbDictionary::Event::TE_FIRST_NON_DATA_EVENT)
- continue;
-
- int noRetries= 0;
- do
- {
- NdbTransaction *trans= GETNDB(step)->startTransaction();
- if (trans == 0)
- {
- g_err << "startTransaction failed "
- << GETNDB(step)->getNdbError().code << " "
- << GETNDB(step)->getNdbError().message << endl;
- result = NDBT_FAILED;
- goto end;
-
- }
-
- NdbOperation *op= trans->getNdbOperation(table_shadow);
- if (op == 0)
- {
- g_err << "getNdbOperation failed "
- << trans->getNdbError().code << " "
- << trans->getNdbError().message << endl;
- result = NDBT_FAILED;
- goto end;
-
- }
-
- switch (pOp->getEventType()) {
- case NdbDictionary::Event::TE_INSERT:
- if (op->writeTuple())
- {
- g_err << "insertTuple "
- << op->getNdbError().code << " "
- << op->getNdbError().message << endl;
- result = NDBT_FAILED;
- goto end;
-
- }
- break;
- case NdbDictionary::Event::TE_DELETE:
- if (op->deleteTuple())
- {
- g_err << "deleteTuple "
- << op->getNdbError().code << " "
- << op->getNdbError().message << endl;
- result = NDBT_FAILED;
- goto end;
-
- }
- break;
- case NdbDictionary::Event::TE_UPDATE:
- if (op->writeTuple())
- {
- g_err << "updateTuple "
- << op->getNdbError().code << " "
- << op->getNdbError().message << endl;
- result = NDBT_FAILED;
- goto end;
-
- }
- break;
- default:
- abort();
- }
-
- for (i= 0; i < n_columns; i++)
- {
- if (recAttr[i]->isNULL())
- {
- if (table->getColumn(i)->getPrimaryKey())
- {
- g_err << "internal error: primary key isNull()="
- << recAttr[i]->isNULL() << endl;
- result = NDBT_FAILED;
- goto end;
-
- }
- switch (pOp->getEventType()) {
- case NdbDictionary::Event::TE_INSERT:
- if (recAttr[i]->isNULL() < 0)
- {
- g_err << "internal error: missing value for insert\n";
- result = NDBT_FAILED;
- goto end;
-
- }
- break;
- case NdbDictionary::Event::TE_DELETE:
- break;
- case NdbDictionary::Event::TE_UPDATE:
- break;
- default:
- abort();
- }
- }
- if (table->getColumn(i)->getPrimaryKey() &&
- op->equal(i,recAttr[i]->aRef()))
- {
- g_err << "equal " << i << " "
- << op->getNdbError().code << " "
- << op->getNdbError().message << endl;
- result = NDBT_FAILED;
- goto end;
-
- }
- }
-
- switch (pOp->getEventType()) {
- case NdbDictionary::Event::TE_INSERT:
- for (i= 0; i < n_columns; i++)
- {
- if (!table->getColumn(i)->getPrimaryKey() &&
- op->setValue(i,recAttr[i]->isNULL() ? 0:recAttr[i]->aRef()))
- {
- g_err << "setValue(insert) " << i << " "
- << op->getNdbError().code << " "
- << op->getNdbError().message << endl;
- result = NDBT_FAILED;
- goto end;
-
- }
- }
- break;
- case NdbDictionary::Event::TE_DELETE:
- break;
- case NdbDictionary::Event::TE_UPDATE:
- for (i= 0; i < n_columns; i++)
- {
- if (!table->getColumn(i)->getPrimaryKey() &&
- recAttr[i]->isNULL() >= 0 &&
- op->setValue(i,recAttr[i]->isNULL() ? 0:recAttr[i]->aRef()))
- {
- g_err << "setValue(update) " << i << " "
- << op->getNdbError().code << " "
- << op->getNdbError().message << endl;
- result = NDBT_FAILED;
- goto end;
-
- }
- }
- break;
- default:
- case NdbDictionary::Event::TE_ALL:
- abort();
- }
- if (trans->execute(Commit) == 0)
- {
- trans->close();
- count++;
- // everything ok
- break;
- }
-
- if (trans->getNdbError().status == NdbError::PermanentError)
- {
- g_err << "Ignoring execute failed "
- << trans->getNdbError().code << " "
- << trans->getNdbError().message << endl;
-
- trans->close();
- count++;
- break;
- }
- else if (noRetries++ == 10)
- {
- g_err << "execute failed "
- << trans->getNdbError().code << " "
- << trans->getNdbError().message << endl;
- trans->close();
- result = NDBT_FAILED;
- goto end;
-
- }
- trans->close();
- NdbSleep_MilliSleep(100); // sleep before retying
- } while(1);
- }
- stop_gci = ctx->getProperty("LastGCI", ~(Uint32)0);
- }
-
- ndbout_c("Applied gci: %d, %d events", stop_gci, count);
- if (hugoTrans.compare(GETNDB(step), shadow, 0))
- {
- g_err << "compare failed" << endl;
- result = NDBT_FAILED;
- goto end;
- }
- ctx->setProperty("LastGCI", ~(Uint32)0);
- ctx->broadcast();
- }
-
-end:
- if(pCreate)
- {
- if (GETNDB(step)->dropEventOperation(pCreate)) {
- g_err << "dropEventOperation execution failed "
- << GETNDB(step)->getNdbError().code << " "
- << GETNDB(step)->getNdbError().message << endl;
- result = NDBT_FAILED;
- }
- }
- ctx->stopTest();
- DBUG_RETURN(result);
-}
-
-int runEventListenerUntilStopped(NDBT_Context* ctx, NDBT_Step* step)
-{
-
- int result = NDBT_OK;
- const NdbDictionary::Table * table= ctx->getTab();
- HugoTransactions hugoTrans(* table);
- Ndb* ndb= GETNDB(step);
-
- char buf[1024];
- sprintf(buf, "%s_EVENT", table->getName());
- NdbEventOperation *pOp, *pCreate = 0;
- pCreate = pOp = ndb->createEventOperation(buf);
- if ( pOp == NULL ) {
- g_err << "Event operation creation failed on %s" << buf << endl;
- return NDBT_FAILED;
- }
-
- int i;
- int n_columns= table->getNoOfColumns();
- NdbRecAttr* recAttr[1024];
- NdbRecAttr* recAttrPre[1024];
- for (i = 0; i < n_columns; i++) {
- recAttr[i] = pOp->getValue(table->getColumn(i)->getName());
- recAttrPre[i] = pOp->getPreValue(table->getColumn(i)->getName());
- }
-
- if (pOp->execute())
- { // This starts changes to "start flowing"
- g_err << "execute operation execution failed: \n";
- g_err << pOp->getNdbError().code << " "
- << pOp->getNdbError().message << endl;
- result = NDBT_FAILED;
- goto end;
- }
-
- while(!ctx->isTestStopped())
- {
- Uint64 curr_gci = 0;
- while(!ctx->isTestStopped())
- {
- ndb->pollEvents(100, &curr_gci);
- while ((pOp= ndb->nextEvent()) != 0)
- {
- assert(pOp == pCreate);
- }
- }
- }
-
-end:
- if(pCreate)
- {
- if (ndb->dropEventOperation(pCreate)) {
- g_err << "dropEventOperation execution failed "
- << ndb->getNdbError().code << " "
- << ndb->getNdbError().message << endl;
- result = NDBT_FAILED;
- }
- }
- return result;
-}
-
-int runRestarter(NDBT_Context* ctx, NDBT_Step* step){
- int result = NDBT_OK;
- int loops = ctx->getNumLoops();
- NdbRestarter restarter;
- int i = 0;
- int lastId = 0;
-
- if (restarter.getNumDbNodes() < 2){
- ctx->stopTest();
- return NDBT_OK;
- }
-
- if(restarter.waitClusterStarted(60) != 0){
- g_err << "Cluster failed to start" << endl;
- return NDBT_FAILED;
- }
-
- while(result != NDBT_FAILED && !ctx->isTestStopped()){
-
- int id = lastId % restarter.getNumDbNodes();
- int nodeId = restarter.getDbNodeId(id);
- ndbout << "Restart node " << nodeId << endl;
- if(restarter.restartOneDbNode(nodeId, false, false, true) != 0){
- g_err << "Failed to restartNextDbNode" << endl;
- result = NDBT_FAILED;
- break;
- }
-
- if(restarter.waitClusterStarted(60) != 0){
- g_err << "Cluster failed to start" << endl;
- result = NDBT_FAILED;
- break;
- }
-
- lastId++;
- i++;
- }
-
- return result;
-}
-
-int runRestarterLoop(NDBT_Context* ctx, NDBT_Step* step)
-{
- int result = NDBT_OK;
- int loops = ctx->getNumLoops();
- NdbRestarter restarter;
- int i = 0;
- int lastId = 0;
-
- if (restarter.getNumDbNodes() < 2){
- ctx->stopTest();
- return NDBT_OK;
- }
-
- if(restarter.waitClusterStarted(60) != 0){
- g_err << "Cluster failed to start" << endl;
- return NDBT_FAILED;
- }
-
- while(result != NDBT_FAILED
- && !ctx->isTestStopped()
- && i < loops)
- {
- int id = lastId % restarter.getNumDbNodes();
- int nodeId = restarter.getDbNodeId(id);
- ndbout << "Restart node " << nodeId << endl;
- if(restarter.restartOneDbNode(nodeId, false, false, true) != 0){
- g_err << "Failed to restartNextDbNode" << endl;
- result = NDBT_FAILED;
- break;
- }
-
- if(restarter.waitClusterStarted(60) != 0){
- g_err << "Cluster failed to start" << endl;
- result = NDBT_FAILED;
- break;
- }
-
- lastId++;
- i++;
- }
-
- ctx->stopTest();
- return result;
-}
-
-Vector<const NdbDictionary::Table*> pTabs;
-Vector<const NdbDictionary::Table*> pShadowTabs;
-
-static int getAllTables(NDBT_Context* ctx, NDBT_Step* step)
-{
- DBUG_ENTER("getAllTables");
- Ndb * ndb= GETNDB(step);
- NdbDictionary::Dictionary * dict = ndb->getDictionary();
- pTabs.clear();
-
- for (int i= 0; i < ctx->getNumTables(); i++)
- {
- const NdbDictionary::Table *pTab= dict->getTable(ctx->getTableName(i));
- if (pTab == 0)
- {
- ndbout << "Failed to get table" << endl;
- ndbout << dict->getNdbError() << endl;
- DBUG_RETURN(NDBT_FAILED);
- }
- pTabs.push_back(pTab);
- ndbout << " " << ctx->getTableName(i);
- }
- pTabs.push_back(NULL);
- ndbout << endl;
-
- DBUG_RETURN(NDBT_OK);
-}
-
-static int createAllEvents(NDBT_Context* ctx, NDBT_Step* step)
-{
- DBUG_ENTER("createAllEvents");
- Ndb * ndb= GETNDB(step);
- for (int i= 0; pTabs[i]; i++)
- {
- if (createEvent(ndb,*pTabs[i]))
- {
- DBUG_RETURN(NDBT_FAILED);
- }
- }
- DBUG_RETURN(NDBT_OK);
-}
-
-static int dropAllEvents(NDBT_Context* ctx, NDBT_Step* step)
-{
- DBUG_ENTER("dropAllEvents");
- Ndb * ndb= GETNDB(step);
- int i;
-
- for (i= 0; pTabs[i]; i++)
- {
- if (dropEvent(ndb,*pTabs[i]))
- {
- DBUG_RETURN(NDBT_FAILED);
- }
- }
- DBUG_RETURN(NDBT_OK);
-}
-
-static int createAllShadows(NDBT_Context* ctx, NDBT_Step* step)
-{
- DBUG_ENTER("createAllShadows");
- Ndb * ndb= GETNDB(step);
- NdbDictionary::Dictionary * dict = ndb->getDictionary();
- // create a "shadow" table for each table
- for (int i= 0; pTabs[i]; i++)
- {
- char buf[1024];
- sprintf(buf, "%s_SHADOW", pTabs[i]->getName());
-
- dict->dropTable(buf);
- if (dict->getTable(buf))
- {
- DBUG_RETURN(NDBT_FAILED);
- }
-
- NdbDictionary::Table table_shadow(*pTabs[i]);
- table_shadow.setName(buf);
- if (dict->createTable(table_shadow))
- {
- g_err << "createTable(" << buf << ") "
- << dict->getNdbError().code << " "
- << dict->getNdbError().message << endl;
- DBUG_RETURN(NDBT_FAILED);
- }
- pShadowTabs.push_back(dict->getTable(buf));
- if (!pShadowTabs[i])
- {
- g_err << "getTable(" << buf << ") "
- << dict->getNdbError().code << " "
- << dict->getNdbError().message << endl;
- DBUG_RETURN(NDBT_FAILED);
- }
- }
- DBUG_RETURN(NDBT_OK);
-}
-
-static int dropAllShadows(NDBT_Context* ctx, NDBT_Step* step)
-{
- DBUG_ENTER("dropAllShadows");
- Ndb * ndb= GETNDB(step);
- NdbDictionary::Dictionary * dict = ndb->getDictionary();
-
- for (int i= 0; pTabs[i]; i++)
- {
- char buf[1024];
- sprintf(buf, "%s_SHADOW", pTabs[i]->getName());
- if (dict->dropTable(buf))
- {
- DBUG_RETURN(NDBT_FAILED);
- }
- }
- DBUG_RETURN(NDBT_OK);
-}
-
-static int start_transaction(Ndb *ndb, Vector<HugoOperations*> &ops)
-{
- if (ops[0]->startTransaction(ndb) != NDBT_OK)
- return -1;
- NdbTransaction * t= ops[0]->getTransaction();
- for (int i= ops.size()-1; i > 0; i--)
- {
- ops[i]->setTransaction(t,true);
- }
- return 0;
-}
-
-static int close_transaction(Ndb *ndb, Vector<HugoOperations*> &ops)
-{
- if (ops[0]->closeTransaction(ndb) != NDBT_OK)
- return -1;
- for (int i= ops.size()-1; i > 0; i--)
- {
- ops[i]->setTransaction(NULL,true);
- }
- return 0;
-}
-
-static int execute_commit(Ndb *ndb, Vector<HugoOperations*> &ops)
-{
- if (ops[0]->execute_Commit(ndb) != NDBT_OK)
- return -1;
- return 0;
-}
-
-static int copy_events(Ndb *ndb)
-{
- DBUG_ENTER("copy_events");
- int r= 0;
- NdbDictionary::Dictionary * dict = ndb->getDictionary();
- int n_inserts= 0;
- int n_updates= 0;
- int n_deletes= 0;
- while (1)
- {
- int res= ndb->pollEvents(1000); // wait for event or 1000 ms
- DBUG_PRINT("info", ("pollEvents res=%d", res));
- if (res <= 0)
- {
- break;
- }
- NdbEventOperation *pOp;
- while ((pOp= ndb->nextEvent()))
- {
- char buf[1024];
- sprintf(buf, "%s_SHADOW", pOp->getEvent()->getTable()->getName());
- const NdbDictionary::Table *table= dict->getTable(buf);
-
- if (table == 0)
- {
- g_err << "unable to find table " << buf << endl;
- DBUG_RETURN(-1);
- }
-
- if (pOp->isOverrun())
- {
- g_err << "buffer overrun\n";
- DBUG_RETURN(-1);
- }
- r++;
-
- if (!pOp->isConsistent()) {
- g_err << "A node failure has occured and events might be missing\n";
- DBUG_RETURN(-1);
- }
-
- int noRetries= 0;
- do
- {
- NdbTransaction *trans= ndb->startTransaction();
- if (trans == 0)
- {
- g_err << "startTransaction failed "
- << ndb->getNdbError().code << " "
- << ndb->getNdbError().message << endl;
- DBUG_RETURN(-1);
- }
-
- NdbOperation *op= trans->getNdbOperation(table);
- if (op == 0)
- {
- g_err << "getNdbOperation failed "
- << trans->getNdbError().code << " "
- << trans->getNdbError().message << endl;
- DBUG_RETURN(-1);
- }
-
- switch (pOp->getEventType()) {
- case NdbDictionary::Event::TE_INSERT:
- if (op->insertTuple())
- {
- g_err << "insertTuple "
- << op->getNdbError().code << " "
- << op->getNdbError().message << endl;
- DBUG_RETURN(-1);
- }
- if (noRetries == 0)
- {
- n_inserts++;
- }
- break;
- case NdbDictionary::Event::TE_DELETE:
- if (op->deleteTuple())
- {
- g_err << "deleteTuple "
- << op->getNdbError().code << " "
- << op->getNdbError().message << endl;
- DBUG_RETURN(-1);
- }
- if (noRetries == 0)
- {
- n_deletes++;
- }
- break;
- case NdbDictionary::Event::TE_UPDATE:
- if (op->updateTuple())
- {
- g_err << "updateTuple "
- << op->getNdbError().code << " "
- << op->getNdbError().message << endl;
- DBUG_RETURN(-1);
- }
- if (noRetries == 0)
- {
- n_updates++;
- }
- break;
- default:
- abort();
- }
-
- {
- for (const NdbRecAttr *pk= pOp->getFirstPkAttr();
- pk;
- pk= pk->next())
- {
- if (pk->isNULL())
- {
- g_err << "internal error: primary key isNull()="
- << pk->isNULL() << endl;
- DBUG_RETURN(NDBT_FAILED);
- }
- if (op->equal(pk->getColumn()->getColumnNo(),pk->aRef()))
- {
- g_err << "equal " << pk->getColumn()->getColumnNo() << " "
- << op->getNdbError().code << " "
- << op->getNdbError().message << endl;
- DBUG_RETURN(NDBT_FAILED);
- }
- }
- }
-
- switch (pOp->getEventType()) {
- case NdbDictionary::Event::TE_INSERT:
- {
- for (const NdbRecAttr *data= pOp->getFirstDataAttr();
- data;
- data= data->next())
- {
- if (data->isNULL() < 0 ||
- op->setValue(data->getColumn()->getColumnNo(),
- data->isNULL() ? 0:data->aRef()))
- {
- g_err << "setValue(insert) " << data->getColumn()->getColumnNo()
- << " " << op->getNdbError().code
- << " " << op->getNdbError().message << endl;
- DBUG_RETURN(-1);
- }
- }
- break;
- }
- case NdbDictionary::Event::TE_DELETE:
- break;
- case NdbDictionary::Event::TE_UPDATE:
- {
- for (const NdbRecAttr *data= pOp->getFirstDataAttr();
- data;
- data= data->next())
- {
- if (data->isNULL() >= 0 &&
- op->setValue(data->getColumn()->getColumnNo(),
- data->isNULL() ? 0:data->aRef()))
- {
- g_err << "setValue(update) " << data->getColumn()->getColumnNo()
- << " " << op->getNdbError().code
- << " " << op->getNdbError().message << endl;
- DBUG_RETURN(NDBT_FAILED);
- }
- }
- break;
- }
- default:
- case NdbDictionary::Event::TE_ALL:
- abort();
- }
- if (trans->execute(Commit) == 0)
- {
- trans->close();
- // everything ok
- break;
- }
- if (noRetries++ == 10 ||
- trans->getNdbError().status != NdbError::TemporaryError)
- {
- g_err << "execute " << r << " failed "
- << trans->getNdbError().code << " "
- << trans->getNdbError().message << endl;
- trans->close();
- DBUG_RETURN(-1);
- }
- trans->close();
- NdbSleep_MilliSleep(100); // sleep before retying
- } while(1);
- } // for
- } // while(1)
- g_info << "n_updates: " << n_updates << " "
- << "n_inserts: " << n_inserts << " "
- << "n_deletes: " << n_deletes << endl;
- DBUG_RETURN(r);
-}
-
-static int verify_copy(Ndb *ndb,
- Vector<const NdbDictionary::Table *> &tabs1,
- Vector<const NdbDictionary::Table *> &tabs2)
-{
- for (unsigned i= 0; i < tabs1.size(); i++)
- if (tabs1[i])
- {
- HugoTransactions hugoTrans(*tabs1[i]);
- if (hugoTrans.compare(ndb, tabs2[i]->getName(), 0))
- return -1;
- }
- return 0;
-}
-
-static int createEventOperations(Ndb * ndb)
-{
- DBUG_ENTER("createEventOperations");
- int i;
-
- // creat all event ops
- for (i= 0; pTabs[i]; i++)
- {
- char buf[1024];
- sprintf(buf, "%s_EVENT", pTabs[i]->getName());
- NdbEventOperation *pOp= ndb->createEventOperation(buf);
- if ( pOp == NULL )
- {
- DBUG_RETURN(NDBT_FAILED);
- }
-
- int n_columns= pTabs[i]->getNoOfColumns();
- for (int j = 0; j < n_columns; j++)
- {
- pOp->getValue(pTabs[i]->getColumn(j)->getName());
- pOp->getPreValue(pTabs[i]->getColumn(j)->getName());
- }
-
- if ( pOp->execute() )
- {
- DBUG_RETURN(NDBT_FAILED);
- }
- }
-
- DBUG_RETURN(NDBT_OK);
-}
-
-static int createAllEventOperations(NDBT_Context* ctx, NDBT_Step* step)
-{
- DBUG_ENTER("createAllEventOperations");
- Ndb * ndb= GETNDB(step);
- int r= createEventOperations(ndb);
- if (r != NDBT_OK)
- {
- DBUG_RETURN(NDBT_FAILED);
- }
- DBUG_RETURN(NDBT_OK);
-}
-
-static int dropEventOperations(Ndb * ndb)
-{
- DBUG_ENTER("dropEventOperations");
-
- NdbEventOperation *pOp;
- while ( (pOp= ndb->getEventOperation()) )
- {
- if (ndb->dropEventOperation(pOp))
- {
- DBUG_RETURN(NDBT_FAILED);
- }
- }
-
- DBUG_RETURN(NDBT_OK);
-}
-
-static int dropAllEventOperations(NDBT_Context* ctx, NDBT_Step* step)
-{
- DBUG_ENTER("dropAllEventOperations");
- Ndb * ndb= GETNDB(step);
- int r= dropEventOperations(ndb);
- if (r != NDBT_OK)
- {
- DBUG_RETURN(NDBT_FAILED);
- }
- DBUG_RETURN(NDBT_OK);
-}
-
-static int runMulti(NDBT_Context* ctx, NDBT_Step* step)
-{
- DBUG_ENTER("runMulti");
-
- Ndb * ndb= GETNDB(step);
-
- int no_error= 1;
- int i;
-
- if (createEventOperations(ndb))
- {
- DBUG_RETURN(NDBT_FAILED);
- }
-
- // create a hugo operation per table
- Vector<HugoOperations *> hugo_ops;
- for (i= 0; no_error && pTabs[i]; i++)
- {
- hugo_ops.push_back(new HugoOperations(*pTabs[i]));
- }
-
- int n_records= 3;
- // insert n_records records per table
- do {
- if (start_transaction(ndb, hugo_ops))
- {
- no_error= 0;
- DBUG_RETURN(NDBT_FAILED);
- }
- for (i= 0; no_error && pTabs[i]; i++)
- {
- hugo_ops[i]->pkInsertRecord(ndb, 0, n_records);
- }
- if (execute_commit(ndb, hugo_ops))
- {
- no_error= 0;
- DBUG_RETURN(NDBT_FAILED);
- }
- if(close_transaction(ndb, hugo_ops))
- {
- no_error= 0;
- DBUG_RETURN(NDBT_FAILED);
- }
- } while(0);
-
- // copy events and verify
- do {
- if (copy_events(ndb) < 0)
- {
- no_error= 0;
- DBUG_RETURN(NDBT_FAILED);
- }
- if (verify_copy(ndb, pTabs, pShadowTabs))
- {
- no_error= 0;
- DBUG_RETURN(NDBT_FAILED);
- }
- } while (0);
-
- // update n_records-1 records in first table
- do {
- if (start_transaction(ndb, hugo_ops))
- {
- no_error= 0;
- DBUG_RETURN(NDBT_FAILED);
- }
-
- hugo_ops[0]->pkUpdateRecord(ndb, n_records-1);
-
- if (execute_commit(ndb, hugo_ops))
- {
- no_error= 0;
- DBUG_RETURN(NDBT_FAILED);
- }
- if(close_transaction(ndb, hugo_ops))
- {
- no_error= 0;
- DBUG_RETURN(NDBT_FAILED);
- }
- } while(0);
-
- // copy events and verify
- do {
- if (copy_events(ndb) < 0)
- {
- no_error= 0;
- DBUG_RETURN(NDBT_FAILED);
- }
- if (verify_copy(ndb, pTabs, pShadowTabs))
- {
- no_error= 0;
- DBUG_RETURN(NDBT_FAILED);
- }
- } while (0);
-
- if (dropEventOperations(ndb))
- {
- DBUG_RETURN(NDBT_FAILED);
- }
-
- if (no_error)
- DBUG_RETURN(NDBT_OK);
- DBUG_RETURN(NDBT_FAILED);
-}
-
-static int runMulti_NR(NDBT_Context* ctx, NDBT_Step* step)
-{
- DBUG_ENTER("runMulti");
-
- int records = ctx->getNumRecords();
- int loops = ctx->getNumLoops();
- Ndb * ndb= GETNDB(step);
-
- int i;
-
- if (createEventOperations(ndb))
- {
- DBUG_RETURN(NDBT_FAILED);
- }
-
- for (i= 0; pTabs[i]; i++)
- {
- HugoTransactions hugo(*pTabs[i]);
- if (hugo.loadTable(ndb, records, 1, true, 1))
- {
- DBUG_RETURN(NDBT_FAILED);
- }
- // copy events and verify
- if (copy_events(ndb) < 0)
- {
- DBUG_RETURN(NDBT_FAILED);
- }
- }
-
- if (verify_copy(ndb, pTabs, pShadowTabs))
- {
- DBUG_RETURN(NDBT_FAILED);
- }
-
- {
- NdbRestarts restarts;
- for (int j= 0; j < loops; j++)
- {
- // restart a node
- int timeout = 240;
- if (restarts.executeRestart("RestartRandomNodeAbort", timeout))
- {
- DBUG_RETURN(NDBT_FAILED);
- }
-
- sleep(5);
- // update all tables
- for (i= 0; pTabs[i]; i++)
- {
- HugoTransactions hugo(*pTabs[i]);
- if (hugo.pkUpdateRecords(ndb, records, 1, 1))
- {
- DBUG_RETURN(NDBT_FAILED);
- }
- if (copy_events(ndb) < 0)
- {
- DBUG_RETURN(NDBT_FAILED);
- }
- }
-
- // copy events and verify
- if (verify_copy(ndb, pTabs, pShadowTabs))
- {
- DBUG_RETURN(NDBT_FAILED);
- }
- }
- }
-
- if (dropEventOperations(ndb))
- {
- DBUG_RETURN(NDBT_FAILED);
- }
-
- DBUG_RETURN(NDBT_OK);
-}
-
-static int restartAllNodes()
-{
- NdbRestarter restarter;
- int id = 0;
- do {
- int nodeId = restarter.getDbNodeId(id++);
- ndbout << "Restart node " << nodeId << endl;
- if(restarter.restartOneDbNode(nodeId, false, false, true) != 0){
- g_err << "Failed to restartNextDbNode" << endl;
- break;
- }
- if(restarter.waitClusterStarted(60) != 0){
- g_err << "Cluster failed to start" << endl;
- break;
- }
- id = id % restarter.getNumDbNodes();
- } while (id);
- return id != 0;
-}
-
-static int runCreateDropNR(NDBT_Context* ctx, NDBT_Step* step)
-{
- DBUG_ENTER("runCreateDropNR");
- Ndb * ndb= GETNDB(step);
- int result = NDBT_OK;
- NdbRestarter restarter;
- int loops = ctx->getNumLoops();
-
- if (restarter.getNumDbNodes() < 2)
- {
- ctx->stopTest();
- return NDBT_OK;
- }
- do
- {
- result = NDBT_FAILED;
- const NdbDictionary::Table* pTab = ctx->getTab();
- if (createEvent(ndb, *pTab))
- {
- g_err << "createEvent failed" << endl;
- break;
- }
- NdbEventOperation *pOp= createEventOperation(ndb, *pTab);
- if (pOp == 0)
- {
- g_err << "Failed to createEventOperation" << endl;
- break;
- }
- if (dropEvent(ndb, *pTab))
- {
- g_err << "Failed to dropEvent()" << endl;
- break;
- }
- ndbout << "Restarting with dropped events with subscribers" << endl;
- if (restartAllNodes())
- break;
- if (ndb->getDictionary()->dropTable(pTab->getName()) != 0){
- g_err << "Failed to drop " << pTab->getName() <<" in db" << endl;
- break;
- }
- ndbout << "Restarting with dropped events and dropped "
- << "table with subscribers" << endl;
- if (restartAllNodes())
- break;
- if (ndb->dropEventOperation(pOp))
- {
- g_err << "Failed dropEventOperation" << endl;
- break;
- }
- NdbDictionary::Table tmp(*pTab);
- //tmp.setNodeGroupIds(0, 0);
- if (ndb->getDictionary()->createTable(tmp) != 0){
- g_err << "createTable failed: "
- << ndb->getDictionary()->getNdbError() << endl;
- break;
- }
- result = NDBT_OK;
- } while (--loops);
-
- DBUG_RETURN(result);
-}
-
-static
-int
-runSubscribeUnsubscribe(NDBT_Context* ctx, NDBT_Step* step)
-{
- char buf[1024];
- const NdbDictionary::Table & tab = * ctx->getTab();
- sprintf(buf, "%s_EVENT", tab.getName());
- Ndb* ndb = GETNDB(step);
- int loops = 5 * ctx->getNumLoops();
-
- while (--loops)
- {
- NdbEventOperation *pOp= ndb->createEventOperation(buf);
- if (pOp == 0)
- {
- g_err << "createEventOperation: "
- << ndb->getNdbError().code << " "
- << ndb->getNdbError().message << endl;
- return NDBT_FAILED;
- }
-
- int n_columns= tab.getNoOfColumns();
- for (int j = 0; j < n_columns; j++)
- {
- pOp->getValue(tab.getColumn(j)->getName());
- pOp->getPreValue(tab.getColumn(j)->getName());
- }
- if ( pOp->execute() )
- {
- g_err << "pOp->execute(): "
- << pOp->getNdbError().code << " "
- << pOp->getNdbError().message << endl;
-
- ndb->dropEventOperation(pOp);
-
- return NDBT_FAILED;
- }
-
- if (ndb->dropEventOperation(pOp))
- {
- g_err << "pOp->execute(): "
- << ndb->getNdbError().code << " "
- << ndb->getNdbError().message << endl;
- return NDBT_FAILED;
- }
- }
-
- return NDBT_OK;
-}
-
-int
-runScanUpdateUntilStopped(NDBT_Context* ctx, NDBT_Step* step){
- int records = ctx->getNumRecords();
- int parallelism = ctx->getProperty("Parallelism", (Uint32)0);
- int abort = ctx->getProperty("AbortProb", (Uint32)0);
- HugoTransactions hugoTrans(*ctx->getTab());
- while (ctx->isTestStopped() == false)
- {
- if (hugoTrans.scanUpdateRecords(GETNDB(step), 0, abort,
- parallelism) == NDBT_FAILED){
- return NDBT_FAILED;
- }
- }
- return NDBT_OK;
-}
-
-int
-runInsertDeleteUntilStopped(NDBT_Context* ctx, NDBT_Step* step)
-{
- int result = NDBT_OK;
- int records = ctx->getNumRecords();
- HugoTransactions hugoTrans(*ctx->getTab());
- UtilTransactions utilTrans(*ctx->getTab());
- while (ctx->isTestStopped() == false)
- {
- if (hugoTrans.loadTable(GETNDB(step), records, 1) != 0){
- return NDBT_FAILED;
- }
- if (utilTrans.clearTable(GETNDB(step), records) != 0){
- return NDBT_FAILED;
- }
- }
-
- return NDBT_OK;
-}
-
-int
-runBug31701(NDBT_Context* ctx, NDBT_Step* step)
-{
- int result = NDBT_OK;
-
- NdbRestarter restarter;
-
- if (restarter.getNumDbNodes() < 2){
- ctx->stopTest();
- return NDBT_OK;
- }
- // This should really wait for applier to start...10s is likely enough
- NdbSleep_SecSleep(10);
-
- int nodeId = restarter.getDbNodeId(rand() % restarter.getNumDbNodes());
-
- int val2[] = { DumpStateOrd::CmvmiSetRestartOnErrorInsert, 1 };
- if (restarter.dumpStateOneNode(nodeId, val2, 2))
- return NDBT_FAILED;
-
- restarter.insertErrorInNode(nodeId, 13033);
- if (restarter.waitNodesNoStart(&nodeId, 1))
- return NDBT_FAILED;
-
- if (restarter.startNodes(&nodeId, 1))
- return NDBT_FAILED;
-
- if (restarter.waitClusterStarted())
- return NDBT_FAILED;
-
-
- int records = ctx->getNumRecords();
- HugoTransactions hugoTrans(*ctx->getTab());
-
- if(ctx->getPropertyWait("LastGCI", ~(Uint32)0))
- {
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
-
- hugoTrans.clearTable(GETNDB(step), 0);
-
- if (hugoTrans.loadTable(GETNDB(step), 3*records, 1, true, 1) != 0){
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
-
- if (hugoTrans.pkDelRecords(GETNDB(step), 3*records, 1, true, 1) != 0){
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
- if (hugoTrans.loadTable(GETNDB(step), records, 1, true, 1) != 0){
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
- if (hugoTrans.pkUpdateRecords(GETNDB(step), records, 1, 1) != 0){
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
- if (hugoTrans.pkUpdateRecords(GETNDB(step), records, 1, 1) != 0){
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
- if (hugoTrans.pkUpdateRecords(GETNDB(step), records, 1, 1) != 0){
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
-
- ctx->setProperty("LastGCI", hugoTrans.m_latest_gci);
- if(ctx->getPropertyWait("LastGCI", ~(Uint32)0))
- {
- g_err << "FAIL " << __LINE__ << endl;
- return NDBT_FAILED;
- }
-
- ctx->stopTest();
- return NDBT_OK;
-}
-
-int
-runBug33793(NDBT_Context* ctx, NDBT_Step* step)
-{
- int result = NDBT_OK;
- int loops = ctx->getNumLoops();
-
- NdbRestarter restarter;
-
- if (restarter.getNumDbNodes() < 2){
- ctx->stopTest();
- return NDBT_OK;
- }
- // This should really wait for applier to start...10s is likely enough
- NdbSleep_SecSleep(10);
-
- while (loops-- && ctx->isTestStopped() == false)
- {
- int nodeId = restarter.getDbNodeId(rand() % restarter.getNumDbNodes());
- int nodecount = 0;
- int nodes[255];
- printf("nodeid: %u : victims: ", nodeId);
- for (int i = 0; i<restarter.getNumDbNodes(); i++)
- {
- int id = restarter.getDbNodeId(i);
- if (id == nodeId)
- continue;
-
- if (restarter.getNodeGroup(id) == restarter.getNodeGroup(nodeId))
- {
- nodes[nodecount++] = id;
- printf("%u ", id);
- int val2[] = { DumpStateOrd::CmvmiSetRestartOnErrorInsert, 1 };
- if (restarter.dumpStateOneNode(id, val2, 2))
- return NDBT_FAILED;
- }
- }
- printf("\n"); fflush(stdout);
-
- restarter.insertErrorInNode(nodeId, 13034);
- if (restarter.waitNodesNoStart(nodes, nodecount))
- return NDBT_FAILED;
-
- if (restarter.startNodes(nodes, nodecount))
- return NDBT_FAILED;
-
- if (restarter.waitClusterStarted())
- return NDBT_FAILED;
- }
-
- ctx->stopTest();
- return NDBT_OK;
-}
-
-
-
-NDBT_TESTSUITE(test_event);
-TESTCASE("BasicEventOperation",
- "Verify that we can listen to Events"
- "NOTE! No errors are allowed!" )
-{
-#if 0
- TABLE("T1");
- TABLE("T3");
- TABLE("T5");
- TABLE("T6");
- TABLE("T8");
-#endif
- INITIALIZER(runCreateEvent);
- STEP(runEventOperation);
- STEP(runEventLoad);
- FINALIZER(runDropEvent);
-}
-TESTCASE("CreateDropEventOperation",
- "Verify that we can Create and Drop many times"
- "NOTE! No errors are allowed!" ){
- INITIALIZER(runCreateEvent);
- STEP(runCreateDropEventOperation);
- FINALIZER(runDropEvent);
-}
-TESTCASE("ParallellEventOperation",
- "Verify that we can listen to Events in parallell"
- "NOTE! No errors are allowed!" ){
- INITIALIZER(runCreateEvent);
- STEP(runEventOperation);
- STEP(runEventOperation);
- STEP(runEventLoad);
- FINALIZER(runDropEvent);
-}
-TESTCASE("EventOperationApplier",
- "Verify that if we apply the data we get from event "
- "operation is the same as the original table"
- "NOTE! No errors are allowed!" ){
- INITIALIZER(runCreateEvent);
- INITIALIZER(runCreateShadowTable);
- STEP(runEventApplier);
- STEP(runEventMixedLoad);
- FINALIZER(runDropEvent);
- FINALIZER(runVerify);
- FINALIZER(runDropShadowTable);
-}
-TESTCASE("EventOperationApplier_NR",
- "Verify that if we apply the data we get from event "
- "operation is the same as the original table"
- "NOTE! No errors are allowed!" ){
- INITIALIZER(runCreateEvent);
- INITIALIZER(runCreateShadowTable);
- STEP(runEventApplier);
- STEP(runEventMixedLoad);
- STEP(runRestarter);
- FINALIZER(runDropEvent);
- FINALIZER(runVerify);
- FINALIZER(runDropShadowTable);
-}
-TESTCASE("MergeEventOperationApplier",
- "Verify that if we apply the data we get from merged event "
- "operation is the same as the original table"
- "NOTE! No errors are allowed!" ){
- TC_PROPERTY("MergeEvents", 1);
- INITIALIZER(runCreateEvent);
- INITIALIZER(runCreateShadowTable);
- STEP(runEventApplier);
- STEP(runEventMixedLoad);
- FINALIZER(runDropEvent);
- FINALIZER(runVerify);
- FINALIZER(runDropShadowTable);
-}
-TESTCASE("MergeEventOperationApplier_NR",
- "Verify that if we apply the data we get from merged event "
- "operation is the same as the original table"
- "NOTE! No errors are allowed!" ){
- TC_PROPERTY("MergeEvents", 1);
- INITIALIZER(runCreateEvent);
- INITIALIZER(runCreateShadowTable);
- STEP(runEventApplier);
- STEP(runEventMixedLoad);
- STEP(runRestarter);
- FINALIZER(runDropEvent);
- FINALIZER(runVerify);
- FINALIZER(runDropShadowTable);
-}
-TESTCASE("Multi",
- "Verify that we can work with all tables in parallell"
- "NOTE! HugoOperations::startTransaction, pTrans != NULL errors, "
- "are allowed!" ){
- ALL_TABLES();
- INITIALIZER(getAllTables);
- INITIALIZER(createAllEvents);
- INITIALIZER(createAllShadows);
- STEP(runMulti);
- FINALIZER(dropAllShadows);
- FINALIZER(dropAllEvents);
-}
-TESTCASE("Multi_NR",
- "Verify that we can work with all tables in parallell"
- "NOTE! HugoOperations::startTransaction, pTrans != NULL errors, "
- "are allowed!" ){
- ALL_TABLES();
- INITIALIZER(getAllTables);
- INITIALIZER(createAllEvents);
- INITIALIZER(createAllShadows);
- STEP(runMulti_NR);
- FINALIZER(dropAllShadows);
- FINALIZER(dropAllEvents);
-}
-TESTCASE("CreateDropNR",
- "Verify that we can Create and Drop in any order"
- "NOTE! No errors are allowed!" ){
- FINALIZER(runCreateDropNR);
-}
-TESTCASE("SubscribeUnsubscribe",
- "A bunch of threads doing subscribe/unsubscribe in loop"
- "NOTE! No errors are allowed!" ){
- INITIALIZER(runCreateEvent);
- STEPS(runSubscribeUnsubscribe, 16);
- FINALIZER(runDropEvent);
-}
-TESTCASE("Bug27169", ""){
- INITIALIZER(runCreateEvent);
- STEP(runEventListenerUntilStopped);
- STEP(runInsertDeleteUntilStopped);
- STEP(runScanUpdateUntilStopped);
- STEP(runRestarterLoop);
- FINALIZER(runDropEvent);
-}
-TESTCASE("Bug31701", ""){
- INITIALIZER(runCreateEvent);
- INITIALIZER(runCreateShadowTable);
- STEP(runEventApplier);
- STEP(runBug31701);
- FINALIZER(runDropEvent);
- FINALIZER(runDropShadowTable);
-}
-TESTCASE("Bug33793", ""){
- INITIALIZER(runCreateEvent);
- STEP(runEventListenerUntilStopped);
- STEP(runBug33793);
- FINALIZER(runDropEvent);
-}
-NDBT_TESTSUITE_END(test_event);
-
-int main(int argc, const char** argv){
- ndb_init();
- test_event.setCreateAllTables(true);
- return test_event.execute(argc, argv);
-}
-
-template class Vector<HugoOperations *>;
-template class Vector<NdbEventOperation *>;
-template class Vector<NdbRecAttr*>;
-template class Vector<Vector<NdbRecAttr*> >;