From: Date: July 3 2009 11:12pm Subject: bzr commit into mysql-5.1-telco-7.1 branch (jonas:2930) List-Archive: http://lists.mysql.com/commits/77944 Message-Id: <20090703211214.039D091B651@perch.localdomain> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_VVcgzOhJEDLW92kUSsL2DQ)" --Boundary_(ID_VVcgzOhJEDLW92kUSsL2DQ) 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 2930 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 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_VVcgzOhJEDLW92kUSsL2DQ) 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: 1b15cdba1e8851a8736035651c1403c2579f5794 # timestamp: 2009-07-03 23:12:13 +0200 # source_branch: file:///home/jonas/src/telco-6.4/ # base_revision_id: magnus.blaudd@stripped\ # 37c0l83ogewtd1lw # # Begin bundle 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 --Boundary_(ID_VVcgzOhJEDLW92kUSsL2DQ)--