List:Commits« Previous MessageNext Message »
From:magnus.blaudd Date:June 26 2012 2:29pm
Subject:bzr push into mysql-5.5-cluster-7.3 branch (magnus.blaudd:3894 to 3895)
View as plain text  
 3895 magnus.blaudd@stripped	2012-06-26 [merge]
      Merge 7.2 -> 7.3

    added:
      mysql-test/suite/ndb/r/ndb_mgmd.result
      mysql-test/suite/ndb/t/ndb_mgmd.cnf
      mysql-test/suite/ndb/t/ndb_mgmd.test
    modified:
      storage/ndb/include/logger/FileLogHandler.hpp
      storage/ndb/include/logger/LogHandler.hpp
      storage/ndb/include/logger/Logger.hpp
      storage/ndb/src/common/logger/LogHandler.cpp
      storage/ndb/src/common/logger/Logger.cpp
      storage/ndb/src/mgmsrv/MgmtSrvr.cpp
      storage/ndb/src/mgmsrv/MgmtSrvr.hpp
      storage/ndb/src/ndbapi/NdbScanOperation.cpp
      storage/ndb/src/ndbapi/ndberror.c
      storage/ndb/test/ndbapi/testScan.cpp
      storage/ndb/test/run-test/daily-basic-tests.txt
      storage/ndb/tools/ndb_error_reporter
 3894 magnus.blaudd@stripped	2012-06-25 [merge]
      Merge 7.2 -> 7.3

    modified:
      mysql-test/suite/ndb/r/ndb_alter_table_online.result
      mysql-test/suite/ndb/r/ndb_index_stat_restart.result
      mysql-test/suite/ndb/r/ndb_reconnect.result
      mysql-test/suite/ndb/t/ndb_alter_table_online.test
      mysql-test/suite/ndb/t/ndb_reconnect.test
      mysql-test/suite/ndb_big/my.cnf
      sql/ha_ndbcluster.cc
      sql/ha_ndbcluster_binlog.cc
      sql/ndb_thd_ndb.h
      sql/sql_show.cc
      sql/sql_show.h
      sql/sql_table.cc
      storage/ndb/include/kernel/ndb_limits.h
      storage/ndb/include/kernel/signaldata/CreateTable.hpp
      storage/ndb/include/kernel/signaldata/DictTabInfo.hpp
      storage/ndb/include/kernel/signaldata/ScanTab.hpp
      storage/ndb/include/ndb_version.h.in
      storage/ndb/src/common/debugger/signaldata/DictTabInfo.cpp
      storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
      storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp
      storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
      storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
      storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
      storage/ndb/src/kernel/blocks/ndbfs/AsyncIoThread.hpp
      storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp
      storage/ndb/src/kernel/blocks/suma/Suma.hpp
      storage/ndb/src/kernel/vm/SimulatedBlock.hpp
      storage/ndb/src/kernel/vm/mt.cpp
      storage/ndb/src/ndbapi/NdbDictionary.cpp
      storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
      storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp
      storage/ndb/src/ndbapi/NdbQueryOperation.cpp
      storage/ndb/src/ndbapi/NdbScanOperation.cpp
      storage/ndb/test/include/NdbBackup.hpp
      storage/ndb/test/include/NdbConfig.hpp
      storage/ndb/test/ndbapi/testBackup.cpp
      storage/ndb/test/ndbapi/testBasic.cpp
      storage/ndb/test/ndbapi/testSystemRestart.cpp
      storage/ndb/test/ndbapi/testTimeout.cpp
      storage/ndb/test/ndbapi/testUpgrade.cpp
      storage/ndb/test/run-test/daily-basic-tests.txt
      support-files/mysql.spec.sh
=== added file 'mysql-test/suite/ndb/r/ndb_mgmd.result'
--- a/mysql-test/suite/ndb/r/ndb_mgmd.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/ndb/r/ndb_mgmd.result	2012-06-26 13:03:52 +0000
@@ -0,0 +1,5 @@
+#
+# BUG#11764570 NDB_ERROR_REPORTER ONLY COLLECTS LOGS MATCHING NAME NDB_*.
+#
+Make sure that ndb_mgmd creates ndb_<nodeid>_cluster.log file
+Make sure that ndb_mgmd does _not_ create logger.log file

