summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoreland@mysql.com <>2005-04-08 14:16:57 +0200
committerjoreland@mysql.com <>2005-04-08 14:16:57 +0200
commitd8a5305d0def2a5ccc87d518c7ffbce85210df11 (patch)
tree29a658f3d91c9c110cef7c959f0fd193c0a2cc07
parent817f2c6a137d76421e2b0f17d902a74e801d6187 (diff)
parent72d89cc253e2e25ed8eb1ae209d3d4ca5bad1248 (diff)
downloadmariadb-git-d8a5305d0def2a5ccc87d518c7ffbce85210df11.tar.gz
Merge joreland@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/home/jonas/src/mysql-4.1
-rw-r--r--ndb/src/kernel/blocks/dbacc/DbaccMain.cpp6
-rw-r--r--ndb/test/ndbapi/testOperations.cpp93
2 files changed, 95 insertions, 4 deletions
diff --git a/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp b/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp
index c6d4e6af4d4..17c5a31cbed 100644
--- a/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp
+++ b/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp
@@ -11274,10 +11274,10 @@ void Dbacc::execACC_CHECK_SCAN(Signal* signal)
operationRecPtr.i = scanPtr.p->scanFirstQueuedOp;
ptrCheckGuard(operationRecPtr, coprecsize, operationrec);
takeOutReadyScanQueue(signal);
+ fragrecptr.i = operationRecPtr.p->fragptr;
+ ptrCheckGuard(fragrecptr, cfragmentsize, fragmentrec);
if (operationRecPtr.p->elementIsDisappeared == ZTRUE) {
jam();
- fragrecptr.i = operationRecPtr.p->fragptr;
- ptrCheckGuard(fragrecptr, cfragmentsize, fragmentrec);
if (fragrecptr.p->createLcp == ZTRUE) {
if (remainingUndoPages() < ZMIN_UNDO_PAGES_AT_COMMIT) {
jam();
@@ -11922,8 +11922,6 @@ void Dbacc::sendNextScanConf(Signal* signal)
return;
}//if
- fragrecptr.i = operationRecPtr.p->fragptr;
- ptrCheckGuard(fragrecptr, cfragmentsize, fragmentrec);
if (fragrecptr.p->keyLength != 0) {
jam();
signal->theData[0] = scanPtr.p->scanUserptr;
diff --git a/ndb/test/ndbapi/testOperations.cpp b/ndb/test/ndbapi/testOperations.cpp
index e254aff58dc..9f1d5ee1191 100644
--- a/ndb/test/ndbapi/testOperations.cpp
+++ b/ndb/test/ndbapi/testOperations.cpp
@@ -531,6 +531,74 @@ runOperations(NDBT_Context* ctx, NDBT_Step* step)
}
int
+runLockUpgrade1(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);
+ 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");
+ ctx->setProperty("READ_DONE", 3);
+ ctx->broadcast();
+ ndbout_c("before update");
+ CHECK(hugoOps.pkUpdateRecord(pNdb, 0, 1, 2) == 0);
+ ndbout_c("wait update");
+ CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
+ CHECK(hugoOps.closeTransaction(pNdb));
+ } while(0);
+
+ return result;
+}
+
+int
+runLockUpgrade2(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);
+ CHECK(hugoOps.execute_Commit(pNdb) == 0);
+ } while(0);
+
+ return NDBT_FAILED;
+}
+
+int
main(int argc, const char** argv){
ndb_init();
@@ -538,6 +606,31 @@ main(int argc, const char** argv){
generate(tmp, 5);
NDBT_TestSuite ts("testOperations");
+
+ {
+ BaseString name("bug_9749");
+ NDBT_TestCaseImpl1 *pt = new NDBT_TestCaseImpl1(&ts,
+ name.c_str(), "");
+
+ 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;