List:Commits« Previous MessageNext Message »
From:Jan Wedvik Date:September 13 2012 8:06am
Subject:bzr push into mysql-5.1-telco-7.0 branch (jan.wedvik:4971 to 4972)
View as plain text  
 4972 Jan Wedvik	2012-09-13
      This is a followup to revno: 4961: 
      'Update of SPJ component in pre 7.2 branches'.
      
      That commit back ported parts but not all of the online upgrade logic for
      SPJ to 7.0. This commit backports the remainder of the online upgarde logic,
      that is, the parts concerning the API and the TC blocks.
      
      This commit also removes testcases that will no longer work (because of version
      checks) from the daily-basic script. This change should be manually reverted
      when merging this commit to 7.2, as the tests are still supposed to work there.
      Instead, a new test that check that it is not possible to SPJ API extensions
      in pre 7.2 releases have been written (and also added to daily-basic).
      
      Finally, a check of the API version has been added in the API, such that it
      is not possible to use SPJ from API client linked with a pre 7.2 API library.
      (Before this commit, it would have been possible to run a 7.0 client against
      7.2 data nodes.)

    modified:
      storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
      storage/ndb/src/ndbapi/NdbQueryBuilder.cpp
      storage/ndb/src/ndbapi/NdbQueryOperation.cpp
      storage/ndb/test/ndbapi/testSpj.cpp
      storage/ndb/test/run-test/daily-basic-tests.txt
 4971 Frazer Clement	2012-09-12 [merge]
      Merge 6.3->7.0

    modified:
      storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp
      storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
      storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp
      storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
      storage/ndb/test/ndbapi/testScan.cpp
      storage/ndb/test/run-test/daily-basic-tests.txt
=== modified file 'storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp	2012-09-12 14:18:33 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp	2012-09-13 08:05:29 +0000
@@ -1863,6 +1863,14 @@ start_failure:
     abortErrorLab(signal);
     return;
   }
+  case 66:
+  {
+    jam();
+    /* Function not implemented yet */
+    terrorCode = 4003;
+    abortErrorLab(signal);
+    return;
+  }
   default:
     jam();
     systemErrorLab(signal, __LINE__);
@@ -2931,6 +2939,17 @@ void Dbtc::execTCKEYREQ(Signal* signal)
     return;
   }
   