=== added file 'mysql-test/suite/ndb/t/ndb_mgmd.cnf'
--- a/mysql-test/suite/ndb/t/ndb_mgmd.cnf	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/ndb/t/ndb_mgmd.cnf	2012-06-26 13:03:52 +0000
@@ -0,0 +1,5 @@
+!include ../my.cnf
+
+[cluster_config.ndb_mgmd.1.1]
+LogDestination=FILE:maxsize=32000000,maxfiles=6
+

=== added file 'mysql-test/suite/ndb/t/ndb_mgmd.test'
--- a/mysql-test/suite/ndb/t/ndb_mgmd.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/ndb/t/ndb_mgmd.test	2012-06-26 13:03:52 +0000
@@ -0,0 +1,13 @@
+--source include/have_ndb.inc
+
+--echo #
+--echo # BUG#11764570 NDB_ERROR_REPORTER ONLY COLLECTS LOGS MATCHING NAME NDB_$ID*.
+--echo #
+
+--echo Make sure that ndb_mgmd creates ndb_<nodeid>_cluster.log file
+--file_exists $MYSQLTEST_VARDIR/mysql_cluster.1/ndb_mgmd.1/ndb_3_cluster.log
+
+--echo Make sure that ndb_mgmd does _not_ create logger.log file
+--error 1
+--file_exists $MYSQLTEST_VARDIR/mysql_cluster.1/ndb_mgmd.1/logger.log
+

=== modified file 'storage/ndb/include/logger/FileLogHandler.hpp'
--- a/storage/ndb/include/logger/FileLogHandler.hpp	2011-06-30 15:59:25 +0000
+++ b/storage/ndb/include/logger/FileLogHandler.hpp	2012-06-26 13:03:52 +0000
@@ -49,7 +49,7 @@ public:
    * @param maxFileSize the maximum log file size before archiving.
    * @param maxLogEntries the maximum number of log entries before checking time to archive.
    */
