From: Date: July 3 2009 11:22pm Subject: bzr commit into mysql-5.1-telco-7.0 branch (jonas:2946) List-Archive: http://lists.mysql.com/commits/77946 Message-Id: <20090703212242.A812991B651@perch.localdomain> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_q8TZ43+nrDdE8vUHR7S8EQ)" --Boundary_(ID_q8TZ43+nrDdE8vUHR7S8EQ) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///home/jonas/src/telco-6.4/ based on revid:frazer@stripped 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 === 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_q8TZ43+nrDdE8vUHR7S8EQ) 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: 4c789844cbdf035991572bbd0dad09d26e83eeaf # timestamp: 2009-07-03 23:22:42 +0200 # source_branch: file:///home/jonas/src/64-local/ # base_revision_id: frazer@stripped # # Begin bundle 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 --Boundary_(ID_q8TZ43+nrDdE8vUHR7S8EQ)--