From: Date: September 25 2008 12:56pm Subject: bzr push into mysql-5.1 branch (jonas:2665 to 2671) Bug#39518, Bug#39549 List-Archive: http://lists.mysql.com/commits/54511 X-Bug: 39549 Message-Id: <20080925105625.002694A4E3@perch.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 2671 Jonas Oreland 2008-09-25 ndb - atrt fix replication in 6.0 allow configurations wo/ cluster modified: storage/ndb/test/run-test/db.cpp storage/ndb/test/run-test/main.cpp storage/ndb/test/run-test/setup.cpp 2670 Tomas Ulin 2008-09-24 Bug #39404 Core in NdbEventBuffer::deleteUsedEventOperations() modified: storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp 2669 Jonas Oreland 2008-09-19 ndb - bug#39549 - incorrectly handled resource shortage in TC::scanfragrec modified: storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp storage/ndb/src/ndbapi/ndberror.c 2668 Martin Skold 2008-09-19 Added extra checking at constraint violation during mult-row insert modified: mysql-test/suite/ndb/r/ndb_insert.result mysql-test/suite/ndb/t/ndb_insert.test 2667 Jonas Oreland 2008-09-18 ndb - bug#39518 - report error back on SUB_CREATE_REF modified: storage/ndb/src/kernel/blocks/trix/Trix.cpp 2666 Tomas Ulin 2008-09-17 [merge] merge modified: storage/ndb/test/include/NDBT_Test.hpp storage/ndb/test/run-test/autotest-run.sh storage/ndb/test/src/NDBT_Test.cpp 2665 Tomas Ulin 2008-09-11 fix for machines with clock_monotonic defined but not implemented modified: storage/ndb/src/common/portlib/NdbTick.c storage/ndb/src/common/util/ndb_init.cpp === modified file 'mysql-test/suite/ndb/r/ndb_insert.result' --- a/mysql-test/suite/ndb/r/ndb_insert.result 2007-11-05 20:11:15 +0000 +++ b/mysql-test/suite/ndb/r/ndb_insert.result 2008-09-19 09:14:38 +0000 @@ -419,8 +419,8 @@ COUNT(*) INSERT INTO t1 VALUES (1,1,1); ERROR 23000: Duplicate entry '1' for key 'PRIMARY' INSERT INTO t1 VALUES -(1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5), -(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10); +(-1,-1,-1),(1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5), +(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(9999,9999,9999); ERROR 23000: Can't write; duplicate key in table 't1' select count(*) from t1; count(*) === modified file 'mysql-test/suite/ndb/t/ndb_insert.test' --- a/mysql-test/suite/ndb/t/ndb_insert.test 2007-11-05 20:11:15 +0000 +++ b/mysql-test/suite/ndb/t/ndb_insert.test 2008-09-19 09:14:38 +0000 @@ -438,8 +438,8 @@ INSERT INTO t1 VALUES (1,1,1); --error 1022 INSERT INTO t1 VALUES -(1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5), -(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10); +(-1,-1,-1),(1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5), +(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(9999,9999,9999); select count(*) from t1; === modified file 'storage/ndb/src/common/portlib/NdbTick.c' --- a/storage/ndb/src/common/portlib/NdbTick.c 2008-06-09 11:57:17 +0000 +++ b/storage/ndb/src/common/portlib/NdbTick.c 2008-09-11 11:40:54 +0000 @@ -26,15 +26,34 @@ #ifdef HAVE_CLOCK_GETTIME #ifdef CLOCK_MONOTONIC -#define CLOCK CLOCK_MONOTONIC +static clockid_t NdbTick_clk_id = CLOCK_MONOTONIC; #else -#define CLOCK CLOCK_REALTIME +static clockid_t NdbTick_clk_id = CLOCK_REALTIME; #endif +void NdbTick_Init() +{ + struct timespec tick_time; + if (clock_gettime(NdbTick_clk_id, &tick_time) == 0) + return; +#ifdef CLOCK_MONOTONIC + fprintf(stderr, "Failed to use CLOCK_MONOTONIC for clock_realtime," + " errno= %u\n", errno); + fflush(stderr); + NdbTick_clk_id = CLOCK_REALTIME; + if (clock_gettime(NdbTick_clk_id, &tick_time) == 0) + return; +#endif + fprintf(stderr, "Failed to use CLOCK_REALTIME for clock_realtime," + " errno=%u. Aborting\n", errno); + fflush(stderr); + abort(); +} + NDB_TICKS NdbTick_CurrentMillisecond(void) { struct timespec tick_time; - clock_gettime(CLOCK, &tick_time); + clock_gettime(NdbTick_clk_id, &tick_time); return ((NDB_TICKS)tick_time.tv_sec) * ((NDB_TICKS)MILLISEC_PER_SEC) + @@ -44,12 +63,16 @@ NDB_TICKS NdbTick_CurrentMillisecond(voi int NdbTick_CurrentMicrosecond(NDB_TICKS * secs, Uint32 * micros){ struct timespec t; - int res = clock_gettime(CLOCK, &t); + int res = clock_gettime(NdbTick_clk_id, &t); * secs = t.tv_sec; * micros = t.tv_nsec / 1000; return res; } #else +void NdbTick_Init() +{ +} + NDB_TICKS NdbTick_CurrentMillisecond(void) { struct timeval tick_time; === modified file 'storage/ndb/src/common/util/ndb_init.cpp' --- a/storage/ndb/src/common/util/ndb_init.cpp 2008-06-09 11:57:17 +0000 +++ b/storage/ndb/src/common/util/ndb_init.cpp 2008-09-11 11:40:54 +0000 @@ -27,6 +27,7 @@ extern void destroy_event_logger(class E static int ndb_init_called = 0; extern "C" void NdbCondition_Init(); +extern "C" void NdbTick_Init(); extern "C" { @@ -46,7 +47,7 @@ ndb_init_internal() exit(1); } } - + NdbTick_Init(); NdbCondition_Init(); } === modified file 'storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp' --- a/storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp 2008-08-11 10:41:11 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp 2008-09-19 21:49:00 +0000 @@ -123,6 +123,7 @@ #define ZUNKNOWN_TABLE_ERROR 285 #define ZNODEFAIL_BEFORE_COMMIT 286 #define ZINDEX_CORRUPT_ERROR 287 +#define ZSCAN_FRAGREC_ERROR 291 // ---------------------------------------- // Seize error @@ -1418,7 +1419,7 @@ private: UintR anApiConnectPtr); void handleScanStop(Signal* signal, UintR aFailedNode); void initScanTcrec(Signal* signal); - void initScanrec(ScanRecordPtr, const class ScanTabReq*, + Uint32 initScanrec(ScanRecordPtr, const class ScanTabReq*, const UintR scanParallel, const UintR noOprecPerFrag); void initScanfragrec(Signal* signal); === modified file 'storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp' --- a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2008-08-20 20:00:56 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2008-09-19 21:49:00 +0000 @@ -9227,7 +9227,12 @@ void Dbtc::execSCAN_TABREQ(Signal* signa ndbrequire(transP->apiScanRec == RNIL); ndbrequire(scanptr.p->scanApiRec == RNIL); - initScanrec(scanptr, scanTabReq, scanParallel, noOprecPerFrag); + errCode = initScanrec(scanptr, scanTabReq, scanParallel, noOprecPerFrag); + if (unlikely(errCode)) + { + jam(); + goto SCAN_TAB_error; + } transP->apiScanRec = scanptr.i; transP->returncode = 0; @@ -9317,10 +9322,11 @@ SCAN_TAB_error_no_state_change: return; }//Dbtc::execSCAN_TABREQ() -void Dbtc::initScanrec(ScanRecordPtr scanptr, - const ScanTabReq * scanTabReq, - UintR scanParallel, - UintR noOprecPerFrag) +Uint32 +Dbtc::initScanrec(ScanRecordPtr scanptr, + const ScanTabReq * scanTabReq, + UintR scanParallel, + UintR noOprecPerFrag) { const UintR ri = scanTabReq->requestInfo; scanptr.p->scanTcrec = tcConnectptr.i; @@ -9355,7 +9361,11 @@ void Dbtc::initScanrec(ScanRecordPtr sca for (Uint32 i = 0; i < scanParallel; i++) { jam(); ScanFragRecPtr ptr; - ndbrequire(list.seize(ptr)); + if (unlikely(list.seize(ptr) == false)) + { + jam(); + goto errout; + } ptr.p->scanFragState = ScanFragRec::IDLE; ptr.p->scanRec = scanptr.i; ptr.p->scanFragId = 0; @@ -9365,6 +9375,10 @@ void Dbtc::initScanrec(ScanRecordPtr sca (* (ScanTabReq::getRangeScanFlag(ri) ? &c_counters.c_range_scan_count : &c_counters.c_scan_count))++; + return 0; +errout: + list.release(); + return ZSCAN_FRAGREC_ERROR; }//Dbtc::initScanrec() void Dbtc::scanTabRefLab(Signal* signal, Uint32 errCode) === modified file 'storage/ndb/src/kernel/blocks/trix/Trix.cpp' --- a/storage/ndb/src/kernel/blocks/trix/Trix.cpp 2008-02-20 09:04:29 +0000 +++ b/storage/ndb/src/kernel/blocks/trix/Trix.cpp 2008-09-18 14:29:25 +0000 @@ -541,7 +541,11 @@ void Trix::execUTIL_PREPARE_REF(Signal* return; } subRecPtr.p = subRec; - subRec->errorCode = BuildIndxRef::InternalError; + subRec->errorCode = (BuildIndxRef::ErrorCode)utilPrepareRef->errorCode; + + UtilReleaseConf* conf = (UtilReleaseConf*)signal->getDataPtrSend(); + conf->senderData = subRecPtr.i; + execUTIL_RELEASE_CONF(signal); } void Trix::execUTIL_EXECUTE_CONF(Signal* signal) @@ -611,20 +615,27 @@ void Trix::execSUB_CREATE_REF(Signal* si { jamEntry(); DBUG_ENTER("Trix::execSUB_CREATE_REF"); - // THIS SIGNAL IS NEVER SENT FROM SUMA? - /* + SubCreateRef * subCreateRef = (SubCreateRef *)signal->getDataPtr(); SubscriptionRecPtr subRecPtr; SubscriptionRecord* subRec; - subRecPtr.i = subCreateRef->subscriberData; - if ((subRec = c_theSubscriptions.getPtr(subRecPtr.i)) == NULL) { + subRecPtr.i = subCreateRef->senderData; + if ((subRec = c_theSubscriptions.getPtr(subRecPtr.i)) == NULL) + { printf("Trix::execSUB_CREATE_REF: Failed to find subscription data %u\n", subRecPtr.i); return; } subRecPtr.p = subRec; - buildFailed(signal, subRecPtr, BuildIndxRef::InternalError); - */ + subRecPtr.p->errorCode = (BuildIndxRef::ErrorCode)subCreateRef->errorCode; + + UtilReleaseReq * const req = (UtilReleaseReq*)signal->getDataPtrSend(); + req->prepareId = subRecPtr.p->prepareId; + req->senderData = subRecPtr.i; + + sendSignal(DBUTIL_REF, GSN_UTIL_RELEASE_REQ, signal, + UtilReleaseReq::SignalLength, JBB); + DBUG_VOID_RETURN; } @@ -731,6 +742,7 @@ void Trix::setupSubscription(Signal* sig sendSignal(SUMA_REF, GSN_SUB_CREATE_REQ, signal, SubCreateReq::SignalLength, JBB); + DBUG_VOID_RETURN; } === modified file 'storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp' --- a/storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp 2008-06-25 12:49:13 +0000 +++ b/storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp 2008-09-24 12:27:11 +0000 @@ -1326,7 +1326,9 @@ NdbEventBuffer::nextEvent() { // moved to next gci, check if any references have been // released when completing the last gci + NdbMutex_Lock(m_mutex); deleteUsedEventOperations(); + NdbMutex_Unlock(m_mutex); gci_ops = m_available_data.delete_next_gci_ops(); } if (!gci_ops->m_consistent) @@ -1357,12 +1359,14 @@ NdbEventBuffer::nextEvent() // free all "per gci unique" collected operations // completed gci, check if any references have been // released when completing the gci + NdbMutex_Lock(m_mutex); EventBufData_list::Gci_ops *gci_ops = m_available_data.first_gci_ops(); while (gci_ops) { deleteUsedEventOperations(); gci_ops = m_available_data.delete_next_gci_ops(); } + NdbMutex_Unlock(m_mutex); DBUG_RETURN_EVENT(0); } === modified file 'storage/ndb/src/ndbapi/ndberror.c' --- a/storage/ndb/src/ndbapi/ndberror.c 2008-04-25 15:12:47 +0000 +++ b/storage/ndb/src/ndbapi/ndberror.c 2008-09-19 21:49:00 +0000 @@ -191,6 +191,7 @@ ErrorBundle ErrorCodes[] = { { 1501, DMEC, TR, "Out of undo space" }, { 288, DMEC, TR, "Out of index operations in transaction coordinator (increase MaxNoOfConcurrentIndexOperations)" }, { 289, DMEC, TR, "Out of transaction buffer memory in TC (increase TransactionBufferMemory)" }, + { 291, DMEC, TR, "Out of scanfrag records in TC (increase MaxNoOfLocalScans)" }, /** * InsufficientSpace === modified file 'storage/ndb/test/include/NDBT_Test.hpp' --- a/storage/ndb/test/include/NDBT_Test.hpp 2007-03-01 09:43:14 +0000 +++ b/storage/ndb/test/include/NDBT_Test.hpp 2008-09-11 10:08:57 +0000 @@ -208,7 +208,7 @@ public: virtual void print() = 0; virtual void printHTML() = 0; - const char* getName(){return name;}; + const char* getName() const { return _name.c_str(); }; virtual bool tableExists(NdbDictionary::Table* aTable) = 0; virtual bool isVerify(const NdbDictionary::Table* aTable) = 0; @@ -238,8 +238,6 @@ protected: BaseString _name; BaseString _comment; - const char* name; - const char* comment; NDBT_TestSuite* suite; Properties props; NdbTimer timer; === modified file 'storage/ndb/test/run-test/autotest-run.sh' --- a/storage/ndb/test/run-test/autotest-run.sh 2007-08-31 14:55:59 +0000 +++ b/storage/ndb/test/run-test/autotest-run.sh 2008-09-11 08:44:49 +0000 @@ -258,7 +258,8 @@ tar cfz $tar_dir/$tarfile `basename $p2` if [ "$report" ] then - scp $tar_dir/$tarfile $result_host:$result_path/ + scp $tar_dir/$tarfile $result_host:$result_path/${tarfile}.upload + ssh $result_host mv $result_path/${tarfile}.upload $result_path/${tarfile} fi cd $p === modified file 'storage/ndb/test/run-test/db.cpp' --- a/storage/ndb/test/run-test/db.cpp 2008-08-27 11:42:30 +0000 +++ b/storage/ndb/test/run-test/db.cpp 2008-09-25 10:21:14 +0000 @@ -23,6 +23,17 @@ static bool setup_repl(atrt_config&); static atrt_process* f_mysqld = 0; +static +int +run_query(atrt_process* src, const char * query) +{ + g_logger.debug("%s:%s - %s", + src->m_cluster->m_name.c_str(), + src->m_host->m_hostname.c_str(), + query); + return mysql_query(&src->m_mysql, query); +} + bool setup_db(atrt_config& config) { @@ -398,16 +409,16 @@ populate_db(atrt_config& config, atrt_pr static bool -setup_repl(atrt_process* src, atrt_process* dst) +setup_repl(atrt_process* dst, atrt_process* src) { - if (mysql_query(&src->m_mysql, "STOP SLAVE")) + if (run_query(src, "STOP SLAVE")) { g_logger.error("Failed to stop slave: %s", mysql_error(&src->m_mysql)); return false; } - if (mysql_query(&src->m_mysql, "RESET SLAVE")) + if (run_query(src, "RESET SLAVE")) { g_logger.error("Failed to reset slave: %s", mysql_error(&src->m_mysql)); @@ -421,7 +432,7 @@ setup_repl(atrt_process* src, atrt_proce dst->m_host->m_hostname.c_str(), atoi(find(dst, "--port="))); - if (mysql_query(&src->m_mysql, tmp.c_str())) + if (run_query(src, tmp.c_str())) { g_logger.error("Failed to setup repl from %s to %s: %s", src->m_host->m_hostname.c_str(), @@ -430,7 +441,7 @@ setup_repl(atrt_process* src, atrt_proce return false; } - if (mysql_query(&src->m_mysql, "START SLAVE")) + if (run_query(src, "START SLAVE")) { g_logger.error("Failed to start slave: %s", mysql_error(&src->m_mysql)); === modified file 'storage/ndb/test/run-test/main.cpp' --- a/storage/ndb/test/run-test/main.cpp 2008-08-27 11:42:30 +0000 +++ b/storage/ndb/test/run-test/main.cpp 2008-09-25 10:21:14 +0000 @@ -767,8 +767,7 @@ wait_ndb(atrt_config& config, int goal){ } if(handle == 0){ - g_logger.critical("Unable to find mgm handle"); - return false; + return true; } if(goal == NDB_MGM_NODE_STATUS_STARTED){ === modified file 'storage/ndb/test/run-test/setup.cpp' --- a/storage/ndb/test/run-test/setup.cpp 2008-09-04 09:43:51 +0000 +++ b/storage/ndb/test/run-test/setup.cpp 2008-09-25 10:21:14 +0000 @@ -34,10 +34,12 @@ struct proc_option f_options[] = { ,{ "--host=", atrt_process::AP_CLIENT, 0 } ,{ "--server-id=", atrt_process::AP_MYSQLD, PO_REP } ,{ "--log-bin", atrt_process::AP_MYSQLD, PO_REP_MASTER } +#if 0 ,{ "--master-host=", atrt_process::AP_MYSQLD, PO_REP_SLAVE } ,{ "--master-port=", atrt_process::AP_MYSQLD, PO_REP_SLAVE } ,{ "--master-user=", atrt_process::AP_MYSQLD, PO_REP_SLAVE } ,{ "--master-password=", atrt_process::AP_MYSQLD, PO_REP_SLAVE } +#endif ,{ "--ndb-connectstring=", atrt_process::AP_MYSQLD | atrt_process::AP_CLUSTER ,PO_NDB } ,{ "--ndbcluster", atrt_process::AP_MYSQLD, PO_NDB } === modified file 'storage/ndb/test/src/NDBT_Test.cpp' --- a/storage/ndb/test/src/NDBT_Test.cpp 2007-08-01 07:24:01 +0000 +++ b/storage/ndb/test/src/NDBT_Test.cpp 2008-09-11 10:08:57 +0000 @@ -371,14 +371,10 @@ NDBT_Finalizer::NDBT_Finalizer(NDBT_Test NDBT_TestCase::NDBT_TestCase(NDBT_TestSuite* psuite, const char* pname, const char* pcomment) : - name(strdup(pname)) , - comment(strdup(pcomment)), + _name(pname) , + _comment(pcomment), suite(psuite) { - _name.assign(pname); - _comment.assign(pcomment); - name= _name.c_str(); - comment= _comment.c_str(); assert(suite != NULL); m_all_tables = false; @@ -602,7 +598,7 @@ void NDBT_TestCaseImpl1::reportStepResul int NDBT_TestCase::execute(NDBT_Context* ctx){ int res; - ndbout << "- " << name << " started [" << ctx->suite->getDate() + ndbout << "- " << _name << " started [" << ctx->suite->getDate() << "]" << endl; ctx->setCase(this); @@ -654,11 +650,11 @@ int NDBT_TestCase::execute(NDBT_Context* runFinal(ctx); if (res == NDBT_OK) { - ndbout << "- " << name << " PASSED [" << ctx->suite->getDate() << "]" + ndbout << "- " << _name << " PASSED [" << ctx->suite->getDate() << "]" << endl; } else { - ndbout << "- " << name << " FAILED [" << ctx->suite->getDate() << "]" + ndbout << "- " << _name << " FAILED [" << ctx->suite->getDate() << "]" << endl; } return res; @@ -741,7 +737,7 @@ void NDBT_TestCaseImpl1::saveTestResult( void NDBT_TestCaseImpl1::printTestResult(){ char buf[255]; - ndbout << name<getResult() == FAILED_TO_DISCOVER) res = "FAILED TO DISCOVER TABLE"; - BaseString::snprintf(buf, 255," %-10s %-5s %-20s", tcr->getName(), res, tcr->getTimeStr()); - ndbout << buf<getName(), res, tcr->getTimeStr()); + ndbout << buf< " << endl; - ndbout << "" << endl << name << "" - << comment << "" << endl; + ndbout << "" << endl << _name << "" + << _comment << "" << endl; } void NDBT_TestCaseImpl1::print(){ - ndbout << "Test case: " << name << endl; - ndbout << "Description: "<< comment << endl; + ndbout << "Test case: " << _name << endl; + ndbout << "Description: "<< _comment << endl; ndbout << "Parameters: " << endl;