-  FileLogHandler(const char* aFileName = "logger.log",
+  FileLogHandler(const char* aFileName,
 		 int maxNoFiles = 6,
 		 long maxFileSize = 1024000,
 		 unsigned int maxLogEntries = 10000);

=== modified file 'storage/ndb/include/logger/LogHandler.hpp'
--- a/storage/ndb/include/logger/LogHandler.hpp	2011-07-05 12:46:07 +0000
+++ b/storage/ndb/include/logger/LogHandler.hpp	2012-06-26 14:23:32 +0000
@@ -108,22 +108,7 @@ public:  
    * @return the footer.
    */
   const char* getDefaultFooter() const;
-  
-  /**
-   * Returns the date and time format used by ctime().
-   *
-   * @return the date and time format.
-   */
-  const char* getDateTimeFormat() const;
-
-  /**
-   * Sets the date and time format. It needs to have the same arguments
-   * a ctime().
-   *
-   * @param pFormat  the date and time format.
-   */
-  void setDateTimeFormat(const char* pFormat);
-  
+    
   /**
    * Returns the error code.
    */
@@ -233,7 +218,6 @@ private: 
   LogHandler* operator = (const LogHandler&);
   bool operator == (const LogHandler&);
 
-  const char* m_pDateTimeFormat;
   int m_errorCode;
   char* m_errorStr;
 

=== modified file 'storage/ndb/include/logger/Logger.hpp'
--- a/storage/ndb/include/logger/Logger.hpp	2011-02-01 23:27:25 +0000
+++ b/storage/ndb/include/logger/Logger.hpp	2012-06-26 13:03:52 +0000
@@ -153,11 +153,11 @@ public:
   bool createEventLogHandler(const char* source_name);
 
   /**
-   * Create a default handler that logs to a file called logger.log.
+   * Create a default handler which writes to the specified file name.
    *
    * @return true if successful.
    */
-  bool createFileHandler(char* filename= 0);
+  bool createFileHandler(char* filename);
 
   /**
    * Remove the default file handler.
@@ -185,16 +185,6 @@ public:
   bool addHandler(LogHandler* pHandler);
 
   /**
-   * Add a new handler
-   *
-   * @param logstring string describing the handler to add
-   * @param err OS errno in event of error
-   * @param len max length of errStr buffer
-   * @param errStr logger error string in event of error
-   */
-  bool addHandler(const BaseString &logstring, int *err, int len, char* errStr);
-
-  /**
    * Remove a log handler.
    *
    * @param pHandler log handler to remove.

=== modified file 'storage/ndb/src/common/logger/LogHandler.cpp'
--- a/storage/ndb/src/common/logger/LogHandler.cpp	2011-10-21 12:36:44 +0000
+++ b/storage/ndb/src/common/logger/LogHandler.cpp	2012-06-26 14:23:32 +0000
@@ -24,7 +24,6 @@
 // PUBLIC
 //
 LogHandler::LogHandler() : 
-  m_pDateTimeFormat("%d-%.2d-%.2d %.2d:%.2d:%.2d"),
   m_errorCode(0),
   m_errorStr(NULL)
 {
@@ -113,17 +112,6 @@ LogHandler::getDefaultFooter() const
   return "\n";
 }
 
-const char* 
-LogHandler::getDateTimeFormat() const
-{
-  return m_pDateTimeFormat;	
-}
-
-void 
-LogHandler::setDateTimeFormat(const char* pFormat)
-{
-  m_pDateTimeFormat = (char*)pFormat;
-}
 
 char* 
 LogHandler::getTimeAsString(char* pStr) const 
@@ -132,7 +120,7 @@ LogHandler::getTimeAsString(char* pStr) 
   tm_now = ::localtime(&m_now); //uses the "current" timezone
 
   BaseString::snprintf(pStr, MAX_DATE_TIME_HEADER_LENGTH, 
-	     m_pDateTimeFormat, 
+	     "%d-%.2d-%.2d %.2d:%.2d:%.2d",
 	     tm_now->tm_year + 1900, 
 	     tm_now->tm_mon + 1, //month is [0,11]. +1 -> [1,12]
 	     tm_now->tm_mday,

=== modified file 'storage/ndb/src/common/logger/Logger.cpp'
--- a/storage/ndb/src/common/logger/Logger.cpp	2011-10-21 12:36:44 +0000
+++ b/storage/ndb/src/common/logger/Logger.cpp	2012-06-26 14:23:32 +0000
@@ -130,8 +130,7 @@ Logger::createFileHandler(char*filename)
   if (m_pFileHandler)
     return true; // Ok, already exist
 
-  LogHandler* log_handler = filename ? new FileLogHandler(filename)
-                                     : new FileLogHandler();
+  LogHandler* log_handler = new FileLogHandler(filename);
   if (!log_handler)
     return false;
 
@@ -210,64 +209,6 @@ Logger::addHandler(LogHandler* pHandler)
   return true;
 }
 
-bool
-Logger::addHandler(const BaseString &logstring, int *err, int len, char* errStr) {
-  Vector<BaseString> logdest;
-  DBUG_ENTER("Logger::addHandler");
-
-  logstring.split(logdest, ";");
-
-  for(unsigned i = 0; i < logdest.size(); i++) {
-    DBUG_PRINT("info",("adding: %s",logdest[i].c_str()));
-
-    Vector<BaseString> v_type_args;
-    logdest[i].split(v_type_args, ":", 2);
-
-    BaseString type(v_type_args[0]);
-    BaseString params;
-    if(v_type_args.size() >= 2)
-      params = v_type_args[1];
-
-    LogHandler *handler = NULL;
-
-#ifndef _WIN32
-    if(type == "SYSLOG")
-    {
-      handler = new SysLogHandler();
-    } else 
-#endif
-    if(type == "FILE")
-      handler = new FileLogHandler();
-    else if(type == "CONSOLE")
-      handler = new ConsoleLogHandler();
-    
-    if(handler == NULL)
-    {
-      BaseString::snprintf(errStr,len,"Could not create log destination: %s",
-                           logdest[i].c_str());
-      DBUG_RETURN(false);
-    }
-
-    if(!handler->parseParams(params))
-    {
-      *err= handler->getErrorCode();
-      if(handler->getErrorStr())
-        strncpy(errStr, handler->getErrorStr(), len);
-      delete handler;
-      DBUG_RETURN(false);
-    }
-
-    if (!addHandler(handler))
-    {
-      BaseString::snprintf(errStr,len,"Could not add log destination: %s",
-                           logdest[i].c_str());
-      delete handler;
-      DBUG_RETURN(false);
-    }
-  }
-
-  DBUG_RETURN(true);
-}
 
 bool
 Logger::removeHandler(LogHandler* pHandler)

=== modified file 'storage/ndb/src/mgmsrv/MgmtSrvr.cpp'
--- a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp	2012-03-19 12:09:39 +0000
+++ b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp	2012-06-26 14:23:32 +0000
@@ -48,6 +48,9 @@
 #include <NdbSleep.h>
 #include <portlib/NdbDir.hpp>
 #include <EventLogger.hpp>
+#include <logger/FileLogHandler.hpp>
+#include <logger/ConsoleLogHandler.hpp>
+#include <logger/SysLogHandler.hpp>
 #include <DebuggerNames.hpp>
 #include <ndb_version.h>
 
@@ -579,6 +582,71 @@ MgmtSrvr::start()
 
 
 void
+MgmtSrvr::configure_eventlogger(const BaseString& logdestination) const
+{
+  // Close old log handlers before creating the new
+  g_eventLogger->close();
+
+  Vector<BaseString> logdestinations;
+  logdestination.split(logdestinations, ";");
+
+  for(unsigned i = 0; i < logdestinations.size(); i++)
+  {
+    // Extract type(everything left of colon)
+    Vector<BaseString> v_type_params;
+    logdestinations[i].split(v_type_params, ":", 2);
+    BaseString type(v_type_params[0]);
+    
+    // Extract params(everything right of colon)
+    BaseString params;
+    if(v_type_params.size() >= 2)
+      params = v_type_params[1];
+
+    LogHandler *handler = NULL;
+    if(type == "FILE")
+    {
+      char *default_file_name= NdbConfig_ClusterLogFileName(_ownNodeId);
+      handler = new FileLogHandler(default_file_name);
+      free(default_file_name);
+    }
+    else if(type == "CONSOLE")
+    {
+      handler = new ConsoleLogHandler();
+    }
+#ifndef _WIN32
+    else if(type == "SYSLOG")
+    {
+      handler = new SysLogHandler();
+    }
+#endif  
+    if(handler == NULL)
+    {
+      ndbout_c("INTERNAL ERROR: Could not create log handler for: '%s'",
+               logdestinations[i].c_str());
+      continue;
+    }
+
+    if(!handler->parseParams(params))
+    {
+      ndbout_c("Failed to parse parameters for log handler: '%s', error: %d '%s'",
+               logdestinations[i].c_str(), handler->getErrorCode(), handler->getErrorStr());
+      delete handler;
+      continue;
+    }
+
+    if (!g_eventLogger->addHandler(handler))
+    {
+      ndbout_c("INTERNAL ERROR: Could not add %s log handler", handler->handler_type());
+      g_eventLogger->error("INTERNAL ERROR: Could not add %s log handler",
+                           handler->handler_type());
+      delete handler;
+      continue;
+    }
+  }
+}
+
+
+void
 MgmtSrvr::setClusterLog(const Config* config)
 {
   DBUG_ASSERT(_ownNodeId);
@@ -615,21 +683,7 @@ MgmtSrvr::setClusterLog(const Config* co
     logdest_configured = false;
   }
 
-  g_eventLogger->close();
-
-  int err= 0;
-  char errStr[100]= {0};
-  if(!g_eventLogger->addHandler(logdest, &err, sizeof(errStr), errStr)) {
-    ndbout << "Warning: could not add log destination '"
-           << logdest.c_str() << "'. Reason: ";
-    if(err)
-      ndbout << strerror(err);
-    if(err && errStr[0]!='\0')
-      ndbout << ", ";
-    if(errStr[0]!='\0')
-      ndbout << errStr;
-    ndbout << endl;
-  }
+  configure_eventlogger(logdest);
 
   if (logdest_configured == false &&
       m_opts.non_interactive)

=== modified file 'storage/ndb/src/mgmsrv/MgmtSrvr.hpp'
--- a/storage/ndb/src/mgmsrv/MgmtSrvr.hpp	2011-09-14 13:49:19 +0000
+++ b/storage/ndb/src/mgmsrv/MgmtSrvr.hpp	2012-06-26 14:23:32 +0000
@@ -304,6 +304,7 @@ public:
 private:
   void config_changed(NodeId, const Config*);
   void setClusterLog(const Config* conf);
+  void configure_eventlogger(const BaseString& logdestination) const;
 public:
 
   /**

=== modified file 'storage/ndb/src/ndbapi/NdbScanOperation.cpp'
--- a/storage/ndb/src/ndbapi/NdbScanOperation.cpp	2012-06-21 15:24:52 +0000
+++ b/storage/ndb/src/ndbapi/NdbScanOperation.cpp	2012-06-26 11:05:35 +0000
@@ -27,6 +27,8 @@
 
 #define DEBUG_NEXT_RESULT 0
 
+static const int Err_scanAlreadyComplete = 4120;
+
 NdbScanOperation::NdbScanOperation(Ndb* aNdb, NdbOperation::Type aType) :
   NdbOperation(aNdb, aType),
   m_transConnection(NULL)
@@ -1888,6 +1890,15 @@ NdbScanOperation::nextResultNdbRecord(co
 
   if(theError.code)
   {
+    if (theError.code == Err_scanAlreadyComplete)
+    {
+      /**
+       * The scan is already complete. There must be a bug in the api 
+       * application such that is calls nextResult()/nextResultNdbRecord() 
+       * again after getting return value 1 (meaning end of scan).
+       */
+      return -1;
+    }
     goto err4;
   }
 
