diff options
author | unknown <joreland@mysql.com> | 2005-04-25 11:59:00 +0200 |
---|---|---|
committer | unknown <joreland@mysql.com> | 2005-04-25 11:59:00 +0200 |
commit | 2c066230be43d9e800752d2511686e31f13623cf (patch) | |
tree | 61a1655a1f94f3035b1b2d86e9af63e5d26fefbc /ndb | |
parent | 7f005d177bc5f2c1562ae65892ea308225edc9af (diff) | |
download | mariadb-git-2c066230be43d9e800752d2511686e31f13623cf.tar.gz |
bug#9749 - ndb lock upgrade
post review fix.
don't init hash value on restart operations
make sure that lock mode is correct in entire que.
ndb/test/ndbapi/testOperations.cpp:
Test case also for abort case.
(abort if not lock owner still fails!)
Diffstat (limited to 'ndb')
-rw-r--r-- | ndb/src/kernel/blocks/dbacc/DbaccMain.cpp | 13 | ||||
-rw-r--r-- | ndb/test/ndbapi/testOperations.cpp | 16 |
2 files changed, 18 insertions, 11 deletions
diff --git a/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp b/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp index d566639489c..44c891fc220 100644 --- a/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp +++ b/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp @@ -5899,33 +5899,32 @@ Dbacc::check_lock_upgrade(Signal* signal, // Find end of parallell que tmp = lock_owner; + Uint32 lockMode = next.p->lockMode > lock_owner.p->lockMode ? + next.p->lockMode : lock_owner.p->lockMode; while(tmp.p->nextParallelQue != RNIL) { jam(); tmp.i = tmp.p->nextParallelQue; + tmp.p->lockMode = lockMode; ptrCheckGuard(tmp, coprecsize, operationrec); } + tmp.p->lockMode = lockMode; next.p->prevParallelQue = tmp.i; tmp.p->nextParallelQue = next.i; OperationrecPtr save = operationRecPtr; - Uint32 lockMode = lock_owner.p->lockMode; - Uint32 TelementIsDisappeared = 0; // lock upgrade = all reads - Uint32 ThashValue = lock_owner.p->hashValue; Uint32 localdata[2]; localdata[0] = lock_owner.p->localdata[0]; localdata[1] = lock_owner.p->localdata[1]; do { - next.p->elementIsDisappeared = TelementIsDisappeared; - next.p->hashValue = ThashValue; next.p->localdata[0] = localdata[0]; next.p->localdata[1] = localdata[1]; + next.p->lockMode = lockMode; operationRecPtr = next; - next.p->lockMode = lockMode; - TelementIsDisappeared = executeNextOperation(signal); + executeNextOperation(signal); if (next.p->nextParallelQue != RNIL) { jam(); diff --git a/ndb/test/ndbapi/testOperations.cpp b/ndb/test/ndbapi/testOperations.cpp index 773511a0475..726f35b01fb 100644 --- a/ndb/test/ndbapi/testOperations.cpp +++ b/ndb/test/ndbapi/testOperations.cpp @@ -635,7 +635,14 @@ runLockUpgrade2(NDBT_Context* ctx, NDBT_Step* step){ ndbout_c("wait 3 - done"); NdbSleep_MilliSleep(200); - CHECK(hugoOps.execute_Commit(pNdb) == 0); + 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; @@ -650,7 +657,7 @@ main(int argc, const char** argv){ NDBT_TestSuite ts("testOperations"); - for(Uint32 i = 0; i <6; i++) + for(Uint32 i = 0; i < 12; i++) { BaseString name("bug_9749"); name.appfmt("_%d", i); @@ -658,8 +665,9 @@ main(int argc, const char** argv){ name.c_str(), ""); pt->setProperty("LOCK_UPGRADE", 1 + (i & 1)); - pt->setProperty("LU_OP", 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)); |