From: Date: July 3 2009 9:03am Subject: bzr commit into mysql-5.1-telco-7.1 branch (jonas:2929) List-Archive: http://lists.mysql.com/commits/77897 Message-Id: <20090703070353.BC43791B661@perch.localdomain> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_VYzYg4Qy2NV5rFMft/UwEg)" --Boundary_(ID_VYzYg4Qy2NV5rFMft/UwEg) 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:jonas@stripped 2929 Jonas Oreland 2009-07-03 [merge] merge 70 to 71 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 07:03:36 +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 07:03:36 +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 07:03:36 +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 07:03:36 +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 07:03:36 +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 07:03:36 +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_VYzYg4Qy2NV5rFMft/UwEg) 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: 7f7dc2bc995709cfb0fc620ca14163ac4073763b # timestamp: 2009-07-03 09:03:53 +0200 # source_branch: file:///home/jonas/src/telco-6.4/ # base_revision_id: jonas@stripped # # Begin bundle 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 cTsTV0mqef+/pPy+KNFD/4u5IpwoSDux6VYA --Boundary_(ID_VYzYg4Qy2NV5rFMft/UwEg)--