+  if (unlikely(TViaSPJFlag &&
+               /* Check that all nodes can handle SPJ requests. */
+               !ndb_join_pushdown(getNodeVersionInfo().m_type[NodeInfo::DB]
+                                  .m_min_version)))
+  {
+    jam();
+    releaseSections(handle);
+    TCKEY_abort(signal, 66);
+    return;
+  }
+
   /* KeyInfo and AttrInfo are buffered in segmented sections
    * If they arrived in segmented sections then there's nothing to do
    * If they arrived in short signals then they are appended into
@@ -10522,6 +10541,16 @@ void Dbtc::execSCAN_TABREQ(Signal* signa
     goto SCAN_TAB_error;
   }
 
+  if (unlikely (ScanTabReq::getViaSPJFlag(ri) &&
+                /* Check that all nodes can handle SPJ requests. */
+                !ndb_join_pushdown(getNodeVersionInfo().m_type[NodeInfo::DB]
+                                   .m_min_version)))
+  {
+    jam();
+    errCode = 4003; // Function not implemented
+    goto SCAN_TAB_error;
+  }
+
   ptrAss(tabptr, tableRecord);
   if ((aiLength == 0) ||
       (!tabptr.p->checkTable(schemaVersion)) ||

=== modified file 'storage/ndb/src/ndbapi/NdbQueryBuilder.cpp'
--- a/storage/ndb/src/ndbapi/NdbQueryBuilder.cpp	2011-10-20 12:45:36 +0000
+++ b/storage/ndb/src/ndbapi/NdbQueryBuilder.cpp	2012-09-13 08:05:29 +0000
@@ -53,6 +53,7 @@ static const bool doPrintQueryTree = fal
 
 /* Various error codes that are not specific to NdbQuery. */
 static const int Err_MemoryAlloc = 4000;
+static const int Err_FunctionNotImplemented = 4003;
 static const int Err_UnknownColumn = 4004;
 static const int Err_FinaliseNotCalled = 4519;
 
@@ -703,6 +704,13 @@ NdbQueryBuilder* NdbQueryBuilder::create
   {
     if (likely(impl->getNdbError().code == 0))
     {
+      if((!ndb_join_pushdown(ndbGetOwnVersion())))
+      {
+        /* The SPJ code is present in releases where the SPJ feature is
+         * not yet enabled.
+         */
+        impl->setErrorCode(Err_FunctionNotImplemented);
+      }
       return &impl->m_interface;
     }
     else

=== modified file 'storage/ndb/src/ndbapi/NdbQueryOperation.cpp'
--- a/storage/ndb/src/ndbapi/NdbQueryOperation.cpp	2012-06-21 12:33:15 +0000
+++ b/storage/ndb/src/ndbapi/NdbQueryOperation.cpp	2012-09-13 08:05:29 +0000
@@ -1893,6 +1893,12 @@ NdbQueryImpl::buildQuery(NdbTransaction&
                          const NdbQueryDefImpl& queryDef)
 {
   assert(queryDef.getNoOfOperations() > 0);
+  // Check for online upgrade/downgrade.
+  if (unlikely(!ndb_join_pushdown(trans.getNdb()->getMinDbNodeVersion())))
+  {
+    trans.setOperationErrorCodeAbort(Err_FunctionNotImplemented);
+    return NULL;
+  }
   NdbQueryImpl* const query = new NdbQueryImpl(trans, queryDef);
   if (unlikely(query==NULL)) {
     trans.setOperationErrorCodeAbort(Err_MemoryAlloc);

=== modified file 'storage/ndb/test/ndbapi/testSpj.cpp'
--- a/storage/ndb/test/ndbapi/testSpj.cpp	2011-09-14 10:30:08 +0000
+++ b/storage/ndb/test/ndbapi/testSpj.cpp	2012-09-13 08:05:29 +0000
@@ -26,6 +26,7 @@
 #include <HugoQueryBuilder.hpp>
 #include <HugoQueries.hpp>
 #include <NdbSchemaCon.hpp>
+#include <ndb_version.h>
 
 int
 runLoadTable(NDBT_Context* ctx, NDBT_Step* step)
@@ -389,6 +390,7 @@ createNegativeSchema(NDBT_Context* ctx,
 #define QRY_EMPTY_PROJECTION 4826
 
 /* Various error codes that are not specific to NdbQuery. */
+static const int Err_FunctionNotImplemented = 4003;
 static const int Err_UnknownColumn = 4004;
 static const int Err_WrongFieldLength = 4209;
 static const int Err_InvalidRangeNo = 4286;
@@ -414,6 +416,9 @@ public:
   static int valueTest(NDBT_Context* ctx, NDBT_Step* step)
   { return NegativeTest(ctx, step).runValueTest();}
 
+  static int featureDisabledTest(NDBT_Context* ctx, NDBT_Step* step)
+  { return NegativeTest(ctx, step).runFeatureDisabledTest();}
+
 private:
   Ndb* m_ndb;
   NdbDictionary::Dictionary* m_dictionary;
@@ -431,6 +436,7 @@ private:
   int runGraphTest() const;
   int runSetBoundTest() const;
   int runValueTest() const;
+  int runFeatureDisabledTest() const;
   // No copy.
   NegativeTest(const NegativeTest&);
   NegativeTest& operator=(const NegativeTest&);
@@ -1176,6 +1182,61 @@ NegativeTest::runValueTest() const
   return NDBT_OK;
 } // NegativeTest::runValueBoundTest()
 
+/**
+ * Check that query pushdown is disabled in older versions of the code
+ * (even if the API extensions are present in the code).
+ */
+int
+NegativeTest::runFeatureDisabledTest() const
+{
+  NdbQueryBuilder* const builder = NdbQueryBuilder::create();
+  
+  const NdbQueryTableScanOperationDef* const parentOperation
+    = builder->scanTable(m_nt1Tab);
+  
+  int result = NDBT_OK;
+
+  if (ndb_join_pushdown(ndbGetOwnVersion()))
+  {
+    if (parentOperation == NULL)
+    {
+      g_err << "scanTable() failed: " << builder->getNdbError()
+            << endl;
+      result = NDBT_FAILED;
+    }
+    else
+    {
+      g_info << "scanTable() succeeded in version "
+             << ndbGetOwnVersionString() << " as expected." << endl;
+    }
+  }
+  else
+  {
+    // Query pushdown should not be enabled in this version.
+    if (parentOperation != NULL)
+    {
+      g_err << "Succeeded with creating scan operation, which should not be "
+        "possible in version " << ndbGetOwnVersionString() << endl;
+      result = NDBT_FAILED;      
+    }
+    else if (builder->getNdbError().code != Err_FunctionNotImplemented)
+    {
+      g_err << "scanTable() failed with unexpected error: " 
+            << builder->getNdbError() << endl;
+      result = NDBT_FAILED;
+    }
+    else
+    {
+      g_info << "scanTable() failed in version "
+             << ndbGetOwnVersionString() << " as expected with error: " 
+             << builder->getNdbError() << endl;
+    }
+  }
+
+  builder->destroy();
+  return result;
+} // NegativeTest::runFeatureDisabledTest()
+
 static int
 dropNegativeSchema(NDBT_Context* ctx, NDBT_Step* step)
 {
@@ -1204,6 +1265,11 @@ TESTCASE("NegativeJoin", ""){
   INITIALIZER(NegativeTest::valueTest);
   FINALIZER(dropNegativeSchema);
 }
+TESTCASE("FeatureDisabled", ""){
+  INITIALIZER(createNegativeSchema);
+  INITIALIZER(NegativeTest::featureDisabledTest);
+  FINALIZER(dropNegativeSchema);
+}
 TESTCASE("LookupJoin", ""){
   INITIALIZER(runLoadTable);
   STEP(runLookupJoin);

=== modified file 'storage/ndb/test/run-test/daily-basic-tests.txt'
--- a/storage/ndb/test/run-test/daily-basic-tests.txt	2012-09-12 14:18:33 +0000
+++ b/storage/ndb/test/run-test/daily-basic-tests.txt	2012-09-13 08:05:29 +0000
@@ -135,15 +135,7 @@ args: -n DeleteRead
 
 max-time: 500
 cmd: testSpj
-args: -n LookupJoin
-
-max-time: 500
-cmd: testSpj
-args: -n ScanJoin
-
-max-time: 500
-cmd: testSpj
-args: -n MixedJoin
+args: -n FeatureDisabled T1
 
 max-time: 500
 cmd: testBasic
@@ -739,10 +731,6 @@ max-time: 2500
 cmd: testIndex
 args: -n NFNR2_O T6 T13 
 
-max-time: 2500
-cmd: testSpj
-args: -n NF_Join T6 T13
-
 #
 # DICT TESTS
 max-time: 500

No bundle (reason: useless for push emails).
Thread
bzr push into mysql-5.1-telco-7.0 branch (jan.wedvik:4971 to 4972) Jan Wedvik13 Sep