@@ -1933,8 +1944,9 @@ NdbScanOperation::nextResultNdbRecord(co
       {
         /**
          * No completed & no sent -> EndOfData
+         * Make sure user gets error if he tries again.
          */
-        theError.code= -1; // make sure user gets error if he tries again
+        theError.code= Err_scanAlreadyComplete;
         return 1;
       }
 
@@ -3684,7 +3696,7 @@ NdbIndexScanOperation::next_result_order
   }
   else
   {
-    theError.code= -1;
+    theError.code= Err_scanAlreadyComplete;
     return 1;                                   // End-of-file
   }
 }

=== modified file 'storage/ndb/src/ndbapi/ndberror.c'
--- a/storage/ndb/src/ndbapi/ndberror.c	2012-03-05 09:38:49 +0000
+++ b/storage/ndb/src/ndbapi/ndberror.c	2012-06-26 11:05:35 +0000
@@ -627,6 +627,7 @@ ErrorBundle ErrorCodes[] = {
   { 4116, DMEC, AE, "Operation was not defined correctly, probably missing a key" },
   { 4117, DMEC, AE, "Could not start transporter, configuration error"}, 
   { 4118, DMEC, AE, "Parameter error in API call" },
+  { 4120, DMEC, AE, "Scan already complete" },
   { 4300, DMEC, AE, "Tuple Key Type not correct" },
   { 4301, DMEC, AE, "Fragment Type not correct" },
   { 4302, DMEC, AE, "Minimum Load Factor not correct" },

=== modified file 'storage/ndb/test/ndbapi/testScan.cpp'
--- a/storage/ndb/test/ndbapi/testScan.cpp	2012-04-24 14:41:37 +0000
+++ b/storage/ndb/test/ndbapi/testScan.cpp	2012-06-26 12:33:15 +0000
@@ -24,6 +24,7 @@
 #include "ScanFunctions.hpp"
 #include <random.h>
 #include <signaldata/DumpStateOrd.hpp>
+#include <NdbConfig.hpp>
 
 const NdbDictionary::Table *
 getTable(Ndb* pNdb, int i){
@@ -1682,6 +1683,99 @@ runBug13394788(NDBT_Context* ctx, NDBT_S
   return NDBT_OK;
 }
 
+/**
+ * This is a regression test for bug #11748194 "TRANSACTION OBJECT CREATED 
+ * AND UNRELEASED BY EXTRA CALL TO NEXTRESULT()".
+ * If a transaction made an extra call to nextResult() after getting
+ * end-of-scan from nextResult(), the API would leak transaction objects. 
+ */
+static int
+runExtraNextResult(NDBT_Context* ctx, NDBT_Step* step)
+{
+  const NdbDictionary::Table * pTab = ctx->getTab();
+  // Fill table with 10 rows.
+  HugoTransactions hugoTrans(*pTab);
+  Ndb* const ndb = GETNDB(step);
+  hugoTrans.loadTable(ndb, 10);
+  // Read MaxNoOfConcurrentTransactions configuration value.
+  Uint32 maxTrans = 0;
+  NdbConfig conf;
+  require(conf.getProperty(conf.getMasterNodeId(),
+                           NODE_TYPE_DB,
+                           CFG_DB_NO_TRANSACTIONS,
+                           &maxTrans));
+  require(maxTrans > 0);
+  
+  /**
+   * The bug causes each scan to leak one object.
+   */
+  int result = NDBT_OK;
+  Uint32 i = 0;
+  while (i < maxTrans+1)
+  {
+    NdbTransaction* const trans = ndb->startTransaction();
+    if (trans == NULL)
+    {
+      g_err << "ndb->startTransaction() gave unexpected error : " 
+            << ndb->getNdbError() << " in the " << i << "th iteration." <<endl;
+    }
+    
+    // Do a random numer of scans in this transaction.
+    const int scanCount = rand()%4;
+    for (int j=0; j < scanCount; j++)
+    {
+      NdbScanOperation* const scan = trans->getNdbScanOperation(pTab);
+      if (scan == NULL)
+      {
+        g_err << "trans->getNdbScanOperation() gave unexpected error : " 
+              << trans->getNdbError() << " in the " << i
+              << "th iteration." <<endl;
+        return NDBT_FAILED;
+      }
+      
+      require(scan->readTuples(NdbOperation::LM_CommittedRead) == 0);
+      require(scan->getValue(0u) != 0);
+      require(trans->execute(NoCommit) == 0);
+      
+      // Scan table until end.
+      int scanResult;
+      do
+      {
+        // Fetch new batch.
+        scanResult = scan->nextResult(true);
+        while (scanResult == 0)
+        {
+          // Iterate over batch.
+          scanResult = scan->nextResult(false);
+        }
+      } while (scanResult == 0 || scanResult == 2);
+
+      /** 
+       * Do extra nextResult. This is the application error that triggers the 
+       * bug.
+       */
+      scanResult = scan->nextResult(true);
+      require(scanResult < 0);
+      // Here we got the undefined error code -1. So check for that too.
+      // if (trans->getNdbError().code != 4120
+      if (scan->getNdbError().code != 4120
+          && result == NDBT_OK)
+      {
+        g_err << "scan->nextResult() gave unexpected error : " 
+              << scan->getNdbError() << " in the " << i << "th iteration." 
+              << endl;
+        result = NDBT_FAILED;
+      }
+      i++;
+    }
+    ndb->closeTransaction(trans);
+  } // while (i < maxTrans+1)
+
+  // Delete table rows.
+  require(UtilTransactions(*ctx->getTab()).clearTable(ndb) == 0);
+  return result;
+}
+
 NDBT_TESTSUITE(testScan);
 TESTCASE("ScanRead", 
 	 "Verify scan requirement: It should be possible "\
@@ -2247,6 +2341,11 @@ TESTCASE("Bug13394788", "")
   FINALIZER(createOrderedPkIndex_Drop);
   FINALIZER(runClearTable);
 }
+TESTCASE("extraNextResultBug11748194",
+         "Regression test for bug #11748194")
+{
+  INITIALIZER(runExtraNextResult);
+}
 NDBT_TESTSUITE_END(testScan);
 
 int main(int argc, const char** argv){

=== modified file 'storage/ndb/test/run-test/daily-basic-tests.txt'
--- a/storage/ndb/test/run-test/daily-basic-tests.txt	2012-06-25 11:35:54 +0000
+++ b/storage/ndb/test/run-test/daily-basic-tests.txt	2012-06-26 11:05:35 +0000
@@ -1871,3 +1871,7 @@ max-time: 300
 cmd: testBasic
 args: -n LeakApiConnectObjects T1
 
+max-time: 300
+cmd: testScan
+args:  -n extraNextResultBug11748194 T1
+

=== modified file 'storage/ndb/tools/ndb_error_reporter'
--- a/storage/ndb/tools/ndb_error_reporter	2011-07-05 12:46:07 +0000
+++ b/storage/ndb/tools/ndb_error_reporter	2012-06-26 14:23:32 +0000
@@ -81,6 +81,17 @@ foreach my $node (@nodes)
     system 'scp -p '.$recurse.$config_username.config($node,'host').
 	':'.config($node,'datadir')."/ndb_".$node."* ".
 	"$reportdir/\n";
+
+    # Extract cluster log name from LogDestination(if any)
+    foreach my $file_handler (grep(s/^FILE://i, split(/;/, config($node, 'LogDestination'))))
+    {
+      foreach my $file_name (grep(s/^filename=//i, split(/,/, $file_handler)))
+      {
+        print "  Copying cluster log from '$file_name' on node $node...\n";
+        system 'scp -p '.$config_username.config($node,'host').
+            ':'.$file_name.". $reportdir/\n";
+      }
+    }
 }
 
 print "\n\n Copying configuration file...\n\n\t$config_file\n\n";

No bundle (reason: useless for push emails).
Thread
bzr push into mysql-5.5-cluster-7.3 branch (magnus.blaudd:3894 to 3895) magnus.blaudd26 Jun