summaryrefslogtreecommitdiff
path: root/ndb
diff options
context:
space:
mode:
authorunknown <joreland@mysql.com>2005-04-25 11:59:00 +0200
committerunknown <joreland@mysql.com>2005-04-25 11:59:00 +0200
commit2c066230be43d9e800752d2511686e31f13623cf (patch)
tree61a1655a1f94f3035b1b2d86e9af63e5d26fefbc /ndb
parent7f005d177bc5f2c1562ae65892ea308225edc9af (diff)
downloadmariadb-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.cpp13
-rw-r--r--ndb/test/ndbapi/testOperations.cpp16
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));