diff options
Diffstat (limited to 'ndb/src/old_files/rep/ExtSender.cpp')
-rw-r--r-- | ndb/src/old_files/rep/ExtSender.cpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/ndb/src/old_files/rep/ExtSender.cpp b/ndb/src/old_files/rep/ExtSender.cpp new file mode 100644 index 00000000000..cf31001a85f --- /dev/null +++ b/ndb/src/old_files/rep/ExtSender.cpp @@ -0,0 +1,149 @@ +/* Copyright (C) 2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include "ExtSender.hpp" + +/***************************************************************************** + * Constructor / Destructor / Init / Get / Set + *****************************************************************************/ + +/** + * @todo: signalErrorHandler is not finished. Just infrastructure. + */ + +ExtSender::ExtSender() { + m_tf = NULL; + m_nodeId = 0; + m_ownRef = 0; +} + +ExtSender::~ExtSender() { + if (m_tf) delete m_tf; +} + +void +ExtSender::setNodeId(Uint32 nodeId) +{ +#if 0 + ndbout_c("ExtSender: Set nodeid to %d", nodeId); +#endif + + m_nodeId = nodeId; +} + +Uint32 +ExtSender::getOwnRef() const +{ + if(!m_ownRef) REPABORT("No m_ownRef set"); + + return m_ownRef; +} + +void +ExtSender::setOwnRef(Uint32 ref) +{ + // Can only be set once + if (m_ownRef != 0) REPABORT("Trying to change m_ownRef"); + + m_ownRef = ref; +} + +/***************************************************************************** + * Usage + *****************************************************************************/ + +int +ExtSender::sendSignal(class NdbApiSignal * s) { +#if 0 + ndbout_c("ExtSender: Sending signal %d to %d", + s->readSignalNumber(), m_nodeId); +#endif + + if (m_tf == NULL || m_nodeId == 0 || s==0) abort(); + m_tf->lock_mutex(); + int retvalue = m_tf->sendSignal(s, m_nodeId); + if (retvalue) { + RLOG(("sendSignal returned %d for send to node %d", retvalue, m_nodeId)); + } +#if 0 + ndbout_c("ExtSender: Sent signal to %d", m_nodeId); +#endif + m_tf->unlock_mutex(); + return retvalue; +} + +int +ExtSender::sendFragmentedSignal(NdbApiSignal * s, + LinearSectionPtr ptr[3], + Uint32 sections) { + if (m_tf == NULL || m_nodeId == 0) abort(); + m_tf->lock_mutex(); + int retvalue = m_tf->sendFragmentedSignal(s, m_nodeId, ptr, sections); + if (retvalue) { + RLOG(("sendFragmentedSignal returned %d for send to node %d", + retvalue, m_nodeId)); + } + m_tf->unlock_mutex(); + return retvalue; +} + +/** + * Check that TransporterFacade is connected to at least one DB node + */ +bool +ExtSender::connected(Uint32 timeOutMillis){ +#if 0 + ndbout_c("ExtSender: Waiting for remote component to be ready!"); +#endif + + NDB_TICKS start = NdbTick_CurrentMillisecond(); + NDB_TICKS now = start; + // while(m_tf->theClusterMgr->getNoOfConnectedNodes() == 0 && + while((m_tf->get_an_alive_node() == 0) && + (timeOutMillis == 0 || (now - start) < timeOutMillis)){ + NdbSleep_MilliSleep(100); + now = NdbTick_CurrentMillisecond(); + } + return m_tf->theClusterMgr->getNoOfConnectedNodes() > 0; +} + +bool +ExtSender::connected(Uint32 timeOutMillis, Uint32 nodeId){ + NDB_TICKS start = NdbTick_CurrentMillisecond(); + NDB_TICKS now = start; + + // while(m_tf->theClusterMgr->getNoOfConnectedNodes() == 0 && + while((m_tf->get_node_alive(nodeId) != 0) && + (timeOutMillis == 0 || (now - start) < timeOutMillis)){ + NdbSleep_MilliSleep(100); + now = NdbTick_CurrentMillisecond(); + } + return m_tf->theClusterMgr->getNoOfConnectedNodes() > 0; +} + +NdbApiSignal * +ExtSender::getSignal() +{ + /** + * @todo This should use some kind of list of NdbApiSignals, + * similar to the NDBAPI and the MGRSRVR. + * The best thing would be to have set of code + * shared between the programs. + * Thus the NDBAPI and MGMSRVR should be refactored. + * /Lars + */ + return new NdbApiSignal(getOwnRef()); +} |