From 2c066230be43d9e800752d2511686e31f13623cf Mon Sep 17 00:00:00 2001
From: unknown <joreland@mysql.com>
Date: Mon, 25 Apr 2005 11:59:00 +0200
Subject: [PATCH] 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!)
---
 ndb/src/kernel/blocks/dbacc/DbaccMain.cpp | 13 ++++++-------
 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));
-- 
2.30.9