📄 testoperations.cpp
字号:
/** * Increase savepoint to <em>k</em> */ for(size_t l = 1; l<=seq; l++) { C3(same.pkReadRecord(pNdb, DUMMY, 1, lm) == 0); // Read dummy row C3(same.execute_NoCommit(pNdb) == 0); g_info << "savepoint: " << l << endl; } g_info << "op(" << seq << "): " << " lock mode " << lm << endl; C3(same.pkReadRecord(pNdb, ROW, 1, lm) == 0); // Read real row int tmp= same.execute_Commit(pNdb); if(seq == 0) { if(initial_row) { C3(tmp == 0 && same.verifyUpdatesValue(0) == 0); } else { C3(tmp == 626); } } else { switch(latest){ case o_INS: case o_UPD: C3(tmp == 0 && same.verifyUpdatesValue(seq) == 0); break; case o_DEL: C3(tmp == 626); break; case o_DONE: abort(); } } } return NDBT_OK;}int runOperations(NDBT_Context* ctx, NDBT_Step* step){ int tmp; Ndb* pNdb = GETNDB(step); Uint32 seqNo = ctx->getProperty("Sequence", (Uint32)0); Uint32 commit= ctx->getProperty("Commit", (Uint32)1); if(seqNo == 0) { return NDBT_FAILED; } Sequence seq; generate(seq, seqNo); { // Dummy row HugoOperations hugoOps(*ctx->getTab()); C3(hugoOps.startTransaction(pNdb) == 0); C3(hugoOps.pkInsertRecord(pNdb, DUMMY, 1, 0) == 0); C3(hugoOps.execute_Commit(pNdb) == 0); } const bool initial_row= (seq[0] != o_INS); if(initial_row) { HugoOperations hugoOps(*ctx->getTab()); C3(hugoOps.startTransaction(pNdb) == 0); C3(hugoOps.pkInsertRecord(pNdb, ROW, 1, 0) == 0); C3(hugoOps.execute_Commit(pNdb) == 0); } HugoOperations trans1(*ctx->getTab()); C3(trans1.startTransaction(pNdb) == 0); for(size_t i = 0; i<seq.size(); i++) { /** * Perform operation */ switch(seq[i]){ case o_INS: C3(trans1.pkInsertRecord(pNdb, ROW, 1, i+1) == 0); break; case o_UPD: C3(trans1.pkUpdateRecord(pNdb, ROW, 1, i+1) == 0); break; case o_DEL: C3(trans1.pkDeleteRecord(pNdb, ROW, 1) == 0); break; case o_DONE: abort(); } C3(trans1.execute_NoCommit(pNdb) == 0); /** * Verify other transaction */ if(verify_other(ctx, pNdb, 0, seq[0], initial_row, commit) != NDBT_OK) return NDBT_FAILED; /** * Verify savepoint read */ Uint64 transactionId= trans1.getTransaction()->getTransactionId(); for(size_t k=0; k<=i+1; k++) { if(verify_savepoint(ctx, pNdb, k, k>0 ? seq[k-1] : initial_row ? o_INS : o_DONE, transactionId) != NDBT_OK) return NDBT_FAILED; } } if(commit) { C3(trans1.execute_Commit(pNdb) == 0); } else { C3(trans1.execute_Rollback(pNdb) == 0); } if(verify_other(ctx, pNdb, seq.size(), seq.back(), initial_row, commit) != NDBT_OK) return NDBT_FAILED; return NDBT_OK;}intrunLockUpgrade1(NDBT_Context* ctx, NDBT_Step* step){ // Verify that data in index match // table data Ndb* pNdb = GETNDB(step); HugoOperations hugoOps(*ctx->getTab()); HugoTransactions hugoTrans(*ctx->getTab()); if(hugoTrans.loadTable(pNdb, 1) != 0){ g_err << "Load table failed" << endl; return NDBT_FAILED; } int result= NDBT_OK; do { CHECK(hugoOps.startTransaction(pNdb) == 0); if(ctx->getProperty("LOCK_UPGRADE", 1) == 1) { CHECK(hugoOps.pkReadRecord(pNdb, 0, 1, NdbOperation::LM_Read) == 0); CHECK(hugoOps.execute_NoCommit(pNdb) == 0); ctx->setProperty("READ_DONE", 1); ctx->broadcast(); ndbout_c("wait 2"); ctx->getPropertyWait("READ_DONE", 2); ndbout_c("wait 2 - done"); } else { ctx->setProperty("READ_DONE", 1); ctx->broadcast(); ctx->getPropertyWait("READ_DONE", 2); ndbout_c("wait 2 - done"); CHECK(hugoOps.pkReadRecord(pNdb, 0, 1, NdbOperation::LM_Read) == 0); CHECK(hugoOps.execute_NoCommit(pNdb) == 0); } if(ctx->getProperty("LU_OP", o_INS) == o_INS) { CHECK(hugoOps.pkDeleteRecord(pNdb, 0, 1) == 0); CHECK(hugoOps.pkInsertRecord(pNdb, 0, 1, 2) == 0); } else if(ctx->getProperty("LU_OP", o_UPD) == o_UPD) { CHECK(hugoOps.pkUpdateRecord(pNdb, 0, 1, 2) == 0); } else { CHECK(hugoOps.pkDeleteRecord(pNdb, 0, 1) == 0); } ctx->setProperty("READ_DONE", 3); ctx->broadcast(); ndbout_c("before update"); ndbout_c("wait update"); CHECK(hugoOps.execute_Commit(pNdb) == 0); CHECK(hugoOps.closeTransaction(pNdb) == 0); CHECK(hugoOps.startTransaction(pNdb) == 0); CHECK(hugoOps.pkReadRecord(pNdb, 0, 1) == 0); int res= hugoOps.execute_Commit(pNdb); if(ctx->getProperty("LU_OP", o_INS) == o_INS) { CHECK(res == 0); CHECK(hugoOps.verifyUpdatesValue(2) == 0); } else if(ctx->getProperty("LU_OP", o_UPD) == o_UPD) { CHECK(res == 0); CHECK(hugoOps.verifyUpdatesValue(2) == 0); } else { CHECK(res == 626); } } while(0); return result;}intrunLockUpgrade2(NDBT_Context* ctx, NDBT_Step* step){ // Verify that data in index match // table data Ndb* pNdb = GETNDB(step); HugoOperations hugoOps(*ctx->getTab()); HugoTransactions hugoTrans(*ctx->getTab()); int result= NDBT_OK; do { CHECK(hugoOps.startTransaction(pNdb) == 0); ndbout_c("wait 1"); ctx->getPropertyWait("READ_DONE", 1); ndbout_c("wait 1 - done"); CHECK(hugoOps.pkReadRecord(pNdb, 0, 1, NdbOperation::LM_Read) == 0); CHECK(hugoOps.execute_NoCommit(pNdb) == 0); ctx->setProperty("READ_DONE", 2); ctx->broadcast(); ndbout_c("wait 3"); ctx->getPropertyWait("READ_DONE", 3); ndbout_c("wait 3 - done"); NdbSleep_MilliSleep(200); if(ctx->getProperty("LU_COMMIT", (Uint32)0) == 0) { CHECK(hugoOps.execute_Commit(pNdb) == 0); } else { CHECK(hugoOps.execute_Rollback(pNdb) == 0); } } while(0); return result;}intmain(int argc, const char** argv){ ndb_init(); Vector<int> tmp; generate(tmp, 5); NDBT_TestSuite ts("testOperations"); for(Uint32 i = 0; i < 12; i++) { if(i == 6 || i == 8 || i == 10) continue; BaseString name("bug_9749"); name.appfmt("_%d", i); NDBT_TestCaseImpl1 *pt = new NDBT_TestCaseImpl1(&ts, name.c_str(), ""); pt->setProperty("LOCK_UPGRADE", 1 + (i & 1)); pt->setProperty("LU_OP", 1 + ((i >> 1) % 3)); pt->setProperty("LU_COMMIT", i / 6); pt->addInitializer(new NDBT_Initializer(pt, "runClearTable", runClearTable)); pt->addStep(new NDBT_ParallelStep(pt, "thread1", runLockUpgrade1)); pt->addStep(new NDBT_ParallelStep(pt, "thread2", runLockUpgrade2)); pt->addFinalizer(new NDBT_Finalizer(pt, "runClearTable", runClearTable)); ts.addTest(pt); } for(size_t i = 0; i<tmp.size(); i++) { BaseString name; Sequence s; generate(s, tmp[i]); for(size_t j = 0; j<s.size(); j++){ switch(s[j]){ case o_INS: name.append("_INS"); break; case o_DEL: name.append("_DEL"); break; case o_UPD: name.append("_UPD"); break; case o_DONE: abort(); } } BaseString n1; n1.append(name); n1.append("_COMMIT"); NDBT_TestCaseImpl1 *pt = new NDBT_TestCaseImpl1(&ts, n1.c_str()+1, ""); pt->setProperty("Sequence", tmp[i]); pt->addInitializer(new NDBT_Initializer(pt, "runClearTable", runClearTable)); pt->addStep(new NDBT_ParallelStep(pt, "run", runOperations)); pt->addFinalizer(new NDBT_Finalizer(pt, "runClearTable", runClearTable)); ts.addTest(pt); name.append("_ABORT"); pt = new NDBT_TestCaseImpl1(&ts, name.c_str()+1, ""); pt->setProperty("Sequence", tmp[i]); pt->setProperty("Commit", (Uint32)0); pt->addInitializer(new NDBT_Initializer(pt, "runClearTable", runClearTable)); pt->addStep(new NDBT_ParallelStep(pt, "run", runOperations)); pt->addFinalizer(new NDBT_Finalizer(pt, "runClearTable", runClearTable)); ts.addTest(pt); } for(Uint32 i = 0; i<sizeof(matrix)/sizeof(matrix[0]); i++){ NDBT_TestCaseImpl1 *pt = new NDBT_TestCaseImpl1(&ts, matrix[i].name, ""); pt->addInitializer(new NDBT_Initializer(pt, "runClearTable", runClearTable)); if(matrix[i].preCond){ pt->addInitializer(new NDBT_Initializer(pt, "runInsertRecord", runInsertRecord)); } pt->setProperty("op1", matrix[i].op1); pt->setProperty("res1", matrix[i].res1); pt->setProperty("val1", matrix[i].val1); pt->setProperty("op2", matrix[i].op2); pt->setProperty("res2", matrix[i].res2); pt->setProperty("val2", matrix[i].val2); pt->setProperty("res3", matrix[i].res3); pt->setProperty("val3", matrix[i].val3); pt->addStep(new NDBT_ParallelStep(pt, matrix[i].name, runTwoOperations)); pt->addFinalizer(new NDBT_Finalizer(pt, "runClearTable", runClearTable)); ts.addTest(pt); } return ts.execute(argc, argv);}template class Vector<OPS>;template class Vector<Sequence>;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -