From: Date: July 3 2009 11:22pm Subject: bzr commit into mysql-5.1-telco-7.1 branch (jonas:2933) List-Archive: http://lists.mysql.com/commits/77945 Message-Id: <20090703212252.105B191B651@perch.localdomain> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_wWo+8OCZOYiDUgzUDDdWvw)" --Boundary_(ID_wWo+8OCZOYiDUgzUDDdWvw) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///home/jonas/src/telco-7.1/ based on revid:magnus.blaudd@stripped 2933 Jonas Oreland 2009-07-03 [merge] merge 71-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 === 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 14:57:25 +0000 +++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2009-07-03 21:11:59 +0000 @@ -3719,7 +3719,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 @@ -4347,7 +4348,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) { @@ -4378,7 +4378,8 @@ void Dblqh::execLQHKEYREQ(Signal* signal return; } - regTcPtr->currTupAiLen= TreclenAiLqhkey; + if (saveAttrInfo) + regTcPtr->currTupAiLen= TreclenAiLqhkey; } }//if @@ -10580,7 +10581,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-06-29 20:56:37 +0000 +++ b/storage/ndb/src/ndbapi/ClusterMgr.cpp 2009-07-03 21:11:59 +0000 @@ -75,6 +75,7 @@ ClusterMgr::ClusterMgr(TransporterFacade ndbSetOwnVersion(); clusterMgrThreadMutex = NdbMutex_Create(); waitForHBCond= NdbCondition_Create(); + m_auto_reconnect = -1; int ret = open(&theFacade, API_CLUSTERMGR); assert(ret >= 0); @@ -172,6 +173,17 @@ ClusterMgr::configure(Uint32 nodeId, delete theArbitMgr; theArbitMgr= NULL; } + + Uint32 auto_reconnect=1; + iter.get(CFG_AUTO_RECONNECT, &auto_reconnect); + + /** + * Keep value it set before connect (overriding config) + */ + if (m_auto_reconnect == -1) + { + m_auto_reconnect = auto_reconnect; + } } void @@ -190,8 +202,9 @@ void ClusterMgr::doStop( ){ DBUG_ENTER("ClusterMgr::doStop"); Guard g(clusterMgrThreadMutex); - if(theStop) + if(theStop == 1){ DBUG_VOID_RETURN; + } void *status; theStop = 1; @@ -732,6 +745,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-06-29 20:56:37 +0000 +++ b/storage/ndb/src/ndbapi/ClusterMgr.hpp 2009-07-03 21:11:59 +0000 @@ -83,6 +83,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-06-29 20:56:37 +0000 +++ b/storage/ndb/src/ndbapi/TransporterFacade.cpp 2009-07-03 21:11:59 +0000 @@ -1674,7 +1674,6 @@ SignalSender::sendSignal(Uint16 nodeId, return ss; } - Uint32* SignalSectionIterator::getNextWords(Uint32& sz) { @@ -1942,3 +1941,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-06-29 20:56:37 +0000 +++ b/storage/ndb/src/ndbapi/TransporterFacade.hpp 2009-07-03 21:11:59 +0000 @@ -135,6 +135,8 @@ public: // 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, === modified file 'storage/ndb/src/ndbapi/ndb_cluster_connection.cpp' --- a/storage/ndb/src/ndbapi/ndb_cluster_connection.cpp 2009-06-29 20:56:37 +0000 +++ b/storage/ndb/src/ndbapi/ndb_cluster_connection.cpp 2009-07-03 21:11:59 +0000 @@ -897,5 +897,17 @@ Ndb_cluster_connection_impl::getRecvMute return m_transporter_facade->theMutexPtr; } +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_wWo+8OCZOYiDUgzUDDdWvw) 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-7.1/ # testament_sha1: 7ae5cebdbdfb8405253292b12d2674e1c394bb4b # timestamp: 2009-07-03 23:22:52 +0200 # source_branch: file:///home/jonas/src/71-local/ # base_revision_id: magnus.blaudd@stripped\ # hwnne8g7v3mnstkf # # Begin bundle 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 --Boundary_(ID_wWo+8OCZOYiDUgzUDDdWvw)--