List:Commits« Previous MessageNext Message »
From:Frazer Clement Date:July 3 2009 5:24pm
Subject:bzr push into mysql-5.1-telco-6.3 branch (frazer:2993 to 2994)
View as plain text  
 2994 Frazer Clement	2009-07-03
      WL4675 - improve unique index test coverage and testability
      modified:
        storage/ndb/test/include/NDBT_Test.hpp
        storage/ndb/test/ndbapi/testIndex.cpp
        storage/ndb/test/src/NDBT_Test.cpp
        storage/ndb/test/tools/create_index.cpp

 2993 Jonas Oreland	2009-07-02 [merge]
      merge 62 to 63
      modified:
        storage/ndb/test/ndbapi/testUpgrade.cpp

=== modified file 'storage/ndb/test/include/NDBT_Test.hpp'
--- a/storage/ndb/test/include/NDBT_Test.hpp	2009-05-27 12:11:46 +0000
+++ b/storage/ndb/test/include/NDBT_Test.hpp	2009-07-03 14:15:09 +0000
@@ -402,6 +402,7 @@ private:
   bool createAllTables;
   bool temporaryTables;
   bool nologging;
+  bool noddl;
 };
 
 

=== modified file 'storage/ndb/test/ndbapi/testIndex.cpp'
--- a/storage/ndb/test/ndbapi/testIndex.cpp	2009-05-26 18:53:34 +0000
+++ b/storage/ndb/test/ndbapi/testIndex.cpp	2009-07-03 14:15:09 +0000
@@ -197,21 +197,42 @@ int create_index(NDBT_Context* ctx, int 
 
   pIdx.setStoredIndex(logged);
   ndbout << ") ";
-  if (pNdb->getDictionary()->createIndex(pIdx) != 0){
-    attr->indexCreated = false;
-    ndbout << "FAILED!" << endl;
-    const NdbError err = pNdb->getDictionary()->getNdbError();
-    ERR(err);
-    if (err.classification == NdbError::ApplicationError)
-      return SKIP_INDEX;
+  bool noddl= ctx->getProperty("NoDDL");
 
-    if (err.status == NdbError::TemporaryError)
-      return SKIP_INDEX;
-    
-    return NDBT_FAILED;
-  } else {
-    ndbout << "OK!" << endl;
-    attr->indexCreated = true;
+  if (noddl)
+  {
+    const NdbDictionary::Index* idx= pNdb->
+      getDictionary()->getIndex(pIdx.getName(), pTab->getName());
+
+    if (!idx)
+    {
+      ndbout << "Failed - Index does not exist and DDL not allowed" << endl;
+      return NDBT_FAILED;
+    }
+    else
+    {
+      attr->indexCreated = false;
+      // TODO : Check index definition is ok
+    }
+  }
+  else
+  {
+    if (pNdb->getDictionary()->createIndex(pIdx) != 0){
+      attr->indexCreated = false;
+      ndbout << "FAILED!" << endl;
+      const NdbError err = pNdb->getDictionary()->getNdbError();
+      ERR(err);
+      if (err.classification == NdbError::ApplicationError)
+        return SKIP_INDEX;
+      
+      if (err.status == NdbError::TemporaryError)
+        return SKIP_INDEX;
+      
+      return NDBT_FAILED;
+    } else {
+      ndbout << "OK!" << endl;
+      attr->indexCreated = true;
+    }
   }
   return result;
 }
@@ -337,7 +358,8 @@ int createPkIndex(NDBT_Context* ctx, NDB
   Ndb* pNdb = GETNDB(step);
 
   bool logged = ctx->getProperty("LoggedIndexes", 1);
-
+  bool noddl= ctx->getProperty("NoDDL");
+  
   // Create index    
   BaseString::snprintf(pkIdxName, 255, "IDC_PK_%s", pTab->getName());
   if (orderedIndex)
@@ -363,11 +385,30 @@ int createPkIndex(NDBT_Context* ctx, NDB
   
   pIdx.setStoredIndex(logged);
   ndbout << ") ";
-  if (pNdb->getDictionary()->createIndex(pIdx) != 0){
-    ndbout << "FAILED!" << endl;
-    const NdbError err = pNdb->getDictionary()->getNdbError();
-    ERR(err);
-    return NDBT_FAILED;
+  if (noddl)
+  {
+    const NdbDictionary::Index* idx= pNdb->
+      getDictionary()->getIndex(pkIdxName, pTab->getName());
+    
+    if (!idx)
+    {
+      ndbout << "Failed - Index does not exist and DDL not allowed" << endl;
+      ERR(pNdb->getDictionary()->getNdbError());
+      return NDBT_FAILED;
+    }
+    else
+    {
+      // TODO : Check index definition is ok
+    }
+  }
+  else
+  {
+    if (pNdb->getDictionary()->createIndex(pIdx) != 0){
+      ndbout << "FAILED!" << endl;
+      const NdbError err = pNdb->getDictionary()->getNdbError();
+      ERR(err);
+      return NDBT_FAILED;
+    }
   }
 
   ndbout << "OK!" << endl;
@@ -378,15 +419,20 @@ int createPkIndex_Drop(NDBT_Context* ctx
   const NdbDictionary::Table* pTab = ctx->getTab();
   Ndb* pNdb = GETNDB(step);
 
+  bool noddl= ctx->getProperty("NoDDL");
+
   // Drop index
-  ndbout << "Dropping index " << pkIdxName << " ";
-  if (pNdb->getDictionary()->dropIndex(pkIdxName, 
-				       pTab->getName()) != 0){
-    ndbout << "FAILED!" << endl;
-    ERR(pNdb->getDictionary()->getNdbError());
-    return NDBT_FAILED;
-  } else {
-    ndbout << "OK!" << endl;
+  if (!noddl)
+  {
+    ndbout << "Dropping index " << pkIdxName << " ";
+    if (pNdb->getDictionary()->dropIndex(pkIdxName, 
+                                         pTab->getName()) != 0){
+      ndbout << "FAILED!" << endl;
+      ERR(pNdb->getDictionary()->getNdbError());
+      return NDBT_FAILED;
+    } else {
+      ndbout << "OK!" << endl;
+    }
   }
   
   return NDBT_OK;
@@ -755,7 +801,6 @@ int runSystemRestart1(NDBT_Context* ctx,
 
   UtilTransactions utilTrans(*ctx->getTab());
   HugoTransactions hugoTrans(*ctx->getTab());
-  const char * name = ctx->getTab()->getName();
   while(i<=loops && result != NDBT_FAILED){
 
     ndbout << "Loop " << i << "/"<< loops <<" started"
<< endl;
@@ -887,6 +932,17 @@ int runSystemRestart1(NDBT_Context* ctx,
 }
 
 #define CHECK2(b, t) if(!b){ g_err << __LINE__ << ": " << t <<
endl; break;}
+#define CHECKOKORTIMEOUT(e, t) { int rc= (e);        \
+    if (rc != 0) {                                      \
+      if (rc == 266) {                                  \
+        g_err << "Timeout : retries left : "            \
+              << timeoutRetries                         \
+              << endl;                                  \
+        continue;                                       \
+      }                                                 \
+      g_err << __LINE__ << ": " << (t) << endl; break;  \
+    } }
+
 
 int
 runMixed1(NDBT_Context* ctx, NDBT_Step* step){
@@ -895,6 +951,7 @@ runMixed1(NDBT_Context* ctx, NDBT_Step* 
   Ndb* pNdb = GETNDB(step);
   HugoOperations hugoOps(*ctx->getTab());
 
+  /* Old, rather ineffective testcase which nonetheless passes on 6.3 */
 
   do {
     // TC1
@@ -950,6 +1007,413 @@ runMixed1(NDBT_Context* ctx, NDBT_Step* 
   return NDBT_FAILED;
 }
 
+
+
+int
+runMixedUpdateInterleaved(Ndb* pNdb,
+                          HugoOperations& hugoOps,
+                          int outOfRangeRec,
+                          int testSize,
+                          bool commit,
+                          bool abort,
+                          int pkFailRec,
+                          int ixFailRec,
+                          bool invertFail,
+                          AbortOption ao,
+                          int whatToUpdate,
+                          int updatesValue,
+                          bool ixFirst)
+{
+  Uint32 execRc= 0;
+  if ((pkFailRec != -1) || (ixFailRec != -1))
+  {
+    execRc= 626;
+  }
+  
+  bool updateViaPk= whatToUpdate & 1;
+  bool updateViaIx= whatToUpdate & 2;
+
+  int ixOpNum= (ixFirst?0:1);
+  int pkOpNum= (ixFirst?1:0);
+
+  int timeoutRetries= 3;
+
+  while (timeoutRetries--)
+  {
+    CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction");
+    for (int i=0; i < testSize; i++)
+    {
+      /* invertFail causes all issued reads *except* the fail record number
+       * to fail
+       */
+      int indxKey= ((i == ixFailRec)^invertFail)? outOfRangeRec : i;
+      int pkKey= ((i == pkFailRec)^invertFail)? outOfRangeRec : i;
+      
+      for (int opNum=0; opNum < 2; opNum++)
+      {
+        if (opNum == ixOpNum)
+        {
+          if (updateViaIx)
+          {
+            CHECK2(hugoOps.indexUpdateRecord(pNdb, pkIdxName, indxKey, 1, updatesValue)
== 0,
+                   "indexUpdateRecord");
+          }
+          else
+          {
+            CHECK2(hugoOps.indexReadRecords(pNdb, pkIdxName, indxKey) == 0,
"indexReadRecords");
+          }
+        }
+        
+        if (opNum == pkOpNum)
+        {
+          if (updateViaPk)
+          {
+            CHECK2(hugoOps.pkUpdateRecord(pNdb, pkKey, 1, updatesValue) == 0, 
+                   "pkUpdateRecord");
+          }
+          else
+          {
+            CHECK2(hugoOps.pkReadRecord(pNdb, pkKey) == 0, "pkReadRecord");
+          }
+        }
+      }
+    }
+    if (commit)
+    {
+      int rc= hugoOps.execute_Commit(pNdb, ao);
+      if (rc == 266)
+      {
+        /* Timeout */
+        g_err << "Timeout : retries left=" << timeoutRetries << endl;
+        hugoOps.closeTransaction(pNdb);
+        continue;
+      }
+      CHECK2(rc == execRc, "execute_Commit");
+      NdbError err= hugoOps.getTransaction()->getNdbError();
+      CHECK2(err.code == execRc, "getNdbError");
+    }
+    else
+    {
+      int rc= hugoOps.execute_NoCommit(pNdb, ao);
+      if (rc == 266)
+      {
+        /* Timeout */
+        g_err << "Timeout : retries left=" << timeoutRetries << endl;
+        hugoOps.closeTransaction(pNdb);
+        continue;
+      }
+      CHECK2(rc == execRc, "execute_NoCommit");
+      NdbError err= hugoOps.getTransaction()->getNdbError();
+      CHECK2(err.code == execRc, "getNdbError");
+      if (execRc && (ao == AO_IgnoreError))
+      {
+        /* Transaction should still be open, let's commit it */
+        CHECK2(hugoOps.execute_Commit(pNdb, ao) == 0, "executeCommit");
+      }
+      else if (abort)
+      {
+        CHECK2(hugoOps.execute_Rollback(pNdb) == 0, "executeRollback");
+      }
+    }
+    CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction");
+    
+    return 1;
+  }
+
+  hugoOps.closeTransaction(pNdb);
+  return 0;
+}
+
+
+
+int
+runMixed2(NDBT_Context* ctx, NDBT_Step* step){
+  Ndb* pNdb = GETNDB(step);
+  HugoOperations hugoOps(*ctx->getTab());
+
+  int numRecordsInTable= ctx->getNumRecords();
+  const int maxTestSize= 10000;
+  int testSize= MIN(numRecordsInTable, maxTestSize);
+
+  /* Avoid overloading Send Buffers */
+  Uint32 rowSize= 
NdbDictionary::getRecordRowLength(ctx->getTab()->getDefaultRecord());
+  Uint32 dataXfer= 2 * rowSize * testSize;
+  const Uint32 MaxDataXfer= 500000; // 0.5M
+
+  if (dataXfer > MaxDataXfer)
+  {
+    testSize= MIN((int)(MaxDataXfer/rowSize), testSize);
+  }
+
+  g_err << "testSize= " << testSize << endl;
+  g_err << "rowSize= " << rowSize << endl;
+
+  int updatesValue= 1;
+  const int maxTimeoutRetries= 3; 
+
+  do {
+    // TC0
+    {
+      bool ok= false;
+      int timeoutRetries= maxTimeoutRetries;
+      while (timeoutRetries--)
+      {
+        g_err << "TC0 : indexRead, pkread, Commit" << endl;
+        CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction");
+        CHECK2(hugoOps.indexReadRecords(pNdb, pkIdxName, 0, false, testSize) == 0,
"indexReadRecords");
+        CHECK2(hugoOps.pkReadRecord(pNdb, 0, testSize) == 0, "pkReadRecord");
+        CHECKOKORTIMEOUT(hugoOps.execute_Commit(pNdb), "executeCommit");
+        CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction");
+        
+        ok= true;
+        break;
+      }
+      if (!ok) { break; };
+    }
+    
+    
+    // TC1
+    {
+      bool ok= false;
+      int timeoutRetries= maxTimeoutRetries;
+      while (timeoutRetries--)
+      {
+        g_err << "TC1 : pkRead, indexRead, Commit" << endl;
+        CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction");
+        CHECK2(hugoOps.pkReadRecord(pNdb, 0, testSize) == 0, "pkReadRecord");
+        CHECK2(hugoOps.indexReadRecords(pNdb, pkIdxName, 0, false, testSize) == 0,
"indexReadRecords");
+        CHECKOKORTIMEOUT(hugoOps.execute_Commit(pNdb), "executeCommit");
+        CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction");
+        
+        ok= true;
+        break;
+      }
+      if (!ok) { break; };
+    }
+    
+    // TC2
+    {
+      bool ok= false;
+      int timeoutRetries= maxTimeoutRetries;
+      while (timeoutRetries--)
+      {
+        g_err << "TC2 : pkRead, indexRead, NoCommit, Commit" << endl;
+        CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction");
+        CHECK2(hugoOps.pkReadRecord(pNdb, 0, testSize) == 0, "pkReadRecord");
+        CHECK2(hugoOps.indexReadRecords(pNdb, pkIdxName, 0, false, testSize) == 0,
+               "indexReadRecords");
+        CHECKOKORTIMEOUT(hugoOps.execute_NoCommit(pNdb), "executeNoCommit");
+        CHECK2(hugoOps.execute_Commit(pNdb) == 0, "executeCommit");
+        CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction");
+        ok= true;
+        break;
+      }
+      if (!ok) { break; };
+    }
+    
+    // TC3
+    {
+      bool ok= false;
+      int timeoutRetries= maxTimeoutRetries;
+      while (timeoutRetries--)
+      {
+        g_err << "TC3 : pkRead, pkRead, Commit" << endl;
+        CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction ");
+        CHECK2(hugoOps.pkReadRecord(pNdb, 0, testSize) == 0, "pkReadRecords ");
+        CHECK2(hugoOps.pkReadRecord(pNdb, 0, testSize) == 0, "pkReadRecords ");
+        CHECKOKORTIMEOUT(hugoOps.execute_Commit(pNdb), "executeCommit");
+        CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction ");
+        ok= true;
+        break;
+      }
+      if (!ok) { break; };
+    }
+    
+    // TC4
+    {
+      bool ok= false;
+      int timeoutRetries= maxTimeoutRetries;
+      while (timeoutRetries--)
+      {
+        g_err << "TC4 : indexRead, indexRead, Commit" << endl;
+        CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction ");
+        CHECK2(hugoOps.indexReadRecords(pNdb, pkIdxName, 0, false, testSize) == 0,
"indexReadRecords");
+        CHECK2(hugoOps.indexReadRecords(pNdb, pkIdxName, 0, false, testSize) == 0,
"indexReadRecords");
+        CHECKOKORTIMEOUT(hugoOps.execute_Commit(pNdb), "executeCommit");
+        CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction ");
+        ok= true;
+        break;
+      }
+      if (!ok) { break; };
+    }
+    
+    // TC5
+    {
+      bool ok= false;
+      int timeoutRetries= maxTimeoutRetries;
+      while (timeoutRetries--)
+      {
+        g_err << "TC5 : indexRead, pkUpdate, Commit" << endl;
+        CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction");
+        CHECK2(hugoOps.indexReadRecords(pNdb, pkIdxName, 0, false, testSize) == 0,
"indexReadRecords");
+        CHECK2(hugoOps.pkUpdateRecord(pNdb, 0, testSize, updatesValue++) == 0,
"pkUpdateRecord");
+        CHECKOKORTIMEOUT(hugoOps.execute_Commit(pNdb), "executeCommit");
+        CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction");
+        ok= true;
+        break;
+      }
+      if (!ok) { break; };
+    }
+    
+    // TC6
+    {
+      bool ok= false;
+      int timeoutRetries= maxTimeoutRetries;
+      while (timeoutRetries--)
+      {
+        g_err << "TC6 : pkUpdate, indexRead, Commit" << endl;
+        CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction");
+        CHECK2(hugoOps.pkUpdateRecord(pNdb, 0, testSize, updatesValue++) == 0,
"pkUpdateRecord");
+        CHECK2(hugoOps.indexReadRecords(pNdb, pkIdxName, 0, false, testSize) == 0,
"indexReadRecords");
+        CHECKOKORTIMEOUT(hugoOps.execute_Commit(pNdb), "executeCommit");
+        CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction");
+        ok= true;
+        break;
+      }
+      if (!ok) { break; };
+    }
+    
+    // TC7
+    {
+      bool ok= false;
+      int timeoutRetries= maxTimeoutRetries;
+      while (timeoutRetries--)
+      {
+        g_err << "TC7 : pkRead, indexUpdate, Commit" << endl;
+        CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction");
+        CHECK2(hugoOps.pkReadRecord(pNdb, 0, testSize) == 0, "pkReadRecord");
+        CHECK2(hugoOps.indexUpdateRecord(pNdb, pkIdxName, 0, testSize, updatesValue++) ==
0,
+               "indexReadRecords");
+        CHECKOKORTIMEOUT(hugoOps.execute_Commit(pNdb), "executeCommit");
+        CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction");
+        ok= true;
+        break;
+      }
+      if (!ok) { break; };
+    }
+    
+    // TC8
+    {
+      bool ok= false;
+      int timeoutRetries= maxTimeoutRetries;
+      while (timeoutRetries--)
+      {
+        g_err << "TC8 : indexUpdate, pkRead, Commit" << endl;
+        CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction ");
+        CHECK2(hugoOps.indexUpdateRecord(pNdb, pkIdxName, 0, testSize, updatesValue++) ==
0, 
+               "indexReadRecords ");
+        CHECK2(hugoOps.pkReadRecord(pNdb, 0, testSize) == 0, "pkReadRecords ");
+        CHECKOKORTIMEOUT(hugoOps.execute_Commit(pNdb), "executeCommit");
+        CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction ");
+        ok= true;
+        break;
+      }
+      if (!ok) { break; };
+    }
+
+    for (int ao=0; ao < 2; ao++)
+    {
+      AbortOption abortOption= ao?AO_IgnoreError:AbortOnError;
+      
+      for (int exType=0; exType < 3; exType++)
+      {
+        bool commit= (exType == 1);
+        bool abort= (exType == 2);
+        
+        const char* exTypeStr= ((exType == 0) ? "NoCommit" : 
+                                (exType == 1) ? "Commit" : 
+                                "Abort");
+        
+        for (int failType= 0; failType < 4; failType++)
+        {
+          for (int failPos= 0; failPos < 2; failPos++)
+          {
+            int failRec= (failPos == 0)? 0 : testSize -1;
+            int pkFailRec= -1;
+            int ixFailRec= -1;
+            if (failType)
+            {
+              if (failType & 1)
+                pkFailRec= failRec;
+              if (failType & 2)
+                ixFailRec= failRec;
+            }
+            
+            for (int invFail= 0; 
+                 invFail < ((failType==0)?1:2); 
+                 invFail++)
+            {
+              bool invertFail= (invFail)?true:false;
+              const char* failTypeStr= ((failType==0)? "None" : 
+                                        ((failType==1)? "Pk": 
+                                         ((failType==2)?"Ix": "Both")));
+              for (int updateVia= 0; updateVia < 3; updateVia++)
+              {
+                const char* updateViaStr= ((updateVia == 0)? "None" : 
+                                           (updateVia == 1)? "Pk" :
+                                           (updateVia == 2)? "Ix" :
+                                           "Both");
+                for (int updateOrder= 0; updateOrder < 2; updateOrder++)
+                {
+                  bool updateIxFirst= (updateOrder == 0);
+                  g_err << endl
+                        << "AbortOption : " <<
(ao?"IgnoreError":"AbortOnError") << endl
+                        << "ExecType : " << exTypeStr << endl
+                        << "Failtype : " << failTypeStr << endl
+                        << "Failpos : " << ((failPos == 0)? "Early" : "Late")
<< endl
+                        << "Failure scenarios : " << (invFail?"All but
one":"one") << endl
+                        << "UpdateVia : " << updateViaStr << endl
+                        << "Order : " << (updateIxFirst? "Index First" : "Pk
first") << endl;
+                  bool ok= false;
+                  do
+                  {
+                    g_err << "Mixed read/update interleaved" << endl;
+                    CHECK2(runMixedUpdateInterleaved(pNdb, hugoOps, numRecordsInTable,
testSize, 
+                                                     commit,  // Commit 
+                                                     abort, // Abort 
+                                                     pkFailRec,    // PkFail
+                                                     ixFailRec,   // IxFail
+                                                     invertFail, // Invertfail
+                                                     abortOption,
+                                                     updateVia,
+                                                     updatesValue++,
+                                                     updateIxFirst),
+                         "TC4");
+                    
+                    ok= true;
+                  } while (false);
+                  
+                  if (!ok)
+                  {
+                    hugoOps.closeTransaction(pNdb);
+                    return NDBT_FAILED;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+
+    return NDBT_OK;
+  } while (false);
+  
+  hugoOps.closeTransaction(pNdb);
+  return NDBT_FAILED;
+}
+
+
 int
 runBuildDuring(NDBT_Context* ctx, NDBT_Step* step){
   // Verify that data in index match 
@@ -1139,13 +1603,33 @@ runUniqueNullTransactions(NDBT_Context* 
     return NDBT_FAILED;
   }
   
-  if (pNdb->getDictionary()->createIndex(pIdx) != 0){
-    ndbout << "FAILED!" << endl;
-    const NdbError err = pNdb->getDictionary()->getNdbError();
-    ERR(err);
-    return NDBT_FAILED;
+  bool noddl= ctx->getProperty("NoDDL");
+  if (noddl)
+  {
+    const NdbDictionary::Index* idx= pNdb->
+      getDictionary()->getIndex(pIdx.getName(), pTab->getName());
+    
+    if (!idx)
+    {
+      ndbout << "Failed - Index does not exist and DDL not allowed" << endl;
+      ERR(pNdb->getDictionary()->getNdbError());
+      return NDBT_FAILED;
+    }
+    else
+    {
+      // TODO : Check index definition is ok
+    }
   }
-  
+  else
+  {
+    if (pNdb->getDictionary()->createIndex(pIdx) != 0){
+      ndbout << "FAILED!" << endl;
+      const NdbError err = pNdb->getDictionary()->getNdbError();
+      ERR(err);
+      return NDBT_FAILED;
+    }
+  }
+
   int result = NDBT_OK;
 
   HugoTransactions hugoTrans(*ctx->getTab());
@@ -1172,7 +1656,6 @@ runUniqueNullTransactions(NDBT_Context* 
   result = NDBT_FAILED;
   pTrans = pNdb->startTransaction();
   NdbScanOperation * sOp;
-  NdbOperation * uOp;
   int eof;
   if(!pTrans) goto done;
   sOp = pTrans->getNdbScanOperation(pTab->getName());
@@ -1196,7 +1679,6 @@ runUniqueNullTransactions(NDBT_Context* 
 }
 
 int runLQHKEYREF(NDBT_Context* ctx, NDBT_Step* step){
-  int result = NDBT_OK;
   int loops = ctx->getNumLoops() * 100;
   NdbRestarter restarter;
   
@@ -1286,7 +1768,7 @@ runBug25059(NDBT_Context* ctx, NDBT_Step
     ops.startTransaction(pNdb);
     ops.pkReadRecord(pNdb, 10 + rand() % rows, rows);
     int tmp;
-    if (tmp = ops.execute_Commit(pNdb, AO_IgnoreError))
+    if ((tmp = ops.execute_Commit(pNdb, AO_IgnoreError)))
     {
       if (tmp == 4012)
 	res = NDBT_FAILED;
@@ -1313,7 +1795,7 @@ runBug25059(NDBT_Context* ctx, NDBT_Step
       ndbout_c("ignore error");
       break;
     }
-    if (tmp = ops.execute_Commit(pNdb, (AbortOption)arg))
+    if ((tmp = ops.execute_Commit(pNdb, (AbortOption)arg)))
     {
       if (tmp == 4012)
 	res = NDBT_FAILED;
@@ -1343,7 +1825,6 @@ int tcSaveINDX_test(NDBT_Context* ctx, N
 
   int loops = ctx->getNumLoops();
   const int rows = ctx->getNumRecords();
-  const int batchsize = ctx->getProperty("BatchSize", 1);
 
   for(int bs=1; bs < loops; bs++)
   {
@@ -1687,6 +2168,16 @@ TESTCASE("MixedTransaction", 
   FINALIZER(createPkIndex_Drop);
   FINALIZER(runClearTable);
 }
+TESTCASE("MixedTransaction2", 
+	 "Test mixing of index and normal operations with batching"){ 
+  TC_PROPERTY("LoggedIndexes", (unsigned)0);
+  INITIALIZER(runClearTable);
+  INITIALIZER(createPkIndex);
+  INITIALIZER(runLoadTable);
+  STEP(runMixed2);
+  FINALIZER(createPkIndex_Drop);
+  FINALIZER(runClearTable);
+}
 TESTCASE("SR1_O", 
 	 "Test that indexes are correctly maintained during SR"){ 
   TC_PROPERTY("OrderedIndex", 1);

=== modified file 'storage/ndb/test/src/NDBT_Test.cpp'
--- a/storage/ndb/test/src/NDBT_Test.cpp	2009-05-27 12:11:46 +0000
+++ b/storage/ndb/test/src/NDBT_Test.cpp	2009-07-03 14:15:09 +0000
@@ -775,6 +775,7 @@ NDBT_TestSuite::NDBT_TestSuite(const cha
    createAllTables = false;
    temporaryTables = false;
    nologging = false;
+   noddl= false;
 }
 
 
@@ -867,26 +868,48 @@ int NDBT_TestSuite::executeAll(Ndb_clust
 	const NdbDictionary::Table* pTab = NDBT_Tables::getTable(t);
 	const NdbDictionary::Table* pTab2 = pDict->getTable(pTab->getName());
 	
-	if(pTab2 != 0 && pDict->dropTable(pTab->getName()) != 0)
-	{
-	  numTestsFail++;
-	  numTestsExecuted++;
-	  g_err << "ERROR0: Failed to drop table " << pTab->getName() <<
endl;
-	  tests[i]->saveTestResult(pTab, FAILED_TO_CREATE);
-	  continue;
-	}
-      
-	if (NDBT_Tables::createTable(&ndb, pTab->getName(), 
-                                     nologging, false,
-				     g_create_hook, this) != 0) {
-	  numTestsFail++;
-	  numTestsExecuted++;
-	  g_err << "ERROR1: Failed to create table " << pTab->getName()
-		<< pDict->getNdbError() << endl;
-	  tests[i]->saveTestResult(pTab, FAILED_TO_CREATE);
-	  continue;
-	}
-	pTab2 = pDict->getTable(pTab->getName());
+        if (noddl)
+        {
+          if (!pTab2)
+          {
+            numTestsFail++;
+            numTestsExecuted++;
+            g_err << "ERROR : Table not defined and DDL not allowed " 
+                  << pTab->getName() << endl;
+            g_err << "Required schema : " << *((NDBT_Table*)pTab) <<
endl;
+            tests[i]->saveTestResult(pTab, FAILED_TO_CREATE);
+            continue;
+          }
+          else
+          {
+            /* TODO : Check that table in DB is sufficiently similar to 
+             * what we expect
+             */
+          }
+        }
+        else
+        {
+          if(pTab2 != 0 && pDict->dropTable(pTab->getName()) != 0)
+          {
+            numTestsFail++;
+            numTestsExecuted++;
+            g_err << "ERROR0: Failed to drop table " << pTab->getName()
<< endl;
+            tests[i]->saveTestResult(pTab, FAILED_TO_CREATE);
+            continue;
+          }
+          
+          if (NDBT_Tables::createTable(&ndb, pTab->getName(), 
+                                       nologging, false,
+                                       g_create_hook, this) != 0) {
+            numTestsFail++;
+            numTestsExecuted++;
+            g_err << "ERROR1: Failed to create table " << pTab->getName()
+                  << pDict->getNdbError() << endl;
+            tests[i]->saveTestResult(pTab, FAILED_TO_CREATE);
+            continue;
+          }
+          pTab2 = pDict->getTable(pTab->getName());
+        }
 
 	ctx->addTab(pTab2);
       }
@@ -896,6 +919,7 @@ int NDBT_TestSuite::executeAll(Ndb_clust
       if(remote_mgm != NULL)
 	ctx->setRemoteMgm(remote_mgm);
       ctx->setSuite(this);
+      ctx->setProperty("NoDDL", (Uint32)noddl);
       
       const NdbDictionary::Table** tables= ctx->getTables();
 
@@ -909,10 +933,13 @@ int NDBT_TestSuite::executeAll(Ndb_clust
       
       if(result == NDBT_OK)
       {
-	for(t = 0; tables[t] != 0; t++)
-	{ 
-	  pDict->dropTable(tables[t]->getName());
-	}
+        if (!noddl)
+        {
+          for(t = 0; tables[t] != 0; t++)
+          { 
+            pDict->dropTable(tables[t]->getName());
+          }
+        }
       }
       
       delete ctx;
@@ -990,6 +1017,7 @@ NDBT_TestSuite::executeOneCtx(Ndb_cluste
       if(remote_mgm != NULL)
         ctx->setRemoteMgm(remote_mgm);
       ctx->setSuite(this);
+      ctx->setProperty("NoDDL", (Uint32) noddl);
     
       result = tests[t]->execute(ctx);
       if (result != NDBT_OK)
@@ -1062,28 +1090,51 @@ void NDBT_TestSuite::execute(Ndb_cluster
 
     NdbDictionary::Dictionary* pDict = ndb->getDictionary();
     const NdbDictionary::Table* pTab2 = pDict->getTable(pTab->getName());
-    if (createTable == true){
-
-      if(pTab2 != 0 && pDict->dropTable(pTab->getName()) != 0){
-	numTestsFail++;
-	numTestsExecuted++;
-	g_err << "ERROR0: Failed to drop table " << pTab->getName() <<
endl;
-	tests[t]->saveTestResult(pTab, FAILED_TO_CREATE);
-	continue;
+    if (noddl)
+    {
+      if (!pTab2)
+      {
+        numTestsFail++;
+        numTestsExecuted++;
+        g_err << "ERROR : Table not defined and DDL not allowed " 
+              << pTab->getName() << endl;
+        g_err << "Required schema : " << *((NDBT_Table*)pTab) << endl;
+        tests[t]->saveTestResult(pTab, FAILED_TO_CREATE);
+        continue;
       }
-      
-      if (NDBT_Tables::createTable(ndb, pTab->getName(), nologging, false,
-                                   g_create_hook, this) != 0) {
-	numTestsFail++;
-	numTestsExecuted++;
-	g_err << "ERROR1: Failed to create table " << pTab->getName()
-              << pDict->getNdbError() << endl;
-	tests[t]->saveTestResult(pTab, FAILED_TO_CREATE);
-	continue;
+      else
+      {
+        /* TODO : Check that table in DB is sufficiently similar to 
+         * what we expect
+         */
+      }
+    }
+    else
+    {
+      if (createTable)
+      {
+        if(pTab2 != 0 && pDict->dropTable(pTab->getName()) != 0){
+          numTestsFail++;
+          numTestsExecuted++;
+          g_err << "ERROR0: Failed to drop table " << pTab->getName()
<< endl;
+          tests[t]->saveTestResult(pTab, FAILED_TO_CREATE);
+          continue;
+        }
+        
+        if (NDBT_Tables::createTable(ndb, pTab->getName(), nologging, false,
+                                     g_create_hook, this) != 0) {
+          numTestsFail++;
+          numTestsExecuted++;
+          g_err << "ERROR1: Failed to create table " << pTab->getName()
+                << pDict->getNdbError() << endl;
+          tests[t]->saveTestResult(pTab, FAILED_TO_CREATE);
+          continue;
+        }
+        pTab2 = pDict->getTable(pTab->getName());
+      } else if(!pTab2) {
+        // Weird -  used in testDict?
+        pTab2 = pTab;
       }
-      pTab2 = pDict->getTable(pTab->getName());
-    } else if(!pTab2) {
-      pTab2 = pTab;
     } 
     
     ctx = new NDBT_Context(con);
@@ -1093,6 +1144,7 @@ void NDBT_TestSuite::execute(Ndb_cluster
     if(remote_mgm != NULL)
       ctx->setRemoteMgm(remote_mgm);
     ctx->setSuite(this);
+    ctx->setProperty("NoDDL", (Uint32) noddl);
     
     result = tests[t]->execute(ctx);
     tests[t]->saveTestResult(pTab, result);
@@ -1102,7 +1154,10 @@ void NDBT_TestSuite::execute(Ndb_cluster
       numTestsOk++;
     numTestsExecuted++;
 
-    if (result == NDBT_OK && createTable == true && createAllTables ==
false){
+    if (result == NDBT_OK && 
+        createTable == true && 
+        createAllTables == false &&
+        !noddl){
       pDict->dropTable(pTab->getName());
     }
     
@@ -1194,6 +1249,7 @@ static int opt_verbose;
 static int opt_seed = 0;
 static int opt_nologging = 0;
 static int opt_temporary = 0;
+static int opt_noddl = 0;
 
 static struct my_option my_long_options[] =
 {
@@ -1235,6 +1291,9 @@ static struct my_option my_long_options[
   { "nologging", 0, "Create table(s) wo/ logging",
     (uchar **) &opt_nologging, (uchar **) &opt_nologging, 0,
     GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
+  { "noddl", 0, "Don't create/drop tables as part of running tests",
+    (uchar**) &opt_noddl, (uchar**) &opt_noddl, 0,
+    GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
   { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
 };
 
@@ -1315,6 +1374,7 @@ int NDBT_TestSuite::execute(int argc, co
   timer = opt_timer;
   nologging = opt_nologging;
   temporaryTables = opt_temporary;
+  noddl = opt_noddl;
 
   Ndb_cluster_connection con;
   if(con.connect(12, 5, 1))
@@ -1355,18 +1415,36 @@ int NDBT_TestSuite::execute(int argc, co
       {
 	const char *tab_name=  m_tables_in_test[i].c_str();
 	const NdbDictionary::Table* pTab = pDict->getTable(tab_name);
-	if (pTab && pDict->dropTable(tab_name) != 0)
-	{
-	  g_err << "ERROR0: Failed to drop table " << tab_name
-		<< pDict->getNdbError() << endl;
-	  return NDBT_ProgramExit(NDBT_FAILED);
-	}
-	if(NDBT_Tables::createTable(&ndb, tab_name, nologging) != 0)
-	{
-	  g_err << "ERROR1: Failed to create table " << tab_name
-		<< pDict->getNdbError() << endl;
-	  return NDBT_ProgramExit(NDBT_FAILED);
-	}
+	if (noddl)
+        {
+          if (!pTab)
+          {
+            g_err << "ERROR : Table " << tab_name
+                  << " does not exist and DDL not allowed" << endl;
+            return NDBT_ProgramExit(NDBT_FAILED);
+          }
+          else
+          {
+            /* TODO : Check that table in DB is sufficiently similar to 
+             * what we expect
+             */
+          }
+        }
+        else
+        { 
+          if (pTab && pDict->dropTable(tab_name) != 0)
+          {
+            g_err << "ERROR0: Failed to drop table " << tab_name
+                  << pDict->getNdbError() << endl;
+            return NDBT_ProgramExit(NDBT_FAILED);
+          }
+          if(NDBT_Tables::createTable(&ndb, tab_name, nologging) != 0)
+          {
+            g_err << "ERROR1: Failed to create table " << tab_name
+                  << pDict->getNdbError() << endl;
+            return NDBT_ProgramExit(NDBT_FAILED);
+          }
+        }
       }
     }
   }
@@ -1383,7 +1461,9 @@ int NDBT_TestSuite::execute(int argc, co
     res = report(opt_testname);
   }
 
-  if (res == NDBT_OK && createAllTables == true)
+  if (res == NDBT_OK && 
+      createAllTables == true &&
+      !noddl)
   {
     Ndb ndb(&con, "TEST_DB");
     ndb.init(1024);

=== modified file 'storage/ndb/test/tools/create_index.cpp'
--- a/storage/ndb/test/tools/create_index.cpp	2009-05-26 18:53:34 +0000
+++ b/storage/ndb/test/tools/create_index.cpp	2009-07-03 14:15:09 +0000
@@ -33,12 +33,16 @@ main(int argc, const char** argv){
   const char* _dbname = "TEST_DB";
   int _help = 0;
   int _ordered = 0, _pk = 1;
+  char* _iname= NULL;
+  char* _tname= NULL;
 
   struct getargs args[] = {
     { "database", 'd', arg_string, &_dbname, "dbname", 
       "Name of database table is in"},
     { "ordered", 'o', arg_flag, &_ordered, "Create ordered index", "" },
     { "pk", 'p', arg_flag, &_pk, "Create index on primary key", "" },
+    { "idxname", 'i', arg_string, &_iname, "idxname", "Override default name for
index" },
+    { "tabname", 't', arg_string, &_tname, "tabname", "Specify single tabname and
list of col names as args" },
     { "usage", '?', arg_flag, &_help, "Print help", "" }
   };
 
@@ -73,16 +77,15 @@ main(int argc, const char** argv){
   NdbDictionary::Dictionary * dict = MyNdb.getDictionary();
   
   for(int i = optind; i<argc; i++){
-    const NdbDictionary::Table * tab = dict->getTable(argv[i]);
+    const char* tabName= (_tname)? _tname : argv[i];
+    const NdbDictionary::Table * tab = dict->getTable(tabName);
     if(tab == 0){
-      g_err << "Unknown table: " << argv[i] << endl;
+      g_err << "Unknown table: " << tabName << endl;
+      if (_tname)
+        return NDBT_ProgramExit(NDBT_FAILED);
       continue;
     }
     
-    if(tab->getNoOfColumns() > 16){
-      g_err << "Table " <<  argv[i] << " has more than 16 columns"
<< endl;
-    }
-    
     NdbDictionary::Index ind;
     if(_ordered){
       ind.setType(NdbDictionary::Index::OrderedIndex);
@@ -91,20 +94,59 @@ main(int argc, const char** argv){
       ind.setType(NdbDictionary::Index::UniqueHashIndex);
     }
     char buf[512];
-    sprintf(buf, "IND_%s_%s_%c", 
-	    argv[i], (_pk ? "PK" : "FULL"), (_ordered ? 'O' : 'U'));
-    ind.setName(buf);
-    ind.setTable(argv[i]);
-    for(int c = 0; c<tab->getNoOfColumns(); c++){
-      if(!_pk || tab->getColumn(c)->getPrimaryKey())
-	ind.addIndexColumn(tab->getColumn(c)->getName());
+    if (!_iname)
+    {
+      sprintf(buf, "IND_%s_%s_%c", 
+              argv[i], (_pk ? "PK" : "FULL"), (_ordered ? 'O' : 'U'));
+      ind.setName(buf);
+    }
+    else
+    {
+      ind.setName(_iname);
+    }
+
+    ind.setTable(tabName);
+
+    if (!_tname)
+    {
+      ndbout << "creating index " << ind.getName() << " on table "
<< tabName
+             << "(";
+      for(int c = 0; c<tab->getNoOfColumns(); c++){
+        if(!_pk || tab->getColumn(c)->getPrimaryKey())
+        {
+          ndbout << tab->getColumn(c)->getName() << ", ";
+          ind.addIndexColumn(tab->getColumn(c)->getName());
+        }
+      }
+      ndbout << ")" << endl;
+    }
+    else
+    {
+      /* Treat args as column names */
+      ndbout << "creating index " << ind.getName() << " on table "
<< tabName
+             << "(";
+      for(int argNum=i; argNum < argc; argNum++)
+      {
+        const char* colName= argv[argNum];
+        if (tab->getColumn(colName) == NULL)
+        {
+          g_err << "Column " << colName << " does not exist in table "
<< tabName
+                << endl;
+          return NDBT_ProgramExit(NDBT_FAILED);
+        }
+        ndbout << colName << ", ";
+        ind.addIndexColumn(colName);
+      }
+      ndbout << ")" << endl;
     }
-    ndbout << "creating index " << buf << " on table " << argv[i]
<< "...";
     const int res = dict->createIndex(ind);
     if(res != 0)
       ndbout << endl << dict->getNdbError() << endl;
     else
       ndbout << "OK" << endl;
+
+    if (_tname) // Just create a single index
+      return NDBT_ProgramExit(NDBT_OK);
   }  
   
   return NDBT_ProgramExit(NDBT_OK);

Thread
bzr push into mysql-5.1-telco-6.3 branch (frazer:2993 to 2994)Frazer Clement3 Jul 2009