From: Date: July 3 2009 11:39pm Subject: bzr push into mysql-5.1-telco-7.0 branch (jonas:2945 to 2947) List-Archive: http://lists.mysql.com/commits/77951 Message-Id: <20090703213929.7638291B651@perch.localdomain> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_ZfvjTfroXXOAEVnyYkPLCw)" --Boundary_(ID_ZfvjTfroXXOAEVnyYkPLCw) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline 2947 Jonas Oreland 2009-07-03 [merge] merge 63 to 70 2946 Jonas Oreland 2009-07-03 [merge] merge 70-main modified: storage/ndb/include/mgmapi/mgmapi_config_parameters.h storage/ndb/include/ndbapi/ndb_cluster_connection.hpp storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp storage/ndb/src/mgmsrv/ConfigInfo.cpp storage/ndb/src/ndbapi/ClusterMgr.cpp storage/ndb/src/ndbapi/ClusterMgr.hpp storage/ndb/src/ndbapi/TransporterFacade.cpp storage/ndb/src/ndbapi/TransporterFacade.hpp storage/ndb/src/ndbapi/ndb_cluster_connection.cpp 2945 Frazer Clement 2009-07-03 [merge] Merge 6.3->7.0 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 === modified file 'storage/ndb/include/mgmapi/mgmapi_config_parameters.h' --- a/storage/ndb/include/mgmapi/mgmapi_config_parameters.h 2009-06-01 15:58:26 +0000 +++ b/storage/ndb/include/mgmapi/mgmapi_config_parameters.h 2009-07-03 06:34:01 +0000 @@ -233,6 +233,7 @@ #define CFG_MAX_SCAN_BATCH_SIZE 800 #define CFG_BATCH_BYTE_SIZE 801 #define CFG_BATCH_SIZE 802 +#define CFG_AUTO_RECONNECT 803 /** * Internal === modified file 'storage/ndb/include/ndbapi/ndb_cluster_connection.hpp' --- a/storage/ndb/include/ndbapi/ndb_cluster_connection.hpp 2009-06-13 19:09:35 +0000 +++ b/storage/ndb/include/ndbapi/ndb_cluster_connection.hpp 2009-07-03 06:34:01 +0000 @@ -149,6 +149,13 @@ public: int get_latest_error() const; const char *get_latest_error_msg() const; + /** + * Enable/disable auto-reconnect + * @param value 0 = false, 1 = true + */ + void set_auto_reconnect(int value); + int get_auto_reconnect() const; + #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL int get_no_ready(); const char *get_connectstring(char *buf, int buf_sz) const; === modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp' --- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2009-06-01 07:40:55 +0000 +++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2009-07-02 15:16:21 +0000 @@ -3654,7 +3654,8 @@ int Dblqh::saveAttrInfoInSection(const U return ZGET_ATTRINBUF_ERROR; }//if - regTcPtr->currTupAiLen+= len; + if (regTcPtr->m_flags & TcConnectionrec::OP_SAVEATTRINFO) + regTcPtr->currTupAiLen += len; return ZOK; } // saveAttrInfoInSection @@ -4282,7 +4283,6 @@ void Dblqh::execLQHKEYREQ(Signal* signal if (saveAttrInfo) regTcPtr->m_flags|= TcConnectionrec::OP_SAVEATTRINFO; - /* Handle any AttrInfo we received with the LQHKEYREQ */ if (regTcPtr->currReclenAi != 0) { @@ -4313,7 +4313,8 @@ void Dblqh::execLQHKEYREQ(Signal* signal return; } - regTcPtr->currTupAiLen= TreclenAiLqhkey; + if (saveAttrInfo) + regTcPtr->currTupAiLen= TreclenAiLqhkey; } }//if @@ -10515,7 +10516,10 @@ void Dblqh::initScanTc(const ScanFragReq tcConnectptr.p->m_scan_curr_range_no = 0; tcConnectptr.p->m_dealloc = 0; tcConnectptr.p->activeCreat = Fragrecord::AC_NORMAL; - tcConnectptr.p->m_flags = 0; + // set TcConnectionrec::OP_SAVEATTRINFO so that a + // "old" scan (short signals) update currTupAiLen which is checked + // in scanAttrinfoLab + tcConnectptr.p->m_flags = TcConnectionrec::OP_SAVEATTRINFO; TablerecPtr tTablePtr; tTablePtr.i = tabptr.p->primaryTableId; ptrCheckGuard(tTablePtr, ctabrecFileSize, tablerec); === modified file 'storage/ndb/src/mgmsrv/ConfigInfo.cpp' --- a/storage/ndb/src/mgmsrv/ConfigInfo.cpp 2009-06-26 13:33:01 +0000 +++ b/storage/ndb/src/mgmsrv/ConfigInfo.cpp 2009-07-03 06:34:01 +0000 @@ -1927,6 +1927,20 @@ const ConfigInfo::ParamInfo ConfigInfo:: STR_VALUE(MAX_INT_RNIL) }, + { + CFG_AUTO_RECONNECT, + "AutoReconnect", + "API", + "Specifies if an api node should reconnect when fully disconnected from cluster", + ConfigInfo::CI_USED, + false, + ConfigInfo::CI_BOOL, + "true", + "false", + "true" + }, + + /**************************************************************************** * MGM ***************************************************************************/ === modified file 'storage/ndb/src/ndbapi/ClusterMgr.cpp' --- a/storage/ndb/src/ndbapi/ClusterMgr.cpp 2009-05-27 15:21:45 +0000 +++ b/storage/ndb/src/ndbapi/ClusterMgr.cpp 2009-07-03 06:34:01 +0000 @@ -70,6 +70,7 @@ ClusterMgr::ClusterMgr(TransporterFacade ndbSetOwnVersion(); clusterMgrThreadMutex = NdbMutex_Create(); waitForHBCond= NdbCondition_Create(); + m_auto_reconnect = -1; DBUG_VOID_RETURN; } @@ -150,8 +151,9 @@ void ClusterMgr::doStop( ){ DBUG_ENTER("ClusterMgr::doStop"); Guard g(clusterMgrThreadMutex); - if(theStop) + if(theStop == 1){ DBUG_VOID_RETURN; + } void *status; theStop = 1; @@ -592,6 +594,11 @@ ClusterMgr::reportNodeFailed(NodeId node m_connect_count ++; m_cluster_state = CS_waiting_for_clean_cache; } + + if (m_auto_reconnect == 0) + { + theStop = 2; + } } theNode.nfCompleteRep = false; if(noOfAliveNodes == 0) === modified file 'storage/ndb/src/ndbapi/ClusterMgr.hpp' --- a/storage/ndb/src/ndbapi/ClusterMgr.hpp 2009-05-27 15:21:45 +0000 +++ b/storage/ndb/src/ndbapi/ClusterMgr.hpp 2009-07-03 06:34:01 +0000 @@ -91,6 +91,7 @@ public: Uint32 getNoOfConnectedNodes() const; void hb_received(NodeId); + int m_auto_reconnect; Uint32 m_connect_count; private: Uint32 m_max_api_reg_req_interval; === modified file 'storage/ndb/src/ndbapi/TransporterFacade.cpp' --- a/storage/ndb/src/ndbapi/TransporterFacade.cpp 2009-05-28 09:12:44 +0000 +++ b/storage/ndb/src/ndbapi/TransporterFacade.cpp 2009-07-03 06:34:01 +0000 @@ -863,6 +863,17 @@ TransporterFacade::configure(NodeId node m_batch_size= batch_size; } + Uint32 auto_reconnect=1; + iter.get(CFG_AUTO_RECONNECT, &auto_reconnect); + + /** + * Keep value it set before connect (overriding config) + */ + if (theClusterMgr->m_auto_reconnect == -1) + { + theClusterMgr->m_auto_reconnect = auto_reconnect; + } + // Configure timeouts Uint32 timeout = 120000; for (iter.first(); iter.valid(); iter.next()) @@ -2047,7 +2058,6 @@ SignalSender::sendSignal(Uint16 nodeId, return ss; } - Uint32* SignalSectionIterator::getNextWords(Uint32& sz) { @@ -2315,3 +2325,15 @@ int main(int arg, char** argv) return 0; } #endif + +void +TransporterFacade::set_auto_reconnect(int val) +{ + theClusterMgr->m_auto_reconnect = val; +} + +int +TransporterFacade::get_auto_reconnect() const +{ + return theClusterMgr->m_auto_reconnect; +} === modified file 'storage/ndb/src/ndbapi/TransporterFacade.hpp' --- a/storage/ndb/src/ndbapi/TransporterFacade.hpp 2009-05-27 15:21:45 +0000 +++ b/storage/ndb/src/ndbapi/TransporterFacade.hpp 2009-07-03 06:34:01 +0000 @@ -161,6 +161,8 @@ public: NdbWaiter* rem_last_from_cond_wait_queue(); // heart beat received from a node (e.g. a signal came) void hb_received(NodeId n); + void set_auto_reconnect(int val); + int get_auto_reconnect() const; /* TransporterCallback interface. */ void deliver_signal(SignalHeader * const header, @@ -192,7 +194,6 @@ public: theTransporterRegistry->reset_send_buffer(node, should_be_empty); } - private: void init_cond_wait_queue(); struct CondWaitQueueElement { === modified file 'storage/ndb/src/ndbapi/ndb_cluster_connection.cpp' --- a/storage/ndb/src/ndbapi/ndb_cluster_connection.cpp 2009-05-27 15:21:45 +0000 +++ b/storage/ndb/src/ndbapi/ndb_cluster_connection.cpp 2009-07-03 06:34:01 +0000 @@ -833,5 +833,17 @@ int Ndb_cluster_connection::set_timeout( timeout_ms); } +int +Ndb_cluster_connection::get_auto_reconnect() const +{ + return m_impl.m_transporter_facade->get_auto_reconnect(); +} + +void +Ndb_cluster_connection::set_auto_reconnect(int value) +{ + m_impl.m_transporter_facade->set_auto_reconnect(value); +} + template class Vector; --Boundary_(ID_ZfvjTfroXXOAEVnyYkPLCw) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/jonas@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/jonas@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jonas@stripped # target_branch: file:///home/jonas/src/telco-6.4/ # testament_sha1: ee198f612ac411f4409871bcfd44531fbc199957 # timestamp: 2009-07-03 23:39:29 +0200 # source_branch: file:///home/jonas/src/64-local/ # base_revision_id: frazer@stripped # # Begin bundle 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 95cZOSdhxdaawfneOPukaof+LuSKcKEg6StWTg== --Boundary_(ID_ZfvjTfroXXOAEVnyYkPLCw)--