diff options
Diffstat (limited to 'ndb/src/old_files/rep')
68 files changed, 0 insertions, 11852 deletions
diff --git a/ndb/src/old_files/rep/ExtSender.cpp b/ndb/src/old_files/rep/ExtSender.cpp deleted file mode 100644 index cf31001a85f..00000000000 --- a/ndb/src/old_files/rep/ExtSender.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/* 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()); -} diff --git a/ndb/src/old_files/rep/ExtSender.hpp b/ndb/src/old_files/rep/ExtSender.hpp deleted file mode 100644 index 0bdabd68f37..00000000000 --- a/ndb/src/old_files/rep/ExtSender.hpp +++ /dev/null @@ -1,76 +0,0 @@ -/* 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 */ - -#ifndef EXT_SENDER_HPP -#define EXT_SENDER_HPP - -#include <NdbSleep.h> -#include <TransporterFacade.hpp> -#include <NdbApiSignal.hpp> -#include <rep/rep_version.hpp> - -/** - * @todo Johan comment: - * - * ext->sendSignal should return something if send failed. - * I.e., i think all methods sending a signal should return int - * so that we can take care of errors. ALternatively take care of - * the error like this: - * if(ext->sendSignal(..) < 0 ) - * handleSignalError(...) - * - * or a combination.... - * - * Should go through all places that sends signals and check that - * they do correct error handling. - */ - -/** - * @class ExtSender - * @brief Manages connection to a transporter facade - */ -class ExtSender { -public: - /*************************************************************************** - * Constructor / Destructor / Init / Get / Set (Only set once!) - ***************************************************************************/ - ExtSender(); - ~ExtSender(); - - void setTransporterFacade(TransporterFacade * tf) { m_tf = tf; } - void setNodeId(Uint32 nodeId); - Uint32 getOwnRef() const; - void setOwnRef(Uint32 ref); - - /*************************************************************************** - * Usage - ***************************************************************************/ - int sendSignal(NdbApiSignal * s); - int sendFragmentedSignal(NdbApiSignal * s, LinearSectionPtr ptr[3], - Uint32 sections); - - bool connected(Uint32 TimeOutInMilliSeconds); - bool connected(Uint32 TimeOutInMilliSeconds, Uint32 nodeId); - - NdbApiSignal * getSignal(); - -private: - TransporterFacade * m_tf; - Uint32 m_nodeId; - Uint32 m_ownRef; -}; - -#endif diff --git a/ndb/src/old_files/rep/Makefile b/ndb/src/old_files/rep/Makefile deleted file mode 100644 index 9688a68ec74..00000000000 --- a/ndb/src/old_files/rep/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -include .defs.mk - -# -# This "kernel" type should be removed (only need types) -# -TYPE := repserver kernel - -DIRS := adapters storage state transfer repapi - -BIN_TARGET := ndb_rep - -BIN_TARGET_LIBS := -BIN_TARGET_ARCHIVES += editline repstorage repadapters reprequestor reptransfer mgmapi NDB_API mgmsrvcommon - -SOURCES = \ - RepMain.cpp \ - Requestor.cpp \ - RequestorSubscriptions.cpp \ - \ - RepComponents.cpp \ - RepCommandInterpreter.cpp \ - RepApiService.cpp \ - RepApiInterpreter.cpp \ - SignalQueue.cpp \ - ExtSender.cpp \ - dbug_hack.cpp - -include $(NDB_TOP)/Epilogue.mk diff --git a/ndb/src/old_files/rep/NodeConnectInfo.hpp b/ndb/src/old_files/rep/NodeConnectInfo.hpp deleted file mode 100644 index 403f92a5999..00000000000 --- a/ndb/src/old_files/rep/NodeConnectInfo.hpp +++ /dev/null @@ -1,29 +0,0 @@ -/* 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 */ - -#ifndef NODE_CONNECTINFO_HPP -#define NODE_CONNECTINFO_HPP - -#include <ndb_types.h> - -struct NodeConnectInfo { - NodeConnectInfo(Uint16 n, bool c): nodeId(n), connected(c) {}; - Uint32 nodeId; - bool connected; -}; - - -#endif diff --git a/ndb/src/old_files/rep/README b/ndb/src/old_files/rep/README deleted file mode 100644 index 7be5e230eb3..00000000000 --- a/ndb/src/old_files/rep/README +++ /dev/null @@ -1,147 +0,0 @@ - =========================================== - MySQL Replication Servers - Lars Thalmann and Johan Andersson - 2003 MySQL AB - =========================================== - -------------------------------------------------------------------------------- - - PRIMARY SYSTEM STANDBY SYSTEM - REPLICATION SERVER REPLICATION SERVER - (PS or SOURCE SYSTEM) (SS or DESTINATION SYSTEM) - +------------------+ +-------------------------+ - | RepMain | | RepMain [Requests] | - | | +-------------------------+ - | | | Requestor [Executes] | - +------------------+ +-------------------------+ - PS --- | ExtNDB | TransPS | --- | TransSS | AppNDB | --- SS - +------------------+ +-------------------------+ - (GCIContainer) (GCIContainer) - (RepState) - - Figure 1: Replication Server Threads - -Component List --------------- -RepMain - Main thread that runs command-line interpreter [Requests] - -Requestor - Thread that runs RepState::execute [Executes] - -ExtNDB - Extracts transaction epochs from NDB Cluster - -TransPS, TransSS - Transfers information (control and epoch buffers) between - Replication Servers. - -AppNDB - Applies transaction epochs to NDB Cluster - -------------------------------------------------------------------------------- - - RepState Control - Object - +------------------+ - | RepState | - | [Requests] | - | [Executes] | - +------------------+ - | RepStateRequest | --- ExtSender - +------------------+ - - Figure 2: RepState Object - - -The RepState object is shared by all components. - - -------------------------------------------------------------------------------- - -Dependent Directories ---------------------- -rep/adapters Appliers and Extractors - All code dependent on the database system - -rep/transfer - Depends on NDB transporters - -rep/state - Shared resources for all components - -Independent Directories ------------------------ -rep/storage Storage of epochs - Should not depend on any transporters/NDB specific - -rep/repstate - Should only have a reference to an ExtSender for the external PS REP node - - -------------------------------------------------------------------------------- - -Replication Teminology ----------------------- -GLOBAL CHECKPOINT <global checkpoint id - gci> -A global checkpoint is a point in time when all database server -are synchronized. - -NODE -A database server with information. - -NODE GROUP <node group id> -A set of database servers, all storing the same information. - -SUBSCRIPTION <subscription id>. -A "subscription" is a collection of services that a source system -provides. The main to services belonging to a subscription are -"log" and "scan". Log provides the replication servers with -log entries (epochs) and scan provides the replication servers -with scanned data (also stored in epochs). - -EPOCH <subscription id, gci> -An "epoch" is a log of all database changes between two time points. -(An epoch can have redundant log entries.) An epoch is named by the -number of the time slice between the two time points. - -EPOCH BUFFER <subscription id, gci, node group id> -An "epoch buffer" is a part of the log belonging to an epoch. An -epoch buffer does not contain any redundancy. - -Two epoch buffers with the same subscription id and gci can be -"complements" or "duplicates" to each other. If they are complements, -they store different information, if they are duplicates then they -store equivalent information (the information need not be identical, -but it is equivalent for the purpose of restoring the original -information). If they are duplicates then they have the same name, -i.e. same subscription id, gci, and node group id. - -CHANNEL <subscription id> -A "channel" is a collection of epoch buffers belonging to -a specific subscription. (The channel can exist before it is -assigned to a subscription.) - -SUBSCRIPTION CONSISTENT -A database is "subscription consistent" or "consistent with respect -to a subscription" if ... - -Architectural Terminology -------------------------- -ADAPTER -An "adapter" is either an applier or an extractor. - -APPLIER -An "applier" is a a collection of threads in the replication server -that applies epochs to a destination database system. - -EXTRACTOR -An "extractor" is a collection of theads in the replication server -that receives epochs from a source database system. - -TRANSFER COMPONENT -A "transfer component" is a thread in the replication server that is -responsible for the connection with another replication server. - -REQUESTOR -A thread in the replication server that controls replication. diff --git a/ndb/src/old_files/rep/RepApiInterpreter.cpp b/ndb/src/old_files/rep/RepApiInterpreter.cpp deleted file mode 100644 index 6e6f150713a..00000000000 --- a/ndb/src/old_files/rep/RepApiInterpreter.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* 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 "RepApiInterpreter.hpp" -#include <signaldata/GrepImpl.hpp> - -RepApiInterpreter::RepApiInterpreter(RepComponents * comps, int port) -{ - m_repComponents = comps; - m_repState = comps->getRepState(); - m_port = port; - ss = new SocketServer(); - serv = new RepApiService(*this); -} - - -RepApiInterpreter::~RepApiInterpreter() -{ -} - -void -RepApiInterpreter::startInterpreter() -{ - if(!ss->setup(serv, m_port)){ - sleep(1); - delete ss; - delete serv; - } - ss->startServer(); -} - - -void -RepApiInterpreter::stopInterpreter() -{ - delete ss; -} - - -Properties * -RepApiInterpreter::execCommand(const Properties & props) -{ - Properties * result = new Properties(); - Uint32 req = 0; - Uint32 epoch = 0; - props.get("request", &req); - props.get("epoch", &epoch); - GrepError::Code err = m_repState->protectedRequest((GrepReq::Request)req, - epoch); - result->put("err", err); - return result; -} - -Properties * -RepApiInterpreter::getStatus() -{ - - return m_repState->getStatus(); -} - - -Properties * -RepApiInterpreter::query(Uint32 counter, Uint32 replicationId) -{ - return m_repState->query((QueryCounter)counter, replicationId); -} - diff --git a/ndb/src/old_files/rep/RepApiInterpreter.hpp b/ndb/src/old_files/rep/RepApiInterpreter.hpp deleted file mode 100644 index 78f190156b3..00000000000 --- a/ndb/src/old_files/rep/RepApiInterpreter.hpp +++ /dev/null @@ -1,54 +0,0 @@ -/* 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 */ - -#ifndef REP_API_INTERPRETER_HPP -#define REP_API_INTERPRETER_HPP - -#include <editline/editline.h> - -#include <rep/RepComponents.hpp> -#include <rep/state/RepState.hpp> -#include <rep/RepApiService.hpp> -#include <signaldata/GrepImpl.hpp> -#include <Properties.hpp> - -/** - * @class RepCommandInterpreter - * @brief - */ - -class RepApiInterpreter { -public: - RepApiInterpreter(class RepComponents * comps, int port); - ~RepApiInterpreter(); - void startInterpreter(); - void stopInterpreter(); - Properties * execCommand(const Properties & props); - Properties * getStatus(); - Properties * query(Uint32 counter, Uint32 replicationId); - bool readAndExecute(); - -private: - char * readline_gets() const; - void request(Uint32 request); - int m_port; - class RepComponents * m_repComponents; - class RepState * m_repState; - SocketServer * ss; - RepApiService * serv; -}; - -#endif diff --git a/ndb/src/old_files/rep/RepApiService.cpp b/ndb/src/old_files/rep/RepApiService.cpp deleted file mode 100644 index d07f7a59375..00000000000 --- a/ndb/src/old_files/rep/RepApiService.cpp +++ /dev/null @@ -1,318 +0,0 @@ -/* 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 <Parser.hpp> -#include <NdbOut.hpp> -#include <Properties.hpp> -#include <socket_io.h> -#include "RepApiService.hpp" -#include "RepApiInterpreter.hpp" -#include "repapi/repapi.h" -#include <NdbMutex.h> -#include <OutputStream.hpp> - -/** - const char * name; - const char * realName; - const Type type; - const ArgType argType; - const ArgRequired argRequired; - const ArgMinMax argMinMax; - const int minVal; - const int maxVal; - void (T::* function)(const class Properties & args); - const char * description; -*/ - -#define REP_CMD(name, fun, desc) \ - { name, \ - 0, \ - ParserRow<RepApiSession>::Cmd, \ - ParserRow<RepApiSession>::String, \ - ParserRow<RepApiSession>::Optional, \ - ParserRow<RepApiSession>::IgnoreMinMax, \ - 0, 0, \ - fun, \ - desc } - -#define REP_ARG(name, type, opt, desc) \ - { name, \ - 0, \ - ParserRow<RepApiSession>::Arg, \ - ParserRow<RepApiSession>::type, \ - ParserRow<RepApiSession>::opt, \ - ParserRow<RepApiSession>::IgnoreMinMax, \ - 0, 0, \ - 0, \ - desc } - -#define REP_ARG2(name, type, opt, min, max, desc) \ - { name, \ - 0, \ - ParserRow<RepApiSession>::Arg, \ - ParserRow<RepApiSession>::type, \ - ParserRow<RepApiSession>::opt, \ - ParserRow<RepApiSession>::IgnoreMinMax, \ - min, max, \ - 0, \ - desc } - -#define REP_END() \ - { 0, \ - 0, \ - ParserRow<RepApiSession>::Arg, \ - ParserRow<RepApiSession>::Int, \ - ParserRow<RepApiSession>::Optional, \ - ParserRow<RepApiSession>::IgnoreMinMax, \ - 0, 0, \ - 0, \ - 0 } - -#define REP_CMD_ALIAS(name, realName, fun) \ - { name, \ - realName, \ - ParserRow<RepApiSession>::CmdAlias, \ - ParserRow<RepApiSession>::Int, \ - ParserRow<RepApiSession>::Optional, \ - ParserRow<RepApiSession>::IgnoreMinMax, \ - 0, 0, \ - 0, \ - 0 } - -#define REP_ARG_ALIAS(name, realName, fun) \ - { name, \ - realName, \ - ParserRow<RepApiSession>::ArgAlias, \ - ParserRow<RepApiSession>::Int, \ - ParserRow<RepApiSession>::Optional, \ - ParserRow<RepApiSession>::IgnoreMinMax, \ - 0, 0, \ - 0, \ - 0 } - - -const -ParserRow<RepApiSession> commands[] = -{ - - REP_CMD("rep" , &RepApiSession::execCommand, ""), - REP_ARG("request", Int, Mandatory, "Grep::Request."), - REP_ARG("id", Int, Mandatory, "Replication id "), - REP_ARG("epoch", Int, Optional, "Epoch. Used by stop epoch ..."), - - REP_CMD("rep status" , &RepApiSession::getStatus, ""), - REP_ARG("request", Int, Optional, "Grep::Request."), - - REP_CMD("rep query" , &RepApiSession::query, ""), - REP_ARG("id", Int, Mandatory, "Replication Id"), - REP_ARG("counter", Int, Mandatory, "QueryCounter."), - REP_ARG("request", Int, Mandatory, "Grep::Request."), - - REP_END() -}; -RepApiSession::RepApiSession(NDB_SOCKET_TYPE sock, - class RepApiInterpreter & rep) - : SocketServer::Session(sock) - , m_rep(rep) -{ - m_input = new SocketInputStream(sock); - m_output = new SocketOutputStream(sock); - m_parser = new Parser<RepApiSession>(commands, *m_input, true, true, true); -} - -RepApiSession::RepApiSession(FILE * f, class RepApiInterpreter & rep) - : SocketServer::Session(1) - , m_rep(rep) -{ - m_input = new FileInputStream(f); - m_parser = new Parser<RepApiSession>(commands, *m_input, true, true, true); -} - -RepApiSession::~RepApiSession() -{ - delete m_input; - delete m_parser; -} - -void -RepApiSession::runSession() -{ - Parser_t::Context ctx; - while(!m_stop){ - m_parser->run(ctx, * this); - if(ctx.m_currentToken == 0) - break; - - switch(ctx.m_status){ - case Parser_t::Ok: - for(size_t i = 0; i<ctx.m_aliasUsed.size(); i++) - ndbout_c("Used alias: %s -> %s", - ctx.m_aliasUsed[i]->name, ctx.m_aliasUsed[i]->realName); - break; - case Parser_t::NoLine: - case Parser_t::EmptyLine: - break; - default: - break; - } - } - NDB_CLOSE_SOCKET(m_socket); -} - -void -RepApiSession::execCommand(Parser_t::Context & /* unused */, - const class Properties & args) -{ - Uint32 err; - Uint32 replicationId; - args.get("id", &replicationId); - Properties * result = m_rep.execCommand(args); - if(result == NULL) { - m_output->println("global replication reply"); - m_output->println("result: %d", -1); - m_output->println("id: %d",replicationId); - m_output->println(""); - return; - } - result->get("err", &err); - m_output->println("global replication reply"); - m_output->println("result: %d", err); - m_output->println("id: %d", 0); - m_output->println(""); - delete result; -} - - -void -RepApiSession::getStatus(Parser_t::Context & /* unused */, - const class Properties & args) -{ - Uint32 err; - Properties * result = m_rep.getStatus(); - result->get("err", &err); - Uint32 subId; - result->get("subid", &subId); - Uint32 subKey; - result->get("subkey", &subKey); - Uint32 connected_rep; - result->get("connected_rep", &connected_rep); - Uint32 connected_db; - result->get("connected_db", &connected_db); - Uint32 state; - result->get("state", &state); - Uint32 state_sub; - result->get("state", &state_sub); - - m_output->println("global replication status reply"); - m_output->println("result: %d",0); - m_output->println("id: %d",0); - m_output->println("subid: %d", subId); - m_output->println("subkey: %d", subKey); - m_output->println("connected_rep: %d", connected_rep); - m_output->println("connected_db: %d", connected_db); - m_output->println("state_sub: %d", state_sub); - m_output->println("state: %d", state); - m_output->println(""); - delete result; -} - - -void -RepApiSession::query(Parser_t::Context & /* unused */, - const class Properties & args) -{ - Uint32 err; - Uint32 counter, replicationId; - args.get("counter", &counter); - args.get("id", &replicationId); - Properties * result = m_rep.query(counter, replicationId); - if(result == NULL) { - m_output->println("global replication query reply"); - m_output->println("result: %s","Failed"); - m_output->println("id: %d",replicationId); - m_output->println(""); - return; - } - - BaseString first; - BaseString last; - Uint32 subid = 0, subkey = 0, no_of_nodegroups = 0; - Uint32 connected_rep = 0, connected_db = 0; - Uint32 state = 0 , state_sub = 0; - result->get("err", &err); - result->get("no_of_nodegroups", &no_of_nodegroups); - result->get("subid", &subid); - result->get("subkey", &subkey); - result->get("connected_rep", &connected_rep); - result->get("connected_db", &connected_db); - result->get("first", first); - result->get("last", last); - result->get("state", &state); - result->get("state_sub", &state_sub); - m_output->println("global replication query reply"); - m_output->println("result: %s","Ok"); - m_output->println("id: %d",replicationId); - m_output->println("no_of_nodegroups: %d",no_of_nodegroups); - m_output->println("subid: %d", subid); - m_output->println("subkey: %d", subkey); - m_output->println("connected_rep: %d", connected_rep); - m_output->println("connected_db: %d", connected_db); - m_output->println("state_sub: %d", state_sub); - m_output->println("state: %d", state); - m_output->println("first: %s", first.c_str()); - m_output->println("last: %s", last.c_str()); - m_output->println(""); - delete result; -} - - - -static const char * -propToString(Properties *prop, const char *key) { - static char buf[32]; - const char *retval = NULL; - PropertiesType pt; - - prop->getTypeOf(key, &pt); - switch(pt) { - case PropertiesType_Uint32: - Uint32 val; - prop->get(key, &val); - snprintf(buf, sizeof buf, "%d", val); - retval = buf; - break; - case PropertiesType_char: - const char *str; - prop->get(key, &str); - retval = str; - break; - default: - snprintf(buf, sizeof buf, "(unknown)"); - retval = buf; - } - return retval; -} - -void -RepApiSession::printProperty(Properties *prop, const char *key) { - m_output->println("%s: %s", key, propToString(prop, key)); -} - -void -RepApiSession::stopSession(){ - -} diff --git a/ndb/src/old_files/rep/RepApiService.hpp b/ndb/src/old_files/rep/RepApiService.hpp deleted file mode 100644 index e1137e53258..00000000000 --- a/ndb/src/old_files/rep/RepApiService.hpp +++ /dev/null @@ -1,59 +0,0 @@ -/* 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 */ - -#ifndef REP_APISERVICE_HPP -#define REP_APISERVICE_HPP - -#include <Parser.hpp> -#include <InputStream.hpp> -#include <SocketServer.hpp> - -class RepApiInterpreter; - -class RepApiSession : public SocketServer::Session { - typedef Parser<RepApiSession> Parser_t; - - class RepApiInterpreter & m_rep; - InputStream *m_input; - OutputStream *m_output; - Parser_t *m_parser; - -void printProperty(Properties *prop, const char *key); -public: - RepApiSession(NDB_SOCKET_TYPE, class RepApiInterpreter &); - RepApiSession(FILE * f, class RepApiInterpreter & rep); - ~RepApiSession(); - - virtual void runSession(); - virtual void stopSession(); - - void execCommand(Parser_t::Context & ctx, const class Properties & args); - void getStatus(Parser_t::Context & ctx, const class Properties & args); - void query(Parser_t::Context & ctx, const class Properties & args); - -}; - -class RepApiService : public SocketServer::Service { - class RepApiInterpreter & m_rep; -public: - RepApiService(class RepApiInterpreter & rep) : m_rep(rep) {} - - RepApiSession * newSession(NDB_SOCKET_TYPE theSock){ - return new RepApiSession(theSock, m_rep); - } -}; - -#endif diff --git a/ndb/src/old_files/rep/RepCommandInterpreter.cpp b/ndb/src/old_files/rep/RepCommandInterpreter.cpp deleted file mode 100644 index a0daf9529ab..00000000000 --- a/ndb/src/old_files/rep/RepCommandInterpreter.cpp +++ /dev/null @@ -1,456 +0,0 @@ -/* 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 "RepCommandInterpreter.hpp" - -static const char* -helpTextRep = -"+-------------------------------------------------------------------------+\n" -"| MySQL Replication Server |\n" -"| Commands should be executed on the standby Replication Server |\n" -"+-------------------------------------------------------------------------+\n" -"| Simple Commands |\n" -"+-------------------------------------------------------------------------+\n" -"| START Start replication |\n" -"| STATUS Show replication status |\n" -"+-------------------------------------------------------------------------+\n" -"| Advanced Commands |\n" -"+-------------------------------------------------------------------------+\n" -"| STOP <epoch no> Stop replication after epoch number <epoch no> |\n" -"| STOP IMMEDIATELY Stop replication after applying the current epoch |\n" -"| ADD TABLE <db>/<schema>/<tablename> |\n" -"| Note: <db>/<schema>/<tablename> is case sensitive! |\n" -"| Use 'STATUS' to see added tables. |\n" -"| REMOVE TABLE <db>/<schema>/<tablename> |\n" -"| Note: <db>/<schema>/<tablename> is case sensitive! |\n" -"| ENABLE <protocol> Starts protocol |\n" -"| DISABLE <protocol> Stops protocol |\n" -"| DEBUG Toggle logging of replication messages on console |\n" -"| |\n" -"| <protocol> ::= REQUESTOR | TRANSFER | APPLY | DELETE |\n" -"+-------------------------------------------------------------------------+\n" -; - -/** - * @todo -"| <protocol> ::= SUBID | SUBSCRIPTION |\n" -"| <protocol> ::= METALOG | METASCAN | DATALOG | DATASCAN |\n" -"| <system> ::= PRIMARY | STANDBY | TWOWAY |\n" -"| CONNECT <system> Connects to NDB Cluster and other replication server |\n" -"| DELETE Removes all epochs stored in replication servers |\n" -"| DROP <tableid> Drops table in standby system identified by table id |\n" -"| <epoch> ::= Any integer (naming the last epoch to be applied) |\n" -*/ - -RepCommandInterpreter::RepCommandInterpreter(RepComponents * comps) -{ - m_repComponents = comps; - m_repState = comps->getRepState(); -} - -RepCommandInterpreter::~RepCommandInterpreter() -{ -} - -/** - * Read a string, and return a pointer to it. - * - * @return NULL on EOF. - */ -char * -RepCommandInterpreter::readline_gets() const -{ - static char *line_read = (char *)NULL; - - // Disable the default file-name completion action of TAB - // rl_bind_key ('\t', rl_insert); - - /* If the buffer has already been allocated, return the memory - to the free pool. */ - if (line_read) - { - NdbMem_Free(line_read); - line_read = (char *)NULL; - } - - /* Get a line from the user. */ - line_read = readline ("REP> "); - - /* If the line has any text in it, save it on the history. */ - if (line_read && *line_read) - add_history (line_read); - - return (line_read); -} - -bool emptyString(const char* s) -{ - if (s == NULL) { - return true; - } - - for (unsigned int i = 0; i < strlen(s); ++i) { - if (! isspace(s[i])) { - return false; - } - } - - return true; -} - -/** - * Converts a string to a Uint32 pointed value! - */ -bool convert(const char* s, Uint32 * val) -{ - if (s == NULL) { - return false; - } - - if (strlen(s) == 0) { - return false; - } - - errno = 0; - char* p; - long v = strtol(s, &p, 10); - if (errno != 0) { - return false; - } - if (p != &s[strlen(s)]) { - return false; - } - - *val = v; - return true; -} - -void -printError(GrepError::Code err) -{ - if (err == GrepError::NO_ERROR) { ndbout << "Ok" << endl; } - else { ndbout << GrepError::getErrorDesc(err) << endl; } -} - -bool -RepCommandInterpreter::readAndExecute() -{ - GrepError::Code err; - - char* _line = readline_gets(); - char * line; - if(_line == NULL) { - ndbout << endl; - return true; - } - - line = strdup(_line); - - if (emptyString(line)) { - return true; - } - - /* I have to uncomment this, since otherwise <db>/<schema>/<table> - is converted to capitals, but it is case sensitive! - for (unsigned int i = 0; i < strlen(line); ++i) { - line[i] = toupper(line[i]); - } - */ - // if there is anything in the line proceed - char* firstToken = strtok(line, " "); - for (unsigned int i = 0; i < strlen(firstToken); ++i) { - firstToken[i] = toupper(firstToken[i]); - } - char* allAfterFirstToken = strtok(NULL, "\0"); - - /** - * Commands for REP Client only - */ - if (strcmp(firstToken, "ADD") == 0) { - if (m_repState->m_channel.getStateSub() != - Channel::NO_SUBSCRIPTION_EXISTS) { - ndbout_c("Subscription already exists"); - ndbout_c("Tables must be added before subscription exists"); - return true; - } - char * secondToken = strtok(allAfterFirstToken, " "); - char * fullTableName = strtok(NULL, "\0"); - if(fullTableName == NULL) { - ndbout_c("Table name not specified"); - return true; - } - for (unsigned int i = 0; i < strlen(secondToken); ++i) { - secondToken[i] = toupper(secondToken[i]); - } - - if (strcmp(secondToken, "TABLE") == 0) { - err = m_repState->protectedAddTable(fullTableName); - printError(err); - return true; - } - return true; - } - if (strcmp(firstToken, "REMOVE") == 0) { - if (m_repState->m_channel.getStateSub() != - Channel::NO_SUBSCRIPTION_EXISTS) { - ndbout_c("Subscription already exists"); - ndbout_c("Tables can not be removed after subscription is created"); - return true; - } - char * secondToken = strtok(allAfterFirstToken, " "); - char * fullTableName = strtok(NULL, "\0"); - if(fullTableName == NULL) { - ndbout_c("Table name not specified"); - return true; - } - for (unsigned int i = 0; i < strlen(secondToken); ++i) { - secondToken[i] = toupper(secondToken[i]); - } - - if (strcmp(secondToken, "TABLE") == 0) { - err = m_repState->protectedRemoveTable(fullTableName); - printError(err); - return true; - } - return true; - } - /** - * now, we can convert allAfterFirstToken to capitals - */ - if(allAfterFirstToken != 0) { - for (unsigned int i = 0; i < strlen(allAfterFirstToken); ++i) { - allAfterFirstToken[i] = toupper(allAfterFirstToken[i]); - } - } - if (strcmp(firstToken, "CONNECT") == 0) { - - if (strcmp(allAfterFirstToken, "PRIMARY") == 0) { - m_repComponents->connectPS(); - return true; - } - if (strcmp(allAfterFirstToken, "STANDBY") == 0) { - m_repComponents->connectPS(); - return true; - } - if (strcmp(allAfterFirstToken, "TWOWAY") == 0) { - m_repComponents->connectPS(); - return true; - } - ndbout_c("Unknown argument: %s to command: %s", - allAfterFirstToken, firstToken); - return true; - } - - if (strcmp(firstToken, "HELP") == 0) { - ndbout << helpTextRep; - return true; - } - - if (strcmp(firstToken, "QUIT") == 0 || - strcmp(firstToken, "BYE") == 0 || - strcmp(firstToken, "EXIT") == 0) { - return false; - } - - /** - * Commands for REP Server API - */ - if (strcmp(firstToken, "STATUS") == 0 || - strcmp(firstToken, "INFO") == 0 || - strcmp(firstToken, "I") == 0) { - m_repState->protectedRequest(GrepReq::STATUS, 0); - return true; - } - - if (strcmp(firstToken, "DEBUG") == 0) { - if (replogEnabled) - { - ndbout_c("Debugging disabled."); - replogEnabled = false; - } - else - { - ndbout_c("Debugging enabled."); - replogEnabled = true; - } - return true; - } - - if (strcmp(firstToken, "ENABLE") == 0) { - if (strcmp(allAfterFirstToken, "REQUESTOR") == 0) { - err = m_repState->protectedRequest(GrepReq::START_REQUESTOR, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "TRANSFER") == 0) { - err = m_repState->protectedRequest(GrepReq::START_TRANSFER, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "APPLY") == 0) { - err = m_repState->protectedRequest(GrepReq::START_APPLY, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "DELETE") == 0) { - err = m_repState->protectedRequest(GrepReq::START_DELETE, 0); - printError(err); - return true; - } - ndbout_c("Unknown argument: %s to command: %s", - allAfterFirstToken, firstToken); - return true; - } - - if (strcmp(firstToken, "DISABLE") == 0) { - if (strcmp(allAfterFirstToken, "REQUESTOR") == 0) { - err = m_repState->protectedRequest(GrepReq::STOP_REQUESTOR, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "TRANSFER") == 0) { - err = m_repState->protectedRequest(GrepReq::STOP_TRANSFER, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "APPLY") == 0) { - err = m_repState->protectedRequest(GrepReq::STOP_APPLY, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "DELETE") == 0) { - err = m_repState->protectedRequest(GrepReq::STOP_DELETE, 0); - printError(err); - return true; - } - ndbout_c("Unknown argument: %s to command: %s", - allAfterFirstToken, firstToken); - return true; - } - - if (strcmp(firstToken, "START") == 0) { - if (allAfterFirstToken == NULL) { - err = m_repState->protectedRequest(GrepReq::START, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "SUBID") == 0) { - err = m_repState->protectedRequest(GrepReq::CREATE_SUBSCR, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "SUBSCR") == 0 || - strcmp(allAfterFirstToken, "SUBSCRIPTION") == 0) { - err = m_repState->protectedRequest(GrepReq::START_SUBSCR, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "METALOG") == 0) { - err = m_repState->protectedRequest(GrepReq::START_METALOG, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "METASCAN") == 0) { - err = m_repState->protectedRequest(GrepReq::START_METASCAN, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "DATALOG") == 0) { - err = m_repState->protectedRequest(GrepReq::START_DATALOG, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "DATASCAN") == 0) { - err = m_repState->protectedRequest(GrepReq::START_DATASCAN, 0); - printError(err); - return true; - } - ndbout_c("Unknown argument: %s to command: %s", - allAfterFirstToken, firstToken); - return true; - } - - if (strcmp(firstToken, "STOP") == 0) { - if (allAfterFirstToken == NULL) { - ndbout_c("Please use either 'STOP IMMEDIATELY' or 'STOP <epoch no>', " - "where\n<epoch no> is greater than or equal to " - "the last applied epoch."); - return true; - } - - char * secondToken = strtok(allAfterFirstToken, " "); - char * subscription = strtok(NULL, "\0"); - if (strcmp(secondToken, "SUBSCR") == 0 || - strcmp(secondToken, "SUBSCRIPTION") == 0) { - char * sSubId = strtok(subscription," "); - char * sSubKey = strtok(NULL, "\0"); - int subId = atoi(sSubId); - int subKey = atoi(sSubKey); - err = m_repState->protectedRequest(GrepReq::STOP_SUBSCR, subId, subKey ); - printError(err); - return true; - } - - if (strcmp(allAfterFirstToken, "SUBID") == 0) { - ndbout_c("Not implemented"); - return true; - } - - - if (strcmp(allAfterFirstToken, "METALOG") == 0) { - err = m_repState->protectedRequest(GrepReq::STOP_METALOG, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "METASCAN") == 0) { - err = m_repState->protectedRequest(GrepReq::STOP_METASCAN, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "DATALOG") == 0) { - err = m_repState->protectedRequest(GrepReq::STOP_DATALOG, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "DATASCAN") == 0) { - err = m_repState->protectedRequest(GrepReq::STOP_DATASCAN, 0); - printError(err); - return true; - } - if (strcmp(allAfterFirstToken, "IM") == 0 || - strcmp(allAfterFirstToken, "IMM") == 0 || - strcmp(allAfterFirstToken, "IMMEDIATELY") == 0) { - err = m_repState->protectedRequest(GrepReq::STOP, 0); - printError(err); - return true; - } - Uint32 stopEpoch; - if (convert(allAfterFirstToken, &stopEpoch)) { - err = m_repState->protectedRequest(GrepReq::STOP, stopEpoch); - printError(err); - return true; - } - - ndbout_c("Unknown argument: %s to command: %s", - allAfterFirstToken, firstToken); - return true; - } - - ndbout_c("Unknown Command: %s", firstToken); - ndbout_c("Type HELP for help."); - ndbout << endl; - return true; -} diff --git a/ndb/src/old_files/rep/RepCommandInterpreter.hpp b/ndb/src/old_files/rep/RepCommandInterpreter.hpp deleted file mode 100644 index 398a7c0318c..00000000000 --- a/ndb/src/old_files/rep/RepCommandInterpreter.hpp +++ /dev/null @@ -1,45 +0,0 @@ -/* 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 */ - -#ifndef REP_COMMAND_INTERPRETER_HPP -#define REP_COMMAND_INTERPRETER_HPP - -#include <editline/editline.h> - -#include <rep/RepComponents.hpp> -#include <rep/state/RepState.hpp> - -/** - * @class RepCommandInterpreter - * @brief - */ - -class RepCommandInterpreter { -public: - RepCommandInterpreter(class RepComponents * comps); - ~RepCommandInterpreter(); - - bool readAndExecute(); - -private: - char * readline_gets() const; - void request(Uint32 request); - - class RepComponents * m_repComponents; - class RepState * m_repState; -}; - -#endif diff --git a/ndb/src/old_files/rep/RepComponents.cpp b/ndb/src/old_files/rep/RepComponents.cpp deleted file mode 100644 index 04b2e0e5fa5..00000000000 --- a/ndb/src/old_files/rep/RepComponents.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/* 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 "RepComponents.hpp" - -RepComponents::RepComponents() -{ - /** - * @todo Fix proper reporting of errors - */ - m_connectStringPS = NULL; - m_connectStringSS = NULL; - - /** - * Phase 1: Containers, RepState - */ - m_gciContainer = new GCIContainer(MAX_NODE_GROUPS); - if (!m_gciContainer) REPABORT("Could not allocate object"); - m_gciContainerPS = new GCIContainerPS(MAX_NODE_GROUPS); - if (!m_gciContainerPS) REPABORT("Could not allocate object"); - m_repState = new RepState(); - if (!m_repState) REPABORT("Could not allocate object"); - - /** - * Phase 2: PS - */ - m_transPS = new TransPS(m_gciContainerPS); - if (!m_transPS) REPABORT("Could not allocate object"); - - - m_extAPI = new ExtAPI(); - if (!m_extAPI) REPABORT("Could not allocate object"); - - m_extNDB = new ExtNDB(m_gciContainerPS, m_extAPI); - if (!m_extNDB) REPABORT("Could not allocate object"); - - /** - * Phase 3: SS - */ - m_transSS = new TransSS(m_gciContainer, m_repState); - if (!m_transSS) REPABORT("Could not allocate object"); - m_appNDB = new AppNDB(m_gciContainer, m_repState); - if (!m_appNDB) REPABORT("Could not allocate object"); - - /** - * Phase 4: Requestor - */ - m_requestor = new Requestor(m_gciContainer, m_appNDB, m_repState); - if (!m_requestor) REPABORT("Could not allocate object"); - - /** - * Phase 5 - */ - m_repState->init(m_transSS->getRepSender()); - m_repState->setApplier(m_appNDB); - m_repState->setGCIContainer(m_gciContainer); - - m_requestor->setRepSender(m_transSS->getRepSender()); - - m_extNDB->setRepSender(m_transPS->getRepSender()); - - m_transPS->setGrepSender(m_extNDB->getGrepSender()); -} - -RepComponents::~RepComponents() -{ - if (m_requestor) delete m_requestor; - - if (m_appNDB) delete m_appNDB; - if (m_extNDB) delete m_extNDB; - if (m_extAPI) delete m_extAPI; - - if (m_repState) delete m_repState; - - if (m_transPS) delete m_transPS; - if (m_transSS) delete m_transSS; - - if (m_gciContainer) delete m_gciContainer; - if (m_gciContainerPS) delete m_gciContainerPS; -} - -int -RepComponents::connectPS() -{ - /** - * @todo Fix return values of this function - */ - - /** - * Phase 1: TransporterFacade 1, Block number: 2 (PS) - */ - if (!m_extNDB->init(m_connectStringPS)) return -1; - - /** - * Phase 2: TransporterFacade 2, Block number: 2 (PS) - */ - m_transPS->init(m_transSS->getTransporterFacade(), m_connectStringPS); - - return 0; -} - -int -RepComponents::connectSS() -{ - /** - * @todo Fix return values of this function - */ - - /** - * Phase 1: TransporterFacade 1, Block number: 1 (SS) - */ - m_appNDB->init(m_connectStringSS); - - /** - * Phase 2: TransporterFacade 2, Block number: 1 (SS) - */ - m_transSS->init(m_connectStringSS); - - /** - * Phase 3: Has no TransporterFacade, just starts thread - */ - m_requestor->init(); - - return 0; -} diff --git a/ndb/src/old_files/rep/RepComponents.hpp b/ndb/src/old_files/rep/RepComponents.hpp deleted file mode 100644 index ff0f29e2128..00000000000 --- a/ndb/src/old_files/rep/RepComponents.hpp +++ /dev/null @@ -1,60 +0,0 @@ -/* 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 */ - -#ifndef REPCOMPONENTS_HPP -#define REPCOMPONENTS_HPP - -#include <rep/adapters/ExtNDB.hpp> -#include <rep/adapters/AppNDB.hpp> -#include <rep/transfer/TransPS.hpp> -#include <rep/transfer/TransSS.hpp> -#include <rep/Requestor.hpp> -#include <rep/state/RepState.hpp> - -#include <rep/rep_version.hpp> - -/** - * Connection data - */ -class RepComponents { -public: - RepComponents(); - ~RepComponents(); - - int connectPS(); - int connectSS(); - - ExtNDB * m_extNDB; - ExtAPI * m_extAPI; - TransPS * m_transPS; - - TransSS * m_transSS; - AppNDB * m_appNDB; - - Requestor * m_requestor; - - GCIContainer * m_gciContainer; - GCIContainerPS * m_gciContainerPS; - - char * m_connectStringPS; - char * m_connectStringSS; - - RepState * getRepState() { return m_repState; } -private: - RepState * m_repState; -}; - -#endif diff --git a/ndb/src/old_files/rep/RepMain.cpp b/ndb/src/old_files/rep/RepMain.cpp deleted file mode 100644 index d9f057be9a1..00000000000 --- a/ndb/src/old_files/rep/RepMain.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/* 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 <ndb_global.h> - -#include <NdbApiSignal.hpp> -#include <getarg.h> - -#include <rep/RepComponents.hpp> - -#include "rep_version.hpp" -#include <rep/RepCommandInterpreter.hpp> -#include <rep/RepApiInterpreter.hpp> - - -int -main(int argc, const char **argv) -{ - RepComponents comps; - RepCommandInterpreter cmd(&comps); - - - int helpFlag = false; - int noConnectFlag = false; - int onlyPrimaryFlag = false; - int onlyStandbyFlag = false; - int port = 18000; - replogEnabled = false; - - struct getargs args[] = { - { "psc", '1', arg_string, &comps.m_connectStringPS, - "Connect string", "connectstring" }, - { "ssc", '2', arg_string, &comps.m_connectStringSS, - "Connect string", "connectstring" }, - { "port", 'p', arg_integer, &port, - "port for rep api. Default 18000", "" }, - { "usage", '?', arg_flag, &helpFlag, - "Print help", "" }, -/* @todo - { "noConnect", 'n', arg_flag, &noConnectFlag, - "Do not connect adapters", "" }, -*/ - { "debug", 'd', arg_flag, &replogEnabled, - "Enable debug printouts on console", "" }, - { "onlyStandby", 's', arg_flag, &onlyStandbyFlag, - "Let Replication Server view DBMS as standby (destination) system only", - "" } - }; - int num_args = sizeof(args) / sizeof(args[0]); - int optind = 0; - char desc[] = - "\nWhen working as a primary system node, this program receives\n"\ - "records from the primary NDB Cluster and forwards them to\n"\ - "the standby system.\n\n"\ - "When working as a standby system node, this program receives\n"\ - "records from another replication node and inserts them into\n"\ - "the standby NDB Cluster.\n\n"\ - "Example: ndb_rep --psc=\"nodeid=3;host=localhost:10000\"\n"; - - if(getarg(args, num_args, argc, argv, &optind) || - //argv[optind] == NULL || - helpFlag) - { - arg_printusage(args, num_args, argv[0], desc); - return -1; //NDBT_ProgramExit(NDBT_WRONGARGS); - } - - RepApiInterpreter api(&comps,port); - api.startInterpreter(); - - /************************** - * Command-line interface * - **************************/ - if (!noConnectFlag && !onlyPrimaryFlag) comps.connectSS(); - if (!noConnectFlag && !onlyStandbyFlag) comps.connectPS(); - - - while (true) { - if(!cmd.readAndExecute()) { - api.stopInterpreter(); - exit(1); - } - } -} diff --git a/ndb/src/old_files/rep/Requestor.cpp b/ndb/src/old_files/rep/Requestor.cpp deleted file mode 100644 index 3c93a6394a4..00000000000 --- a/ndb/src/old_files/rep/Requestor.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/* 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 "Requestor.hpp" -#include "ConfigRetriever.hpp" - -#include <NdbApiSignal.hpp> - -#include <signaldata/RepImpl.hpp> -#include <signaldata/GrepImpl.hpp> -#include <signaldata/DictTabInfo.hpp> -#include <signaldata/GetTabInfo.hpp> -#include <signaldata/SumaImpl.hpp> - -#include <AttributeHeader.hpp> -#include <rep/rep_version.hpp> - -#define TIME_BETWEEN_EXECUTES_MS 250 - -/* - * @todo The requestor still has a TF, but this is not used... - * (We will need a (set of) TF(s) for REP-REP - * on the same system though....) - */ - - -/***************************************************************************** - * Constructor / Destructor / Init - *****************************************************************************/ -Requestor::Requestor(GCIContainer * gciContainer, - AppNDB * appNDB, - RepState * repState) -{ - m_gciContainer = gciContainer; - m_applier = appNDB; - m_repState = repState; - - //m_grepSender = new ExtSender(); - //if (!m_grepSender) REPABORT(""); - - m_repState->setSubscriptionRequests(&requestCreateSubscriptionId, - &requestCreateSubscription, - &requestRemoveSubscription); - m_repState->setIntervalRequests(&requestTransfer, - &requestApply, - &requestDeleteSS, - &requestDeletePS); - m_repState->setStartRequests(&requestStartMetaLog, - &requestStartDataLog, - &requestStartMetaScan, - &requestStartDataScan, - &requestEpochInfo); -} - -Requestor::~Requestor() { - //delete m_grepSender; -} - -bool -Requestor::init(const char * connectString) -{ - m_signalExecThread = NdbThread_Create(signalExecThread_C, - (void **)this, - 32768, - "Requestor_Service", - NDB_THREAD_PRIO_LOW); - - if (m_signalExecThread == NULL) - return false; - - return true; -} - -/***************************************************************************** - * Signal Queue Executor - *****************************************************************************/ - -void * -Requestor::signalExecThread_C(void *g) { - - Requestor *requestor = (Requestor*)g; - requestor->signalExecThreadRun(); - NdbThread_Exit(0); - - /* NOTREACHED */ - return 0; -} - -class SigMatch -{ -public: - int gsn; - void (Requestor::* function)(NdbApiSignal *signal); - - SigMatch() { gsn = 0; function = NULL; }; - - SigMatch(int _gsn, void (Requestor::* _function)(NdbApiSignal *signal)) { - gsn = _gsn; - function = _function; - }; - - bool check(NdbApiSignal *signal) { - if(signal->readSignalNumber() == gsn) - return true; - return false; - }; -}; - -void -Requestor::signalExecThreadRun() -{ - while(1) - { - /** - * @todo Here we would like to measure the usage size of the - * receive buffer of TransSS. If the buffer contains - * more than X signals (maybe 1k or 10k), then we should - * not do a protectedExecute. - * By having the usage size measure thingy, - * we avoid having the Requestor requesting more - * things than the TransSS can handle. - * /Lars - * - * @todo A different implementation of this functionality - * would be to send a signal to myself when the protected - * execute is finished. This solution could be - * discussed. - * /Lars - */ - m_repState->protectedExecute(); - NdbSleep_MilliSleep(TIME_BETWEEN_EXECUTES_MS); - } -} - -void -Requestor::sendSignalRep(NdbApiSignal * s) { - m_repSender->sendSignal(s); -} - -void -Requestor::execSignal(void* executorObj, NdbApiSignal* signal, - class LinearSectionPtr ptr[3]){ - - Requestor * executor = (Requestor*)executorObj; - - const Uint32 gsn = signal->readSignalNumber(); - const Uint32 len = signal->getLength(); - - NdbApiSignal * s = new NdbApiSignal(executor->m_ownRef); - switch (gsn) { - case GSN_REP_GET_GCI_CONF: - case GSN_REP_GET_GCI_REQ: - case GSN_REP_GET_GCIBUFFER_REQ: - case GSN_REP_INSERT_GCIBUFFER_REQ: - case GSN_REP_CLEAR_SS_GCIBUFFER_REQ: - case GSN_REP_CLEAR_PS_GCIBUFFER_REQ: - case GSN_REP_DROP_TABLE_REQ: - case GSN_GREP_SUB_CREATE_REQ: - case GSN_GREP_SUB_START_REQ: - case GSN_GREP_SUB_SYNC_REQ: - case GSN_GREP_SUB_REMOVE_REQ: - case GSN_GREP_CREATE_SUBID_REQ: - s->set(0, PSREPBLOCKNO, gsn, len); - memcpy(s->getDataPtrSend(), signal->getDataPtr(), 4 * len); - executor->m_signalRecvQueue.receive(s); - break; - default: - REPABORT1("Illegal signal received in execSignal", gsn); - } -#if 0 - ndbout_c("Requestor: Inserted signal into queue (GSN: %d, Len: %d)", - signal->readSignalNumber(), len); -#endif -} - -void -Requestor::execNodeStatus(void* obj, Uint16 nodeId, - bool alive, bool nfCompleted) -{ - //Requestor * thisObj = (Requestor*)obj; - - RLOG(("Node changed status (NodeId %d, Alive %d, nfCompleted %d)", - nodeId, alive, nfCompleted)); - - if(alive) { - /** - * Connected - set node as connected - * - * @todo Make it possible to have multiple External REP nodes - */ -#if 0 - for(Uint32 i=0; i<thisObj->m_nodeConnectList.size(); i++) { - if(thisObj->m_nodeConnectList[i]->nodeId == nodeId) - thisObj->m_nodeConnectList[i]->connected = true; - } - thisObj->m_grepSender->setNodeId(thisObj->m_nodeConnectList[0]->nodeId); -#endif - } - - if(!alive && !nfCompleted){ - /** - * ??? - */ - } - - if(!alive && nfCompleted){ - /** - * Re-connect - */ - } -} diff --git a/ndb/src/old_files/rep/Requestor.hpp b/ndb/src/old_files/rep/Requestor.hpp deleted file mode 100644 index 735d2094bde..00000000000 --- a/ndb/src/old_files/rep/Requestor.hpp +++ /dev/null @@ -1,154 +0,0 @@ -/* 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 */ - -#ifndef REQUESTOR_HPP -#define REQUESTOR_HPP - -#include <ndb_global.h> - -#include <TransporterDefinitions.hpp> -#include <TransporterFacade.hpp> -#include <ClusterMgr.hpp> -#include <API.hpp> -#include <Vector.hpp> -#include <GrepError.hpp> - -#include <rep/storage/GCIContainer.hpp> - -/** - * @todo Remove this dependency - */ -#include <rep/adapters/AppNDB.hpp> - -#include <rep/SignalQueue.hpp> -#include <rep/ExtSender.hpp> - - -/** - * @class Requestor - * @brief Connects to GREP Coordinator on the standby system - */ -class Requestor { -public: - /*************************************************************************** - * Constructor / Destructor / Init - ***************************************************************************/ - Requestor(GCIContainer * gciContainer, AppNDB * applier, RepState * repSt); - ~Requestor(); - bool init(const char * connectString = NULL); - - /*************************************************************************** - * Public Methods - ***************************************************************************/ - void setRepSender(ExtSender * es) { m_repSender = es; }; - -private: - static void * signalExecThread_C(void *); ///< SignalQueue executor thread - void signalExecThreadRun(); - - static void execSignal(void* executorObj, NdbApiSignal* signal, - class LinearSectionPtr ptr[3]); - static void execNodeStatus(void* executorObj, NodeId, bool alive, - bool nfCompleted); - - void sendSignalRep(NdbApiSignal *); - void sendSignalGrep(NdbApiSignal *); - - void connectToNdb(); - - /*************************************************************************** - * Signal Executors - ***************************************************************************/ - void execREP_GET_GCIBUFFER_CONF(NdbApiSignal*); - void execREP_CLEAR_GCIBUFFER_REP(NdbApiSignal*); - void execREP_INSERT_GCIBUFFER_REQ(NdbApiSignal*); - void execREP_CLEAR_SS_GCIBUFFER_REQ(NdbApiSignal*); - void execREP_DROP_TABLE_REQ(NdbApiSignal*); - - /*************************************************************************** - * Signal Executors 2 - ***************************************************************************/ - void execGREP_CREATE_SUBID_CONF(NdbApiSignal*); - void execGREP_CREATE_SUBID_REF(NdbApiSignal*); - void createSubscription(NdbApiSignal*); - void createSubscriptionId(NdbApiSignal*); - void execGREP_SUB_CREATE_CONF(NdbApiSignal*); - void execGREP_SUB_CREATE_REF(NdbApiSignal*); - void execGREP_SUB_START_CONF(NdbApiSignal*); - void execGREP_SUB_START_REF(NdbApiSignal*); - void removeSubscription(NdbApiSignal*); - void execGREP_SUB_REMOVE_REF(NdbApiSignal*); - void execGREP_SUB_SYNC_CONF(NdbApiSignal*); - void execGREP_SUB_SYNC_REF(NdbApiSignal*); - void execREP_CLEAR_SS_GCIBUFFER_CONF(NdbApiSignal*); - void execREP_CLEAR_SS_GCIBUFFER_REF(NdbApiSignal*); - void execREP_GET_GCIBUFFER_REF(NdbApiSignal*); - void execREP_DISCONNECT_REP(NdbApiSignal*); - - /*************************************************************************** - * Ref signal senders - ***************************************************************************/ - void sendREP_INSERT_GCIBUFFER_REF(NdbApiSignal * signal, - Uint32 gci, - Uint32 nodeGrp, - GrepError::Code err); - - void sendREP_CLEAR_SS_GCIBUFFER_REF(NdbApiSignal* signal, - Uint32 firstGCI, - Uint32 lastGCI, - Uint32 currentGCI, - Uint32 nodeGrp, - GrepError::Code err); - - /*************************************************************************** - * Private Variables - ***************************************************************************/ - class SignalQueue m_signalRecvQueue; - struct NdbThread * m_signalExecThread; - - RepState * m_repState; - - Uint32 m_ownNodeId; ///< NodeId of this node - Uint32 m_ownBlockNo; ///< BlockNo of this "block" - BlockReference m_ownRef; ///< Reference to this - - TransporterFacade * m_transporterFacade; - - GCIContainer * m_gciContainer; - - AppNDB * m_applier; - ExtSender * m_repSender; - - friend void startSubscription(void * cbObj, NdbApiSignal* signal, int type); - friend void scanSubscription(void * cbObj, NdbApiSignal* signal, int type); - - friend RepState::FuncRequestCreateSubscriptionId requestCreateSubscriptionId; - friend RepState::FuncRequestCreateSubscription requestCreateSubscription; - friend RepState::FuncRequestRemoveSubscription requestRemoveSubscription; - - friend RepState::FuncRequestTransfer requestTransfer; - friend RepState::FuncRequestApply requestApply; - friend RepState::FuncRequestDeleteSS requestDeleteSS; - friend RepState::FuncRequestDeletePS requestDeletePS; - - friend RepState::FuncRequestStartMetaLog requestStartMetaLog; - friend RepState::FuncRequestStartDataLog requestStartDataLog; - friend RepState::FuncRequestStartMetaScan requestStartMetaScan; - friend RepState::FuncRequestStartDataScan requestStartDataScan; - friend RepState::FuncRequestEpochInfo requestEpochInfo; -}; - -#endif diff --git a/ndb/src/old_files/rep/RequestorSubscriptions.cpp b/ndb/src/old_files/rep/RequestorSubscriptions.cpp deleted file mode 100644 index 75b41fae037..00000000000 --- a/ndb/src/old_files/rep/RequestorSubscriptions.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* 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 "Requestor.hpp" - -#include <signaldata/GrepImpl.hpp> -#include <signaldata/SumaImpl.hpp> - -#include <rep/rep_version.hpp> - -/***************************************************************************** - * Create Subscription Id - *****************************************************************************/ - - -/***************************************************************************** - * Create Subscription - *****************************************************************************/ - - -/***************************************************************************** - * Start Subscription - *****************************************************************************/ - -/***************************************************************************** - * Remove Subscription - *****************************************************************************/ - -void -Requestor::execGREP_SUB_REMOVE_REF(NdbApiSignal* signal) -{ -#if 0 - GrepSubRemoveRef * const ref = (GrepSubRemoveRef *)signal->getDataPtr(); - Uint32 subId = ref->subscriptionId; - Uint32 subKey = ref->subscriptionKey; - Uint32 err = ref->err; - - signal->theData[0] = EventReport::GrepSubscriptionAlert; - signal->theData[1] = GrepEvent::GrepSS_SubRemoveRef; - signal->theData[2] = subId; - signal->theData[3] = subKey; - signal->theData[4] = (Uint32)err; - sendSignal(CMVMI_REF,GSN_EVENT_REP,signal, 5, JBB); -#endif -} - - diff --git a/ndb/src/old_files/rep/SignalQueue.cpp b/ndb/src/old_files/rep/SignalQueue.cpp deleted file mode 100644 index 9b356a14b7d..00000000000 --- a/ndb/src/old_files/rep/SignalQueue.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* 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 <string.h> - -#include "SignalQueue.hpp" - -SignalQueue::SignalQueue() { - m_mutex = NdbMutex_Create(); - m_cond = NdbCondition_Create(); - m_signalQueueHead = NULL; - m_queueSize = 0; -} - -SignalQueue::~SignalQueue() { - { - Guard g(m_mutex); - while(m_signalQueueHead != NULL) - delete pop(); - } - NdbMutex_Destroy(m_mutex); - m_mutex = NULL; - NdbCondition_Destroy(m_cond); - m_cond = NULL; -} - -NdbApiSignal * -SignalQueue::pop() { - NdbApiSignal *ret; - - if(m_signalQueueHead == NULL) - return NULL; - - ret = m_signalQueueHead->signal; - - QueueEntry *old = m_signalQueueHead; - m_signalQueueHead = m_signalQueueHead->next; - - delete old; - m_queueSize--; - return ret; -} - -void -SignalQueue::receive(void *me, NdbApiSignal *signal) { - SignalQueue *q = (SignalQueue *)me; - q->receive(signal); -} - -void -SignalQueue::receive(NdbApiSignal *signal) { - QueueEntry *n = new QueueEntry(); - n->signal = signal; - n->next = NULL; - - Guard guard(m_mutex); - - if(m_signalQueueHead == NULL) { - m_signalQueueHead = n; - m_queueSize++; - NdbCondition_Broadcast(m_cond); - return; - } - - QueueEntry *cur = m_signalQueueHead; - - while(cur->next != NULL) - cur = cur->next; - - cur->next = n; - m_queueSize++; - NdbCondition_Broadcast(m_cond); -} - -NdbApiSignal * -SignalQueue::waitFor(int gsn, NodeId nodeid, Uint32 timeout) { - Guard g(m_mutex); - - if(m_signalQueueHead == NULL) - NdbCondition_WaitTimeout(m_cond, m_mutex, timeout); - - if(m_signalQueueHead == NULL) - return NULL; - - if(gsn != 0 && m_signalQueueHead->signal->readSignalNumber() != gsn) - return NULL; - - if(nodeid != 0 && - refToNode(m_signalQueueHead->signal->theSendersBlockRef) != nodeid) - return NULL; - - return pop(); -} diff --git a/ndb/src/old_files/rep/SignalQueue.hpp b/ndb/src/old_files/rep/SignalQueue.hpp deleted file mode 100644 index 697bca85893..00000000000 --- a/ndb/src/old_files/rep/SignalQueue.hpp +++ /dev/null @@ -1,117 +0,0 @@ -/* 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 */ - -#ifndef __SIGNALQUEUE_HPP_INCLUDED__ -#define __SIGNALQUEUE_HPP_INCLUDED__ - -#include <NdbApiSignal.hpp> -#include <NdbMutex.h> -#include <NdbCondition.h> -#include <Vector.hpp> - -/* XXX Look for an already existing definition */ -#define DEFAULT_TIMEOUT 10000 - -/** - * @class SignalQueue - * @brief - */ -class SignalQueue { -public: - typedef void (* SignalHandler)(void *obj, int gsn, NdbApiSignal *signal); - - SignalQueue(); - ~SignalQueue(); - - /** - * Static wrapper making it possible to call receive without knowing the - * type of the receiver - */ - static void receive(void *me, NdbApiSignal *signal); - - /** - * Enqueues a signal, and notifies any thread waiting for signals. - */ - void receive(NdbApiSignal *signal); - - NdbApiSignal *waitFor(int gsn, - NodeId nodeid = 0, - Uint32 timeout = DEFAULT_TIMEOUT); - template<class T> bool waitFor(Vector<T> &t, - T *&handler, - NdbApiSignal *&signal, - Uint32 timeout); - - /** - * size() - */ - - Uint32 size() {return m_queueSize;}; - -private: - NdbMutex *m_mutex; /* Locks all data in SignalQueue */ - NdbCondition *m_cond; /* Notifies about new signal in the queue */ - - /** - * Returns the last recently received signal. - * Must be called with m_mutex locked. - * - * The caller takes responsibility for deleting the returned object. - * - * @returns NULL if failed, or a received signal - */ - NdbApiSignal *pop(); - - class QueueEntry { - public: - NdbApiSignal *signal; - QueueEntry *next; - }; - QueueEntry *m_signalQueueHead; /** Head of the queue. - * New entries added on the tail - */ - Uint32 m_queueSize; -}; - -template<class T> bool -SignalQueue::waitFor(Vector<T> &t, - T *&handler, - NdbApiSignal *&signal, - Uint32 timeout) { - Guard g(m_mutex); - - if(m_signalQueueHead == NULL) - NdbCondition_WaitTimeout(m_cond, m_mutex, timeout); - - if(m_signalQueueHead == NULL) - return false; - - for(size_t i = 0; i < t.size(); i++) { - if(t[i].check(m_signalQueueHead->signal)) { - handler = &t[i]; - signal = pop(); - return true; - } - } - - ndbout_c("SignalQueue: Queued signal without true check function (GSN: %d)", - m_signalQueueHead->signal->theVerId_signalNumber); - abort(); - - return false; -} - -#endif /* !__SIGNALQUEUE_HPP_INCLUDED__ */ diff --git a/ndb/src/old_files/rep/TODO b/ndb/src/old_files/rep/TODO deleted file mode 100644 index a2462fae6cd..00000000000 --- a/ndb/src/old_files/rep/TODO +++ /dev/null @@ -1,119 +0,0 @@ -REQUIREMENTS ------------- -- It should be possible to run two systems with replication using the - same configuration file on both systems. - -FEATURES TO IMPLEMENT ---------------------- -- Fix so that execute and command uses ExtSender. - None of them should have their own signals, this should - instead by abstacted to the RepStateRequest layer. -- Delete signals - GSN_REP_INSERT_GCIBUFFER_CONF - GSN_REP_INSERT_GCIBUFFER_REF -- Fix so that all ExtSenders are set at one point in the code only. -- Verify the following signals: - GSN_REP_INSERT_GCIBUFFER_REQ - GSN_REP_CLEAR_SS_GCIBUFFER_REQ - GSN_REP_DROP_TABLE_REQ -- Fix all @todo's in the code -- Remove all #if 1, #if 0 etc. -- Fix correct usage of dbug package used in MySQL source code. -- System table storing all info about channels -- Think about how channels, subscriptions etc map to SUMA Subscriptions -- TableInfoPS must be secured if SS REP is restarted and PS REP still - has all log records needed to sync. (This could be saved in a system - table instead of using the struct.) - -KNOWN BUGS AND LIMITATIONS --------------------------- -- REP#1: Non-consistency due to non-logging stop [LIMITATION] - Problem: - - Stopping replication in state other than "Logging" can - lead to a non-consistent state of the destination database - Suggested solution: - - Implement a cleanData flag (= false) that indicates that - this has happend. - -- REP#2: PS REP uses epochs from old subscription [BUG] - The following scenario can lead to a non-correct replication: - - Start replication X - - Wait until replication is in "Logging" state - - Kill SS REP - - Let PS REP be alive - - Start new replication Y - - Replication Y can use old PS REP epochs from replication X. - Suggested solution: - - Mark PS buffers with channel ids - - Make sure that all epoch requests use channel number in the requests. - -- REP#3: When having two node groups, there is sometimes 626 [FIXED] - Problem: - - Sometimes (when doing updated) there is 626 error code when - using 2 node groups. - - 626 = Tuple does not exists. - - Current code in RepState.cpp is: - if(s == Channel::App && - m_channel.getState() == Channel::DATASCAN_COMPLETED && - i.last() >= m_channel.getDataScanEpochs().last() && - i.last() >= m_channel.getMetaScanEpochs().last()) - { - m_channel.setState(Channel::LOG); - disableAutoStart(); - } - When the system gets into LOG state, force flag is turned off - Suggested solution: - - During DATASCAN, force=true (i.e. updates are treated as writes, - deletes error due to non-existing tuple are ignored) - - The code above must take ALL node groups into account. - -- REP#4: User requests sometime vanish when DB node is down [LIMITATION] - Problem: - - PS REP node does not always REF when no connection to GREP exists - Suggested solution: - - All REP->GREP signalsends should be checked. If they return <0, - then a REF signal should be returned. - -- REP#5: User requests sometime vanish when PS REP is down [BUG] - Scenario: - - Execute "Start" with PS REP node down - Solution: - - When start is executed, the connect flag should be checked - -- REP#6: No warning if table exists [Lars, BUG!] - Problem: - - There is no warning if a replicated table already exists in the - database. - Suggested solution: - - Print warning - - Set cleanData = false - -- REP#7: Starting 2nd subscription crashes DB node (Grep.cpp:994) [FIXED] - Scenario: - - Start replication - - Wait until replication is in "Logging" state - - Kill SS REP - - Let PS REP be alive - - Start new replication - - Now GREP crashes in Grep.cpp:994. - Suggested fix: - - If a new subscription is requested with same subscriberData - as already exists, then SUMA (or GREP) sends a REF signal - indicating that SUMA does not allow a new subscription to be - created. [Now no senderData is sent from REP.] - -- REP#8: Dangling subscriptions in GREP/SUMA [Johan,LIMITATION] - Problem: - - If both REP nodes die, then there is no possibility to remove - subscriptions from GREP/SUMA - Suggested solution 1: - - Fix so that GREP/SUMA can receive a subscription removal - signal with subid 0. This means that ALL subscriptions are - removed. This meaning should be documented in the - signaldata class. - - A new user command "STOP ALL" is implemented that sends - a request to delete all subscriptions. - Suggested solution 2: - - When GREP detects that ALL PS REP nodes associated with a s - subscription are killed, then that subscription should be - deleted. diff --git a/ndb/src/old_files/rep/adapters/AppNDB.cpp b/ndb/src/old_files/rep/adapters/AppNDB.cpp deleted file mode 100644 index 05f6d52807f..00000000000 --- a/ndb/src/old_files/rep/adapters/AppNDB.cpp +++ /dev/null @@ -1,583 +0,0 @@ -/* 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 "AppNDB.hpp" -#include <ConfigRetriever.hpp> -#include <AttributeHeader.hpp> -#include <NdbOperation.hpp> -#include <NdbDictionaryImpl.hpp> - -#include <signaldata/RepImpl.hpp> -#include <TransporterFacade.hpp> -#include <trigger_definitions.h> -#include <rep/storage/GCIPage.hpp> -#include <rep/storage/GCIBuffer.hpp> -#include <rep/rep_version.hpp> - -/***************************************************************************** - * Constructor / Destructor / Init - *****************************************************************************/ - -AppNDB::~AppNDB() -{ - delete m_tableInfoPs; - delete m_ndb; - m_tableInfoPs = 0; -} - -AppNDB::AppNDB(GCIContainer * gciContainer, RepState * repState) -{ - m_gciContainer = gciContainer; - m_repState = repState; - m_cond = NdbCondition_Create(); - m_started = true; -} - -void -AppNDB::init(const char* connectString) { - - // NdbThread_SetConcurrencyLevel(1+ 2); - m_ndb = new Ndb(""); - - m_ndb->useFullyQualifiedNames(false); - - m_ndb->setConnectString(connectString); - /** - * @todo Set proper max no of transactions?? needed?? Default 12?? - */ - m_ndb->init(2048); - m_dict = m_ndb->getDictionary(); - - m_ownNodeId = m_ndb->getNodeId(); - - ndbout << "-- NDB Cluster -- REP node " << m_ownNodeId << " -- Version " - << REP_VERSION_ID << " --" << endl; - ndbout_c("Connecting to NDB Cluster..."); - if (m_ndb->waitUntilReady() != 0){ - REPABORT("NDB Cluster not ready for connections"); - } - ndbout_c("Phase 1 (AppNDB): Connection 1 to NDB Cluster opened (Applier)"); - - m_tableInfoPs = new TableInfoPs(); - - m_applierThread = NdbThread_Create(runAppNDB_C, - (void**)this, - 32768, - "AppNDBThread", - NDB_THREAD_PRIO_LOW); -} - - -/***************************************************************************** - * Threads - *****************************************************************************/ - -extern "C" -void* -runAppNDB_C(void * me) -{ - ((AppNDB *) me)->threadMainAppNDB(); - NdbThread_Exit(0); - return me; -} - -void -AppNDB::threadMainAppNDB() { - MetaRecord * mr; - LogRecord * lr; - GCIBuffer::iterator * itBuffer; - GCIPage::iterator * itPage; - GCIBuffer * buffer; - GCIPage * page; - Uint32 gci=0; - - bool force; - while(true){ - - m_gciBufferList.lock(); - if(m_gciBufferList.size()==0) - NdbCondition_Wait(m_cond, m_gciBufferList.getMutex()); - m_gciBufferList.unlock(); - - /** - * Do nothing if we are not started! - */ - if(!m_started) - continue; - - if(m_gciBufferList.size()>0) { - m_gciBufferList.lock(); - buffer = m_gciBufferList[0]; - assert(buffer!=0); - if(buffer==0) { - m_gciBufferList.unlock(); -// stopApplier(GrepError::REP_APPLY_NULL_GCIBUFFER); - return; - } - m_gciBufferList.unlock(); - - RLOG(("Applying %d:[%d]", buffer->getId(), buffer->getGCI())); - gci = buffer->getGCI(); - /** - * Do stuff with buffer - */ - - force = buffer->m_force; - itBuffer = new GCIBuffer::iterator(buffer); - page = itBuffer->first(); - - Record * record; - while(page!=0 && m_started) { - - itPage = new GCIPage::iterator(page); - record = itPage->first(); - - while(record!=0 && m_started) { - switch(Record::RecordType(record->recordType)) { - case Record::META: - mr = (MetaRecord*)record; - if(applyMetaRecord(mr, gci) < 0){ - /** - * If we fail with a meta record then - * we should fail the replication! - */ - //stopApplier(GrepError::REP_APPLY_METARECORD_FAILED); - } - break; - case Record::LOG: - lr = (LogRecord*)record; - if(applyLogRecord(lr, force, gci) < 0) { - /** - * If we fail to apply a log record AND - * we have sent a ref to repstate event, - * then we should not try to apply another one! - */ -// stopApplier(GrepError::REP_APPLY_LOGRECORD_FAILED); - } - break; - default: - REPABORT("Illegal record type"); - }; - record = itPage->next(); - } - delete itPage; - itPage = 0; - page = itBuffer->next(); - } - - m_gciBufferList.erase(0, true); - /** - * "callback" to RepState to send REP_INSERT_GCIBUFFER_CONF - */ - m_repState->eventInsertConf(buffer->getGCI(), buffer->getId()); - delete itBuffer; - itBuffer = 0; - mr = 0; - lr = 0; - page = 0; - buffer = 0; - } - } - - -} - -void AppNDB::startApplier(){ - m_started = true; -} - - -void AppNDB::stopApplier(GrepError::Code err){ - m_started = false; - m_repState->eventInsertRef(0,0,0, err); -} - - -GrepError::Code -AppNDB::applyBuffer(Uint32 nodeGrp, Uint32 epoch, Uint32 force) -{ - m_gciBufferList.lock(); - - GCIBuffer * buffer = m_gciContainer->getGCIBuffer(epoch, nodeGrp); - if (buffer == NULL) { - RLOG(("WARNING! Request to apply NULL buffer %d[%d]. Force %d", - nodeGrp, epoch, force)); - return GrepError::NO_ERROR; - } - if (!buffer->isComplete()) { - RLOG(("WARNING! Request to apply non-complete buffer %d[%d]. Force %d", - nodeGrp, epoch, force)); - return GrepError::REP_APPLY_NONCOMPLETE_GCIBUFFER; - } - buffer->m_force = force; - - assert(buffer!=0); - m_gciBufferList.push_back(buffer, false); - NdbCondition_Broadcast(m_cond); - m_gciBufferList.unlock(); - return GrepError::NO_ERROR; -} - -int -AppNDB::applyLogRecord(LogRecord* lr, bool force, Uint32 gci) -{ -#if 0 - RLOG(("Applying log record (force %d, Op %d, GCI %d)", - force, lr->operation, gci)); -#endif - - int retries =0; - retry: - if(retries == 10) { - m_repState->eventInsertRef(gci, 0, lr->tableId, - GrepError::REP_APPLIER_EXECUTE_TRANSACTION); - return -1; - } - NdbConnection * trans = m_ndb->startTransaction(); - if (trans == NULL) { - /** - * Transaction could not be started - * @todo Handle the error by: - * 1. Return error code - * 2. Print log message - * 3. On higher level indicate that DB has been tainted - */ - ndbout_c("AppNDB: Send the following error msg to NDB Cluster support"); - reportNdbError("Cannot start transaction!", trans->getNdbError()); - m_repState->eventInsertRef(gci, 0, 0, - GrepError::REP_APPLIER_START_TRANSACTION); - REPABORT("Can not start transaction"); - } - - /** - * Resolve table name based on table id - */ - const Uint32 tableId = lr->tableId; - const char * tableName = m_tableInfoPs->getTableName(tableId); - - /** - * Close trans and return if it is systab_0. - */ - if (tableId == 0) { - RLOG(("WARNING! System table log record received")); - m_ndb->closeTransaction(trans); - return -1; - } - - if (tableName==0) { - /** - * Table probably does not exist - * (Under normal operation this should not happen - * since log records should not appear unless the - * table has been created.) - * - * @todo Perhaps the table is not cached due to a restart, - * so let's check in the dictionary if it exists. - */ - m_ndb->closeTransaction(trans); - m_repState->eventInsertRef(gci, 0, tableId, - GrepError::REP_APPLIER_NO_TABLE); - return -1; - } - - const NdbDictionary::Table * table = m_dict->getTable(tableName); - - NdbOperation * op = trans->getNdbOperation(tableName); - if (op == NULL) { - ndbout_c("AppNDB: Send the following error msg to NDB Cluster support"); - reportNdbError("Cannot get NdbOperation record", - trans->getNdbError()); - m_repState->eventInsertRef(gci,0,tableId, - GrepError::REP_APPLIER_NO_OPERATION); - REPABORT("Can not get NdbOperation record"); - } - - int check=0; - switch(lr->operation) { - case TriggerEvent::TE_INSERT: // INSERT - check = op->insertTuple(); - break; - case TriggerEvent::TE_DELETE: // DELETE - check = op->deleteTuple(); - break; - case TriggerEvent::TE_UPDATE: // UPDATE - if (force) { - check = op->writeTuple(); - } else { - check = op->updateTuple(); - } - break; - case TriggerEvent::TE_CUSTOM: //SCAN - check = op->writeTuple(); - break; - default: - m_ndb->closeTransaction(trans); - return -1; - }; - - if (check<0) { - ndbout_c("AppNDB: Something is weird"); - } - - /** - * @todo index inside LogRecord struct somewhat prettier - * Now it 4 (sizeof(Uint32)), and 9 the position inside the struct - * where the data starts. - */ - AttributeHeader * ah=(AttributeHeader *)((char *)lr + sizeof(Uint32) * 9); - AttributeHeader *end = (AttributeHeader *)(ah + lr->attributeHeaderWSize); - Uint32 * dataPtr = (Uint32 *)(end); - - /** - * @note attributeheader for operaration insert includes a duplicate - * p.k. The quick fix for this problem/bug is to skip the first set of - * of p.k, and start from the other set of P.Ks. Data is duplicated for - * the p.k. - */ - if (lr->operation == 0) { - for(int i = 0; i< table->getNoOfPrimaryKeys(); i++) { - ah+=ah->getHeaderSize(); - dataPtr = dataPtr + ah->getDataSize(); - } - } - - while (ah < end) { - const NdbDictionary::Column * column = - table->getColumn(ah->getAttributeId()); - /** - * @todo: Here is a limitation. I don't care if it is a tuplekey - * that is autogenerated or an ordinary pk. I just whack it in. - * However, this must be examined. - */ - if(column->getPrimaryKey()) { - if(op->equal(ah->getAttributeId(), (const char *)dataPtr) < 0) { - ndbout_c("AppNDB: Equal failed id %d op %d name %s, gci %d force %d", - ah->getAttributeId(), - lr->operation, - column->getName(), gci, force); - reportNdbError("Equal!", trans->getNdbError()); - } - - } else { - if(op->setValue(ah->getAttributeId(), (const char *)dataPtr) < 0) - ndbout_c("AppNDB: setvalue failed id %d op %d name %s, gci %d force %d", - ah->getAttributeId(), - lr->operation, - column->getName(), gci, force); - } - - dataPtr = dataPtr + ah->getDataSize(); - ah = ah + ah->getHeaderSize() ; - } - - if(trans->execute(Commit) != 0) { - /** - * Transaction commit failure - */ - const NdbError err = trans->getNdbError(); - m_ndb->closeTransaction(trans); - switch(err.status){ - case NdbError::Success: - { - m_repState->eventInsertRef(gci, 0, tableId, - GrepError::REP_APPLIER_EXECUTE_TRANSACTION); - return -1; - } - break; - case NdbError::TemporaryError: - { - NdbSleep_MilliSleep(50); - retries++; - goto retry; - } - break; - case NdbError::UnknownResult: - { - ndbout_c("AppNDB: Send the following error msg to NDB Cluster support"); - reportNdbError("Execute transaction failed!", - trans->getNdbError()); - m_repState->eventInsertRef(gci, 0, tableId, - GrepError::REP_APPLIER_EXECUTE_TRANSACTION); - return -1; - } - break; - case NdbError::PermanentError: - { - if(err.code == 626) { - if(force && lr->operation == TriggerEvent::TE_DELETE) /**delete*/ { - /**tuple was not found. Ignore this, since - * we are trying to apply a "delete a tuple"-log record before - * having applied the scan data. - */ - return -1; - } - } - - ndbout_c("AppNDB: Send the following error msg to NDB Cluster support"); reportNdbError("Execute transaction failed!", - trans->getNdbError()); - ndbout_c("\n\nAppNDB: RepNode will now crash."); - m_ndb->closeTransaction(trans); - m_repState->eventInsertRef(gci, 0, tableId, - GrepError::REP_APPLIER_EXECUTE_TRANSACTION); - return -1; - } - break; - } - } - - /** - * No errors. Close transaction and continue in applierThread. - */ - m_ndb->closeTransaction(trans); - return 1; -} - - -int -AppNDB::applyMetaRecord(MetaRecord* mr, Uint32 gci) -{ - /** - * Validate table id - */ - Uint32 tableId = mr->tableId; - if (tableId==0) { - RLOG(("WARNING! Meta record contained record with tableId 0")); - return 0; - } - - /** - * Prepare meta record - */ - NdbDictionary::Table * table = prepareMetaRecord(mr); - if(table == 0) { - RLOG(("WARNING! Prepare table meta record failed for table %d", tableId)); - m_dict->getNdbError(); - m_repState->eventInsertRef(gci,0,tableId, - GrepError::REP_APPLIER_PREPARE_TABLE); - return -1; - } - - /** - * Table does not exist in TableInfoPs -> add it - */ - if(m_tableInfoPs->getTableName(tableId)==0) { - RLOG(("Table %d:%s added to m_tableInfoPs", tableId, table->getName())); - m_tableInfoPs->insert(tableId,table->getName()); - } - - /** - * Validate that table does not exist in Dict - */ - - const NdbDictionary::Table * tmpTable = m_dict->getTable(table->getName()); - if(tmpTable !=0) { - /** - * Oops, a table with the same name exists - */ - if(tmpTable->getObjectVersion()!=table->getObjectVersion()) { - char buf[100]; - sprintf(buf,"WARNING! Another version of table %d:%s already exists." - "Currently, we dont support versions, so will abort now!", - tableId, table->getName()); - - REPABORT(buf); - - } - RLOG(("WARNING! An identical table %d:%s already exists.", - tableId, table->getName())); - return -1; - } - - - /** - * @todo WARNING! Should scan table MR for columns that are not supported - */ - /* - NdbDictionary::Column * column; - - for(int i=0; i<table->getNoOfColumns(); i++) { - column = table->getColumn(i); - if(column->getAutoIncrement()) { - reportWarning(table->getName(), column->getName(), - "Uses AUTOINCREMENT of PK"); - } - } - */ - - - /** - * Create table - */ - if(m_dict->createTable(*table)<0) { - ndbout_c("AppNDB: Send the following error msg to NDB Cluster support"); - reportNdbError("Create table failed!", m_dict->getNdbError()); - m_repState->eventCreateTableRef(gci, - tableId, - table->getName(), - GrepError::REP_APPLIER_CREATE_TABLE); - return -1; - } - - RLOG(("Table %d:%s created", tableId, table->getName())); - return 0; -} - -NdbDictionary::Table* -AppNDB::prepareMetaRecord(MetaRecord* mr) { - NdbTableImpl * tmp = 0; - NdbDictionary::Table * table =0; - Uint32 * data =(Uint32*)( ((char*)mr + sizeof(Uint32)*6)); - int res = NdbDictInterface::parseTableInfo(&tmp, data, mr->dataLen, - m_ndb->usingFullyQualifiedNames()); - if(res == 0) { - table = tmp; - return table; - } else{ - return 0; - } -} - -void -AppNDB::reportNdbError(const char * msg, const NdbError & err) { - ndbout_c("%s : Error code %d , error message %s", - msg, err.code, - (err.message ? err.message : "")); -} - -void -AppNDB::reportWarning(const char * tableName, const char * message) { - ndbout_c("WARNING: Table %s, %s", tableName, message); -} - -void -AppNDB::reportWarning(const char * tableName, const char * columnName, - const char * message) { - ndbout_c("WARNING: Table %s, column %s, %s", tableName, columnName,message); -} - -int -AppNDB::dropTable(Uint32 tableId) -{ - char * tableName = m_tableInfoPs->getTableName(tableId); - if(tableName == 0) return -1; - ndbout_c("AppNDB: Dropping table "); - if(m_dict->dropTable(tableName) != 0) { - reportNdbError("Failed dropping table",m_dict->getNdbError()); - return -1; - } - m_tableInfoPs->del(tableId); - return 1; -} diff --git a/ndb/src/old_files/rep/adapters/AppNDB.hpp b/ndb/src/old_files/rep/adapters/AppNDB.hpp deleted file mode 100644 index 9563a1e41ab..00000000000 --- a/ndb/src/old_files/rep/adapters/AppNDB.hpp +++ /dev/null @@ -1,141 +0,0 @@ -/* 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 */ - -#ifndef APPNDB_HPP -#define APPNDB_HPP -#include "NdbApi.hpp" - -#include <NdbMain.h> -#include <NdbOut.hpp> -#include <NdbSleep.h> -#include <NdbTick.h> - -#include <NdbThread.h> -#include <Vector.hpp> - -#include "TableInfoPs.hpp" -#include <rep/storage/GCIContainer.hpp> -#include <rep/storage/GCIBuffer.hpp> - -#include <rep/state/RepState.hpp> - -extern "C" { - void * runAppNDB_C(void *); -} - -/** - * @class AppNDB - * @brief Connects to NDB and appliers log records into standby system - */ -class AppNDB { -public: - /*************************************************************************** - * Constructor / Destructor / Init - ***************************************************************************/ - AppNDB(class GCIContainer * gciContainer, class RepState * repState); - ~AppNDB(); - - void init(const char * connectString); - - GrepError::Code - applyBuffer(Uint32 nodeGrp, Uint32 first, Uint32 force); - - /** - * Takes a table id and drops it. - * @param tableId Name of table to be dropped - * @return Returns 1 = ok, -1 failed - * - * @todo Fix: 0 usually means ok... - */ - int dropTable(Uint32 tableId); - void startApplier(); - void stopApplier(GrepError::Code err); -private: - /*************************************************************************** - * Methods - ***************************************************************************/ - friend void* runAppNDB_C(void*); - - void threadMainAppNDB(void); - - /** - * Takes a log records and does the operation specified in the log record - * on NDB. - * @param - lr (LogRecord) - * @param - force true if GREP:SSCoord is in phase STARTING. - * Ignore "Execute" errors if true. - */ - int applyLogRecord(LogRecord * lr, bool force, Uint32 gci); - - /** - * Applies a table based on a meta record and creates the table - * in NDB. - * @param - meta record - * @return - 0 on success, -1 if something went wrong - */ - int applyMetaRecord(MetaRecord * mr, Uint32 gci); - - /** - * Takes a meta record and uses NdbDictionaryXXX::parseInfoTable - * and returns a table - * @param mr - MetaRecord - * @return - a table based on the meta record - */ - NdbDictionary::Table* prepareMetaRecord(MetaRecord * mr); - - /** - * Prints out an NDB error message if a ndb operation went wrong. - * @param msg - text explaining the error - * @param err - NDB error type - */ - void reportNdbError(const char * msg, const NdbError & err); - - /** - * Prints out a warning message. Used if support for something - * is not implemented. - * @param tableName - the name of the table this warning occured on - * @param message - warning message - */ - void reportWarning(const char * tableName, const char * message); - - /** - * Prints out a warning message. Used if support for something - * is not implemented. - * @param tableName - the name of the table this warning occured on - * @param columnName - the name of the column this warning occured on - * @param message - warning message - */ - void reportWarning(const char * tableName, const char * columnName, - const char * message); - - - /*************************************************************************** - * Variables - ***************************************************************************/ - GCIContainer * m_gciContainer; - RepState * m_repState; - - Ndb* m_ndb; - NdbDictionary::Dictionary * m_dict; - NodeId m_ownNodeId; - bool m_started; - TableInfoPs * m_tableInfoPs; - NdbThread* m_applierThread; - NdbCondition * m_cond; - MutexVector<GCIBuffer*> m_gciBufferList; -}; - -#endif diff --git a/ndb/src/old_files/rep/adapters/ExtAPI.cpp b/ndb/src/old_files/rep/adapters/ExtAPI.cpp deleted file mode 100644 index 0dcd1e85465..00000000000 --- a/ndb/src/old_files/rep/adapters/ExtAPI.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* 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 "ExtAPI.hpp" - -GrepError::Code -ExtAPI::eventSubscriptionIdCreated(Uint32 subId, Uint32 subKey) -{ - NdbApiSignal* signal = m_repSender->getSignal(); - CreateSubscriptionIdConf * conf = - (CreateSubscriptionIdConf *)signal->getDataPtrSend(); - conf->subscriptionId = subId; - conf->subscriptionKey = subKey; - signal->set(0, SSREPBLOCKNO, GSN_GREP_CREATE_SUBID_CONF, - CreateSubscriptionIdConf::SignalLength); - m_repSender->sendSignal(signal); - return GrepError::NO_ERROR; -} diff --git a/ndb/src/old_files/rep/adapters/ExtAPI.hpp b/ndb/src/old_files/rep/adapters/ExtAPI.hpp deleted file mode 100644 index f10b6c7d682..00000000000 --- a/ndb/src/old_files/rep/adapters/ExtAPI.hpp +++ /dev/null @@ -1,107 +0,0 @@ -/* 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 */ - -#ifndef EXTAPI_HPP -#define EXTAPI_HPP - -#include <signaldata/RepImpl.hpp> -#include <signaldata/GrepImpl.hpp> -#include <signaldata/SumaImpl.hpp> - -#include <rep/ExtSender.hpp> - -/** - * The abstract class for all extractors - */ -class ExtAPI -{ -public: - /*************************************************************************** - * Constructor / Destructor - ***************************************************************************/ -#if 0 - bool init(const char * connectString = NULL); - - GrepError::Code dataLogStarted(Uint32 epoch, - Uint32 subId, Uint32 subKey) = 0; - GrepError::Code metaLogStarted(Uint32 epoch, - Uint32 subId, Uint32 subKey) = 0; - GrepError::Code epochComleted() = 0; - GrepError::Code subscriptionCreated() = 0; - GrepError::Code subscriptionRemoved() = 0; - GrepError::Code metaScanCompleted() = 0; - GrepError::Code dataScanCompleted() = 0; - GrepError::Code subscriptionRemoveFailed() = 0; - GrepError::Code metaScanFailed() = 0; - GrepError::Code dataScanFailed() = 0; - GrepError::Code subscriptiodIdCreateFailed() = 0; - GrepError::Code dataLogFailed() = 0; - GrepError::Code metaLogFailed() = 0; - GrepError::Code subscriptionCreateFailed() = 0; - - /**Above to be deleted*/ -#endif - - virtual GrepError::Code - eventSubscriptionIdCreated(Uint32 subId, Uint32 subKey) ; - -#if 0 - GrepError::Code - eventSubscriptionDeleted(Uint32 subId, Uint32 subKey); - - GrepError::Code - eventMetaLogStarted(NdbApiSignal*, Uint32 subId, Uint32 subKey); - - GrepError::Code - eventDataLogStarted(NdbApiSignal*, Uint32 subId, Uint32 subKey); - - GrepError::Code - eventMetaScanCompleted(NdbApiSignal*, Uint32 subId, Uint32 subKey, - Interval epochs); - - GrepError::Code - eventDataScanCompleted(NdbApiSignal*, Uint32 subId, Uint32 subKey, - Interval epochs); - - GrepError::Code - eventMetaScanFailed(Uint32 subId, Uint32 subKey, GrepError::Code error); - - GrepError::Code - eventDataScanFailed(Uint32 subId, Uint32 subKey, GrepError::Code error); -#endif - - /*************************************************************************** - * Public Methods - ***************************************************************************/ - void setRepSender(ExtSender * es) { m_repSender = es; }; - //void signalErrorHandler(NdbApiSignal * s, Uint32 nodeId); - -protected: - ExtSender * m_repSender; -}; - - -#if 0 -class TestExtAPI : public ExtAPI -{ - GrepError::Code - eventSubscriptionIdCreated(Uint32 subId, Uint32 subKey) { - ndbout_c("Received subscription:%d-%d"); - }; -}; -#endif - -#endif // EXTAPI_HPP diff --git a/ndb/src/old_files/rep/adapters/ExtNDB.cpp b/ndb/src/old_files/rep/adapters/ExtNDB.cpp deleted file mode 100644 index 6642b750b57..00000000000 --- a/ndb/src/old_files/rep/adapters/ExtNDB.cpp +++ /dev/null @@ -1,559 +0,0 @@ -/* 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 "ExtNDB.hpp" -#include "ConfigRetriever.hpp" -#include <NdbSleep.h> - -#include <NdbApiSignal.hpp> - -#include <signaldata/DictTabInfo.hpp> -#include <signaldata/GetTabInfo.hpp> -#include <signaldata/SumaImpl.hpp> -#include <AttributeHeader.hpp> -#include <rep/rep_version.hpp> -#include <ndb_limits.h> - -/***************************************************************************** - * Constructor / Destructor / Init - *****************************************************************************/ -ExtNDB::ExtNDB(GCIContainerPS * gciContainer, ExtAPI * extAPI) -{ - m_grepSender = new ExtSender(); - if (!m_grepSender) REPABORT("Could not allocate object"); - m_gciContainerPS = gciContainer; - - m_nodeGroupInfo = new NodeGroupInfo(); - m_gciContainerPS->setNodeGroupInfo(m_nodeGroupInfo); - - m_doneSetGrepSender = false; - m_subId = 0; - m_subKey = 0; - m_firstGCI = 0; - m_dataLogStarted = false; - - m_extAPI = extAPI; - if (!m_extAPI) REPABORT("Could not allocate object"); -} - -ExtNDB::~ExtNDB() -{ - delete m_grepSender; - delete m_nodeGroupInfo; -} - -void -ExtNDB::signalErrorHandler(NdbApiSignal * signal, Uint32 nodeId) -{ - //const Uint32 gsn = signal->readSignalNumber(); - //const Uint32 len = signal->getLength(); - RLOG(("Send signal failed. Signal %p", signal)); -} - -bool -ExtNDB::init(const char * connectString) -{ - m_signalExecThread = NdbThread_Create(signalExecThread_C, - (void **)this, - 32768, - "ExtNDB_Service", - NDB_THREAD_PRIO_LOW); - -#if 0 - /** - * I don't see that this does anything - * - * Jonas 13/2-04 - */ - ConfigRetriever cr; cr.setConnectString(connectString); - - ndb_mgm_configuration * config = cr.getConfig(NDB_VERSION, NODE_TYPE_REP); - if (config == 0) { - ndbout << "ExtNDB: Configuration error: "; - const char* erString = cr.getErrorString(); - if (erString == 0) { - erString = "No error specified!"; - } - ndbout << erString << endl; - return false; - } - NdbAutoPtr autoPtr(config); - m_ownNodeId = r.getOwnNodeId(); - - /** - * Check which GREPs to connect to (in configuration) - * - * @note SYSTEM LIMITATION: Only connects to one GREP - */ - Uint32 noOfConnections=0; - NodeId grepNodeId=0; - const Properties * connection; - - config->get("NoOfConnections", &noOfConnections); - for (Uint32 i=0; i<noOfConnections; i++) { - Uint32 nodeId1, nodeId2; - config->get("Connection", i, &connection); - connection->get("NodeId1", &nodeId1); - connection->get("NodeId2", &nodeId2); - if (!connection->contains("System1") && - !connection->contains("System2") && - (nodeId1 == m_ownNodeId || nodeId2 == m_ownNodeId)) { - /** - * Found connection - */ - if (nodeId1 == m_ownNodeId) { - grepNodeId = nodeId2; - } else { - grepNodeId = nodeId1; - } - } - } -#endif - - m_transporterFacade = TransporterFacade::instance(); - - assert(m_transporterFacade != 0); - - m_ownBlockNo = m_transporterFacade->open(this, execSignal, execNodeStatus); - assert(m_ownBlockNo > 0); - m_ownRef = numberToRef(m_ownBlockNo, m_ownNodeId); - ndbout_c("EXTNDB blockno %d ownref %d ", m_ownBlockNo, m_ownRef); - assert(m_ownNodeId == m_transporterFacade->ownId()); - - m_grepSender->setOwnRef(m_ownRef); - m_grepSender->setTransporterFacade(m_transporterFacade); - - if(!m_grepSender->connected(50000)){ - ndbout_c("ExtNDB: Failed to connect to DB nodes!"); - ndbout_c("ExtNDB: Tried to create transporter as (node %d, block %d).", - m_ownNodeId, m_ownBlockNo); - ndbout_c("ExtNDB: Check that DB nodes are started."); - return false; - } - ndbout_c("Phase 3 (ExtNDB): Connection %d to NDB Cluster opened (Extractor)", - m_ownBlockNo); - - for (Uint32 i=1; i<MAX_NDB_NODES; i++) { - if (m_transporterFacade->getIsDbNode(i) && - m_transporterFacade->getIsNodeSendable(i)) - { - Uint32 nodeGrp = m_transporterFacade->getNodeGrp(i); - m_nodeGroupInfo->addNodeToNodeGrp(i, true, nodeGrp); - Uint32 nodeId = m_nodeGroupInfo->getFirstConnectedNode(nodeGrp); - m_grepSender->setNodeId(nodeId); - if(m_nodeGroupInfo->getPrimaryNode(nodeGrp) == 0) { - m_nodeGroupInfo->setPrimaryNode(nodeGrp, nodeId); - } - m_doneSetGrepSender = true; -#if 0 - RLOG(("Added node %d to node group %d", i, nodeGrp)); -#endif - } - } - - return true; -} - -/***************************************************************************** - * Signal Queue Executor - *****************************************************************************/ - -class SigMatch -{ -public: - int gsn; - void (ExtNDB::* function)(NdbApiSignal *signal); - - SigMatch() { gsn = 0; function = NULL; }; - - SigMatch(int _gsn, void (ExtNDB::* _function)(NdbApiSignal *signal)) { - gsn = _gsn; - function = _function; - }; - - bool check(NdbApiSignal *signal) { - if(signal->readSignalNumber() == gsn) - return true; - return false; - }; -}; - -extern "C" -void *signalExecThread_C(void *r) -{ - ExtNDB *grepps = (ExtNDB*)r; - - grepps->signalExecThreadRun(); - - NdbThread_Exit(0); - /* NOTREACHED */ - return 0; -} - - -void -ExtNDB::signalExecThreadRun() -{ - Vector<SigMatch> sl; - - /** - * Signals to be executed - */ - sl.push_back(SigMatch(GSN_SUB_GCP_COMPLETE_REP, - &ExtNDB::execSUB_GCP_COMPLETE_REP)); - - /** - * Is also forwarded to SSCoord - */ - sl.push_back(SigMatch(GSN_GREP_SUB_START_CONF, - &ExtNDB::execGREP_SUB_START_CONF)); - sl.push_back(SigMatch(GSN_GREP_SUB_CREATE_CONF, - &ExtNDB::execGREP_SUB_CREATE_CONF)); - sl.push_back(SigMatch(GSN_GREP_SUB_REMOVE_CONF, - &ExtNDB::execGREP_SUB_REMOVE_CONF)); - /** - * Signals to be forwarded - */ - sl.push_back(SigMatch(GSN_GREP_CREATE_SUBID_CONF, - &ExtNDB::execGREP_CREATE_SUBID_CONF)); - - sl.push_back(SigMatch(GSN_GREP_SUB_SYNC_CONF, &ExtNDB::sendSignalRep)); - - sl.push_back(SigMatch(GSN_GREP_SUB_REMOVE_REF, &ExtNDB::sendSignalRep)); - sl.push_back(SigMatch(GSN_GREP_SUB_SYNC_REF, &ExtNDB::sendSignalRep)); - sl.push_back(SigMatch(GSN_GREP_CREATE_SUBID_REF, &ExtNDB::sendSignalRep)); - - sl.push_back(SigMatch(GSN_GREP_SUB_START_REF, &ExtNDB::sendSignalRep)); - sl.push_back(SigMatch(GSN_GREP_SUB_CREATE_REF, &ExtNDB::sendSignalRep)); - - - while(1) { - SigMatch *handler = NULL; - NdbApiSignal *signal = NULL; - - if(m_signalRecvQueue.waitFor(sl, handler, signal, DEFAULT_TIMEOUT)) { -#if 0 - RLOG(("Removed signal from queue (GSN: %d, QSize: %d)", - signal->readSignalNumber(), m_signalRecvQueue.size())); -#endif - if(handler->function != 0) { - (this->*handler->function)(signal); - delete signal; signal = 0; - } else { - REPABORT("Illegal handler for signal"); - } - } - } -} - -void -ExtNDB::sendSignalRep(NdbApiSignal * s) -{ - if(m_repSender->sendSignal(s) == -1) - { - signalErrorHandler(s, 0); - } -} - -void -ExtNDB::execSignal(void* executorObj, NdbApiSignal* signal, - class LinearSectionPtr ptr[3]) -{ - ExtNDB * executor = (ExtNDB*)executorObj; - - const Uint32 gsn = signal->readSignalNumber(); - const Uint32 len = signal->getLength(); - - NdbApiSignal * s = new NdbApiSignal(executor->m_ownRef); - switch(gsn){ - case GSN_SUB_GCP_COMPLETE_REP: - case GSN_GREP_CREATE_SUBID_CONF: - case GSN_GREP_SUB_CREATE_CONF: - case GSN_GREP_SUB_START_CONF: - case GSN_GREP_SUB_SYNC_CONF: - case GSN_GREP_SUB_REMOVE_CONF: - case GSN_GREP_CREATE_SUBID_REF: - case GSN_GREP_SUB_CREATE_REF: - case GSN_GREP_SUB_START_REF: - case GSN_GREP_SUB_SYNC_REF: - case GSN_GREP_SUB_REMOVE_REF: - s->set(0, SSREPBLOCKNO, gsn, len); - memcpy(s->getDataPtrSend(), signal->getDataPtr(), 4 * len); - executor->m_signalRecvQueue.receive(s); - break; - case GSN_SUB_TABLE_DATA: - executor->execSUB_TABLE_DATA(signal, ptr); - delete s; s=0; - break; - case GSN_SUB_META_DATA: - executor->execSUB_META_DATA(signal, ptr); - delete s; s=0; - break; - default: - REPABORT1("Illegal signal received in execSignal", gsn); - } - s=0; -#if 0 - ndbout_c("ExtNDB: Inserted signal into queue (GSN: %d, Len: %d)", - signal->readSignalNumber(), len); -#endif -} - -void -ExtNDB::execNodeStatus(void* obj, Uint16 nodeId, bool alive, bool nfCompleted) -{ - ExtNDB * thisObj = (ExtNDB*)obj; - - RLOG(("Changed node status (Id %d, Alive %d, nfCompleted %d)", - nodeId, alive, nfCompleted)); - - if(alive) { - /** - * Connected - */ - Uint32 nodeGrp = thisObj->m_transporterFacade->getNodeGrp(nodeId); - RLOG(("DB node %d of node group %d connected", nodeId, nodeGrp)); - - thisObj->m_nodeGroupInfo->addNodeToNodeGrp(nodeId, true, nodeGrp); - Uint32 firstNode = thisObj->m_nodeGroupInfo->getPrimaryNode(nodeGrp); - - if(firstNode == 0) - thisObj->m_nodeGroupInfo->setPrimaryNode(nodeGrp, nodeId); - - if (!thisObj->m_doneSetGrepSender) { - thisObj->m_grepSender->setNodeId(firstNode); - thisObj->m_doneSetGrepSender = true; - } - - RLOG(("Connect: First connected node in nodegroup: %d", - thisObj->m_nodeGroupInfo->getPrimaryNode(nodeGrp))); - - } else if (!nfCompleted) { - - /** - * Set node as "disconnected" in m_nodeGroupInfo until - * node comes up again. - */ - Uint32 nodeGrp = thisObj->m_transporterFacade->getNodeGrp(nodeId); - RLOG(("DB node %d of node group %d disconnected", - nodeId, nodeGrp)); - thisObj->m_nodeGroupInfo->setConnectStatus(nodeId, false); - /** - * The node that crashed was also the primary node, the we must change - * primary node - */ - if(nodeId == thisObj->m_nodeGroupInfo->getPrimaryNode(nodeGrp)) { - Uint32 node = thisObj->m_nodeGroupInfo->getFirstConnectedNode(nodeGrp); - if(node > 0) { - thisObj->m_grepSender->setNodeId(node); - thisObj->m_nodeGroupInfo->setPrimaryNode(nodeGrp, node); - } - else { - thisObj->sendDisconnectRep(nodeGrp); - } - } - RLOG(("Disconnect: First connected node in nodegroup: %d", - thisObj->m_nodeGroupInfo->getPrimaryNode(nodeGrp))); - - } else if(nfCompleted) { - } else { - REPABORT("Function execNodeStatus with wrong parameters"); - } -} - -/***************************************************************************** - * Signal Receivers for LOG and SCAN - *****************************************************************************/ - -/** - * Receive datalog/datascan from GREP/SUMA - */ -void -ExtNDB::execSUB_TABLE_DATA(NdbApiSignal * signal, LinearSectionPtr ptr[3]) -{ - SubTableData * const data = (SubTableData*)signal->getDataPtr(); - Uint32 tableId = data->tableId; - Uint32 operation = data->operation; - Uint32 gci = data->gci; - Uint32 nodeId = refToNode(signal->theSendersBlockRef); - - if((SubTableData::LogType)data->logType == SubTableData::SCAN) - { - Uint32 nodeGrp = m_nodeGroupInfo->findNodeGroup(nodeId); - - NodeGroupInfo::iterator * it; - it = new NodeGroupInfo::iterator(nodeGrp, m_nodeGroupInfo); - for(NodeConnectInfo * nci=it->first(); it->exists();nci=it->next()) { - m_gciContainerPS->insertLogRecord(nci->nodeId, tableId, - operation, ptr, gci); - } - delete it; it = 0; - } else { - m_gciContainerPS->insertLogRecord(nodeId, tableId, operation, ptr, gci); - } -} - -/** - * Receive metalog/metascan from GREP/SUMA - */ -void -ExtNDB::execSUB_META_DATA(NdbApiSignal * signal, LinearSectionPtr ptr[3]) -{ - Uint32 nodeId = refToNode(signal->theSendersBlockRef); - SubMetaData * const data = (SubMetaData*)signal->getDataPtr(); - Uint32 tableId = data->tableId; - Uint32 gci = data->gci; - - Uint32 nodeGrp = m_nodeGroupInfo->findNodeGroup(nodeId); - - NodeGroupInfo::iterator * it; - it = new NodeGroupInfo::iterator(nodeGrp, m_nodeGroupInfo); - for(NodeConnectInfo * nci=it->first(); it->exists();nci=it->next()) { - m_gciContainerPS->insertMetaRecord(nci->nodeId, tableId, ptr, gci); - RLOG(("Received meta record in %d[%d]", nci->nodeId, gci)); - } - - delete it; it = 0; -} - - -/***************************************************************************** - * Signal Receivers (Signals that are actually just forwarded to SS REP) - *****************************************************************************/ - -void -ExtNDB::execGREP_CREATE_SUBID_CONF(NdbApiSignal * signal) -{ - CreateSubscriptionIdConf const * conf = - (CreateSubscriptionIdConf *)signal->getDataPtr(); - Uint32 subId = conf->subscriptionId; - Uint32 subKey = conf->subscriptionKey; - ndbout_c("GREP_CREATE_SUBID_CONF m_extAPI=%p\n", m_extAPI); - m_extAPI->eventSubscriptionIdCreated(subId, subKey); -} - -/***************************************************************************** - * Signal Receivers - *****************************************************************************/ - -/** - * Receive information about completed GCI from GREP/SUMA - * - * GCI completed, i.e. no more unsent log records exists in SUMA - * @todo use node id to identify buffers? - */ -void -ExtNDB::execSUB_GCP_COMPLETE_REP(NdbApiSignal * signal) -{ - SubGcpCompleteRep * const rep = (SubGcpCompleteRep*)signal->getDataPtr(); - const Uint32 gci = rep->gci; - Uint32 nodeId = refToNode(rep->senderRef); - - RLOG(("Epoch %d completed at node %d", gci, nodeId)); - m_gciContainerPS->setCompleted(gci, nodeId); - - if(m_firstGCI == gci && !m_dataLogStarted) { - sendGREP_SUB_START_CONF(signal, m_firstGCI); - m_dataLogStarted = true; - } -} - -/** - * Send info that scan is competed to SS REP - * - * @todo Use node id to identify buffers? - */ -void -ExtNDB::sendGREP_SUB_START_CONF(NdbApiSignal * signal, Uint32 gci) -{ - RLOG(("Datalog started (Epoch %d)", gci)); - GrepSubStartConf * conf = (GrepSubStartConf *)signal->getDataPtrSend(); - conf->firstGCI = gci; - conf->subscriptionId = m_subId; - conf->subscriptionKey = m_subKey; - conf->part = SubscriptionData::TableData; - signal->m_noOfSections = 0; - signal->set(0, SSREPBLOCKNO, GSN_GREP_SUB_START_CONF, - GrepSubStartConf::SignalLength); - sendSignalRep(signal); -} - -/** - * Scan is completed... says SUMA/GREP - * - * @todo Use node id to identify buffers? - */ -void -ExtNDB::execGREP_SUB_START_CONF(NdbApiSignal * signal) -{ - GrepSubStartConf * const conf = (GrepSubStartConf *)signal->getDataPtr(); - Uint32 part = conf->part; - //Uint32 nodeId = refToNode(conf->senderRef); - m_firstGCI = conf->firstGCI; - - if (part == SubscriptionData::TableData) { - RLOG(("Datalog started (Epoch %d)", m_firstGCI)); - return; - } - RLOG(("Metalog started (Epoch %d)", m_firstGCI)); - - signal->set(0, SSREPBLOCKNO, GSN_GREP_SUB_START_CONF, - GrepSubStartConf::SignalLength); - sendSignalRep(signal); -} - -/** - * Receive no of node groups that PS has and pass signal on to SS - */ -void -ExtNDB::execGREP_SUB_CREATE_CONF(NdbApiSignal * signal) -{ - GrepSubCreateConf * conf = (GrepSubCreateConf *)signal->getDataPtrSend(); - m_subId = conf->subscriptionId; - m_subKey = conf->subscriptionKey; - - conf->noOfNodeGroups = m_nodeGroupInfo->getNoOfNodeGroups(); - sendSignalRep(signal); -} - -/** - * Receive conf that subscription has been remove in GREP/SUMA - * - * Pass signal on to TransPS - */ -void -ExtNDB::execGREP_SUB_REMOVE_CONF(NdbApiSignal * signal) -{ - m_gciContainerPS->reset(); - sendSignalRep(signal); -} - -/** - * If all PS nodes has disconnected, then remove all epochs - * for this subscription. - */ -void -ExtNDB::sendDisconnectRep(Uint32 nodeId) -{ - NdbApiSignal * signal = new NdbApiSignal(m_ownRef); - signal->set(0, SSREPBLOCKNO, GSN_REP_DISCONNECT_REP, - RepDisconnectRep::SignalLength); - RepDisconnectRep * rep = (RepDisconnectRep*) signal->getDataPtrSend(); - rep->nodeId = nodeId; - rep->subId = m_subId; - rep->subKey = m_subKey; - sendSignalRep(signal); -} diff --git a/ndb/src/old_files/rep/adapters/ExtNDB.hpp b/ndb/src/old_files/rep/adapters/ExtNDB.hpp deleted file mode 100644 index 228c980fd06..00000000000 --- a/ndb/src/old_files/rep/adapters/ExtNDB.hpp +++ /dev/null @@ -1,118 +0,0 @@ -/* 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 */ - -#ifndef EXTNDB_HPP -#define EXTNDB_HPP - -#include <ndb_global.h> - -#include <TransporterDefinitions.hpp> -#include <TransporterFacade.hpp> -#include <ClusterMgr.hpp> -#include <API.hpp> -#include <Vector.hpp> - -#include <signaldata/RepImpl.hpp> -#include <signaldata/GrepImpl.hpp> - -#include <rep/SignalQueue.hpp> -#include <rep/ExtSender.hpp> - -#include <rep/storage/GCIContainerPS.hpp> -#include "ExtAPI.hpp" - -extern "C" { -static void * signalExecThread_C(void *); -} - -/** - * @class ExtNDB - * @brief Class responsible for connection to primary system GREP - */ -class ExtNDB -{ -public: - /*************************************************************************** - * Constructor / Destructor - ***************************************************************************/ - ExtNDB(GCIContainerPS * gciContainer, ExtAPI * extAPI); - ~ExtNDB(); - bool init(const char * connectString = NULL); - - /*************************************************************************** - * Public Methods - ***************************************************************************/ - void setGrepSender(ExtSender * es) { m_grepSender = es; }; - ExtSender * getGrepSender() { return m_grepSender; }; - void setRepSender(ExtSender * es) { - m_extAPI->setRepSender(es); m_repSender = es; }; - void signalErrorHandler(NdbApiSignal * s, Uint32 nodeId); - -private: - friend void * signalExecThread_C(void *); - void signalExecThreadRun(); - - static void execSignal(void* signalSender, NdbApiSignal* signal, - class LinearSectionPtr ptr[3]); - - static void execNodeStatus(void* signalSender, NodeId, - bool alive, bool nfCompleted); - - void sendSignalRep(NdbApiSignal *); - void sendDisconnectRep(Uint32 nodeId); - - /*************************************************************************** - * Signal Executors - ***************************************************************************/ - void execSUB_GCP_COMPLETE_REP(NdbApiSignal*); - void execGREP_SUB_CREATE_CONF(NdbApiSignal * signal); - void execGREP_SUB_REMOVE_CONF(NdbApiSignal * signal); - void execGREP_SUB_START_CONF(NdbApiSignal * signal); - void sendGREP_SUB_START_CONF(NdbApiSignal * signal, Uint32 gci); - void execSUB_TABLE_DATA(NdbApiSignal * signal,LinearSectionPtr ptr[3]); - void execSUB_META_DATA(NdbApiSignal * signal,LinearSectionPtr ptr[3]); - - // Signals that are actually just fowarded to REP - void execGREP_CREATE_SUBID_CONF(NdbApiSignal *); - - /*************************************************************************** - * Private Variables - ***************************************************************************/ - struct NdbThread * m_signalExecThread; - class SignalQueue m_signalRecvQueue; - - Uint32 m_ownNodeId; ///< NodeId of this node - Uint32 m_ownBlockNo; ///< BlockNo of this "block" - BlockReference m_ownRef; ///< Reference to this - - ExtSender * m_grepSender; ///< Responsible send to GREP - ExtSender * m_repSender; ///< Responsible send to SS REP - - NodeGroupInfo * m_nodeGroupInfo; - GCIContainerPS * m_gciContainerPS; ///< Interface to GCICotainer - ///< seen by PS - TransporterFacade * m_transporterFacade; - - bool m_doneSetGrepSender; ///< Only done once - bool m_dataLogStarted; - Uint32 m_subId; - Uint32 m_subKey; - Uint32 m_firstGCI; - - ExtAPI * m_extAPI; -}; - -#endif diff --git a/ndb/src/old_files/rep/adapters/Makefile b/ndb/src/old_files/rep/adapters/Makefile deleted file mode 100644 index bdd711510c3..00000000000 --- a/ndb/src/old_files/rep/adapters/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include .defs.mk - -TYPE := ndbapi repserver kernel - -ARCHIVE_TARGET := repadapters - -SOURCES = ExtNDB.cpp \ - AppNDB.cpp \ - ExtAPI.cpp - -include $(NDB_TOP)/Epilogue.mk diff --git a/ndb/src/old_files/rep/adapters/TableInfoPs.hpp b/ndb/src/old_files/rep/adapters/TableInfoPs.hpp deleted file mode 100644 index 3fa25979255..00000000000 --- a/ndb/src/old_files/rep/adapters/TableInfoPs.hpp +++ /dev/null @@ -1,118 +0,0 @@ -/* 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 */ - -#ifndef TABLEINFO_PS_HPP -#define TABLEINFO_PS_HPP - -#include <Vector.hpp> -#include <ndb_types.h> -#include <string.h> -#include <NdbMem.h> - -struct TableInfo { - Uint32 tableId; - char* tableName; -}; - -/** - * @class TableInfoPS - * @brief Meta information about tables stored on PS - */ -class TableInfoPs { -public: - inline void insert(const Uint32 tableId, const char * tableName); - - inline bool del(const Uint32 tableId); - - inline char * getTableName(const Uint32 tableId) const; - -private: - Vector<struct TableInfo*> tableInfo; - - inline TableInfo * lookup(const Uint32 tableId) const; - inline TableInfo * lookup(const Uint32 tableId , Uint32 * pos) const; -}; - -inline -TableInfo * -TableInfoPs::lookup(const Uint32 tableId) const{ - TableInfo * table; - Uint32 i=0; - - while(i<tableInfo.size()) { - table=tableInfo[i]; - if(table->tableId == tableId) - return table; - i++; - } - return 0; -} - -inline -TableInfo * -TableInfoPs::lookup(const Uint32 tableId, Uint32 * pos ) const{ - TableInfo * table; - Uint32 i=0; - while(i<tableInfo.size()) { - table=tableInfo[i]; - if(table->tableId == tableId) { - *pos=i; - return table; - } - i++; - } - return 0; -} - - -inline -char * -TableInfoPs::getTableName(const Uint32 tableId) const{ - TableInfo * table; - table=lookup(tableId); - if(table!=0) - return table->tableName; - return 0; -} - - -inline -void -TableInfoPs::insert(const Uint32 tableId, const char * tableName) { - TableInfo * table = new TableInfo; - table->tableId=tableId; - table->tableName=strdup(tableName); - tableInfo.push_back(table); -} - -inline -bool -TableInfoPs::del(const Uint32 tableId) { - - TableInfo * table; - Uint32 i=0; - table = lookup(tableId, &i); - - if(table!=0) { - NdbMem_Free(table->tableName); - delete table; - tableInfo.erase(i); - return true; - } - return false; -} - -#endif diff --git a/ndb/src/old_files/rep/dbug_hack.cpp b/ndb/src/old_files/rep/dbug_hack.cpp deleted file mode 100644 index 74e5f080777..00000000000 --- a/ndb/src/old_files/rep/dbug_hack.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* 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 <ndb_global.h> - -#include <OutputStream.hpp> -#include "NdbOut.hpp" -#include "rep_version.hpp" - -int replogEnabled; - -/** - * @todo This should be implemented using MySQLs dbug library - */ -#if 0 -extern "C" -void -DBUG_PRINT(const char * fmt, ...) -{ -#ifdef DBUG - va_list ap; - char buf[1000]; - - va_start(ap, fmt); - if (fmt != 0) - vsnprintf(buf, sizeof(buf)-1, fmt, ap); - ndbout << buf << endl; - va_end(ap); -#endif -} -#endif - -extern "C" -void -replog(const char * fmt, ...) -{ - if (replogEnabled) - { - va_list ap; - char buf[1000]; - - va_start(ap, fmt); - if (fmt != 0) - vsnprintf(buf, sizeof(buf)-1, fmt, ap); - ndbout << buf << endl; - va_end(ap); - } -} - -extern "C" -void -rlog(const char * fmt, ...) -{ - va_list ap; - char buf[1000]; - - va_start(ap, fmt); - if (fmt != 0) - vsnprintf(buf, sizeof(buf)-1, fmt, ap); - ndbout << buf; - va_end(ap); -} diff --git a/ndb/src/old_files/rep/rep_version.hpp b/ndb/src/old_files/rep/rep_version.hpp deleted file mode 100644 index 3830f9c351c..00000000000 --- a/ndb/src/old_files/rep/rep_version.hpp +++ /dev/null @@ -1,88 +0,0 @@ -/* 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 */ - -#ifndef REP_VERSION_HPP -#define REP_VERSION_HPP - -/** - * Block number for REP - */ -#define SSREPBLOCKNO 1 -#define PSREPBLOCKNO 2 - -#define DBUG - -#include <ndb_version.h> - -extern "C" -void -DBUG_PRINT__(const char * fmt, ...); - -extern "C" -void -replog(const char * fmt, ...); - -extern "C" -void -rlog(const char * fmt, ...); - -#define RLOG(ARGS) \ - do { if (replogEnabled) { \ - rlog ARGS; \ - ndbout << " (" << __FILE__ << ":" << __LINE__ << ")" << endl; \ - } \ - } while (0) - -/** - * Replication logging on or off - */ -extern int replogEnabled; - -/** - * Used for config id - */ -#define REP_VERSION_ID NDB_VERSION - -#define MAX_NODE_GROUPS 6 - -#define REPABORT(string) \ - { \ - ndbout_c("\nInternal error in %s:%d: %s", __FILE__, __LINE__, string); \ - abort(); \ - } -#define REPABORT1(string, data1) \ - { \ - ndbout_c("\nInternal error in %s:%d: %s" \ - "\n (data1: %d)", \ - __FILE__, __LINE__, string, data1); \ - abort(); \ - } -#define REPABORT2(string, data1, data2) \ - { \ - ndbout_c("\nInternal error in %s:%d: %s" \ - "\n (data1: %d, data2: %d)", \ - __FILE__, __LINE__, string, data1, data2); \ - abort(); \ - } -#define REPABORT3(string, data1, data2, data3) \ - { \ - ndbout_c("\nInternal error in %s:%d: %s" \ - "\n (data1: %d, data2: %d data3: %d)", \ - __FILE__, __LINE__, string, data1, data2, data3); \ - abort(); \ - } - -#endif diff --git a/ndb/src/old_files/rep/repapi/Makefile b/ndb/src/old_files/rep/repapi/Makefile deleted file mode 100644 index fdd153f1060..00000000000 --- a/ndb/src/old_files/rep/repapi/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -include .defs.mk - -TYPE := util - -PIC_ARCHIVE := Y -ARCHIVE_TARGET := repapi - -A_LIB := Y -SO_LIB := Y -PIC_LIB := Y - -#DIRS := test - -LIB_TARGET := REP_API -LIB_TARGET_ARCHIVES := $(ARCHIVE_TARGET) general portlib - -# Source files of non-templated classes (.C files) -SOURCES = repapi.cpp - -CCFLAGS_LOC += -I$(call fixpath,$(NDB_TOP)/include/mgmapi) \ - -I$(call fixpath,$(NDB_TOP)/src/common/mgmcommon) - -CCFLAGS += -DNO_DEBUG_MESSAGES - -include $(NDB_TOP)/Epilogue.mk diff --git a/ndb/src/old_files/rep/repapi/repapi.cpp b/ndb/src/old_files/rep/repapi/repapi.cpp deleted file mode 100644 index d34ab098c9c..00000000000 --- a/ndb/src/old_files/rep/repapi/repapi.cpp +++ /dev/null @@ -1,598 +0,0 @@ -/* 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 <ndb_global.h> -#include <NdbTCP.h> -#include "repapi.h" -//#include "mgmapi_debug.h" -#include <socket_io.h> - -#include <NdbOut.hpp> -#include <SocketServer.hpp> -#include <Parser.hpp> -#include <OutputStream.hpp> -#include <InputStream.hpp> - -#if defined VM_TRACE && !defined NO_DEBUG_MESSAGES -#define DEBUG(x) ndbout << x << endl; -#elif defined NO_DEBUG_MESSAGES -#define DEBUG(x) -#endif - -#ifdef NDB_WIN32 -#define EBADMSG EFAULT -#endif - - - -class ParserDummy2 : SocketServer::Session { -public: - ParserDummy2(NDB_SOCKET_TYPE sock); -}; - -ParserDummy2::ParserDummy2(NDB_SOCKET_TYPE sock) : SocketServer::Session(sock) { - -} - -typedef Parser<ParserDummy2> Parser_t; - - -#define REP_CMD(name, fun, desc) \ - { name, \ - 0, \ - ParserRow<ParserDummy2>::Cmd, \ - ParserRow<ParserDummy2>::String, \ - ParserRow<ParserDummy2>::Optional, \ - ParserRow<ParserDummy2>::IgnoreMinMax, \ - 0, 0, \ - fun, \ - desc, 0 } - -#define REP_ARG(name, type, opt, desc) \ - { name, \ - 0, \ - ParserRow<ParserDummy2>::Arg, \ - ParserRow<ParserDummy2>::type, \ - ParserRow<ParserDummy2>::opt, \ - ParserRow<ParserDummy2>::IgnoreMinMax, \ - 0, 0, \ - 0, \ - desc, 0 } - -#define REP_END() \ - { 0, \ - 0, \ - ParserRow<ParserDummy2>::Arg, \ - ParserRow<ParserDummy2>::Int, \ - ParserRow<ParserDummy2>::Optional, \ - ParserRow<ParserDummy2>::IgnoreMinMax, \ - 0, 0, \ - 0, \ - 0, 0 } - -struct ndb_rep_handle { - char * hostname; - unsigned short port; - - int connected; - int last_error; - int last_error_line; - int read_timeout; - int write_timeout; - - NDB_SOCKET_TYPE socket; - -#ifdef REPAPI_LOG - FILE* logfile; -#endif -}; - -#define SET_ERROR(h, e) \ - h->last_error = e; \ - h->last_error_line = __LINE__; - -extern "C" -NdbRepHandle -ndb_rep_create_handle(){ - NdbRepHandle h = (NdbRepHandle)malloc(sizeof(ndb_rep_handle)); - h->connected = 0; - h->last_error = 0; - h->last_error_line = 0; - h->hostname = 0; - h->socket = -1; - h->read_timeout = 50000; - h->write_timeout = 100; - -#ifdef REPAPI_LOG - h->logfile = 0; -#endif - - return h; -} - -/** - * Destroy a handle - */ -extern "C" -void -ndb_rep_destroy_handle(NdbRepHandle * handle){ - if(!handle) - return; - if((* handle)->connected){ - ndb_rep_disconnect(* handle); - } - if((* handle)->hostname != 0){ - free((* handle)->hostname); - } -#ifdef REPAPI_LOG - if ((* handle)->logfile != 0){ - fclose((* handle)->logfile); - (* handle)->logfile = 0; - } -#endif - free(* handle); - * handle = 0; -} - -/** - * Get latest error associated with a handle - */ -extern "C" -int -ndb_rep_get_latest_error(const NdbRepHandle h){ - return h->last_error; -} - -/** - * Get latest error line associated with a handle - */ -extern "C" -int -ndb_rep_get_latest_error_line(const NdbRepHandle h){ - return h->last_error_line; -} - -static -int -parse_connect_string(const char * connect_string, - NdbRepHandle handle){ - - if(connect_string == 0){ - DEBUG("connect_string == 0"); - SET_ERROR(handle, EINVAL); - return -1; - } - - char * line = strdup(connect_string); - if(line == 0){ - DEBUG("line == 0"); - SET_ERROR(handle, ENOMEM); - return -1; - } - - char * tmp = strchr(line, ':'); - if(tmp == 0){ - DEBUG("tmp == 0"); - free(line); - SET_ERROR(handle, EINVAL); - return -1; - } - * tmp = 0; tmp++; - - int port = 0; - if(sscanf(tmp, "%d", &port) != 1){ - DEBUG("sscanf() != 1"); - free(line); - SET_ERROR(handle, EINVAL); - return -1; - } - - if(handle->hostname != 0) - free(handle->hostname); - - handle->hostname = strdup(line); - handle->port = port; - free(line); - return 0; -} - -/* - * Call an operation, and return the reply - */ -static const Properties * -ndb_rep_call(NdbRepHandle handle, - const ParserRow<ParserDummy2> *command_reply, - const char *cmd, - const Properties *cmd_args) { - SocketOutputStream out(handle->socket); - SocketInputStream in(handle->socket, handle->read_timeout); - - out.println(cmd); -#ifdef REPAPI_LOG - /** - * Print command to log file - */ - FileOutputStream f(handle->logfile); - f.println("OUT: %s", cmd); -#endif - - if(cmd_args != NULL) { - Properties::Iterator iter(cmd_args); - const char *name; - while((name = iter.next()) != NULL) { - PropertiesType t; - Uint32 val_i; - BaseString val_s; - - cmd_args->getTypeOf(name, &t); - switch(t) { - case PropertiesType_Uint32: - cmd_args->get(name, &val_i); - out.println("%s: %d", name, val_i); - break; - case PropertiesType_char: - cmd_args->get(name, val_s); - out.println("%s: %s", name, val_s.c_str()); - break; - default: - /* Ignore */ - break; - } - } -#ifdef REPAPI_LOG - /** - * Print arguments to log file - */ - cmd_args->print(handle->logfile, "OUT: "); -#endif - } - out.println(""); - - Parser_t::Context ctx; - ParserDummy2 session(handle->socket); - Parser_t parser(command_reply, in, true, true, true); - -#if 1 - const Properties* p = parser.parse(ctx, session); - if (p == NULL){ - /** - * Print some info about why the parser returns NULL - */ - ndbout << " status=" << ctx.m_status << ", curr="<<ctx.m_currentToken << endl; - } -#ifdef REPAPI_LOG - else { - /** - * Print reply to log file - */ - p->print(handle->logfile, "IN: "); - } -#endif - return p; -#else - return parser.parse(ctx, session); -#endif -} - -/** - * Connect to a rep server - * - * Returns 0 if OK, sets ndb_rep_handle->last_error otherwise - */ -extern "C" -int -ndb_rep_connect(NdbRepHandle handle, const char * repsrv){ - - if(handle == 0) - return -1; - - if(parse_connect_string(repsrv, handle) != 0) - return -1; - - -#ifdef REPAPI_LOG - /** - * Open the log file - */ - char logname[64]; - snprintf(logname, 64, "repapi.log"); - handle->logfile = fopen(logname, "w"); -#endif - - /** - * Do connect - */ - const NDB_SOCKET_TYPE sockfd = socket(AF_INET, SOCK_STREAM, 0); - if (sockfd == NDB_INVALID_SOCKET) { - DEBUG("socket() == INVALID_SOCKET"); - return -1; - } - - struct sockaddr_in servaddr; - memset(&servaddr, 0, sizeof(servaddr)); - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons(handle->port); - // Convert ip address presentation format to numeric format - const int res1 = Ndb_getInAddr(&servaddr.sin_addr, handle->hostname); - if (res1 != 0) { - DEBUG("Ndb_getInAddr(...) == -1"); - return -1; - } - - const int res2 = connect(sockfd, (struct sockaddr*) &servaddr, - sizeof(servaddr)); - if (res2 == -1) { - DEBUG("connect() == -1"); - NDB_CLOSE_SOCKET(sockfd); - return -1; - } - - handle->socket = sockfd; - handle->connected = 1; - - return 0; -} - -/** - * Disconnect from a rep server - */ -extern "C" -void -ndb_rep_disconnect(NdbRepHandle handle){ - if(handle == 0) - return; - - if(handle->connected != 1){ - return; - } - - NDB_CLOSE_SOCKET(handle->socket); - handle->socket = -1; - handle->connected = 0; - - return; -} - - - -/****************************************************************************** - * Global Replication - ******************************************************************************/ -extern "C" -int ndb_rep_command(NdbRepHandle handle, - unsigned int request, - unsigned int* replication_id, - struct ndb_rep_reply* /*reply*/, - unsigned int epoch) { - - *replication_id = 0; - - const ParserRow<ParserDummy2> replication_reply[] = { - REP_CMD("global replication reply", NULL, ""), - REP_ARG("result", Int, Mandatory, "Error message"), - REP_ARG("id", Int, Optional, "Id of global replication"), - REP_END() - }; - - if (handle == 0) { - return -1; - } - - if (handle->connected != 1) { - handle->last_error = EINVAL; - return -1; - } - - Properties args; - args.put("request", request); - args.put("id", *replication_id); - if(epoch > 0) - args.put("epoch",epoch); - else - args.put("epoch",(unsigned int)0); - - const Properties *reply; - reply = ndb_rep_call(handle, replication_reply, "rep", &args); - - if(reply == NULL) { - handle->last_error = EIO; - return -1; - } - - reply->get("id", replication_id); - Uint32 result; - reply->get("result", &result); - delete reply; - return result; -} - -extern "C" -int convert2int(char * first, char * last, unsigned int f[], unsigned int l[]) -{ - char * ftok = strtok(first, ","); - char * ltok = strtok(last, ","); - Uint32 i=0; - while(ftok!=NULL && ltok!=NULL) - { - f[i] = atoi(ftok); - l[i] = atoi(ltok); - ftok = strtok(NULL, ","); - ltok = strtok(NULL, ","); - i++; - } - - return 0; -} - - -int ndb_rep_query(NdbRepHandle handle, - QueryCounter counter, - unsigned int* replicationId, - struct ndb_rep_reply* /*reply*/, - struct rep_state * state) -{ - *replicationId = 0; // not used currently. - - if(state == 0) - return -1; - - const ParserRow<ParserDummy2> replication_reply[] = { - REP_CMD("global replication query reply", NULL, ""), - REP_ARG("result", String, Mandatory, "Error message"), - REP_ARG("id", Int, Mandatory, "replicationId"), - REP_ARG("no_of_nodegroups", Int, Optional, "number of nodegroups"), - REP_ARG("subid", Int, Optional, "Id of subscription"), - REP_ARG("subkey", Int, Optional, "Key of subscription"), - REP_ARG("connected_rep", Int, Optional, "connected to rep"), - REP_ARG("connected_db", Int, Optional, "connected to db"), - REP_ARG("first", String, Optional, ""), - REP_ARG("last", String, Optional, ""), - REP_ARG("state_sub", Int, Optional, "state of subsription"), - REP_ARG("state", Int, Optional, "state"), - REP_END() - }; - - if (handle == 0) { - return -1; - } - - if (handle->connected != 1) { - handle->last_error = EINVAL; - return -1; - } - - const Properties *props; - Properties args; - Uint32 request = 0; - args.put("request", request); - args.put("id", *replicationId); - args.put("counter" , (Uint32)counter); - props = ndb_rep_call(handle, replication_reply, "rep query", &args); - - BaseString result; - props->get("result", result); - if(strcmp(result.c_str(), "Ok") != 0) - { - delete props; - return 1; - } - state->queryCounter = counter; - unsigned int no_of_nodegroups; - props->get("no_of_nodegroups", &no_of_nodegroups); - state->no_of_nodegroups = no_of_nodegroups; - - if(counter >= 0) - { - BaseString first, last; - props->get("first", first); - props->get("last", last); - convert2int((char*)first.c_str(), (char*)last.c_str(), - state->first , state->last ); - } else - { - for(Uint32 i = 0; i<REPAPI_MAX_NODE_GROUPS; i++) { - state->first[i] = 0; - state->last[i] = 0; - } - } - - unsigned int connected_rep = 0; - props->get("connected_rep", &connected_rep); - state->connected_rep = connected_rep; - - unsigned int connected_db = 0; - props->get("connected_rep", &connected_db); - state->connected_db = connected_db; - - unsigned int subid; - props->get("subid", &subid); - state->subid = subid; - - unsigned int subkey; - props->get("subkey", &subkey); - state->subkey = subkey; - - unsigned int _state; - props->get("state", &_state); - state->state = _state; - - unsigned int state_sub; - props->get("state_sub", &state_sub); - state->state_sub = state_sub; - - if(props == NULL) { - handle->last_error = EIO; - return -1; - } - delete props; - - return 0; -} - - -extern "C" -int -ndb_rep_get_status(NdbRepHandle handle, - unsigned int* replication_id, - struct ndb_rep_reply* /*reply*/, - struct rep_state * repstate) { - - const ParserRow<ParserDummy2> replication_reply[] = { - REP_CMD("global replication status reply", NULL, ""), - REP_ARG("result", String, Mandatory, "Error message"), - REP_ARG("id", Int, Optional, "Error message"), - REP_ARG("subid", Int, Optional, "Id of subscription"), - REP_ARG("subkey", Int, Optional, "Key of subscription"), - REP_ARG("connected_rep", Int, Optional, "connected to rep"), - REP_ARG("connected_db", Int, Optional, "connected to db"), - REP_ARG("state_sub", Int, Optional, "state of subsription"), - REP_ARG("state", Int, Optional, "state"), - REP_END() - }; - - if (handle == 0) { - return -1; - } - - if (handle->connected != 1) { - handle->last_error = EINVAL; - return -1; - } - - const Properties *reply; - Properties args; - Uint32 request = 0; - args.put("request", request); - reply = ndb_rep_call(handle, replication_reply, "rep status", &args); - - if(reply == NULL) { - handle->last_error = EIO; - return -1; - } - - Uint32 result; - reply->get("result", &result); - reply->get("id", replication_id); - reply->get("subid", (Uint32*)&repstate->subid); - reply->get("subkey", (Uint32*)&repstate->subkey); - reply->get("connected_rep", (Uint32*)&repstate->connected_rep); - reply->get("connected_db", (Uint32*)&repstate->connected_db); - reply->get("state", (Uint32*)&repstate->state); - reply->get("state_sub", (Uint32*)&repstate->state_sub); - - delete reply; - return result; -} diff --git a/ndb/src/old_files/rep/repapi/repapi.h b/ndb/src/old_files/rep/repapi/repapi.h deleted file mode 100644 index 170e493cd86..00000000000 --- a/ndb/src/old_files/rep/repapi/repapi.h +++ /dev/null @@ -1,216 +0,0 @@ -/* 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 */ - -#ifndef REPAPI_H -#define REPAPI_H - -/** - * @mainpage NDB Cluster REP API - * - * The NDB Cluster Replication API (REP API) consists of a C API - * which is used to: - * - Start and stop replication - * - Other administrative tasks - * - * The functions use simple ASCII based - * commands to interact with thw Replication Server. - * - * - * @section General Concepts - * - * Each REP API function call needs an rep_C_Api::NdbRepHandle - * which initally is created by - * calling the function ndb_rep_create_handle(). - * - * A function can return: - * -# An integer value. If it returns 0 then this indicates success. - * -# A pointer value. If it returns NULL then check the latest error. - * If it didn't return NULL, then "something" is returned. - * This "something" has to be free:ed by the user of the REP API. - */ - -/** @addtogroup REP_C_API - * @{ - */ - -#ifdef __cplusplus -extern "C" { -#endif - -#define REPAPI_MAX_NODE_GROUPS 4 - /** - * The NdbRepHandle. - */ - typedef struct ndb_rep_handle * NdbRepHandle; - - - /** - * Default reply from the server - */ - struct ndb_rep_reply { - int return_code; ///< 0 if successful, - ///< otherwise error code - char message[256]; ///< Error or reply message. - }; - - enum QueryCounter { - PS = 0, ///< Stored on Primary System REP - SSReq = 1, ///< Requested for transfer to Standby System - SS = 2, ///< Stored on Standby System REP - AppReq = 3, ///< Requested to be applied to Standby System - App = 4, ///< Has been applied to Standby System - DelReq = 5, ///< Has been requested to be deleted on PS REP & SS REP - Subscription = 6, - ConnectionRep = 7, - ConnectionDb = 8 - }; - - - struct rep_state { - QueryCounter queryCounter; - unsigned int no_of_nodegroups; - unsigned int connected_rep; - unsigned int connected_db; - unsigned int subid; - unsigned int subkey; - unsigned int state; - unsigned int state_sub; - unsigned int first[REPAPI_MAX_NODE_GROUPS]; //4 = max no of nodegroups - unsigned int last[REPAPI_MAX_NODE_GROUPS]; //4 = max no of nodegroups - }; - - - - - - - /*************************************************************************** - * FUNCTIONS - ***************************************************************************/ - /** - * Create a handle - * - * @return A handle != 0 - * or 0 if failed to create one. (Check errno then). - */ - NdbRepHandle ndb_rep_create_handle(); - - /** - * Destroy a handle - * - * @param handle Rep server handle - */ - void ndb_rep_destroy_handle(NdbRepHandle * handle); - - /** - * Get latest error associated with a handle - * - * @param handle Rep server handle - * @return Latest error. - */ - int ndb_rep_get_latest_error(const NdbRepHandle handle); - - /** - * Get latest error line associated with a handle - * - * @param handle Rep server handle. - * @return Latest error line. - */ - int ndb_rep_get_latest_error_line(const NdbRepHandle handle); - - /** - * Connect to a REP server - * - * @param handle Rep server handle. - * @param repsrv Hostname and port of the REP server, - * "hostname:port". - * @return 0 if OK, sets ndb_rep_handle->last_error otherwise. - */ - int ndb_rep_connect(NdbRepHandle handle, const char * repsrv); - - /** - * Disconnect from a REP server - * - * @param handle Rep server handle. - */ - void ndb_rep_disconnect(NdbRepHandle handle); - - - /** - * Global Replication Command - * - * @param handle NDB REP handle. - * @param request Type of request - * @param replicationId Replication id is returned from function. - * @param reply Reply message. - * @param epoch Currenty used to STOP at a certain EPOCH - * @return 0 if successful, error code otherwise. - */ - int ndb_rep_command(NdbRepHandle handle, - unsigned int request, - unsigned int* replicationId, - struct ndb_rep_reply* reply, - unsigned int epoch = 0); - - - /** - * Global Replication Command - * - * @param handle NDB REP handle. - * @param counter Type of request. If <0, then - "first" and "last" in repstate - is set to 0;x - * @param replicationId Replication id is returned from function. - * @param reply Reply message. - * @param repstate Struct containing queried data. (Note! - * All values are set in the struct, regardless - which QueryCounter that has been set - * @return 0 if successful, error code otherwise. - */ - int ndb_rep_query(NdbRepHandle handle, - QueryCounter counter, - unsigned int* replicationId, - struct ndb_rep_reply* reply, - struct rep_state * repstate); - - -/** - * @deprecated (will probably be). Can use ndb_rep_query instead. - */ - int ndb_rep_get_status(NdbRepHandle handle, - unsigned int* replication_id, - struct ndb_rep_reply* /*reply*/, - struct rep_state * repstate); - - - - enum RequestStatusCode { - OK = 0, ///< Everything OK - Error = 1, ///< Generic error - AlreadyExists = 2, ///< Entry already exists in list - NotExists = 3, ///< Entry does not exist in list - AlreadyStopped = 4 - }; - - - -#ifdef __cplusplus -} -#endif - -/** @} */ - -#endif diff --git a/ndb/src/old_files/rep/state/Channel.cpp b/ndb/src/old_files/rep/state/Channel.cpp deleted file mode 100644 index a7f7b90d3fe..00000000000 --- a/ndb/src/old_files/rep/state/Channel.cpp +++ /dev/null @@ -1,487 +0,0 @@ -/* 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 "Channel.hpp" - -Channel::Channel() -{ - reset(); -} - -Channel::~Channel() -{ - /** - * Destroy list of selected tables - */ - for(Uint32 i=0; i < m_selectedTables.size(); i++) { - delete m_selectedTables[i]; - m_selectedTables[i] = 0; - } - m_selectedTables=0; -} - -void -Channel::reset() -{ - for (Uint32 i=0; i<MAX_NO_OF_NODE_GROUPS; i++) { - for (Uint32 j=0; j<NO_OF_POSITIONS; j++) { - state[i][j].set(1,0); - } - } - m_noOfNodeGroups = 0; - m_requestorEnabled = true; - m_transferEnabled = true; - m_applyEnabled = true; - m_deleteEnabled = true; - m_autoStartEnabled = false; - m_stopEpochId = intervalMax; - setSubKey(0); - setSubId(0); - m_stateSub = NO_SUBSCRIPTION_EXISTS; - m_stateRep = CONSISTENT; - m_metaScanEpochs = emptyInterval; - m_dataScanEpochs = emptyInterval; -} - -bool -Channel::requestTransfer(Uint32 nodeGrp, Interval * i) -{ - invariant(); - Interval tmp1, tmp2; - - // i = PS - SSReq - SS - App - intervalLeftMinus(state[nodeGrp][PS], state[nodeGrp][SSReq], &tmp1); - intervalLeftMinus(tmp1, state[nodeGrp][SS], &tmp2); - intervalLeftMinus(tmp2, state[nodeGrp][App], i); - - i->onlyLeft(GREP_SYSTEM_TABLE_MAX_RANGE); - i->onlyUpToValue(m_stopEpochId); - if (i->isEmpty()) return false; - - add(SSReq, nodeGrp, *i); - invariant(); - return true; -} - -bool -Channel::requestApply(Uint32 nodeGrp, Uint32 * epoch) -{ - invariant(); - Interval tmp1, tmp2; - - // tmp2 = SS - AppReq - App - intervalLeftMinus(state[nodeGrp][SS], state[nodeGrp][AppReq], &tmp1); - intervalLeftMinus(tmp1, state[nodeGrp][App], &tmp2); - - tmp2.onlyUpToValue(m_stopEpochId); - if (tmp2.isEmpty()) return false; - tmp2.onlyLeft(1); - - // Check that all GCI Buffers for epoch exists in SS - for (Uint32 i=0; i<m_noOfNodeGroups; i++) { - if (!state[nodeGrp][SS].inInterval(tmp2.first())) - return false; - } - - invariant(); - add(AppReq, nodeGrp, tmp2); - invariant(); - *epoch = tmp2.first(); - return true; -} - -bool -Channel::requestDelete(Uint32 nodeGrp, Interval * i) -{ - invariant(); - Interval tmp1; - - // i = (App cut PS) - DelReq - intervalCut(state[nodeGrp][App], state[nodeGrp][PS], &tmp1); - intervalLeftMinus(tmp1, state[nodeGrp][DelReq], i); - - if (i->isEmpty()) return false; - i->onlyLeft(GREP_SYSTEM_TABLE_MAX_RANGE); - - invariant(); - add(DelReq, nodeGrp, *i); - invariant(); - return true; -} - -void -Channel::add(Position pos, Uint32 nodeGrp, const Interval i) -{ - Interval r; - intervalAdd(state[nodeGrp][pos], i, &r); - state[nodeGrp][pos].set(r); -} - -void -Channel::clear(Position p, Uint32 nodeGrp, const Interval i) -{ - Interval r; - intervalLeftMinus(state[nodeGrp][p], i, &r); - state[nodeGrp][p].set(r); -} - -bool -Channel::isSynchable(Uint32 nodeGrp) -{ - return true; - /* - @todo This should be implemented... - - Interval tmp1, tmp2; - intervalAdd(state[nodeGrp][PS], state[nodeGrp][SSReq], &tmp1); - intervalAdd(tmp1, state[nodeGrp][SSReq], &tmp2); - intervalAdd(tmp2, state[nodeGrp][SS], &tmp1); - intervalAdd(tmp1, state[nodeGrp][AppReq], &tmp2); - intervalAdd(tmp2, state[nodeGrp][App], &tmp1); - if (intervalInclude(state[nodeGrp][PS], tmp1.right())) - return true; - else - return false; - */ -} - -/** - * Return the cut of all App:s. - */ -void -Channel::getFullyAppliedEpochs(Interval * interval) -{ - if (m_noOfNodeGroups < 1) { - *interval = emptyInterval; - return; - } - - *interval = universeInterval; - for (Uint32 i=0; i<m_noOfNodeGroups; i++) { - if (state[i][App].isEmpty()) { - *interval = emptyInterval; - return; - } - - if (interval->first() < state[i][App].first()) { - interval->setFirst(state[i][App].first()); - } - if (state[i][App].last() < interval->last()) { - interval->setLast(state[i][App].last()); - } - } - interval->normalize(); - return; -} - -/** - * Return true if it is ok to remove the subscription and then stop channel - */ -bool -Channel::isStoppable() -{ - /** - * Check that AppReq are empty for all nodegrps - */ - for (Uint32 i=0; i<m_noOfNodeGroups; i++) { - if (!state[i][AppReq].isEmpty()) { - RLOG(("Stop disallowed. AppReq is non-empty")); - return false; - } - } - - /** - * If stop immediately, then it is ok to stop now - */ - if (m_stopEpochId == 0) { - RLOG(("Stop allowed. AppReq empty and immediate stop requested")); - return true; - } - - /** - * If stop on a certain epoch, then - * check that stopEpochId is equal to the last applied epoch - */ - Interval interval; - getFullyAppliedEpochs(&interval); - if (m_stopEpochId > interval.last()) { - RLOG(("Stop disallowed. AppReq empty. Stop %d, LastApplied %d", - m_stopEpochId, interval.last())); - return false; - } - - return true; -} - -GrepError::Code -Channel::setStopEpochId(Uint32 n) -{ - /** - * If n equal to zero, use next possible epoch (max(App, AppReq)) - */ - if (n == 0) { - for (Uint32 i=0; i<m_noOfNodeGroups; i++) { - n = (state[i][App].last() > n) ? state[i][App].last() : n; - n = (state[i][AppReq].last() > n) ? state[i][AppReq].last() : n; - } - } - - /** - * If n >= max(App, AppReq) then set value, else return error code - */ - for (Uint32 i=0; i<m_noOfNodeGroups; i++) { - if (n < state[i][App].last()) return GrepError::ILLEGAL_STOP_EPOCH_ID; - if (n < state[i][AppReq].last()) return GrepError::ILLEGAL_STOP_EPOCH_ID; - } - - m_stopEpochId = n; - return GrepError::NO_ERROR; -}; - -bool -Channel::shouldStop() -{ - /** - * If (m_stopEpochId == App) then channel should stop - */ - for (Uint32 i=0; i<m_noOfNodeGroups; i++) { - if(m_stopEpochId != state[i][App].last()) return false; - } - return true; -} - -/***************************************************************************** - * SELECTIVE TABLE INTERFACE - *****************************************************************************/ - -GrepError::Code -Channel::addTable(const char * tableName) -{ - if(strlen(tableName)>MAX_TAB_NAME_SIZE) - return GrepError::REP_NOT_PROPER_TABLE; - /** - * No of separators are the number of table_name_separator found in tableName - * since a table is defined as <db>/<schema>/tablename. - * if noOfSeparators is not equal to 2, then it is not a valid - * table name. - */ - Uint32 noOfSeps = 0; - if(strlen(tableName) < 5) - return GrepError::REP_NOT_PROPER_TABLE; - for(Uint32 i =0; i < strlen(tableName); i++) - if(tableName[i]==table_name_separator) - noOfSeps++; - if(noOfSeps!=2) - return GrepError::REP_NOT_PROPER_TABLE; - table * t= new table(tableName); - for(Uint32 i=0; i<m_selectedTables.size(); i++) { - if(strcmp(tableName, m_selectedTables[i]->tableName)==0) - return GrepError::REP_TABLE_ALREADY_SELECTED; - } - m_selectedTables.push_back(t); - return GrepError::NO_ERROR; -} - -GrepError::Code -Channel::removeTable(const char * tableName) -{ - if(strlen(tableName)>MAX_TAB_NAME_SIZE) - return GrepError::REP_NOT_PROPER_TABLE; - /** - * No of separators are the number of table_name_separator found in tableName - * since a table is defined as <db>/<schema>/tablename. - * If noOfSeparators is not equal to 2, - * then it is not a valid table name. - */ - Uint32 noOfSeps = 0; - if(strlen(tableName) < 5) - return GrepError::REP_NOT_PROPER_TABLE; - for(Uint32 i =0; i < strlen(tableName); i++) - if(tableName[i]==table_name_separator) - noOfSeps++; - if(noOfSeps!=2) - return GrepError::REP_NOT_PROPER_TABLE; - for(Uint32 i=0; i<m_selectedTables.size(); i++) { - if(strcmp(tableName, m_selectedTables[i]->tableName)==0) { - delete m_selectedTables[i]; - m_selectedTables.erase(i); - return GrepError::NO_ERROR; - } - } - return GrepError::REP_TABLE_NOT_FOUND; -} - -void -Channel::printTables() -{ - if(m_selectedTables.size() == 0) - ndbout_c("| ALL TABLES " - " |"); - else { - for(Uint32 i=0; i<m_selectedTables.size(); i++) - ndbout_c("| %-69s |", m_selectedTables[i]->tableName); - } -} - -Vector<struct table *> * -Channel::getSelectedTables() -{ - if(m_selectedTables.size() == 0) return 0; - return &m_selectedTables; -} - -/***************************************************************************** - * PRINT - *****************************************************************************/ - -void -Channel::print(Position pos) -{ - switch(pos){ - case PS: ndbout << "PS Rep"; break; - case SSReq: ndbout << "Tra-Req"; break; - case SS: ndbout << "SS Rep"; break; - case AppReq: ndbout << "App-Req"; break; - case App: ndbout << "Applied"; break; - case DelReq: ndbout << "Del-Req"; break; - default: REPABORT("Unknown replication position"); - } -} - -void -Channel::print() -{ - for (Uint32 i=0; i<m_noOfNodeGroups; i++) { - print(i); - } -} - -void -Channel::print(Position pos, Uint32 nodeGrp) -{ - print(pos); - if (state[nodeGrp][pos].first() == 1 && state[nodeGrp][pos].last() == 0) { - ndbout << " EMPTY"; - } else { - ndbout << " [" << state[nodeGrp][pos].first() << "-" - << state[nodeGrp][pos].last() << "]"; - } -} - -static const char* -channelline = -"+-------------------------------------------------------------------------+\n" -; - -void -Channel::getEpochState(Position p, - Uint32 nodeGrp, - Uint32 * first, - Uint32 * last) { - if(state[nodeGrp][p].isEmpty()) { - *first = 1; - *last = 0; - return; - } - *first = state[nodeGrp][p].first(); - *last = state[nodeGrp][p].last(); -} - - -void -Channel::print(Uint32 nodeGrp) -{ - ndbout << channelline; - ndbout_c("| | Meta scan |" - " Data scan |"); - ndbout.print("| "); - if (m_metaScanEpochs.isEmpty()) { - ndbout.print("| "); - } else { - ndbout.print("| %10u-%-10u ", - m_metaScanEpochs.first(), m_metaScanEpochs.last()); - } - if (m_dataScanEpochs.isEmpty()) { - ndbout_c("| |"); - } else { - ndbout_c("| %10u-%-10u |", - m_dataScanEpochs.first(), m_dataScanEpochs.last()); - } - - /* --- */ - - ndbout << channelline; - ndbout_c("| Source Rep Server | Being Transfered |" - " Destination Rep Server |"); - if (state[nodeGrp][PS].isEmpty()) { - ndbout.print("| "); - } else { - ndbout.print("| %10u-%-10u ", - state[nodeGrp][PS].first(), state[nodeGrp][PS].last()); - } - if (state[nodeGrp][SSReq].isEmpty()) { - ndbout.print("| "); - } else { - ndbout.print("| %10u-%-10u ", - state[nodeGrp][SSReq].first(), state[nodeGrp][SSReq].last()); - } - if (state[nodeGrp][SS].isEmpty()) { - ndbout_c("| |"); - } else { - ndbout_c("| %10u-%-10u |", - state[nodeGrp][SS].first(), state[nodeGrp][SS].last()); - } - - /* --- */ - - ndbout << channelline; - ndbout_c("| Being Applied | Applied |" - " Being Deleted |"); - if (state[nodeGrp][AppReq].isEmpty()) { - ndbout.print("| "); - } else { - ndbout.print("| %10u-%-10u ", state[nodeGrp][AppReq].first(), - state[nodeGrp][AppReq].last()); - } - if (state[nodeGrp][App].isEmpty()) { - ndbout.print("| "); - } else { - ndbout.print("| %10u-%-10u ", - state[nodeGrp][App].first(), state[nodeGrp][App].last()); - } - if (state[nodeGrp][DelReq].isEmpty()) { - ndbout_c("| |"); - } else { - ndbout_c("| %10u-%-10u |", - state[nodeGrp][DelReq].first(), state[nodeGrp][DelReq].last()); - } -} - -/***************************************************************************** - * Private Methods - *****************************************************************************/ - -void -Channel::invariant() -{ - for (Uint32 j=0; j<MAX_NO_OF_NODE_GROUPS; j++) - { - if (!intervalDisjoint(state[j][SSReq], state[j][SS])) - REPABORT("Invariant 1 violated"); - if (!intervalDisjoint(state[j][AppReq], state[j][App])) - REPABORT("Invariant 2 violated"); - } -} diff --git a/ndb/src/old_files/rep/state/Channel.hpp b/ndb/src/old_files/rep/state/Channel.hpp deleted file mode 100644 index cdf4eecca63..00000000000 --- a/ndb/src/old_files/rep/state/Channel.hpp +++ /dev/null @@ -1,206 +0,0 @@ -/* 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 */ - -#ifndef CHANNEL_HPP -#define CHANNEL_HPP - -#include "Interval.hpp" -#include <rep/rep_version.hpp> -#include <Vector.hpp> -#include <ndb_limits.h> -#include <GrepError.hpp> - - -/** - * Max number of requested epochs from PS - */ -#define GREP_SYSTEM_TABLE_MAX_RANGE 20 - -#define MAX_NO_OF_NODE_GROUPS 32 - -/** - * This table struct is used in m_selectedTables - */ -struct table{ - table(const char * n) {strncpy(tableName, n, MAX_TAB_NAME_SIZE);} - char tableName[MAX_TAB_NAME_SIZE]; -}; - -/** - * @class Channel - * @brief Represents location of various epochs belonging to a subscription - */ -class Channel { -public: - enum StateSub - { - NO_SUBSCRIPTION_EXISTS, - - CREATING_SUBSCRIPTION_ID, - SUBSCRIPTION_ID_CREATED, - - STARTING_SUBSCRIPTION, - SUBSCRIPTION_STARTED - }; - - enum StateRep - { - CONSISTENT, ///< Consistent database. Grep not running. - METALOG_STARTING, ///< Starting. Starting METALOG subscription - METALOG_STARTED, - METASCAN_STARTING, ///< Starting. Starting METASCAN subscription - METASCAN_COMPLETED, - DATALOG_STARTING, ///< Starting. Starting DATALOG subscription - DATALOG_STARTED, - DATASCAN_STARTING, ///< Starting. Starting DATASCAN subscription - DATASCAN_COMPLETED, - LOG, ///< Started. Cons/Inconsistent. Grep running. - ///< All scan records have been applied. - STOPPING ///< Channel is stopping - }; - - /** - * Storage "positions" of Epochs - */ - enum Position { - PS = 0, ///< Stored on Primary System REP - SSReq = 1, ///< Requested for transfer to Standby System - SS = 2, ///< Stored on Standby System REP - AppReq = 3, ///< Requested to be applied to Standby System - App = 4, ///< Has been applied to Standby System - DelReq = 5, ///< Has been requested to be deleted on PS REP & SS REP - NO_OF_POSITIONS = 6 - }; //DONT FORGET TO ADD STUFF in position2Name if u add somehting here, - - /*************************************************************************** - * CONSTRUCTOR / DESTRUCTOR - ***************************************************************************/ - Channel(); - ~Channel(); - - /** - * Get and set no of nodegroups that actually exists on PS - */ - void setNoOfNodeGroups(Uint32 n) { m_noOfNodeGroups = n; }; - Uint32 getNoOfNodeGroups() { return m_noOfNodeGroups; }; - void getEpochState(Position p, - Uint32 nodeGrp, - Uint32 * first, - Uint32 * last); - Uint32 getEpochState(Position p, Uint32 nodegroup); - bool m_requestorEnabled; - bool m_transferEnabled; - bool m_applyEnabled; - bool m_deleteEnabled; - bool m_autoStartEnabled; - - /*************************************************************************** - * GETTERS and SETTERS - ***************************************************************************/ - bool requestTransfer(Uint32 nodeGrp, Interval * i); - bool requestApply(Uint32 nodeGrp, Uint32 * epoch); - bool requestDelete(Uint32 nodeGrp, Interval * i); - - void add(Position pos, Uint32 nodeGrp, const Interval i); - void clear(Position pos, Uint32 nodeGrp, const Interval i); - - void setSubId(Uint32 subId) { m_subId=subId; }; - Uint32 getSubId() { return m_subId; }; - - Uint32 getSubKey() { return m_subKey; }; - void setSubKey(Uint32 subKey) { m_subKey=subKey; }; - - bool isSynchable(Uint32 nodeGrp); - GrepError::Code addTable(const char * tableName); - GrepError::Code removeTable(const char * tableName); - void printTables(); - bool isSelective() {return m_selectedTables.size()>0;}; - Vector<struct table *> * getSelectedTables(); - - void reset(); - - StateRep getState() { return m_stateRep; } - void setState(StateRep sr) { m_stateRep = sr; } - - StateSub getStateSub() { return m_stateSub; } - void setStateSub(StateSub ss) { m_stateSub = ss; } - - Interval getMetaScanEpochs() { return m_metaScanEpochs; } - void setMetaScanEpochs(Interval i) { m_metaScanEpochs = i; } - Interval getDataScanEpochs() { return m_dataScanEpochs; } - void setDataScanEpochs(Interval i) { m_dataScanEpochs = i; } - - GrepError::Code setStopEpochId(Uint32 n); - Uint32 getStopEpochId() { return m_stopEpochId; }; - - bool isStoppable(); - bool shouldStop(); - - bool subscriptionExists() { return (m_subId != 0 && m_subKey != 0); } - - /*************************************************************************** - * GETTERS - ***************************************************************************/ - Uint32 getFirst(Position pos, Uint32 nodeGrp) { - return state[nodeGrp][pos].first(); - } - - Uint32 getLast(Position pos, Uint32 nodeGrp) { - return state[nodeGrp][pos].last(); - } - - void getFullyAppliedEpochs(Interval * i); - - /*************************************************************************** - * PRINT METHODS - ***************************************************************************/ - void print(); - void print(Position pos); - void print(Position pos, Uint32 nodeGrp); - void print(Uint32 nodeGrp); - - /*************************************************************************** - * PUBLIC ATTRIBUTES - ***************************************************************************/ - -private: - /*************************************************************************** - * PRIVATE ATTRIBUTES - ***************************************************************************/ - StateRep m_stateRep; // Replication state - StateSub m_stateSub; // Subscription state - - Uint32 m_subId; - Uint32 m_subKey; - - Uint32 m_noOfNodeGroups; // Number of node grps in this channel - Uint32 m_stopEpochId; // Epoch id to stop subscription - - Interval state[MAX_NO_OF_NODE_GROUPS][NO_OF_POSITIONS]; - - Interval m_metaScanEpochs; - Interval m_dataScanEpochs; - - - Vector<struct table *> m_selectedTables; - void invariant(); // Abort if channel metadata is inconsistent - char * position2Name(Position p); -public: - bool copy(Position from, Position to, Uint32 range, - Uint32 * f, Uint32 * l, Uint32 nodeGrp); -}; - -#endif diff --git a/ndb/src/old_files/rep/state/Interval.cpp b/ndb/src/old_files/rep/state/Interval.cpp deleted file mode 100644 index 8266f19c58d..00000000000 --- a/ndb/src/old_files/rep/state/Interval.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/* 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 "Interval.hpp" - -#undef min -#undef max -Uint32 max(Uint32 a, Uint32 b) { return a > b ? a : b; } -Uint32 min(Uint32 a, Uint32 b) { return a < b ? a : b; } - -Interval::Interval() -{ - set(1, 0); // EmptyInterval -} - -Interval::Interval(Uint32 f, Uint32 l) -{ - set(f, l); -} - -bool -Interval::isEmpty() const -{ - return (m_first > m_last) ? true : false; -} - -bool -Interval::isEqual(Uint32 a, Uint32 b) const -{ - return (a==m_first && b==m_last); -} - -bool -Interval::inInterval(Uint32 a) const -{ - return (m_first <= a && a <= m_last); -} - -void -Interval::set(Uint32 first, Uint32 last) -{ - m_first = first; - m_last = last; - normalize(); -} - -void -Interval::set(const Interval i) -{ - m_first = i.first(); - m_last = i.last(); - normalize(); -} - -void -Interval::setFirst(Uint32 first) -{ - m_first = first; -} - -void -Interval::setLast(Uint32 last) -{ - m_last = last; -} - -void -Interval::onlyLeft(Uint32 n) -{ - if (size() > n) m_last = m_first + n - 1; -} - -void -Interval::onlyUpToValue(Uint32 n) -{ - m_last = min(n, m_last); - normalize(); -} - -/*****************************************************************************/ - -void -Interval::normalize() -{ - if (isEmpty()) { - m_first = 1; - m_last = 0; - } -} - - -/*****************************************************************************/ - -bool -intervalAdd(const Interval a, const Interval b, Interval * r) -{ - /** - * Non-empty disjoint intervals - */ - if (!a.isEmpty() && - !b.isEmpty() && - (a.last() + 1 < b.first() || - b.last() + 1 < a.first()) ) { - return false; // Illegal add - } - - /** - * Interval A empty -> return B - */ - if (a.isEmpty()) { - r->set(b); - return true; - } - - /** - * Interval B empty -> return A - */ - if (b.isEmpty()) { - r->set(a); - return true; - } - - r->set(min(a.first(), b.first()), - max(a.last(), b.last())); - return true; -} - -/** - * Subtract the left part of interval 'a' up to last of 'b'. - * - * @note This is NOT ordinary arithmetic interval minus. - * In ordinary arithmetic, [11-25] - [12-15] would be undefined, - * but here it is [11-25] - [12-15] = [16-25]. - */ -void -intervalLeftMinus(const Interval a, const Interval b, Interval * r) -{ - if(b.last() != intervalMax) - r->set(max(a.first(), b.last()+1), a.last()); - else - r->set(max(a.first(), intervalMax), a.last()); -} - -void -intervalCut(const Interval a, const Interval b, Interval * r) -{ - r->set(max(a.first(), b.first()), min(a.last(), b.last())); - r->normalize(); -} - -bool -intervalDisjoint(const Interval a, const Interval b) -{ - return (a.isEmpty() || - b.isEmpty() || - a.last() < b.first() || - b.last() < a.first()); -} diff --git a/ndb/src/old_files/rep/state/Interval.hpp b/ndb/src/old_files/rep/state/Interval.hpp deleted file mode 100644 index 935adaf26b1..00000000000 --- a/ndb/src/old_files/rep/state/Interval.hpp +++ /dev/null @@ -1,107 +0,0 @@ -/* 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 */ - -#ifndef INTERVAL_HPP -#define INTERVAL_HPP - -#include <NdbOut.hpp> -#include <ndb_types.h> - -/** - * @class Interval - * @brief Represents an interval - */ -class Interval { -public: - Interval(); - Interval(Uint32, Uint32); - - /** - * Getters of first and last - */ - inline Uint32 first() const { return m_first; } - inline Uint32 last() const { return m_last; } - - /** - * Check if interval is empty - */ - bool isEmpty() const; - bool isEqual(Uint32 a, Uint32 b) const; - bool inInterval(Uint32 a) const; - - /** - * Size of interval - */ - Uint32 size() const { - return (!isEmpty()) ? m_last - m_first + 1 : 0; - } - - /** - * Set interval - */ - void set(Uint32 first, Uint32 last); - void set(const Interval i); - - void setFirst(Uint32 first); - void setLast(Uint32 last); - - /** - * Reduce the interval to only the n left elements of the - * interval. If the interval is shorter than n, then - * interval is not changed. - */ - void onlyLeft(Uint32 n); - - /** - * Reduce the interval to have at most the value n - * as the last value. - * This method can make the interval empty. - */ - void onlyUpToValue(Uint32 n); - - /** - * Print - */ - void print() { - ndbout << "[" << m_first << "," << m_last << "]"; - } - - void normalize(); -private: - Uint32 m_first; - Uint32 m_last; -}; - -const Uint32 intervalMin = 0; -const Uint32 intervalMax = 0xffffffff; -const Interval emptyInterval(1, 0); -const Interval universeInterval(intervalMin, intervalMax); - -/** - * @return true if intervals could be added - */ -bool intervalAdd(const Interval a, const Interval b, Interval * c); - -void intervalLeftMinus(const Interval a, const Interval b, Interval * c); - -void intervalCut(const Interval a, const Interval b, Interval * c); - -/** - * @return true if intervals are disjoint - */ -bool intervalDisjoint(const Interval a, const Interval b); - -#endif diff --git a/ndb/src/old_files/rep/state/Makefile b/ndb/src/old_files/rep/state/Makefile deleted file mode 100644 index 3eed69a97dd..00000000000 --- a/ndb/src/old_files/rep/state/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -include .defs.mk - -TYPE := repserver kernel - -ARCHIVE_TARGET := reprequestor - -DIR := testRepState \ - testInterval - -SOURCES = RepState.cpp \ - RepStateEvent.cpp \ - RepStateRequests.cpp \ - \ - Channel.cpp \ - Interval.cpp - -include $(NDB_TOP)/Epilogue.mk diff --git a/ndb/src/old_files/rep/state/RepState.cpp b/ndb/src/old_files/rep/state/RepState.cpp deleted file mode 100644 index d8a50961a3c..00000000000 --- a/ndb/src/old_files/rep/state/RepState.cpp +++ /dev/null @@ -1,869 +0,0 @@ -/* 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 "RepState.hpp" - -#include <signaldata/SumaImpl.hpp> -#include <NdbApiSignal.hpp> -#include <Properties.hpp> -//#define DBUG_REQUESTOR - -#ifdef DBUG_REQUESTOR -#define DBUG_REQUESTOR_PRINT(X) ndbout_c(X); -#else -#define DBUG_REQUESTOR_PRINT(X) -#endif - -/**************************************************************************** - * Constructor / Destructor / Init - ****************************************************************************/ -RepState::RepState() -{ - m_connected = UNKNOWN; - m_repConnected = UNKNOWN; - m_mutex = NdbMutex_Create(); - m_stopEpoch = 0; - m_subIdToRemove = 0; - m_subKeyToRemove = 0; -} - -RepState::~RepState() -{ - NdbMutex_Destroy(m_mutex); -} - -void -RepState::setSubscriptionRequests(FuncRequestCreateSubscriptionId f1, - FuncRequestCreateSubscription f2, - FuncRequestRemoveSubscription f3) -{ - m_funcRequestCreateSubscriptionId = f1; - m_funcRequestCreateSubscription = f2; - m_funcRequestRemoveSubscription = f3; -} - -void -RepState::setIntervalRequests(FuncRequestTransfer f1, - FuncRequestApply f2, - FuncRequestDeleteSS f3, - FuncRequestDeletePS f4) -{ - m_funcRequestTransfer = f1; - m_funcRequestApply = f2; - m_funcRequestDeleteSS = f3; - m_funcRequestDeletePS = f4; -} - -void -RepState::setStartRequests(FuncRequestStartMetaLog * f5, - FuncRequestStartDataLog * f6, - FuncRequestStartMetaScan * f7, - FuncRequestStartDataScan * f8, - FuncRequestEpochInfo * f9) -{ - m_funcRequestStartMetaLog = f5; - m_funcRequestStartDataLog = f6; - m_funcRequestStartMetaScan = f7; - m_funcRequestStartDataScan = f8; - m_funcRequestEpochInfo = f9; -} - - -/**************************************************************************** - * Private Helper functions - ****************************************************************************/ - -void -RepState::requestTransfer(NdbApiSignal * signal) -{ - DBUG_REQUESTOR_PRINT("RepState: Transfer calculations started"); - for(Uint32 nodeGrp=0; nodeGrp<m_channel.getNoOfNodeGroups(); nodeGrp++) { - DBUG_REQUESTOR_PRINT("RepState: Transfer calc for node grp"); - Interval i; - if (m_channel.requestTransfer(nodeGrp, &i)) { - m_funcRequestTransfer(m_extSender, signal, nodeGrp, i.first(), i.last()); - } - } -} - -void -RepState::requestApply(NdbApiSignal * signal) -{ - DBUG_REQUESTOR_PRINT("RepState: Apply calculations started"); - for(Uint32 nodeGrp=0; nodeGrp<m_channel.getNoOfNodeGroups(); nodeGrp++) { - DBUG_REQUESTOR_PRINT("RepState: Apply calc for node grp"); - Uint32 gci; - if (m_channel.requestApply(nodeGrp, &gci)) { - Uint32 force = (m_channel.getState() == Channel::LOG) ? 0 : 1; - m_funcRequestApply(m_applier, signal, nodeGrp, gci, gci, force); - } - } -} - -void -RepState::requestDelete(NdbApiSignal * signal) -{ - DBUG_REQUESTOR_PRINT("RepState: Delete calculations started"); - for(Uint32 nodeGrp=0; nodeGrp<m_channel.getNoOfNodeGroups(); nodeGrp++) { - DBUG_REQUESTOR_PRINT("RepState: Delete calc for node grp"); - Interval i; - if (m_channel.requestDelete(nodeGrp, &i)){ - m_funcRequestDeleteSS(m_gciContainer, signal, nodeGrp, - i.first(), i.last()); - m_funcRequestDeletePS(m_extSender, signal, nodeGrp, i.first(), i.last()); - } - } -} - -void -RepState::requestEpochInfo(NdbApiSignal * signal) -{ - DBUG_REQUESTOR_PRINT("RepState: Epoch Info calculations"); - for(Uint32 nodeGrp=0; nodeGrp<m_channel.getNoOfNodeGroups(); nodeGrp++) { - m_funcRequestEpochInfo(m_extSender, signal, nodeGrp); - } -} - -/**************************************************************************** - * Public - ****************************************************************************/ - -GrepError::Code -RepState::add(Channel::Position s, Uint32 nodeGrp, const Interval i) -{ - m_channel.add(s, nodeGrp, i); - - if(s == Channel::PS) - { - m_connected = CONNECTED; - m_connected_counter = 0; - } - - Interval fullEpochs; - m_channel.getFullyAppliedEpochs(&fullEpochs); - if(s == Channel::App && - m_channel.getState() == Channel::DATASCAN_COMPLETED && - fullEpochs.last() >= m_channel.getDataScanEpochs().last() && - fullEpochs.last() >= m_channel.getMetaScanEpochs().last()) - { - RLOG(("[%d-%d] fully applied. Channel state changed to LOG", - fullEpochs.first(), fullEpochs.last())); - m_channel.setState(Channel::LOG); - disableAutoStart(); - } - - return GrepError::NO_ERROR; -} - -GrepError::Code -RepState::clear(Channel::Position s, Uint32 nodeGrp, const Interval i) -{ - m_channel.clear(s, nodeGrp, i); - return GrepError::NO_ERROR; -} - -/**************************************************************************** - * Execute - * - * This method should only be called from Requestor! - ****************************************************************************/ - -GrepError::Code -RepState::protectedExecute() -{ - GrepError::Code err; - - NdbMutex_Lock(m_mutex); - - NdbApiSignal* signal = m_extSender->getSignal(); - if (signal == NULL) { - err = GrepError::COULD_NOT_ALLOCATE_MEM_FOR_SIGNAL; - } else { - err = execute(signal); - } - NdbMutex_Unlock(m_mutex); - return err; -} - -GrepError::Code -RepState::execute(NdbApiSignal* signal) -{ - Uint32 subId = m_channel.getSubId(); - Uint32 subKey = m_channel.getSubKey(); - - if (!m_channel.m_requestorEnabled) - return GrepError::NO_ERROR; - - /** - * @todo Should have subscriptions in here - */ - requestEpochInfo(signal); - - /** - * Update connected counter (Silence time) - */ - m_connected_counter++; - if (m_connected_counter > REQUESTOR_EXECUTES_NEEDED_FOR_UNKNOWN_CONNECTION) { - m_connected = UNKNOWN; - } - - switch (m_channel.getState()) - { - case Channel::CONSISTENT: - if (isAutoStartEnabled()) { - switch (m_channel.getStateSub()) - { - case Channel::NO_SUBSCRIPTION_EXISTS: - m_funcRequestCreateSubscriptionId(m_extSender, signal); - m_channel.setStateSub(Channel::CREATING_SUBSCRIPTION_ID); - break; - - case Channel::CREATING_SUBSCRIPTION_ID: - break; - - case Channel::SUBSCRIPTION_ID_CREATED: - if(m_channel.isSelective()) - m_funcRequestCreateSubscription(m_extSender, signal, - m_channel.getSubId(), - m_channel.getSubKey(), - m_channel.getSelectedTables()); - else - m_funcRequestCreateSubscription(m_extSender, signal, - m_channel.getSubId(), - m_channel.getSubKey(), - 0); - m_channel.setStateSub(Channel::STARTING_SUBSCRIPTION); - break; - - case Channel::STARTING_SUBSCRIPTION: - break; - - case Channel::SUBSCRIPTION_STARTED: - m_funcRequestStartMetaLog(m_extSender, signal, - m_channel.getSubId(), - m_channel.getSubKey()); - m_channel.setState(Channel::METALOG_STARTING); - break; - } - } - break; - - case Channel::METALOG_STARTING: - break; - - case Channel::METALOG_STARTED: - if (isAutoStartEnabled()) { - m_funcRequestStartMetaScan(m_extSender, signal, subId, subKey); - m_channel.setState(Channel::METASCAN_STARTING); - } - break; - - case Channel::METASCAN_STARTING: - break; - - case Channel::METASCAN_COMPLETED: - if (isAutoStartEnabled()) { - m_funcRequestStartDataLog(m_extSender, signal, subId, subKey); - m_channel.setState(Channel::DATALOG_STARTING); - } - break; - - case Channel::DATALOG_STARTING: - break; - - case Channel::DATALOG_STARTED: - if (isAutoStartEnabled()) { - m_funcRequestStartDataScan(m_extSender, signal, subId, subKey); - m_channel.setState(Channel::DATASCAN_STARTING); - } - break; - - case Channel::DATASCAN_STARTING: - break; - - case Channel::DATASCAN_COMPLETED: - break; - - case Channel::LOG: - if (m_channel.shouldStop()) { - disableTransfer(); - m_channel.setState(Channel::STOPPING); - } - break; - - case Channel::STOPPING: - if (m_channel.m_transferEnabled) - { - REPABORT("Illegal stopping state while transfer is still enabled"); - } - /** - * check if channel has a subscription, if not, - * check if we have marked a subscription that we want to remove - * and remove it. This is used to clean up "dangling subscriptions" - * after various crashes - */ - if(!m_channel.subscriptionExists()) - { - if(m_subIdToRemove && m_subKeyToRemove) - { - m_funcRequestRemoveSubscription(m_extSender, signal, - m_subIdToRemove, - m_subKeyToRemove); - eventSubscriptionDeleted( m_subIdToRemove, - m_subKeyToRemove); - return GrepError::NO_ERROR; - } - else { - return GrepError::SUBSCRIPTION_ID_NOT_FOUND; - } - } else { - if (m_channel.isStoppable()) - { - - m_funcRequestRemoveSubscription(m_extSender, signal, - m_channel.getSubId(), - m_channel.getSubKey()); - eventSubscriptionDeleted(m_channel.getSubId(), - m_channel.getSubKey()); - } - else - return GrepError::CHANNEL_NOT_STOPPABLE; - - } - break; - - default: - REPABORT("Illegal replication state"); - } - if (m_channel.m_transferEnabled) requestTransfer(signal); - if (m_channel.m_applyEnabled) requestApply(signal); - if (m_channel.m_deleteEnabled) requestDelete(signal); - return GrepError::NO_ERROR; -} - -/**************************************************************************** - * Request - * - * This method should only be called from Main Thread! - ****************************************************************************/ - -GrepError::Code -RepState::protectedRequest(GrepReq::Request req, Uint32 arg) -{ - return protectedRequest(req, arg, 0); -} - -GrepError::Code -RepState::protectedRequest(GrepReq::Request req, Uint32 arg1, Uint32 arg2) -{ - GrepError::Code code; - NdbMutex_Lock(m_mutex); - - NdbApiSignal* signal = m_extSender->getSignal(); - if (signal == NULL) { - code = GrepError::COULD_NOT_ALLOCATE_MEM_FOR_SIGNAL; - } else { - code = request(req, arg1, arg2, signal); - } - - NdbMutex_Unlock(m_mutex); - return code; -} - -GrepError::Code -RepState::protectedAddTable(const char * fullTableName) -{ - GrepError::Code code; - NdbMutex_Lock(m_mutex); - code = m_channel.addTable(fullTableName); - NdbMutex_Unlock(m_mutex); - return code; -} - -GrepError::Code -RepState::protectedRemoveTable(const char * fullTableName) -{ - GrepError::Code code; - if(m_channel.getStateSub() != Channel::NO_SUBSCRIPTION_EXISTS) - return GrepError::START_ALREADY_IN_PROGRESS; - NdbMutex_Lock(m_mutex); - code = m_channel.removeTable(fullTableName); - NdbMutex_Unlock(m_mutex); - return code; -} - -GrepError::Code -RepState::request(GrepReq::Request request, Uint32 arg1, Uint32 arg2, - NdbApiSignal* signal) -{ - switch (request) - { - /************************************************************************* - * STATUS etc - *************************************************************************/ - - case GrepReq::STATUS: - printStatus(); - break; - - case GrepReq::REMOVE_BUFFERS: - return GrepError::NOT_YET_IMPLEMENTED; - - /************************************************************************* - * START - *************************************************************************/ - - case GrepReq::CREATE_SUBSCR: - if (m_channel.getStateSub() != Channel::NO_SUBSCRIPTION_EXISTS) - return GrepError::SUBSCRIPTION_ID_ALREADY_EXIST; - - m_funcRequestCreateSubscriptionId(m_extSender, signal); - m_channel.setStateSub(Channel::CREATING_SUBSCRIPTION_ID); - return GrepError::NO_ERROR; - - case GrepReq::START_SUBSCR: - if (m_channel.getState() == Channel::STOPPING) - return GrepError::ILLEGAL_ACTION_WHEN_STOPPING; - if (m_channel.getStateSub() != Channel::SUBSCRIPTION_ID_CREATED) - return GrepError::SUBSCRIPTION_ID_NOT_FOUND; - if(m_channel.isSelective()) - m_funcRequestCreateSubscription(m_extSender, signal, - m_channel.getSubId(), - m_channel.getSubKey(), - m_channel.getSelectedTables()); - else - m_funcRequestCreateSubscription(m_extSender, signal, - m_channel.getSubId(), - m_channel.getSubKey(), - 0); - m_channel.setStateSub(Channel::STARTING_SUBSCRIPTION); - return GrepError::NO_ERROR; - - case GrepReq::START_METALOG: - if (m_channel.getState() == Channel::STOPPING) - return GrepError::ILLEGAL_ACTION_WHEN_STOPPING; - if (m_channel.getStateSub() != Channel::SUBSCRIPTION_STARTED) - return GrepError::SUBSCRIPTION_NOT_STARTED; - if (m_channel.getState() != Channel::CONSISTENT) - return GrepError::START_OF_COMPONENT_IN_WRONG_STATE; - - m_funcRequestStartMetaLog(m_extSender, signal, - m_channel.getSubId(), - m_channel.getSubKey()); - m_channel.setState(Channel::METALOG_STARTING); - return GrepError::NO_ERROR; - - case GrepReq::START_METASCAN: - if (m_channel.getState() == Channel::STOPPING) - return GrepError::ILLEGAL_ACTION_WHEN_STOPPING; - if (m_channel.getStateSub() != Channel::SUBSCRIPTION_STARTED) - return GrepError::SUBSCRIPTION_NOT_STARTED; - if (m_channel.getState() != Channel::METALOG_STARTED) - return GrepError::START_OF_COMPONENT_IN_WRONG_STATE; - - m_funcRequestStartMetaScan(m_extSender, signal, - m_channel.getSubId(), - m_channel.getSubKey()); - m_channel.setState(Channel::METASCAN_STARTING); - return GrepError::NO_ERROR; - - case GrepReq::START_DATALOG: - if (m_channel.getState() == Channel::STOPPING) - return GrepError::ILLEGAL_ACTION_WHEN_STOPPING; - if (m_channel.getStateSub() != Channel::SUBSCRIPTION_STARTED) - return GrepError::SUBSCRIPTION_NOT_STARTED; - if (m_channel.getState() != Channel::METASCAN_COMPLETED) - return GrepError::START_OF_COMPONENT_IN_WRONG_STATE; - - m_funcRequestStartDataLog(m_extSender, signal, - m_channel.getSubId(), - m_channel.getSubKey()); - m_channel.setState(Channel::DATALOG_STARTING); - return GrepError::NO_ERROR; - - case GrepReq::START_DATASCAN: - if (m_channel.getState() == Channel::STOPPING) - return GrepError::ILLEGAL_ACTION_WHEN_STOPPING; - if (m_channel.getStateSub() != Channel::SUBSCRIPTION_STARTED) - return GrepError::SUBSCRIPTION_NOT_STARTED; - if (m_channel.getState() != Channel::DATALOG_STARTED) - return GrepError::START_OF_COMPONENT_IN_WRONG_STATE; - - m_funcRequestStartDataScan(m_extSender, signal, - m_channel.getSubId(), - m_channel.getSubKey()); - m_channel.setState(Channel::DATASCAN_STARTING); - return GrepError::NO_ERROR; - - case GrepReq::START_REQUESTOR: - enable(); - return GrepError::NO_ERROR; - - case GrepReq::START_TRANSFER: - if (m_channel.getState() == Channel::STOPPING) - return GrepError::ILLEGAL_ACTION_WHEN_STOPPING; - enableTransfer(); - return GrepError::NO_ERROR; - - case GrepReq::START_APPLY: - enableApply(); - return GrepError::NO_ERROR; - - case GrepReq::START_DELETE: - enableDelete(); - return GrepError::NO_ERROR; - - case GrepReq::START: - if (isAutoStartEnabled()) - return GrepError::START_ALREADY_IN_PROGRESS; - - enableAutoStart(); - return GrepError::NO_ERROR; - - /************************************************************************* - * STOP - *************************************************************************/ - - case GrepReq::STOP: - if (m_channel.getStateSub() == Channel::NO_SUBSCRIPTION_EXISTS) - return GrepError::SUBSCRIPTION_NOT_STARTED; - if (m_channel.getState() == Channel::STOPPING) - return GrepError::ILLEGAL_ACTION_WHEN_STOPPING; - - if (arg1 == 0) { - /** - * Stop immediately - */ - disableTransfer(); - m_channel.setState(Channel::STOPPING); - m_channel.setStopEpochId(0); - return GrepError::NO_ERROR; - } else { - /** - * Set future stop epoch - */ - return m_channel.setStopEpochId(arg1); - } - - case GrepReq::STOP_SUBSCR: - { - if(m_subIdToRemove == 0 && m_subKeyToRemove == 0) { - m_subIdToRemove = arg1; - m_subKeyToRemove = arg2; - } else { - return GrepError::ILLEGAL_ACTION_WHEN_STOPPING; - } - - if(m_channel.getSubId() != 0 && m_channel.getSubKey() != 0) - return GrepError::ILLEGAL_USE_OF_COMMAND; - if (m_channel.getState() == Channel::STOPPING) - return GrepError::ILLEGAL_ACTION_WHEN_STOPPING; - disableTransfer(); - m_channel.setState(Channel::STOPPING); - return GrepError::NO_ERROR; - } - case GrepReq::STOP_METALOG: - case GrepReq::STOP_METASCAN: - case GrepReq::STOP_DATALOG: - case GrepReq::STOP_DATASCAN: - return GrepError::NOT_YET_IMPLEMENTED; - - case GrepReq::STOP_REQUESTOR: - disable(); - return GrepError::NO_ERROR; - - case GrepReq::STOP_TRANSFER: - disableTransfer(); - return GrepError::NO_ERROR; - - case GrepReq::STOP_APPLY: - disableApply(); - return GrepError::NO_ERROR; - - case GrepReq::STOP_DELETE: - disableDelete(); - return GrepError::NO_ERROR; - - default: - ndbout_c("RepCommandInterpreter: Illegal request received"); - return GrepError::NOT_YET_IMPLEMENTED; - } - return GrepError::NOT_YET_IMPLEMENTED; -} - -/**************************************************************************** - * - ****************************************************************************/ - -/* -GrepError::Code -RepState::slowStop() -{ - switch(m_channel.getState()) - { - case Channel::LOG: - m_channel.setState(Channel::LOG_SLOW_STOP); - return GrepError::NO_ERROR; - default: - return GrepError::REQUESTOR_ILLEGAL_STATE_FOR_SLOWSTOP; - } -} - -GrepError::Code -RepState::fastStop() -{ - switch(m_channel.getState()) - { - case Channel::LOG: - m_channel.setState(Channel::LOG_FAST_STOP); - return GrepError::NO_ERROR; - default: - return GrepError::REQUESTOR_ILLEGAL_STATE_FOR_FASTSTOP; - } -} -*/ - -/**************************************************************************** - * Print Status - ****************************************************************************/ - -static const char* -headerText = -"+-------------------------------------------------------------------------+\n" -"| MySQL Replication Server |\n" -"+-------------------------------------------------------------------------+\n" -; - -static const char* -channelHeaderText = -"+-------------------------------------------------------------------------+\n" -"| Applier Channel 1 Replication Status |\n" -"+-------------------------------------------------------------------------+\n" -; - -static const char* -line = -"+-------------------------------------------------------------------------+\n" -; - - -Properties * -RepState::getStatus() -{ - Properties * prop = new Properties(); - if(prop == NULL) - return NULL; - NdbMutex_Lock(m_mutex); - - prop->put("nodegroups", (int)m_channel.getNoOfNodeGroups()); -// prop->put("epoch_state", m_channel.getEpochState()); - NdbMutex_Unlock(m_mutex); - return prop; -} - - -Properties * RepState::query(QueryCounter counter, Uint32 replicationId) -{ - Properties * prop = new Properties(); - if(prop == NULL) - return NULL; - NdbMutex_Lock(m_mutex); - if(counter != ~(Uint32)0) - getEpochState((Channel::Position)counter, prop ); - prop->put("no_of_nodegroups", m_channel.getNoOfNodeGroups()); - prop->put("subid", m_channel.getNoOfNodeGroups()); - prop->put("subkey", m_channel.getSubKey()); - prop->put("connected_db", m_connected); - prop->put("connected_rep", m_repConnected); - prop->put("state_sub", (int)m_channel.getStateSub()); - prop->put("state", (int)m_channel.getState()); - - NdbMutex_Unlock(m_mutex); - return prop; - -} - -void -RepState::getEpochState(Channel::Position pos, Properties * p) -{ - char first_buf[20]; - char last_buf[20]; - int pos_first = 0, pos_last = 0; - Uint32 first = 0, last = 0; - for(Uint32 i = 0; i < m_channel.getNoOfNodeGroups() ; i++) - { - m_channel.getEpochState(pos, i, &first, &last); - pos_first += sprintf(first_buf+pos_first,"%d%s",first,","); - pos_last += sprintf(last_buf+pos_last,"%d%s",last,","); - } -/** - * remove trailing comma - */ - pos_first--; - pos_last--; - first_buf[pos_first]= '\0'; - last_buf[pos_last]= '\0'; -#if 0 - sprintf(first_buf+pos_first,"",""); - sprintf(last_buf + pos_last,"",""); -#endif - - p->put("first", first_buf); - p->put("last", last_buf); - -} - - -void -RepState::printStatus() -{ - /*************************************************************************** - * Global Status - ***************************************************************************/ - ndbout << headerText; - switch (m_connected) - { - case CONNECTED: - ndbout << "| Source: Connected "; break; - case DISCONNECTED: - ndbout << "| Source: Disconnected "; break; - case CONNECTABLE: - ndbout << "| Source: Disconnected "; break; - default: - ndbout << "| Source: Unknown "; break; - } - switch (m_repConnected) - { - case CONNECTED: - ndbout << "(Rep: Connected) "; break; - case DISCONNECTED: - ndbout << "(Rep: Disconnected) "; break; - case CONNECTABLE: - ndbout << "(Rep: Disconnected) "; break; - default: - ndbout << "(Rep: Unknown) "; break; - } - ndbout << " |" << endl; - ndbout << "| Autostart: " << (isAutoStartEnabled() ? "On " : "Off") - << " "; - ndbout_c(" Silence time: %10u |", m_connected_counter); - - /*************************************************************************** - * Channel Status - ***************************************************************************/ - ndbout << channelHeaderText; - switch(m_channel.getStateSub()) { - case Channel::NO_SUBSCRIPTION_EXISTS: - ndbout_c("| Subscription: Non-existing " - " |"); - break; - case Channel::CREATING_SUBSCRIPTION_ID: - ndbout_c("| Subscription: Non-existing (Id is being created)" - " |"); - break; - case Channel::SUBSCRIPTION_ID_CREATED: - ndbout_c("| Subscription: %-3d-%-6d in state: Not yet started " - " |", - m_channel.getSubId(), m_channel.getSubKey()); - break; - case Channel::STARTING_SUBSCRIPTION: - ndbout_c("| Subscription: %-3d-%-6d in state: Being started " - " |", - m_channel.getSubId(), m_channel.getSubKey()); - break; - case Channel::SUBSCRIPTION_STARTED: - ndbout_c("| Subscription: %-3d-%-6d in state: Started " - " |", - m_channel.getSubId(), m_channel.getSubKey()); - break; - default: - REPABORT("Illegal subscription state"); - } - ndbout << "| Stop epoch: "; - if (m_channel.getStopEpochId() == intervalMax) { - ndbout << "No stop defined "; - } else { - ndbout.print("%-10d ", - m_channel.getStopEpochId()); - } - ndbout << " |" << endl; - - ndbout << "| State: "; - switch(m_channel.getState()) - { - case Channel::CONSISTENT: - ndbout << "Local database is subscription consistent "; - break; - case Channel::METALOG_STARTING: - ndbout << "Starting (Phase 1: Metalog starting) "; - break; - case Channel::METALOG_STARTED: - ndbout << "Starting (Phase 2: Metalog started) "; - break; - case Channel::METASCAN_STARTING: - ndbout << "Starting (Phase 3: Metascan starting) "; - break; - case Channel::METASCAN_COMPLETED: - ndbout << "Starting (Phase 4: Metascan completed) "; - break; - case Channel::DATALOG_STARTING: - ndbout << "Starting (Phase 5: Datalog starting) "; - break; - case Channel::DATALOG_STARTED: - ndbout << "Starting (Phase 6: Datalog started) "; - break; - case Channel::DATASCAN_STARTING: - ndbout << "Starting (Phase 7: Datascan completed) "; - break; - case Channel::DATASCAN_COMPLETED: - ndbout << "Starting (Phase 8: Datascan completed) "; - break; - case Channel::LOG: - ndbout << "Logging "; - break; - case Channel::STOPPING: - ndbout << "Stopping (Stopped when all epochs applied) "; - break; - } - ndbout << " |" << endl; - -/* @todo - ndbout_c("| Syncable: Yes/Scan/No/Unknown (Not implemented)" - " |"); -*/ - ndbout << "| Requestor: " << (isEnabled() ? "On " : "Off") - << " (Transfer: " << (isTransferEnabled() ? "On, " : "Off, ") - << "Apply: " << (isApplyEnabled() ? "On, " : "Off, ") - << "Delete: " << (isDeleteEnabled() ? "On) " : "Off)") - << " |" << endl; - ndbout_c("| Tables being replicated using this channel: " - " |"); - m_channel.printTables(); - - /** - * Print node groups - */ - if (getNoOfNodeGroups() == 0) - { - ndbout_c("| No node groups are known. " - " |"); - } - else - { - m_channel.print(); - } - ndbout << line; -} diff --git a/ndb/src/old_files/rep/state/RepState.hpp b/ndb/src/old_files/rep/state/RepState.hpp deleted file mode 100644 index 06bbca19f7e..00000000000 --- a/ndb/src/old_files/rep/state/RepState.hpp +++ /dev/null @@ -1,276 +0,0 @@ -/* 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 */ - -#ifndef REP_STATE_HPP -#define REP_STATE_HPP - -#include <GrepError.hpp> -#include <signaldata/GrepImpl.hpp> -#include <rep/repapi/repapi.h> -#include <rep/ExtSender.hpp> -#include <rep/adapters/AppNDB.hpp> -#include <Properties.hpp> - -#include "Channel.hpp" -#include "Interval.hpp" - -#define REQUESTOR_EXECUTES_NEEDED_FOR_UNKNOWN_CONNECTION 5 - -class NdbApiSignal; - - -/** - * @class RepState - * @brief The main information about the replication - */ -class RepState -{ -public: - RepState(); - ~RepState(); - void init(ExtSender * extSender) { m_extSender = extSender; } - - /*************************************************************************** - * Callback functions - * - * These are used when RepState wants to do something - ***************************************************************************/ - - typedef void (FuncRequestCreateSubscriptionId) - (void * cbObj, NdbApiSignal* signal); - - typedef void (FuncRequestCreateSubscription) - (void * cbObj, NdbApiSignal* signal, Uint32 subId, - Uint32 subKey , - Vector <struct table *> * selectedTables); - - typedef void (FuncRequestRemoveSubscription) - (void * cbObj, NdbApiSignal* signal, Uint32 subId, Uint32 subKey); - - typedef void (FuncRequestTransfer) - (void * cbObj, NdbApiSignal* signal, - Uint32 nodeGrp, Uint32 first, Uint32 last); - - typedef void (FuncRequestApply) - (void * cbObj, NdbApiSignal* signal, - Uint32 nodeGrp, Uint32 first, Uint32 last, Uint32 force); - - typedef void (FuncRequestDeleteSS) - (void * cbObj, NdbApiSignal* signal, - Uint32 nodeGrp, Uint32 first, Uint32 last); - - typedef void (FuncRequestDeletePS) - (void * cbObj, NdbApiSignal* signal, - Uint32 nodeGrp, Uint32 first, Uint32 last); - - typedef void (FuncRequestStartMetaLog) - (void * cbObj, NdbApiSignal * signal, Uint32 subId, Uint32 subKey); - - typedef void (FuncRequestStartDataLog) - (void * cbObj, NdbApiSignal * signal, Uint32 subId, Uint32 subKey); - - typedef void (FuncRequestStartMetaScan) - (void * cbObj, NdbApiSignal * signal, Uint32 subId, Uint32 subKey); - - typedef void (FuncRequestStartDataScan) - (void * cbObj, NdbApiSignal * signal, Uint32 subId, Uint32 subKey); - - typedef void (FuncRequestEpochInfo) - (void * cbObj, NdbApiSignal * signal, Uint32 nodeGrp); - - /*************************************************************************** - * - ***************************************************************************/ - void setSubscriptionRequests(FuncRequestCreateSubscriptionId f1, - FuncRequestCreateSubscription f2, - FuncRequestRemoveSubscription f3); - void setIntervalRequests(FuncRequestTransfer * f1, - FuncRequestApply * f2, - FuncRequestDeleteSS * f3, - FuncRequestDeletePS * f4); - void setStartRequests(FuncRequestStartMetaLog * f5, - FuncRequestStartDataLog * f6, - FuncRequestStartMetaScan * f7, - FuncRequestStartDataScan * f8, - FuncRequestEpochInfo * f9); - - /*************************************************************************** - * Enablings - ***************************************************************************/ - bool isEnabled() { return m_channel.m_requestorEnabled; } - bool isTransferEnabled() { return m_channel.m_transferEnabled; } - bool isApplyEnabled() { return m_channel.m_applyEnabled; } - bool isDeleteEnabled() { return m_channel.m_deleteEnabled; } - bool isAutoStartEnabled() { return m_channel.m_autoStartEnabled; } - - void enable() { m_channel.m_requestorEnabled = true; } - void enableTransfer() { m_channel.m_transferEnabled = true; } - void enableApply() { m_channel.m_applyEnabled = true; } - void enableDelete() { m_channel.m_deleteEnabled = true; } - void enableAutoStart() { m_channel.m_autoStartEnabled = true; } - - void disable() { m_channel.m_requestorEnabled = false; } - void disableTransfer() { m_channel.m_transferEnabled = false; } - void disableApply() { m_channel.m_applyEnabled = false;} - void disableDelete() { m_channel.m_deleteEnabled = false; } - void disableAutoStart() { m_channel.m_autoStartEnabled = false; } - - /*************************************************************************** - * Node groups - ***************************************************************************/ - void setNoOfNodeGroups(Uint32 n) { m_channel.setNoOfNodeGroups(n); } - Uint32 getNoOfNodeGroups() { return m_channel.getNoOfNodeGroups(); } - - /*************************************************************************** - * Event reporting to RepState - * - * These are used to update the state of the Requestor when something - * has happend. - ***************************************************************************/ - void request(GrepReq::Request request); - - //GrepError::Code createSubscription(Uint32 subId, Uint32 subKey); - GrepError::Code protectedExecute(); - GrepError::Code protectedRequest(GrepReq::Request request, Uint32 arg); - GrepError::Code protectedRequest(GrepReq::Request request, - Uint32 arg1, - Uint32 arg2); - GrepError::Code protectedAddTable(const char * fullTableName); - GrepError::Code protectedRemoveTable(const char * fullTableName); - GrepError::Code add(Channel::Position s, Uint32 nodeGrp, const Interval i); - GrepError::Code clear(Channel::Position s, Uint32 nodeGrp, const Interval i); - - void eventSubscriptionDeleted(Uint32 subId, Uint32 subKey); - - void eventMetaLogStarted(NdbApiSignal*, Uint32 subId, Uint32 subKey); - void eventDataLogStarted(NdbApiSignal*, Uint32 subId, Uint32 subKey); - void eventMetaScanCompleted(NdbApiSignal*, Uint32 subId, Uint32 subKey, - Interval epochs); - void eventDataScanCompleted(NdbApiSignal*, Uint32 subId, Uint32 subKey, - Interval epochs); - void eventMetaScanFailed(Uint32 subId, Uint32 subKey, GrepError::Code error); - void eventDataScanFailed(Uint32 subId, Uint32 subKey, GrepError::Code error); - - /** - * @fn sendInsertConf - * @param gci - the gci of the applied GCIBuffer. - * @param nodeGrp - the nodeGrp of the applied GCIBuffer. - */ - void eventInsertConf(Uint32 gci, Uint32 nodeGrp); - - /** - * @fn sendInsertRef - * @param gci - the gci of the applied GCIBuffer. - * @param nodeGrp - the nodeGrp of the applied GCIBuffer. - * @param tableId - the table of the applied GCIBuffer. - */ - void eventInsertRef(Uint32 gci, Uint32 nodeGrp, Uint32 tableId, - GrepError::Code err); - void eventCreateTableRef(Uint32 gci, - Uint32 tableId, - const char * tableName, - GrepError::Code err) ; - - void eventSubscriptionIdCreated(Uint32 subId, Uint32 subKey); - void eventSubscriptionIdCreateFailed(Uint32 subId, Uint32 subKey, - GrepError::Code error); - - void eventSubscriptionCreated(Uint32 subId, Uint32 subKey); - void eventSubscriptionCreateFailed(Uint32 subId, Uint32 subKey, - GrepError::Code error); - - void eventMetaLogStartFailed(Uint32 subId, Uint32 subKey, - GrepError::Code error); - void eventDataLogStartFailed(Uint32 subId, Uint32 subKey, - GrepError::Code error); - - void eventNodeConnected(Uint32 nodeId); - void eventNodeDisconnected(Uint32 nodeId); - void eventNodeConnectable(Uint32 nodeId); - - void printStatus(); - Properties * getStatus(); - Properties * query(QueryCounter counter, Uint32 replicationId); - Uint32 getSubId() { return m_channel.getSubId(); } - Uint32 getSubKey () { return m_channel.getSubKey(); } - - void setApplier(class AppNDB * app) { m_applier = app; } - void setGCIContainer(class GCIContainer * c) { m_gciContainer = c; } - - /* @todo should be private */ - Channel m_channel; - -private: - /*************************************************************************** - * PRIVATE ATTRIBUTES - ***************************************************************************/ - ExtSender * m_extSender; - AppNDB * m_applier; - GCIContainer * m_gciContainer; - - Uint32 m_subIdToRemove; - Uint32 m_subKeyToRemove; - - - enum Connected - { - UNKNOWN, ///< - CONNECTED, ///< Recently received info from (all needed) PS REP - DISCONNECTED, ///< Received disconnect info from (some needed) PS REP - CONNECTABLE ///< Received disconnect info from (some needed) PS REP - }; - Connected m_connected; - Connected m_repConnected; - Uint32 m_connected_counter; - - NdbMutex * m_mutex; - - /** @todo Should be channel-specific */ - Uint32 m_stopEpoch; - - /*************************************************************************** - * PRIVATE METHODS - ***************************************************************************/ - GrepError::Code execute(NdbApiSignal*); - GrepError::Code request(GrepReq::Request req, - Uint32 arg1, - Uint32 arg2, - NdbApiSignal*); - - FuncRequestCreateSubscriptionId * m_funcRequestCreateSubscriptionId; - FuncRequestCreateSubscription * m_funcRequestCreateSubscription; - FuncRequestRemoveSubscription * m_funcRequestRemoveSubscription; - - FuncRequestTransfer * m_funcRequestTransfer; - FuncRequestApply * m_funcRequestApply; - FuncRequestDeleteSS * m_funcRequestDeleteSS; - FuncRequestDeletePS * m_funcRequestDeletePS; - - FuncRequestStartMetaLog * m_funcRequestStartMetaLog; - FuncRequestStartDataLog * m_funcRequestStartDataLog; - FuncRequestStartMetaScan * m_funcRequestStartMetaScan; - FuncRequestStartDataScan * m_funcRequestStartDataScan; - FuncRequestEpochInfo * m_funcRequestEpochInfo; - - void requestTransfer(NdbApiSignal * signal); - void requestApply(NdbApiSignal * signal); - void requestDelete(NdbApiSignal * signal); - void requestEpochInfo(NdbApiSignal * signal); - void getEpochState(Channel::Position pos, Properties * p); - friend void testRepState(); -}; - -#endif diff --git a/ndb/src/old_files/rep/state/RepStateEvent.cpp b/ndb/src/old_files/rep/state/RepStateEvent.cpp deleted file mode 100644 index 9be304c8bfa..00000000000 --- a/ndb/src/old_files/rep/state/RepStateEvent.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/* 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 "RepState.hpp" - -/**************************************************************************** - * Public Event Handlers : CREATE SUBSCRIPTION ID - ****************************************************************************/ - -void -RepState::eventSubscriptionIdCreated(Uint32 subId, Uint32 subKey) -{ - if (m_channel.getStateSub() == Channel::CREATING_SUBSCRIPTION_ID) - { - m_channel.setSubId(subId); - m_channel.setSubKey(subKey); - m_channel.setStateSub(Channel::SUBSCRIPTION_ID_CREATED); - } - else - { - REPABORT("Illegal state for create subscription id conf"); - } -} - -void -RepState::eventSubscriptionIdCreateFailed(Uint32 subId, Uint32 subKey, - GrepError::Code error) -{ - ndbout_c("\nSubscription id creation failed"); - ndbout_c("Error %d: %s", error, GrepError::getErrorDesc(error)); - ndbout_c("Subscription Id: %d, Key: %d", subId, subKey); -} - -/**************************************************************************** - * Public Event Handlers : CREATE SUBSCRIPTION - ****************************************************************************/ - -void -RepState::eventSubscriptionCreated(Uint32 subId, Uint32 subKey) -{ - if (m_channel.getStateSub() == Channel::STARTING_SUBSCRIPTION) - { - m_channel.setStateSub(Channel::SUBSCRIPTION_STARTED); - } - else - { - REPABORT("Illegal state for create subscription conf"); - } -} - -void -RepState::eventSubscriptionCreateFailed(Uint32 subId, Uint32 subKey, - GrepError::Code error) -{ - ndbout_c("\nSubscription creation failed"); - ndbout_c("Error %d: %s", error, GrepError::getErrorDesc(error)); - ndbout_c("Subscription Id: %d, Key: %d", subId, subKey); -} - - -/**************************************************************************** - * Public Event Handlers : META LOG - ****************************************************************************/ - -void -RepState::eventMetaLogStarted(NdbApiSignal* signal, - Uint32 subId, Uint32 subKey) -{ - if (m_channel.getState() != Channel::METALOG_STARTING) - { - RLOG(("WARNING! Metalog started in state %d, should be %d", - m_channel.getState(), Channel::METALOG_STARTING)); - } - - if (!isAutoStartEnabled()) - { - m_channel.setState(Channel::METALOG_STARTED); - } - else - { - m_channel.setState(Channel::METALOG_STARTED); - m_channel.setState(Channel::METASCAN_STARTING); - m_funcRequestStartMetaScan(m_extSender, signal, subId, subKey); - } -} - -void -RepState::eventMetaLogStartFailed(Uint32 subId, Uint32 subKey, - GrepError::Code error) -{ - ndbout_c("\nMetalog start failed"); - ndbout_c("Error %d: %s", error, GrepError::getErrorDesc(error)); - ndbout_c("Subscription Id: %d, Key: %d", subId, subKey); -} - -/**************************************************************************** - * Public Event Handlers : META SCAN - ****************************************************************************/ - -void -RepState::eventMetaScanCompleted(NdbApiSignal* signal, - Uint32 subId, Uint32 subKey, Interval epochs) -{ - if (m_channel.getState() != Channel::METASCAN_STARTING) - { - RLOG(("WARNING! Metascan completed in state %d, should be %d", - m_channel.getState(), Channel::METASCAN_STARTING)); - } - RLOG(("Metascan completed. Subscription %d-%d, Epochs [%d-%d]", - subId, subKey, epochs.first(), epochs.last())); - - m_channel.setState(Channel::METASCAN_COMPLETED); - - if (isAutoStartEnabled()) - { - m_channel.setState(Channel::DATALOG_STARTING); - m_funcRequestStartDataLog(m_extSender, signal, subId, subKey); - } - m_channel.setMetaScanEpochs(epochs); -} - -/**************************************************************************** - * Public Event Handlers : DATA LOG - ****************************************************************************/ - -void -RepState::eventDataLogStarted(NdbApiSignal* signal, - Uint32 subId, Uint32 subKey) -{ - if (m_channel.getState() != Channel::DATALOG_STARTING) - { - RLOG(("WARNING! Datalog started in state %d, should be %d", - m_channel.getState(), Channel::DATALOG_STARTING)); - } - - m_channel.setState(Channel::DATALOG_STARTED); - - if (isAutoStartEnabled()) - { - m_channel.setState(Channel::DATASCAN_STARTING); - m_funcRequestStartDataScan(m_extSender, signal, subId, subKey); - } -} - -void -RepState::eventDataLogStartFailed(Uint32 subId, Uint32 subKey, - GrepError::Code error) -{ - ndbout_c("\nDatalog start failed"); - ndbout_c("Error %d: %s", error, GrepError::getErrorDesc(error)); - ndbout_c("Subscription Id: %d, Key: %d", subId, subKey); -} - -/**************************************************************************** - * Public Event Handlers : DATA SCAN - ****************************************************************************/ - -void -RepState::eventDataScanCompleted(NdbApiSignal* signal, - Uint32 subId, Uint32 subKey, - Interval epochs) -{ - if (m_channel.getState() != Channel::DATASCAN_STARTING) - { - RLOG(("WARNING! Datascan completed in state %d, should be %d", - m_channel.getState(), Channel::DATASCAN_STARTING)); - } - RLOG(("Datascan completed. Subscription %d-%d, Epochs [%d-%d]", - subId, subKey, epochs.first(), epochs.last())); - - m_channel.setState(Channel::DATASCAN_COMPLETED); - m_channel.setDataScanEpochs(epochs); -} - -/**************************************************************************** - * Public Event Handlers : FAILURES - ****************************************************************************/ - -void -RepState::eventMetaScanFailed(Uint32 subId, Uint32 subKey, - GrepError::Code error) -{ - ndbout_c("\nMetascan failed"); - ndbout_c("Error %d: %s", error, GrepError::getErrorDesc(error)); - ndbout_c("Subscription Id: %d, Key: %d", subId, subKey); -} - -void -RepState::eventDataScanFailed(Uint32 subId, Uint32 subKey, - GrepError::Code error) -{ - ndbout_c("\nDatascan failed"); - ndbout_c("Error %d: %s", error, GrepError::getErrorDesc(error)); - ndbout_c("Subscription Id: %d, Key: %d", subId, subKey); -} - -/**************************************************************************** - * Public Event Handlers : APPLY - ****************************************************************************/ - -void -RepState::eventInsertConf(Uint32 gci, Uint32 nodeGrp) -{ - Interval app(gci, gci); - add(Channel::App, nodeGrp, app); - clear(Channel::AppReq, nodeGrp, app); - -#ifdef DEBUG_GREP - ndbout_c("RepState: GCI Buffer %d:[%d] applied", nodeGrp, gci); -#endif -} - -void -RepState::eventInsertRef(Uint32 gci, Uint32 nodeGrp, Uint32 tableId, - GrepError::Code err) -{ - ndbout_c("\nTable %d, used in replication, did not exist"); - RLOG(("ERROR %d:%s. Apply failed (%d[%d] in table %d)", - err, GrepError::getErrorDesc(err), nodeGrp, gci, tableId)); -} - - -void -RepState::eventCreateTableRef(Uint32 gci, - Uint32 tableId, - const char * tableName, - GrepError::Code err) -{ - ndbout_c("\nFailed to create table %s with source site table id %d", - tableName, - tableId); - - RLOG(("ERROR %d:%s. Failed to create table %s with source site table id %d!", - err, GrepError::getErrorDesc(err), tableName, tableId)); -} - -/**************************************************************************** - * Public Event Handlers : Connected/Disconnected - ****************************************************************************/ - -void -RepState::eventNodeConnected(Uint32 nodeId) -{ - m_repConnected = CONNECTED; -} - -void -RepState::eventNodeDisconnected(Uint32 nodeId) -{ - m_repConnected = DISCONNECTED; -} - -void -RepState::eventNodeConnectable(Uint32 nodeId) -{ - m_repConnected = CONNECTABLE; -} - -/**************************************************************************** - * Public Event Handlers : Connected/Disconnected - ****************************************************************************/ - -void -RepState::eventSubscriptionDeleted(Uint32 subId, Uint32 subKey) -{ - m_gciContainer->reset(); - m_channel.setState(Channel::CONSISTENT); - m_channel.reset(); - m_subIdToRemove = 0; - m_subKeyToRemove = 0; -} diff --git a/ndb/src/old_files/rep/state/RepStateRequests.cpp b/ndb/src/old_files/rep/state/RepStateRequests.cpp deleted file mode 100644 index 02677e141f6..00000000000 --- a/ndb/src/old_files/rep/state/RepStateRequests.cpp +++ /dev/null @@ -1,294 +0,0 @@ -/* 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 "RepState.hpp" - -#include <NdbApiSignal.hpp> -#include <SimpleProperties.hpp> -#include <UtilBuffer.hpp> - -#include <signaldata/GrepImpl.hpp> -#include <signaldata/RepImpl.hpp> -#include <signaldata/SumaImpl.hpp> - -#include <rep/rep_version.hpp> -#include "Channel.hpp" - -/***************************************************************************** - * Helper functions - *****************************************************************************/ - -void -startSubscription(void * cbObj, NdbApiSignal* signal, - SubscriptionData::Part part, - Uint32 subId, Uint32 subKey) -{ - ExtSender * ext = (ExtSender *) cbObj; - - GrepSubStartReq * req = (GrepSubStartReq *)signal->getDataPtrSend(); - req->subscriptionId = subId; - req->subscriptionKey = subKey; - req->part = (Uint32) part; - signal->set(0, PSREPBLOCKNO, GSN_GREP_SUB_START_REQ, - GrepSubStartReq::SignalLength); - ext->sendSignal(signal); -} - -void -scanSubscription(void * cbObj, NdbApiSignal* signal, - SubscriptionData::Part part, - Uint32 subId, Uint32 subKey) -{ - ExtSender * ext = (ExtSender *) cbObj; - - GrepSubSyncReq * req = (GrepSubSyncReq *)signal->getDataPtrSend(); - req->subscriptionId = subId; - req->subscriptionKey = subKey; - req->part = part; - signal->set(0, PSREPBLOCKNO, GSN_GREP_SUB_SYNC_REQ, - GrepSubSyncReq::SignalLength); - ext->sendSignal(signal); -} - -/***************************************************************************** - * RepState registered functions - * - * These registered functions are executed by RepState when - * RepState needs to have stuff done. - *****************************************************************************/ - -void -requestCreateSubscriptionId(void * cbObj, NdbApiSignal* signal) -{ - ExtSender * ext = (ExtSender *) cbObj; - - CreateSubscriptionIdReq * req = - (CreateSubscriptionIdReq *)signal->getDataPtrSend(); - req->senderData = ext->getOwnRef(); - signal->set(0, PSREPBLOCKNO, GSN_GREP_CREATE_SUBID_REQ, - CreateSubscriptionIdReq::SignalLength); - ext->sendSignal(signal); - -#ifdef DEBUG_GREP_SUBSCRIPTION - ndbout_c("Sent request for creation of subscription id to PS"); -#endif -} - -void -requestCreateSubscription(void * cbObj, - NdbApiSignal* signal, - Uint32 subId, - Uint32 subKey, - Vector<struct table *> * selectedTables) -{ - ExtSender * ext = (ExtSender *) cbObj; - - GrepSubCreateReq * req = (GrepSubCreateReq *)signal->getDataPtrSend(); - req->senderRef = ext->getOwnRef(); - req->subscriptionId = subId; - req->subscriptionKey = subKey; - if(selectedTables!=0) { - UtilBuffer m_buffer; - UtilBufferWriter w(m_buffer); - LinearSectionPtr tablePtr[3]; - req->subscriptionType = SubCreateReq::SelectiveTableSnapshot; - - for(Uint32 i=0; i< selectedTables->size(); i++) { - w.add(SimpleProperties::StringValue, (*selectedTables)[i]->tableName); - } - - tablePtr[0].p = (Uint32*)m_buffer.get_data(); - tablePtr[0].sz = m_buffer.length() >> 2; - - signal->set(0, PSREPBLOCKNO, GSN_GREP_SUB_CREATE_REQ, - GrepSubCreateReq::SignalLength); - ext->sendFragmentedSignal(signal, tablePtr, 1); - } - else { - req->subscriptionType = SubCreateReq::DatabaseSnapshot; - signal->set(0, PSREPBLOCKNO, GSN_GREP_SUB_CREATE_REQ, - GrepSubCreateReq::SignalLength); - ext->sendFragmentedSignal(signal, 0, 0); - } - - - -#ifdef DEBUG_GREP_SUBSCRIPTION - ndbout_c("Requestor: Sent request for creation of subscription"); -#endif -} - -void -requestRemoveSubscription(void * cbObj, NdbApiSignal* signal, - Uint32 subId, Uint32 subKey) -{ - ExtSender * ext = (ExtSender *) cbObj; - - GrepSubRemoveReq * req = (GrepSubRemoveReq *)signal->getDataPtrSend(); - req->subscriptionId = subId; - req->subscriptionKey = subKey; - signal->set(0, PSREPBLOCKNO, GSN_GREP_SUB_REMOVE_REQ, - GrepSubRemoveReq::SignalLength); - ext->sendSignal(signal); -} - -void -requestTransfer(void * cbObj, NdbApiSignal * signal, - Uint32 nodeGrp, Uint32 first, Uint32 last) -{ - ExtSender * ext = (ExtSender *) cbObj; - - RepGetGciBufferReq * req = (RepGetGciBufferReq*)signal->getDataPtrSend(); - req->firstGCI = first; - req->lastGCI = last; - req->nodeGrp = nodeGrp; - req->senderRef = ext->getOwnRef(); - signal->set(0, PSREPBLOCKNO, GSN_REP_GET_GCIBUFFER_REQ, - RepGetGciBufferReq::SignalLength); - ext->sendSignal(signal); - -#ifdef DEBUG_GREP_TRANSFER - ndbout_c("Requestor: Requested PS GCI buffers %d:[%d-%d]", - nodeGrp, first, last); -#endif -} - -void -requestApply(void * applyObj, NdbApiSignal * signal, - Uint32 nodeGrp, Uint32 first, Uint32 last, Uint32 force) -{ - AppNDB * applier = (AppNDB *) applyObj; - - if (first != last) { - RLOG(("WARNING! Trying to apply range [%d-%d]. This is not implemeted", - first, last)); - } - /** - * Apply GCIBuffer even if it is empty. - */ - applier->applyBuffer(nodeGrp, first, force); - /** - * @todo Handle return value from the method above - */ -} - -void -requestDeleteSS(void * cbObj, NdbApiSignal * signal, - Uint32 nodeGrp, Uint32 firstGCI, Uint32 lastGCI) -{ - GCIContainer * container = (GCIContainer *) cbObj; - - RLOG(("Deleting SS:%d:[%d-%d]", nodeGrp, firstGCI, lastGCI)); - - if(firstGCI < 0 || lastGCI<=0 || nodeGrp < 0) { - REPABORT("Illegal interval or wrong node group"); - //return GrepError::REP_DELETE_NEGATIVE_EPOCH; - } - - /********************************************* - * All buffers : Modify to the available ones - *********************************************/ - if(firstGCI==0 && lastGCI==(Uint32)0xFFFF) { - container->getAvailableGCIBuffers(nodeGrp, &firstGCI, &lastGCI); - } - - if(firstGCI == 0) { - Uint32 f, l; - container->getAvailableGCIBuffers(nodeGrp, &f, &l); - RLOG(("Deleting SS:[%d-%d]", f, l)); - if(f > firstGCI) firstGCI = f; - } - - /** - * Delete buffers - */ - for(Uint32 i=firstGCI; i<=lastGCI; i++) { - if(!container->destroyGCIBuffer(i, nodeGrp)) { - RLOG(("WARNING! Delete non-existing epoch SS:%d:[%d]", nodeGrp, i)); - } - //RLOG(("RepStateRequests: Deleting buffer SS:%d:[%d]", nodeGrp, i)); - } -} - -void -requestDeletePS(void * cbObj, NdbApiSignal * signal, - Uint32 nodeGrp, Uint32 firstGCI, Uint32 lastGCI) -{ - ExtSender * ext = (ExtSender *) cbObj; - - RepClearPSGciBufferReq * psReq = - (RepClearPSGciBufferReq*)signal->getDataPtrSend(); - /** - * @todo Should have better senderData /Lars - */ - psReq->senderData = 4711; - psReq->senderRef = ext->getOwnRef(); - psReq->firstGCI = firstGCI; - psReq->lastGCI = lastGCI; - psReq->nodeGrp = nodeGrp; - signal->set(0, PSREPBLOCKNO, GSN_REP_CLEAR_PS_GCIBUFFER_REQ, - RepClearPSGciBufferReq::SignalLength); - ext->sendSignal(signal); - - RLOG(("Requesting deletion of PS:%d:[%d-%d]", nodeGrp, firstGCI, lastGCI)); -} - -/** - * Function that requests information from REP PS about stored GCI Buffers - */ -void -requestEpochInfo(void * cbObj, NdbApiSignal* signal, Uint32 nodeGrp) -{ - ExtSender * ext = (ExtSender *) cbObj; - - RepGetGciReq * req = (RepGetGciReq *) signal->getDataPtrSend(); - req->nodeGrp = nodeGrp; - signal->set(0, PSREPBLOCKNO, GSN_REP_GET_GCI_REQ, - RepGetGciReq::SignalLength); - ext->sendSignal(signal); -} - -void -requestStartMetaLog(void * cbObj, NdbApiSignal * signal, - Uint32 subId, Uint32 subKey) -{ - RLOG(("Metalog starting. Subscription %d-%d", subId, subKey)); - startSubscription(cbObj, signal, SubscriptionData::MetaData, subId, subKey); -} - -void -requestStartDataLog(void * cbObj, NdbApiSignal * signal, - Uint32 subId, Uint32 subKey) -{ - RLOG(("Datalog starting. Subscription %d-%d", subId, subKey)); - startSubscription(cbObj, signal, SubscriptionData::TableData, subId, subKey); -} - -void -requestStartMetaScan(void * cbObj, NdbApiSignal* signal, - Uint32 subId, Uint32 subKey) -{ - RLOG(("Metascan starting. Subscription %d-%d", subId, subKey)); - scanSubscription(cbObj, signal, SubscriptionData::MetaData, subId, subKey); -} - -void -requestStartDataScan(void * cbObj, NdbApiSignal* signal, - Uint32 subId, Uint32 subKey) -{ - RLOG(("Datascan starting. Subscription %d-%d", subId, subKey)); - scanSubscription(cbObj, signal, SubscriptionData::TableData, subId, subKey); -} diff --git a/ndb/src/old_files/rep/state/testInterval/Makefile b/ndb/src/old_files/rep/state/testInterval/Makefile deleted file mode 100644 index fbb0b48c280..00000000000 --- a/ndb/src/old_files/rep/state/testInterval/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -include .defs.mk - -TYPE := kernel ndbapitest - -BIN_TARGET := testInterval -BIN_TARGET_ARCHIVES := portlib general - -CCFLAGS_LOC += -I.. - -SOURCES = testInterval.cpp ../Interval.cpp - -include $(NDB_TOP)/Epilogue.mk diff --git a/ndb/src/old_files/rep/state/testInterval/testInterval.cpp b/ndb/src/old_files/rep/state/testInterval/testInterval.cpp deleted file mode 100644 index 463e4adffb7..00000000000 --- a/ndb/src/old_files/rep/state/testInterval/testInterval.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* 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 "../Interval.hpp" - -#define TEST_REQUIRE(X); if (!(X)) { \ - ndbout_c("Test failed in line %d", __LINE__); testPassed = false; } - - -int -main () { - bool testPassed = true; - - Interval a, b, c; - - /** - * isEmpty - */ - TEST_REQUIRE(a.isEmpty()); - - a.set(3,1); - TEST_REQUIRE(a.isEmpty()); - - /** - * isEqual - */ - a.set(1,2); - TEST_REQUIRE(a.isEqual(1,2)); - - a.set(3,1); - TEST_REQUIRE(a.isEqual(1,0)); // The result should be normalized - - /** - * intervalAdd -- non-disjoint - */ - a.set(1,3); - b.set(3,10); - TEST_REQUIRE(intervalAdd(a, b, &c)); - TEST_REQUIRE(c.isEqual(1,10)); - - a.set(3,10); - b.set(1,3); - TEST_REQUIRE(intervalAdd(a, b, &c)); - TEST_REQUIRE(c.isEqual(1,10)); - - /** - * intervalAdd -- consequtive - */ - a.set(1,3); - b.set(4,10); - TEST_REQUIRE(intervalAdd(a, b, &c)); - TEST_REQUIRE(c.isEqual(1,10)); - - a.set(4,10); - b.set(1,3); - TEST_REQUIRE(intervalAdd(a, b, &c)); - TEST_REQUIRE(c.isEqual(1,10)); - - /** - * intervalAdd -- disjoint - */ - a.set(1,3); - b.set(5,10); - c.set(4711,4711); - TEST_REQUIRE(!intervalAdd(a, b, &c)); // This should not work - TEST_REQUIRE(c.isEqual(4711,4711)); - - a.set(5,10); - b.set(1,3); - c.set(4711,4711); - TEST_REQUIRE(!intervalAdd(a, b, &c)); // This should not work - TEST_REQUIRE(c.isEqual(4711,4711)); - - /** - * intervalLeftMinus -- non-disjoint - */ - a.set(1,3); - b.set(5,10); - intervalLeftMinus(a, b, &c); - TEST_REQUIRE(c.isEmpty()); - - a.set(5,10); - b.set(1,3); - intervalLeftMinus(a, b, &c); - TEST_REQUIRE(c.isEqual(5,10)); - - /** - * intervalLeftMinus -- consequtive - */ - a.set(1,3); - b.set(4,10); - intervalLeftMinus(a, b, &c); - TEST_REQUIRE(c.isEmpty()); - - a.set(4,10); - b.set(1,3); - intervalLeftMinus(a, b, &c); - TEST_REQUIRE(c.isEqual(4,10)); - - /** - * intervalLeftMinus -- disjoint - */ - a.set(1,3); - b.set(5,10); - intervalLeftMinus(a, b, &c); - TEST_REQUIRE(c.isEmpty()); - - a.set(5,10); - b.set(1,3); - intervalLeftMinus(a, b, &c); - TEST_REQUIRE(c.isEqual(5,10)); - - ndbout << "Test " << (testPassed ? "passed" : "failed") << "." << endl; -} diff --git a/ndb/src/old_files/rep/state/testRepState/Makefile b/ndb/src/old_files/rep/state/testRepState/Makefile deleted file mode 100644 index 33c6076eff3..00000000000 --- a/ndb/src/old_files/rep/state/testRepState/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -include .defs.mk - -TYPE := kernel - -BIN_TARGET := testRequestor -BIN_TARGET_ARCHIVES := portlib general - -CCFLAGS_LOC += -I.. - -SOURCES = testRequestor.cpp \ - ../Requestor.cpp \ - ../RepState.cpp \ - ../Interval.cpp - -include $(NDB_TOP)/Epilogue.mk diff --git a/ndb/src/old_files/rep/state/testRepState/testRequestor.cpp b/ndb/src/old_files/rep/state/testRepState/testRequestor.cpp deleted file mode 100644 index 8989f7098b8..00000000000 --- a/ndb/src/old_files/rep/state/testRepState/testRequestor.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* 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 "testRequestor.hpp" - -#define TEST_REQUIRE(X); if (!(X)) { \ - ndbout_c("Test failed in line %d", __LINE__); testPassed = false; } - - -struct Result { - Uint32 nodeGrp; - Uint32 first; - Uint32 last; - Uint32 force; -}; -Result result; - -/** Callbacks ****************************************************************/ - -void -f_transfer(void *, Signal* signal, Uint32 nodeGrp, Uint32 first, Uint32 last) -{ - result.nodeGrp = nodeGrp; - result.first = first; - result.last = last; - result.force = 0; - ndbout_c("Transfer: %d:[%d-%d] ", nodeGrp, first, last); -} - -void -f_apply(void *, Signal* signal, Uint32 nodeGrp, - Uint32 first, Uint32 last, Uint32 force) -{ - result.nodeGrp = nodeGrp; - result.first = first; - result.last = last; - result.force = force; - ndbout_c("Apply: %d:[%d-%d] (Force:%d)", nodeGrp, first, last, force); -} - -void -f_deletePS(void *, Signal* signal, Uint32 nodeGrp, Uint32 first, Uint32 last) -{ - result.nodeGrp = nodeGrp; - result.first = first; - result.last = last; - result.force = 0; - ndbout_c("DeletePS: %d:[%d-%d] ", nodeGrp, first, last); -} - -void -f_deleteSS(void *, Signal* signal, Uint32 nodeGrp, Uint32 first, Uint32 last) -{ - result.nodeGrp = nodeGrp; - result.first = first; - result.last = last; - result.force = 0; - ndbout_c("DeleteSS: %d:[%d-%d] ", nodeGrp, first, last); -} - -void -requestStartMetaLog(void * cbObj, Signal * signal) -{ - ndbout_c("StartMetaLog:"); -} - -void -requestStartDataLog(void * cbObj, Signal * signal) -{ - ndbout_c("StartDataLog:"); -} - -void -requestStartMetaScan(void * cbObj, Signal* signal) -{ - ndbout_c("StartMetaScan:"); -} - -void -requestStartDataScan(void * cbObj, Signal* signal) -{ - ndbout_c("StartDataScan:"); -} - - -/** Compare ****************************************************************/ - -bool compare(Uint32 nodeGrp, Uint32 first, Uint32 last, Uint32 force) -{ - return (result.nodeGrp == nodeGrp && result.first == first && - result.last == last && result.force == force); -} - - -/** Main *******************************************************************/ - -void -testRequestor() -{ - Signal * signal; - bool testPassed = true; - - Requestor requestor; - requestor.setObject(0); - requestor.setIntervalRequests(&f_transfer, - &f_apply, - &f_deletePS, - &f_deleteSS); - requestor.setStartRequests(&requestStartMetaLog, - &requestStartDataLog, - &requestStartMetaScan, - &requestStartDataScan); - requestor.setNoOfNodeGroups(1); - requestor.enable(); - requestor.enableTransfer(); - requestor.enableDelete(); - requestor.enableApply(); - requestor.m_state = Requestor::LOG; - - requestor.printStatus(); - - /** - * First transfer - */ - Interval i(12,13); - requestor.add(RepState::PS, 0, i); - requestor.execute(signal); - TEST_REQUIRE(compare(0, 12, 13, 0)); - - requestor.printStatus(); - - /** - * State transtion test - */ - - /** - * First apply - */ - - /** - * Test end - */ - if (testPassed) { - ndbout << "Test passed!" << endl; - } else { - ndbout << "Test FAILED!" << endl; - } -} - -int -main () { - testRequestor(); -} diff --git a/ndb/src/old_files/rep/state/testRepState/testRequestor.hpp b/ndb/src/old_files/rep/state/testRepState/testRequestor.hpp deleted file mode 100644 index 726b289114d..00000000000 --- a/ndb/src/old_files/rep/state/testRepState/testRequestor.hpp +++ /dev/null @@ -1,24 +0,0 @@ -/* 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 */ - -#ifndef TEST_REQUESTOR_HPP -#define TEST_REQUESTOR_HPP - -#include "../Requestor.hpp" - -void testRequestor(); - -#endif diff --git a/ndb/src/old_files/rep/storage/GCIBuffer.cpp b/ndb/src/old_files/rep/storage/GCIBuffer.cpp deleted file mode 100644 index 013600b30a5..00000000000 --- a/ndb/src/old_files/rep/storage/GCIBuffer.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/* 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 <ndb_global.h> -#include "GCIBuffer.hpp" - -/***************************************************************************** - * Constructor / Destructor - *****************************************************************************/ - -GCIBuffer::GCIBuffer(Uint32 gci, Uint32 id) -{ - m_gci = gci; - m_id = id; - m_complete = false; - m_receivedBytes = 0; -} - -GCIBuffer::~GCIBuffer() -{ - /** - * Loop through all pages and delete them - */ - for(Uint32 i=0; i<m_pageList.size(); i++) { - delete m_pageList[i]; - m_pageList[i] = 0; - } - m_pageList.clear(); - // m_pageList = 0; -} - -/***************************************************************************** - * Inserts - *****************************************************************************/ - -void -GCIBuffer::insertLogRecord(Uint32 tableId, Uint32 operation, - class LinearSectionPtr ptr[3]) -{ - GCIPage * p; - if(m_pageList.size() == 0) { - p = new GCIPage(m_gci); - assert(p != NULL); - m_pageList.push_back(p); - } - - p = m_pageList.back(); - if (!p->insertLogRecord(tableId, operation, ptr)) { - /** - * GCIPage is full. - */ - GCIPage * newPage = new GCIPage(m_gci); - assert(newPage != NULL); - m_pageList.push_back(newPage); - bool res = newPage->insertLogRecord(tableId, operation, ptr); - - if(!res) { - ndbout << "GCIBuffer: gci : " << m_gci << endl; - assert(res); - } - } -} - -/** - * @todo: We must be able to distinguish between Scan meta - * data and log meta data. - * Currently only scan meta data is considered. - */ -void -GCIBuffer::insertMetaRecord(Uint32 tableId, class LinearSectionPtr ptr[3]) -{ - GCIPage * p; - if(m_pageList.size()==0) { - p = new GCIPage(m_gci); - assert(p != NULL); - m_pageList.push_back(p); - } - - p = m_pageList.back(); - - if (!p->insertMetaRecord(tableId, ptr)) { - /** - * Page is full. - */ - GCIPage * newPage = new GCIPage(m_gci); - assert(newPage != NULL); - m_pageList.push_back(newPage); - - bool res = newPage->insertMetaRecord(tableId, ptr); - assert(res); - } -} - -void -GCIBuffer::insertPage(Uint32 gci, char * dataPtr, Uint32 dataBLen) -{ - /** - * allocate a new GCIPage - */ - GCIPage * page = new GCIPage(gci); - assert(page != 0); - - /** - * copy data into page - */ - page->copyDataToPage(dataPtr, dataBLen); - - /** - * put page on pagelist. - */ - m_pageList.push_back(page); - - /** - * Update GCI Buffer received bytes - */ - m_receivedBytes += dataBLen; -} - - -/***************************************************************************** - * Iterator - *****************************************************************************/ - -GCIBuffer::iterator::iterator(const GCIBuffer* gciBuffer) -{ - m_gciBuffer = gciBuffer; - m_iterator=0; - -} - -GCIPage * -GCIBuffer::iterator::first() -{ - m_iterator = 0; - if(m_gciBuffer->m_pageList.size() == 0) return NULL; - return (m_gciBuffer->m_pageList)[m_iterator]; -} - - -GCIPage * -GCIBuffer::iterator::next() -{ - m_iterator++; - if(m_gciBuffer->m_pageList.size() == 0) return NULL; - - if((m_iterator<m_gciBuffer->m_pageList.size())) - return (m_gciBuffer->m_pageList)[m_iterator]; - else - return NULL; -} - - -bool -GCIBuffer::iterator::exists() -{ - return (m_iterator < m_gciBuffer->m_pageList.size()); -} - - - diff --git a/ndb/src/old_files/rep/storage/GCIBuffer.hpp b/ndb/src/old_files/rep/storage/GCIBuffer.hpp deleted file mode 100644 index 8a8473d1d49..00000000000 --- a/ndb/src/old_files/rep/storage/GCIBuffer.hpp +++ /dev/null @@ -1,112 +0,0 @@ -/* 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 */ - -#ifndef GCI_BUFFER_HPP -#define GCI_BUFFER_HPP - -#include "GCIPage.hpp" -#include <Vector.hpp> -#include <TransporterDefinitions.hpp> - -#include <signaldata/RepImpl.hpp> - -/** - * @class GCIBuffer - * @brief A GCIBuffer contains pages containing log records for ONE gci. - * - * @todo Load and save to disk - */ - -class GCIBuffer -{ -public: - GCIBuffer(Uint32 gci, Uint32 id); - ~GCIBuffer(); - - /** - * @fn insertLogRecord - * @param tableId Table this will be LogRecord applies to. - * @param operation Operation this LogRecord represents - * @param ptr Ptr of type LinearSectionPtr that contains the data. - * @return A full page or 0, if the insert didn't generate a full page. - */ - void insertLogRecord(Uint32 tableId, Uint32 operation, - class LinearSectionPtr ptr[3]); - - void insertMetaRecord(Uint32 tableId, class LinearSectionPtr ptr[3]); - - /** - * @fn inserts a page, containing Records into a GCI Buffer. - * @param gci - the gci of the page. - * @param dataPtr - Pointer originating from Page::m_page. - * @param dataBLen - length of dataptr in bytes - * @note Page must NOT be deallocated after being inserted! - */ - void insertPage(Uint32 gci, char * dataPtr, Uint32 dataBLen); - - /** - * @fn isComplete - * @return True if this GCI Buffer is done (gci is completed). - */ - bool isComplete() { return m_complete; }; - void setComplete() { m_complete = true; }; - - /** - * @fn getReceivedBytes - * @returns the total number of bytes that this buffer has received. - */ - Uint32 getReceivedBytes() const { return m_receivedBytes;} ; - - /** - * Iterator for pages - */ - class iterator { - public: - iterator(const GCIBuffer* gciBuffer); - GCIPage * first(); ///< @return First page (or NULL if no page exists) - GCIPage * next(); ///< @return Next page (or NULL if no more page exists) - bool exists(); ///< @return true if another page exists (for next()) - private: - Uint32 m_iterator; - const GCIBuffer * m_gciBuffer; - }; - friend class GCIBuffer::iterator; - - /*************************************************************************** - * GCI Buffer meta information - ***************************************************************************/ - void setGCI(Uint32 gci) { m_gci = gci; }; - Uint32 getGCI() { return m_gci; }; - - void setId(Uint32 id) { m_id = id; }; - Uint32 getId() { return m_id; }; - - bool m_force; // if true, ignore "execute" errors when - // restoring buffer (PUBLIC) during phase - // starting. -private: - /*************************************************************************** - * Private Variables - ***************************************************************************/ - Uint32 m_gci; ///< GCI of this buffer - Uint32 m_id; ///< <m_gci, id> names GCIBuffer - bool m_complete; ///< GCI complete; buffer contains - ///< everything - Vector <GCIPage *> m_pageList; ///< Storage for data/log record pages. - Uint32 m_receivedBytes; ///< Received bytes in this buffer -}; - -#endif diff --git a/ndb/src/old_files/rep/storage/GCIContainer.cpp b/ndb/src/old_files/rep/storage/GCIContainer.cpp deleted file mode 100644 index c161db0769b..00000000000 --- a/ndb/src/old_files/rep/storage/GCIContainer.cpp +++ /dev/null @@ -1,272 +0,0 @@ -/* 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 "GCIContainer.hpp" -#include <NdbOut.hpp> -#include <NdbMem.h> -#include <new> - -#include <rep/rep_version.hpp> - -//#define GCICONTAINER_DEBUG - -/***************************************************************************** - * Constructors / Destructors - *****************************************************************************/ - -GCIContainer::GCIContainer(Uint32 maxNoOfIds) -{ - m_maxNoOfIds = maxNoOfIds; - - gciRange = new GCIRange[maxNoOfIds * sizeof(GCIRange)]; - - for(Uint32 i = 0; i < maxNoOfIds; i++) { - gciRange[i].m_firstGCI = 1; // The empty interval = [1,0] - gciRange[i].m_lastGCI = 0; - } - theMutexPtr = NdbMutex_Create(); -} - -GCIContainer::~GCIContainer() -{ - for(Uint32 i=0; i < m_bufferList.size(); i++) { - delete m_bufferList[i]; - m_bufferList[i] = 0; - } - - m_bufferList=0; - delete [] gciRange; - NdbMutex_Destroy(theMutexPtr); -} - -/***************************************************************************** - * GCIBuffer Create / Destroy - *****************************************************************************/ - -GCIBuffer * -GCIContainer::createGCIBuffer(Uint32 gci, Uint32 id) -{ - GCIBuffer * buf = new GCIBuffer(gci, id); - if (buf == NULL) REPABORT("Could not allocate new buffer"); - - m_bufferList.push_back(buf, true); - -#ifdef GCICONTAINER_DEBUG - ndbout_c("GCIContainer: New buffer created (GCI: %d, Id: %d)", gci, id); -#endif - return buf; -} - -/** - * Delete all GCI buffers strictly less than "gci" - */ -void -GCIContainer::destroyGCIBuffersBeforeGCI(Uint32 gci, Uint32 id) -{ - for(Uint32 i = 0 ; i < m_bufferList.size(); i++) { - if(m_bufferList[i]->getGCI() < gci) { -#ifdef GCICONTAINER_DEBUG - ndbout_c("GCIContainer: Destroying buffer (GCI: %d, id: %d)", - m_bufferList[i]->getGCI(), id); -#endif - destroyGCIBuffer(i, id); - } - } -} - -/** - * Delete one GCI Buffer - */ -bool -GCIContainer::destroyGCIBuffer(Uint32 gci, Uint32 id) -{ - m_bufferList.lock(); - for(Uint32 i = 0 ; i < m_bufferList.size(); i++) { - if((m_bufferList[i]->getGCI() == gci) && - (m_bufferList[i]->getId() == id)) { - - /** - * Delete the GCI Buffer - */ - delete m_bufferList[i]; - m_bufferList[i] = 0; - - /** - * Remove from the list of buffers stored in GCIContainer - */ - m_bufferList.erase(i,false); - m_bufferList.unlock(); - - /** - * Set info - */ - NdbMutex_Lock(theMutexPtr); - if(gciRange[id].m_firstGCI != gci) - RLOG(("WARNING! Buffer %d deleted from [%d-%d]", - gci, gciRange[id].m_firstGCI, gciRange[id].m_lastGCI)); - - gciRange[id].m_firstGCI++; - - /** - * Normalize empty interval to [1,0] - */ - if (gciRange[id].m_firstGCI > gciRange[id].m_lastGCI){ - gciRange[id].m_firstGCI = 1; - gciRange[id].m_lastGCI = 0; - } - NdbMutex_Unlock(theMutexPtr); - return true; - } - } - m_bufferList.unlock(); - return false; -} - -/***************************************************************************** - * GCIBuffer interface - *****************************************************************************/ - -GCIBuffer * -GCIContainer::getGCIBuffer(Uint32 gci, Uint32 id) -{ - GCIBuffer * gciBuffer = 0; - - m_bufferList.lock(); - for(Uint32 i=0; i < m_bufferList.size(); i++) { - gciBuffer = m_bufferList[i]; - if((gciBuffer->getGCI() == gci) && (gciBuffer->getId() == id)) { - m_bufferList.unlock(); - return gciBuffer; - } - } - m_bufferList.unlock(); - return 0; -} - -void -GCIContainer::setCompleted(Uint32 gci, Uint32 id) -{ - GCIBuffer * gciBuffer = getGCIBuffer(gci, id); - if(gciBuffer == 0) gciBuffer = createGCIBuffer(gci, id); - - gciBuffer->setComplete(); - -#ifdef GCICONTAINER_DEBUG - ndbout_c("GCIContainer: Buffer completely stored in GCIContainer (GCI: %d)", - gci); -#endif - - NdbMutex_Lock(theMutexPtr); - - /** - * If this is the first GCI Buffer to be completed - * then both first and last must be updated. - * Subsequently, only the last value must be updated. - */ - if(gciRange[id].m_firstGCI == 1 && gciRange[id].m_lastGCI == 0) { - gciRange[id].m_firstGCI = gci; - gciRange[id].m_lastGCI = gci; - } else { - if (gci != gciRange[id].m_lastGCI + 1) { - RLOG(("WARNING! Non-consequtive buffer %u completed [%u-%u])", - gci, gciRange[id].m_firstGCI, gciRange[id].m_lastGCI)); - } - gciRange[id].m_lastGCI = gci; - } - NdbMutex_Unlock(theMutexPtr); -} - -void -GCIContainer::getAvailableGCIBuffers(Uint32 id, Uint32 * first, Uint32 * last) -{ - NdbMutex_Lock(theMutexPtr); - *first = gciRange[id].m_firstGCI; - *last = gciRange[id].m_lastGCI; - NdbMutex_Unlock(theMutexPtr); -} - -/***************************************************************************** - * Inserts - *****************************************************************************/ -void -GCIContainer::insertMetaRecord(Uint32 id, Uint32 tableId, - class LinearSectionPtr ptr[3], Uint32 gci) -{ - /********************************************************** - * 1. Find correct GCI Buffer (Doesn't exist? Create one) - **********************************************************/ - GCIBuffer * gciBuffer = getGCIBuffer(gci, id); - if(gciBuffer == 0) gciBuffer = createGCIBuffer(gci, id); - - /********************************** - * 2. Insert record into GCIBuffer - **********************************/ - gciBuffer->insertMetaRecord(tableId, ptr); -} - -void -GCIContainer::insertLogRecord(Uint32 id, Uint32 tableId, Uint32 operation, - class LinearSectionPtr ptr[3], Uint32 gci) -{ - /********************************************************* - * 1. Find correct GCI Buffer (doesn't exist? create one) - *********************************************************/ - GCIBuffer * gciBuffer = getGCIBuffer(gci, id); - if(gciBuffer == 0) gciBuffer = createGCIBuffer(gci, id); - /********************************** - * 2. Insert record into GCIBuffer - **********************************/ - gciBuffer->insertLogRecord(tableId, operation, ptr); -} - -void -GCIContainer::insertPage(Uint32 gci, Uint32 id, - char * dataPtr, Uint32 dataBLen) -{ - /********************************************************* - * 1. Find correct GCI Buffer (doesn't exist? create one) - *********************************************************/ - GCIBuffer * gciBuffer = getGCIBuffer(gci, id); - if(gciBuffer == 0) gciBuffer = createGCIBuffer(gci, id); - - /******************************** - * 2. Insert page into GCIBuffer - ********************************/ - gciBuffer->insertPage(gci, dataPtr, dataBLen); -} - -bool -GCIContainer::reset() -{ - /** - * Clear the intervals - */ - for(Uint32 i = 0; i < m_maxNoOfIds; i++) { - gciRange[i].m_firstGCI = 1; // The empty interval = [1,0] - gciRange[i].m_lastGCI = 0; - } - - /** - * Destroy ALL gci buffers for ALL ids - */ - for(Uint32 i=0; i < m_bufferList.size(); i++) { - delete m_bufferList[i]; - m_bufferList[i] = 0; - } - m_bufferList.clear(); - - return true; -} diff --git a/ndb/src/old_files/rep/storage/GCIContainer.hpp b/ndb/src/old_files/rep/storage/GCIContainer.hpp deleted file mode 100644 index 48cbc66bfbd..00000000000 --- a/ndb/src/old_files/rep/storage/GCIContainer.hpp +++ /dev/null @@ -1,121 +0,0 @@ -/* 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 */ - -#ifndef GCI_CONTAINER_HPP -#define GCI_CONTAINER_HPP - -#include <Vector.hpp> - -#include "LogRecord.hpp" -#include "GCIBuffer.hpp" - -#undef swap -#include <list> -#include <iterator> - -/** - * @class GCIContainer - * @brief Responsible for storing LogRecord:s in GCIBuffer:s - * - * Each GCIBuffer stored in the GCIContainer is named by a pair <GCI, id>. - * (On PS REP the id is the nodeId, on SS REP the id is the node group). - */ -class GCIContainer { -public: - GCIContainer(Uint32 maxNoOfIds); - ~GCIContainer(); - - /*************************************************************************** - * GCIBuffer interface - ***************************************************************************/ - /** - * @return GCIBuffer if success, NULL otherwise - */ - GCIBuffer * createGCIBuffer(Uint32 gci, Uint32 id); - - /** - * Destroy all buffers with GCI strictly less than gci. - */ - void destroyGCIBuffersBeforeGCI(Uint32 gci, Uint32 id); - - /** - * Destroy all buffers with GCI gci. - * @return true if buffer was deleted, false if no buffer exists - */ - bool destroyGCIBuffer(Uint32 gci, Uint32 id); - - /** - * Fetch buffer - * @return GCIBuffer for gci, or NULL if no buffer found - */ - GCIBuffer * getGCIBuffer(Uint32 gci, Uint32 id); - - /** - * Set that buffer is completed, i.e. no more records are to be inserted - */ - void setCompleted(Uint32 gci, Uint32 id); - - - /** - * @fn insertPage - * @param gci GCI this page belongs to. - * @param id Id this page belongs to. - * @param dataPtr Pointer originating from Page::m_page - * @param dataBLen Length in bytes of data following dataptr. - */ - void insertPage(Uint32 gci, Uint32 id, char * dataPtr, Uint32 dataBLen); - - - /*************************************************************************** - * Record interface - ***************************************************************************/ - void insertLogRecord(Uint32 id, Uint32 tableId, Uint32 operation, - class LinearSectionPtr ptr[3], Uint32 gci); - - void insertMetaRecord(Uint32 id, Uint32 tableId, - class LinearSectionPtr ptr[3], Uint32 gci); - - /** - * Get available (complete) GCI Buffers that exists in the container. - * first == last means that there is one complete buffer - * @param id Id for which to as for available gci buffers. - * @param first First complete gci buffer - * @param last Last complete gci buffer - */ - void getAvailableGCIBuffers(Uint32 id, Uint32 * first, Uint32 * last); - - /** - * Resets the gcicontainer to its original state (initial state and empty) - * I.e., same state as when the object was first constructed. - * @return true if reset was ok - */ - bool reset(); - -private: - NdbMutex* theMutexPtr; - MutexVector <GCIBuffer *> m_bufferList; ///< All GCIBuffers stored - - typedef struct GCIRange { - Uint32 m_firstGCI; - Uint32 m_lastGCI; - }; - - Uint32 m_maxNoOfIds; - - GCIRange * gciRange; ///< Array of GCI ranges for each id -}; - -#endif diff --git a/ndb/src/old_files/rep/storage/GCIContainerPS.cpp b/ndb/src/old_files/rep/storage/GCIContainerPS.cpp deleted file mode 100644 index 5adb53f965c..00000000000 --- a/ndb/src/old_files/rep/storage/GCIContainerPS.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* 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 "GCIContainerPS.hpp" -#include <NdbOut.hpp> -#include <NdbMem.h> -#include <new> - -GCIContainerPS::GCIContainerPS(Uint32 maxNoOfNodeGrps) -{ - m_container = new GCIContainer(maxNoOfNodeGrps); - if (!m_container) REPABORT("Could not allocate new GCIContainer"); -} - -GCIContainerPS::~GCIContainerPS() -{ - delete m_container; -} - -void -GCIContainerPS::setNodeGroupInfo(NodeGroupInfo * info) -{ - m_nodeGroupInfo=info; -}; - -void -GCIContainerPS::createGCIBuffer(Uint32 gci, Uint32 id) -{ - m_container->createGCIBuffer(gci, id); -} - -void -GCIContainerPS::getAvailableGCIBuffers(Uint32 id /*nodegrp */, - Uint32 * first, Uint32 * last) { - - Uint32 nodeId = m_nodeGroupInfo->getPrimaryNode(id); - if(!nodeId) { - *first = 1; - *last = 0; - return; - } - - /** - *@todo do smart stuff with this! - */ - m_container->getAvailableGCIBuffers(nodeId, first, last); - -} - -void -GCIContainerPS::destroyGCIBuffersBeforeGCI(Uint32 gci) -{ - //for each node in every nodeGrp do: - NodeGroupInfo::iterator * it; - for(Uint32 i=0; i<m_nodeGroupInfo->getNoOfNodeGroups(); i++) { - it = new NodeGroupInfo::iterator(i, m_nodeGroupInfo); - for(NodeConnectInfo * nci=it->first(); it->exists();nci=it->next()) { - m_container->destroyGCIBuffersBeforeGCI(gci, nci->nodeId); - } - delete it; - } -} - -void -GCIContainerPS::insertLogRecord(Uint32 id, Uint32 tableId, Uint32 operation, - class LinearSectionPtr ptr[3], Uint32 gci) -{ - m_container->insertLogRecord(id, tableId, operation, ptr, gci); -} - -void -GCIContainerPS::insertMetaRecord(Uint32 id, Uint32 tableId, - class LinearSectionPtr ptr[3], Uint32 gci) -{ - m_container->insertMetaRecord(id, tableId, ptr, gci); -} - -void -GCIContainerPS::setCompleted(Uint32 gci, Uint32 id) -{ - m_container->setCompleted(gci, id); -} - -GCIBuffer * -GCIContainerPS::getGCIBuffer(Uint32 gci, Uint32 id) -{ - return m_container->getGCIBuffer(gci, id); -} - -/** - * @todo: fix return value - */ -bool -GCIContainerPS::destroyGCIBuffer(Uint32 gci, Uint32 id) -{ - //for each node in nodeGrp id do: - NodeGroupInfo::iterator * it; - it = new NodeGroupInfo::iterator(id, m_nodeGroupInfo); - for(NodeConnectInfo * nci=it->first(); it->exists();nci=it->next()) - { - if(!m_container->destroyGCIBuffer(gci, nci->nodeId)) - { - delete it; - return false; - } - } - delete it; - return true; -} - -bool -GCIContainerPS::reset() -{ - return m_container->reset(); -} diff --git a/ndb/src/old_files/rep/storage/GCIContainerPS.hpp b/ndb/src/old_files/rep/storage/GCIContainerPS.hpp deleted file mode 100644 index 7f5aaac4840..00000000000 --- a/ndb/src/old_files/rep/storage/GCIContainerPS.hpp +++ /dev/null @@ -1,90 +0,0 @@ -/* 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 */ - -#ifndef GCI_CONTAINER_PS_HPP -#define GCI_CONTAINER_PS_HPP - -#include <Vector.hpp> -#include <TransporterDefinitions.hpp> - -#include "NodeGroupInfo.hpp" -#include <rep/storage/GCIContainer.hpp> - -#include <list> -#include <iterator> - -/** - * @class GCIContainerPS - * @brief Interface to GCIContainer that takes node groups into account - */ -class GCIContainerPS -{ -public: - GCIContainerPS(Uint32 maxNoOfNodeGrps); - ~GCIContainerPS(); - - void setNodeGroupInfo(NodeGroupInfo * info); - NodeGroupInfo * getNodeGroupInfo() {return m_nodeGroupInfo;}; - - void createGCIBuffer(Uint32 gci, Uint32 id); - void getAvailableGCIBuffers(Uint32 id /*nodegrp */, - Uint32 * first, Uint32 * last); - - /*************************************************************************** - * Record interface - ***************************************************************************/ - void insertLogRecord(Uint32 grpId, Uint32 tableId, Uint32 operation, - class LinearSectionPtr ptr[3], Uint32 gci); - - void insertMetaRecord(Uint32 grpId, Uint32 tableId, - class LinearSectionPtr ptr[3], Uint32 gci); - - /** - * Destroy all buffers with GCI strictly less than gci. - */ - void destroyGCIBuffersBeforeGCI(Uint32 gci); - - /** - * Set that buffer is completed, i.e. no more records are to be inserted - */ - void setCompleted(Uint32 gci, Uint32 id); - - /** - * Fetch buffer - * @return GCIBuffer for gci, or NULL if no buffer found - */ - GCIBuffer * getGCIBuffer(Uint32 gci, Uint32 id); - - /** - * Destroy all buffers with GCI gci. - * @return true if buffer was deleted, false if no buffer exists - */ - bool destroyGCIBuffer(Uint32 gci, Uint32 id); - - - /** - * Resets the gcicontainer to its original state (initial state and empty) - * @return true if reset was ok - */ - bool reset(); - -private: - GCIContainer * m_container; - NodeGroupInfo * m_nodeGroupInfo; -}; - - -#endif diff --git a/ndb/src/old_files/rep/storage/GCIPage.cpp b/ndb/src/old_files/rep/storage/GCIPage.cpp deleted file mode 100644 index 05ecde2fee1..00000000000 --- a/ndb/src/old_files/rep/storage/GCIPage.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* 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 "GCIPage.hpp" -#include "assert.h" -#include <new> - -GCIPage::GCIPage(Uint32 gci) -{ - m_first = NULL; - m_last = NULL; - m_gci = gci; - m_full = false; - m_currentPagePos=m_page; - m_usedBytes = 0; -} - -/***************************************************************************** - * Insert - *****************************************************************************/ - -/** - * Store a new log record on this page. - * @return True if success, false otherwise - */ -bool -GCIPage::insertLogRecord(Uint32 tableId, Uint32 operation, - class LinearSectionPtr ptr[3]) -{ - /** - * Calculate size of new logrecord in bytes - */ - assert(m_page!=NULL); - Uint32 size = 4*ptr[0].sz + 4*ptr[1].sz + sizeof(LogRecord); - - if(!((m_currentPagePos + size ) < (m_page + m_pageBSize))) { - m_full = true; - return false; // No free space. GCIBuffer must allocate a new page - } - LogRecord * lr = new(m_currentPagePos) LogRecord(); - if (lr==0) REPABORT("Could not allocate new log record"); - - lr->recordType = Record::LOG; - lr->recordLen = size; - lr->operation = operation; - lr->tableId = tableId; - lr->attributeHeaderWSize = ptr[0].sz; - lr->attributeDataWSize = ptr[1].sz; - - m_currentPagePos += sizeof(LogRecord); - - lr->attributeHeader = (Uint32*)m_currentPagePos; - memcpy(lr->attributeHeader, ptr[0].p, lr->attributeHeaderWSize * 4); - - m_currentPagePos += lr->attributeHeaderWSize * 4; - - lr->attributeData = (Uint32*)m_currentPagePos; - memcpy(lr->attributeData, ptr[1].p, lr->attributeDataWSize * 4); - - m_currentPagePos += lr->attributeDataWSize * 4; - - m_usedBytes+=size; - return true; -} - -/** - * Store a new log record on this page. - * @return True if sucessful, false otherwise. - */ -bool -GCIPage::insertMetaRecord(Uint32 tableId, class LinearSectionPtr ptr[3]) -{ - /** - * Calculate size of new logrecord in bytes - */ - Uint32 size = 4*ptr[0].sz + sizeof(MetaRecord); - - if(!((m_currentPagePos + size ) < (m_page + m_pageBSize))) { - m_full = true; - return false; // No free space. GCIBuffer must allocate a new page - } - MetaRecord * mr = new(m_currentPagePos) MetaRecord(); - if (mr==0) REPABORT("Could not allocate new meta record"); - - // mr->operation = operation; - mr->recordType = Record::META; - mr->recordLen = size; - - mr->tableId = tableId; - mr->dataLen = ptr[0].sz; - - - m_currentPagePos += sizeof(MetaRecord); - - mr->data = (Uint32*)m_currentPagePos; - memcpy(mr->data, ptr[0].p, mr->dataLen * 4); - - m_currentPagePos += mr->dataLen * 4; - - m_usedBytes+=size; - return true; -} - -/** - * copy function - */ -void -GCIPage::copyDataToPage(char * dataPtr, Uint32 dataBLen) -{ - assert (dataBLen < m_pageBSize); - memcpy(m_page, dataPtr, dataBLen); - m_currentPagePos=m_page + dataBLen; - m_usedBytes = dataBLen; - m_full = true; - m_first = (Record * )m_page; - dataPtr = 0; -} - -/***************************************************************************** - * Iterator - *****************************************************************************/ - -GCIPage::iterator::iterator(const GCIPage* page) -{ - m_gciPage = page; - m_data = m_gciPage->m_page; - m_currentRecord = (Record*)m_data; -} - -Record * -GCIPage::iterator::first() -{ - return m_currentRecord; -} - -Record * -GCIPage::iterator::next() -{ - m_currentRecord = (Record*) - ((char*)(m_currentRecord)+ m_currentRecord->recordLen); - if((char*)m_currentRecord < (char*)(m_data + m_gciPage->m_usedBytes)) - return m_currentRecord; - else { - return 0; - } -} - -bool -GCIPage::iterator::exists() -{ - return ((char*)m_currentRecord < (m_data + m_gciPage->m_usedBytes)); -} diff --git a/ndb/src/old_files/rep/storage/GCIPage.hpp b/ndb/src/old_files/rep/storage/GCIPage.hpp deleted file mode 100644 index 50c5ab0cfba..00000000000 --- a/ndb/src/old_files/rep/storage/GCIPage.hpp +++ /dev/null @@ -1,114 +0,0 @@ -/* 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 */ - -#ifndef GCI_PAGE_HPP -#define GCI_PAGE_HPP - -#include "LogRecord.hpp" -#include <TransporterDefinitions.hpp> - -#include <rep/rep_version.hpp> - -/** - * @class GCIPage - * @brief A GCIPage contains a number of LogRecords for a certain GCI. - */ -class GCIPage -{ -public: - GCIPage(Uint32 gci); - GCIPage(Uint32 gci, char * dataPtr, Uint32 szBytes); - - /** - * @fn insertLogRecord - * @param tableId the table this will be LogRecord applies to. - * @param operation the operation this LogRecord represents - * @param ptr A LinearSectionPtr p'tr that contains the data. - * @return PAGE_FULL if the page is full, otherwise "true" - */ - bool insertLogRecord(Uint32 tableId, Uint32 operation, - class LinearSectionPtr ptr[3]); - - /** - * @fn insertMetaRecord - */ - bool insertMetaRecord(Uint32 tableId, class LinearSectionPtr ptr[3]); - - /** - * @fn getFirstRecord - * @return First record (or NULL if no record is stored on page) - */ - Record * getFirstRecord() { return m_first; }; - - /** - * @fn getStorage - */ - Uint32 * getStoragePtr() const {return (Uint32*)m_page;} ; - Uint32 getStorageByteSize() const {return m_usedBytes;} ; - Uint32 getStorageWordSize() const {return m_usedBytes >> 2;}; - - /** - * @fn copyDataToPage - * @info copy dataPtr to Page - * @param dataPtr - data to copy - * @param dataBLen - size in bytes to copy. - */ - void copyDataToPage(char * dataPtr, Uint32 szBytes); - - /** - * Iterator for records (Not yet used! Maybe should not be used.) - */ - class iterator { - public: - iterator(const GCIPage* page); - Record * first(); ///< @return First record (or NULL if no page exists) - Record * next(); ///< @return Next record (or NULL if no more records) - bool exists(); ///< @return true if another record exists-for next() - private: - Record * m_currentRecord; - const char * m_data; - const GCIPage * m_gciPage; - }; - friend class GCIPage::iterator; - - /** - * @fn getGCI - * Get the GCI of all log records stored on this page. - */ - Uint32 getGCI() { return m_gci; }; - - /** - * @fn isFull - * @return true if page is full, i.e. is one attempt to add a record - * has failed, false otherwise. - */ - bool isFull() { return m_full; }; - -private: - Uint32 m_gci; ///< GCI for this page - - Record * m_first; ///< Pointer to first log record - Record * m_last; ///< Pointer to last log record - - bool m_full; - - static const Uint32 m_pageBSize = 8192; ///< Page size in bytes - char m_page[m_pageBSize]; ///< Storage for pages - char * m_currentPagePos; - Uint32 m_usedBytes; -}; - -#endif diff --git a/ndb/src/old_files/rep/storage/LogRecord.hpp b/ndb/src/old_files/rep/storage/LogRecord.hpp deleted file mode 100644 index a0bf3d52372..00000000000 --- a/ndb/src/old_files/rep/storage/LogRecord.hpp +++ /dev/null @@ -1,81 +0,0 @@ -/* 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 */ - -#ifndef LOG_RECORD_HPP -#define LOG_RECORD_HPP - -#include <ndb_global.h> -#include <portlib/NdbMem.h> - -/** - * @class Record - * @brief - */ -class Record { -public: - enum RecordType { META = 1, LOG = 2 }; - RecordType recordType; - Uint32 recordLen; ///< Size in bytes of entire log record, incl payload -}; - - -/** - * @class LogRecord - * @brief - */ -class LogRecord : public Record { -public: - ~LogRecord() { - NdbMem_Free(attributeHeader); - NdbMem_Free(attributeData); - } - -public: - Uint32 gci; //0 - Uint32 operation; //4 - Uint32 tableId; //8 - - Uint32 attributeHeaderWSize; //12 - Uint32 attributeDataWSize; //16 - Uint32 * attributeHeader; //20 - Uint32 * attributeData; //24 - - /** - * Next pointer - */ -}; - - -/** - * @class MetaRecord - * @brief - */ -class MetaRecord : public Record { -public: - ~MetaRecord() { - NdbMem_Free(data); - } - -public: - Uint32 gci; - Uint32 tableId; - Uint32 dataLen; //in words of the data (below) - Uint32 *data; -}; - - -#endif - diff --git a/ndb/src/old_files/rep/storage/Makefile b/ndb/src/old_files/rep/storage/Makefile deleted file mode 100644 index 89b3af455e8..00000000000 --- a/ndb/src/old_files/rep/storage/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -include .defs.mk - -TYPE := repserver - -ARCHIVE_TARGET := repstorage - -SOURCES = GCIContainer.cpp \ - GCIContainerPS.cpp \ - GCIBuffer.cpp \ - GCIPage.cpp \ - NodeGroupInfo.cpp \ - NodeGroup.cpp - -include $(NDB_TOP)/Epilogue.mk diff --git a/ndb/src/old_files/rep/storage/NodeConnectInfo.hpp b/ndb/src/old_files/rep/storage/NodeConnectInfo.hpp deleted file mode 100644 index 403f92a5999..00000000000 --- a/ndb/src/old_files/rep/storage/NodeConnectInfo.hpp +++ /dev/null @@ -1,29 +0,0 @@ -/* 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 */ - -#ifndef NODE_CONNECTINFO_HPP -#define NODE_CONNECTINFO_HPP - -#include <ndb_types.h> - -struct NodeConnectInfo { - NodeConnectInfo(Uint16 n, bool c): nodeId(n), connected(c) {}; - Uint32 nodeId; - bool connected; -}; - - -#endif diff --git a/ndb/src/old_files/rep/storage/NodeGroup.cpp b/ndb/src/old_files/rep/storage/NodeGroup.cpp deleted file mode 100644 index 33451efb104..00000000000 --- a/ndb/src/old_files/rep/storage/NodeGroup.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/* 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 "NodeGroup.hpp" -#include <NdbOut.hpp> - -//#define NODE_GROUP_DEBUG - -NodeGroup::NodeGroup(Uint32 nodeGrp) { - m_nodeGrp = nodeGrp; - m_primaryNode = 0; -} - -NodeGroup::~NodeGroup() { - for(Uint32 i=0; i<m_nodeConnectList.size(); i++) { - delete m_nodeConnectList[i]; - m_nodeConnectList.erase(i); - } -} - -void -NodeGroup::addNode(Uint32 nodeId, bool connected) { -#ifdef NODE_GROUP_DEBUG - ndbout_c("NodeGroup: addNode(nodeId=%d, connected=%d), nodegrp=%d", - nodeId, connected, m_nodeGrp); -#endif - - /** - * If node already in node group, then do nothing except - * setting the connect statusflag for the node (in case it - * has changed). - */ - for(Uint32 i=0; i < m_nodeConnectList.size(); i++) - if(m_nodeConnectList[i]->nodeId == nodeId) { - m_nodeConnectList[i]->connected = connected; - return; - } - - /** - * If node not already in node group, then add node - */ - m_nodeConnectList.push_back(new NodeConnectInfo(nodeId, connected)); - sort(); - -#ifdef NODE_GROUP_DEBUG - for(Uint32 i=0; i < m_nodeConnectList.size(); i++) - ndbout_c("NodeGroup: NodeId=%d", m_nodeConnectList[i]->nodeId); -#endif -} - -/** - * crappy sort - */ -void NodeGroup::sort() { - NodeConnectInfo * tmp; - if(m_nodeConnectList.size()<2) - return; - for(Uint32 i=0; i < m_nodeConnectList.size()-1; i++) { - for(Uint32 j=m_nodeConnectList.size()-1;j>i+1; j--) { - if(m_nodeConnectList[j]->nodeId < m_nodeConnectList[j-1]->nodeId) { - tmp=m_nodeConnectList[j]; - m_nodeConnectList[j]=m_nodeConnectList[j-1]; - m_nodeConnectList[j-1]=tmp; - } - } - } -} - -Uint32 -NodeGroup::getFirstConnectedNode() { - for(Uint32 i=0; i<m_nodeConnectList.size(); i++){ - if(m_nodeConnectList[i]->connected) - return m_nodeConnectList[i]->nodeId; - } - return 0; -} - -Uint32 -NodeGroup::getNodeGrp() { - return m_nodeGrp; -} - -Vector <NodeConnectInfo *> * -NodeGroup::getNodeConnectList(){ - return &m_nodeConnectList; -} - -void -NodeGroup::setNodeConnectStatus(Uint32 nodeId, bool connected) { - for(Uint32 i=0; i<m_nodeConnectList.size(); i++){ - if(m_nodeConnectList[i]->nodeId==nodeId) { - m_nodeConnectList[i]->connected=connected; - break; - } - } -} - -bool -NodeGroup::isConnected(Uint32 nodeId) { - for(Uint32 i=0; i<m_nodeConnectList.size(); i++){ - if(m_nodeConnectList[i]->nodeId == nodeId) { - return m_nodeConnectList[i]->connected; - } - } - REPABORT1("Check for non-existing node to be connected", nodeId); -} - - -bool -NodeGroup::fullyConnected() { - for(Uint32 i=0; i<m_nodeConnectList.size(); i++){ - if(!(m_nodeConnectList[i]->connected)) - return false; - } - return true; -} - -bool -NodeGroup::connectedNodeGrp() { - for(Uint32 i=0; i<m_nodeConnectList.size(); i++){ - if(m_nodeConnectList[i]->connected) { - return true; - } - } - return false; -} - - -bool -NodeGroup::exists(Uint32 nodeId) { - for(Uint32 i=0;i<m_nodeConnectList.size();i++) { - if(m_nodeConnectList[i]->nodeId==nodeId) - return true; - } - return false; -} diff --git a/ndb/src/old_files/rep/storage/NodeGroup.hpp b/ndb/src/old_files/rep/storage/NodeGroup.hpp deleted file mode 100644 index 1f515e02a23..00000000000 --- a/ndb/src/old_files/rep/storage/NodeGroup.hpp +++ /dev/null @@ -1,109 +0,0 @@ -/* 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 */ - -#ifndef NODE_GROUP_HPP -#define NODE_GROUP_HPP - -#include "NodeConnectInfo.hpp" -#include <Vector.hpp> -#include <ndb_types.h> - -#include <rep/rep_version.hpp> - -/** - * @class NodeGroup - * @brief Contains info about all nodes belonging to one node group - */ -class NodeGroup { -public: - NodeGroup(Uint32 nodeGrp); - ~NodeGroup(); - /** - * Add node to node group - * @param nodeId Node id of node to add - * @param connected Status of this node (true==connected) - */ - void addNode(Uint32 nodeId, bool connected); - - /** - * get first connected node in this node group - * @returns nodeId, 0 if there is no connected node... - */ - Uint32 getFirstConnectedNode(); - - /** - * get the primary node id - * @returns nodeId, the primary node id - */ - Uint32 getPrimaryNode() {return m_primaryNode;}; - - - /** - * sets a node in this nodegroup as the primary node - */ - void setPrimaryNode(Uint32 nodeId) {m_primaryNode=nodeId;}; - - - /** - * get the node group - * @returns the nodegroup number (m_nodeGrp) - */ - Uint32 getNodeGrp(); - - /** - * set the connection status for a particular node - * @param nodeId - the nodeId to set the connect status on - * @param connected - the status of this node (true==connected) - */ - void setNodeConnectStatus(Uint32 nodeId, bool connected); - - /** - * Get the connection status for a particular node - * @param nodeId - the nodeId to check the connect status on - * @returns true if node is connected, otherwise false - */ - bool isConnected(Uint32 nodeId); - - /** - * gives the status of this nodegroup. - * @returns true if atleast one node in the node group is connected - */ - bool connectedNodeGrp(); - - /** - * @returns true if ALL nodes are connected - */ - bool fullyConnected(); - - /** - * - * @returns true if node exists in nodegroup - */ - bool exists(Uint32 nodeId); - - Vector <NodeConnectInfo *> * getNodeConnectList(); - -private: - /** - * Sort list (bubble sort) - */ - void sort(); - Uint32 m_primaryNode; - Uint32 m_nodeGrp; - Vector<NodeConnectInfo *> m_nodeConnectList; -}; - -#endif diff --git a/ndb/src/old_files/rep/storage/NodeGroupInfo.cpp b/ndb/src/old_files/rep/storage/NodeGroupInfo.cpp deleted file mode 100644 index 8c250268997..00000000000 --- a/ndb/src/old_files/rep/storage/NodeGroupInfo.cpp +++ /dev/null @@ -1,218 +0,0 @@ -/* 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 "NodeGroupInfo.hpp" - -NodeGroupInfo::NodeGroupInfo() -{ -} - -NodeGroupInfo::~NodeGroupInfo() -{ - for(Uint32 i=0; i<m_nodeGroupList.size(); i++) { - delete m_nodeGroupList[i]; - } - m_nodeGroupList.clear(); -} - - -void -NodeGroupInfo::setPrimaryNode(Uint32 nodeGrp, Uint32 nodeId) { - Uint32 pos; - /** - * Validation check to find out that the nodegroup really exists. - * The list is not sorted, so the index of the nodegroup is returned - * in pos. - */ - if(existsNodeGroup(nodeGrp, &pos)) { - m_nodeGroupList[pos]->setPrimaryNode(nodeId); - } else { - /** - * could not find node group - */ - RLOG(("Node group not found")); - REPABORT("Node group not found"); - } -} - -Uint32 -NodeGroupInfo::getPrimaryNode(Uint32 nodeGrp) { - Uint32 pos; - /** - * Validation check to find out that the nodegroup really exists. - * The list is not sorted, so the index of the nodegroup is returned - * in pos. - */ - if(existsNodeGroup(nodeGrp, &pos)) { - return m_nodeGroupList[pos]->getPrimaryNode(); - } else { - /** - * could not find node group - */ - RLOG(("Node group not found")); - REPABORT("Node group not found"); - } -} - -void -NodeGroupInfo::addNodeToNodeGrp(Uint32 nodeId, bool connected, Uint32 nodeGrp) -{ - Uint32 pos; - if(existsNodeGroup(nodeGrp, &pos)) { - /** - * NG exists -> just add the node - */ - m_nodeGroupList[pos]->addNode(nodeId, connected); - - } else { - /** - * NG do not exist -> create a new nodeGrp and add the node - */ - m_nodeGroupList.push_back(new NodeGroup(nodeGrp)); - - /** - * paranoia - */ - if(existsNodeGroup(nodeGrp, &pos)) { - m_nodeGroupList[pos]->addNode(nodeId, connected); - } else { - REPABORT(""); - } - } -} - -Uint32 -NodeGroupInfo::findNodeGroup(Uint32 nodeId) -{ - /** - * Check for existance in each nodegroup - */ - for(Uint32 i=0; i<m_nodeGroupList.size(); i++) { - if(m_nodeGroupList[i]->exists(nodeId)) return i; - } - - REPABORT1("No node group known for node", nodeId); -} - -Uint32 -NodeGroupInfo::getFirstConnectedNode(Uint32 nodeGrp) -{ - Uint32 pos; - /** - * Validation check to find out that the nodegroup really exists. - * The list is not sorted, so the index of the nodegroup is returned - * in pos. - */ - if(existsNodeGroup(nodeGrp, &pos)) { - return m_nodeGroupList[pos]->getFirstConnectedNode(); - } else { - /** - * could not find node group - */ - REPABORT(""); - } -} - -bool -NodeGroupInfo::connectedNodeGrp(Uint32 nodeGrp) -{ - return m_nodeGroupList[nodeGrp]->connectedNodeGrp(); -} - -bool -NodeGroupInfo::isConnected(Uint32 nodeId) -{ - Uint32 nodeGrp = findNodeGroup(nodeId); - return m_nodeGroupList[nodeGrp]->isConnected(nodeId); - -} - -bool -NodeGroupInfo::fullyConnected() -{ - for(Uint32 i=0; i<m_nodeGroupList.size(); i++) { - if(!(m_nodeGroupList[i]->fullyConnected())) - return false; - } - return true; -} - - -void -NodeGroupInfo::setConnectStatus(Uint32 nodeId, bool connected) -{ - Uint32 nodeGrp = findNodeGroup(nodeId); - m_nodeGroupList[nodeGrp]->setNodeConnectStatus(nodeId,connected); -} - - -bool -NodeGroupInfo::existsNodeGroup(Uint32 nodeGrp, Uint32 * pos) -{ - for(Uint32 i=0; i<m_nodeGroupList.size(); i++) { - if(m_nodeGroupList[i]->getNodeGrp()==nodeGrp) { - *pos=i; - return true; - } - } - return false; -} - - -/***************************************************************************** - * Iterator - *****************************************************************************/ - -NodeGroupInfo::iterator::iterator(Uint32 nodeGrp, NodeGroupInfo * ngi) -{ - m_iterator = 0; - for(Uint32 i=0; i < ngi->m_nodeGroupList.size(); i++) { - if(ngi->m_nodeGroupList[i]->getNodeGrp()==nodeGrp) { - m_nodeList = ngi->m_nodeGroupList[i]->getNodeConnectList(); - return; - } - } - m_nodeList=0; -} - -bool -NodeGroupInfo::iterator::exists() -{ - if(m_nodeList==0) return 0; - return (m_iterator < m_nodeList->size()); -} - -NodeConnectInfo * -NodeGroupInfo::iterator::first() -{ - m_iterator=0; - if(m_nodeList==0) return 0; - if(m_nodeList->size() == 0) return 0; - return (*m_nodeList)[m_iterator]; -} - -NodeConnectInfo * -NodeGroupInfo::iterator::next() -{ - m_iterator++; - if(m_nodeList==0) return 0; - if(m_nodeList->size() == 0) return 0; - if(m_iterator<m_nodeList->size()) - return (*m_nodeList)[m_iterator]; - else - return 0; -} - diff --git a/ndb/src/old_files/rep/storage/NodeGroupInfo.hpp b/ndb/src/old_files/rep/storage/NodeGroupInfo.hpp deleted file mode 100644 index 3d0499d4425..00000000000 --- a/ndb/src/old_files/rep/storage/NodeGroupInfo.hpp +++ /dev/null @@ -1,145 +0,0 @@ -/* 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 */ - -#ifndef NODE_GROUPINFO_HPP -#define NODE_GROUPINFO_HPP - -#include <Vector.hpp> -#include <NdbTick.h> -#include <NdbMain.h> -#include <NdbOut.hpp> -//#include <NdbSleep.h> - -#include "NodeGroup.hpp" -#include <rep/rep_version.hpp> - -/** - * @class NodeGroupInfo - * @brief Contains info about all node groups and their connectivity status - */ -class NodeGroupInfo { -public: - NodeGroupInfo(); - ~NodeGroupInfo(); - - /** - * Add a node to a nodegroup together with the status of the node - * @param nodeId - the nodeId to add - * @param connected - true/false - * @param nodeGrp - the nodegroup to add this node to - */ - void addNodeToNodeGrp(Uint32 nodeId, bool connected, Uint32 nodeGrp); - - /** - * Get the nodegroup that a node belongs to. - * @param nodeId - the nodeId to check wich nodegroup it belongs to - * @return the nodegroup - */ - Uint32 findNodeGroup(Uint32 nodeId); - - /** - * Get the first connected node in a node group - * @param nodegroup - the node group to get the node in. - * @return nodeId, 0 if there is no connected node in the nodegroup - */ - Uint32 getFirstConnectedNode(Uint32 nodeGrp); - - - /** - * sets a nodeId in a nodeGroup as the primary node. If the - * primary node fails, then a new node in the node group is chosen - * @param nodegroup - the node group to get the node in. - * @param nodeId, 0 if there is no connected node in the nodegroup - */ - void setPrimaryNode(Uint32 nodeGrp, Uint32 nodeId); - - /** - * gets the nodeId in the nodegroup of the primary node. - * @param nodegroup - the node group to get the node in. - * @return nodeId, 0 if there is no connected node in the nodegroup - */ - Uint32 getPrimaryNode(Uint32 nodeGrp); - - - /** - * Checks if at least one node in the nodegroup is connected. - * @param nodeGrp - the nodegrp to check - * @return true if >0 nodes are connected in the nodegroup - */ - bool connectedNodeGrp(Uint32 nodeGrp); - - /** - * Checks if a node is connected or not - * @param nodeId - the nodeId to check connectivity - * @return true if node is connected - */ - bool isConnected(Uint32 nodeId); - - /** - * Set if a node is connected or not - * @param nodeId - the nodeId to set the connect flag fory - * @param connected - true if connect false if disconnect - */ - void setConnectStatus(Uint32 nodeId, bool connected); - - /** - * Check if all nodes are connected in all nodegroups - * @return return true if ALL nodes are connected in ALL nodeGroups - */ - bool fullyConnected(); - - /** - * Get the number of nodegroups - * @return the number of nodegroups. - */ - Uint32 getNoOfNodeGroups() { return m_nodeGroupList.size();}; - - /** - * @class iterator - * The iterator class iterates over a nodegroup, returning nodeIds - * in that node group. - * - * @code - * NodeGroupInfo::iterator * it; - * for(Uint32 i=0;i < m_nodeGroupInfo->getNoOfNodeGroups();i++) { - * it = new NodeGroupInfo::iterator(i,m_nodeGroupInfo); - * for(NodeConnectInfo * nci=it->first(); it->exists();nci=it->next()) - * ndbout_c("Iterating: %d", nci->nodeId); - * - * } - * @end code - */ - class iterator { - public: - iterator(Uint32 nodeGrp, NodeGroupInfo * ngi); - NodeConnectInfo * first(); ///< @return nodeConnectInfo* if exists. - ///< (NULL if no more nodes exists) - NodeConnectInfo * next(); ///< @return nodeConnectInfo* if exists. - ///< (NULL if no more nodes exists) - bool exists(); ///< @return true if another nodeId exists (for next()) - private: - Uint32 m_iterator; - const Vector<NodeConnectInfo *> * m_nodeList; - }; - friend class NodeGroupInfo::iterator; - -private: - bool existsNodeGroup(Uint32 nodeGrp, Uint32 * pos); - - Vector<NodeGroup *> m_nodeGroupList; -}; - -#endif diff --git a/ndb/src/old_files/rep/transfer/Makefile b/ndb/src/old_files/rep/transfer/Makefile deleted file mode 100644 index 0d8851e287a..00000000000 --- a/ndb/src/old_files/rep/transfer/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include .defs.mk - -TYPE := ndbapi repserver kernel - -ARCHIVE_TARGET := reptransfer - -SOURCES = TransPS.cpp \ - TransSS.cpp \ - TransSSSubscriptions.cpp - -include $(NDB_TOP)/Epilogue.mk diff --git a/ndb/src/old_files/rep/transfer/TransPS.cpp b/ndb/src/old_files/rep/transfer/TransPS.cpp deleted file mode 100644 index 11fb0203cbc..00000000000 --- a/ndb/src/old_files/rep/transfer/TransPS.cpp +++ /dev/null @@ -1,553 +0,0 @@ -/* 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 "ConfigRetriever.hpp" -#include <NdbSleep.h> - -#include <NdbApiSignal.hpp> -#include <AttributeHeader.hpp> - -#include <signaldata/DictTabInfo.hpp> -#include <signaldata/GetTabInfo.hpp> -#include <signaldata/SumaImpl.hpp> -#include <GrepError.hpp> -#include <SimpleProperties.hpp> - -#include "TransPS.hpp" -#include <rep/storage/NodeGroupInfo.hpp> - -/***************************************************************************** - * Constructor / Destructor / Init - *****************************************************************************/ -TransPS::TransPS(GCIContainerPS* gciContainer) -{ - m_repSender = new ExtSender(); - m_gciContainerPS = gciContainer; -} - -TransPS::~TransPS() -{ - delete m_repSender; -} - -void -TransPS::init(TransporterFacade * tf, const char * connectString) -{ - abort(); -#ifdef NOT_FUNCTIONAL - m_signalExecThread = NdbThread_Create(signalExecThread_C, - (void **)this, - 32768, - "TransPS_Service", - NDB_THREAD_PRIO_LOW); - - ConfigRetriever configRetriever; - // configRetriever.setConnectString(connectString); - Properties* config = configRetriever.getConfig("REP", REP_VERSION_ID); - if (config == 0) { - ndbout << "TransPS: Configuration error: "; - const char* erString = configRetriever.getErrorString(); - if (erString == 0) { - erString = "No error specified!"; - } - ndbout << erString << endl; - exit(-1); - } - - Properties * extConfig; - /** - * @todo Hardcoded primary system name - */ - if (!config->getCopy("EXTERNAL SYSTEM_External", &extConfig)) { - ndbout << "External System \"External\" not found in configuration. " - << "Check config.ini." << endl; - config->print(); - exit(-1); - } - - m_ownNodeId = configRetriever.getOwnNodeId(); - extConfig->put("LocalNodeId", m_ownNodeId); - extConfig->put("LocalNodeType", "REP"); - Uint32 noOfConnections; - extConfig->get("NoOfConnections", &noOfConnections); - /* if (noOfConnections != 1) { - ndbout << "TransPS: There are " << noOfConnections << " connections " - << "defined in configuration" - << endl - << " There should be exactly one!" << endl; - exit(-1); - } - */ - /****************************** - * Set node id of external REP - ******************************/ - const Properties * connection; - const char * extSystem; - Uint32 extRepNodeId, tmpOwnNodeId; - - for(Uint32 i=0; i < noOfConnections; i++) { - extConfig->get("Connection", i, &connection); - if(connection == 0) REPABORT("No connection found"); - - if(connection->get("System1", &extSystem)) { - connection->get("NodeId1", &extRepNodeId); - connection->get("NodeId2", &tmpOwnNodeId); - } else { - connection->get("System2", &extSystem); - connection->get("NodeId1", &tmpOwnNodeId); - connection->get("NodeId2", &extRepNodeId); - } - if(m_ownNodeId == tmpOwnNodeId) - break; - } - - if(extRepNodeId==0) REPABORT("External replication server not found"); - if(extSystem==0) REPABORT("External system not found"); - - m_ownBlockNo = tf->open(this, execSignal, execNodeStatus); - assert(m_ownBlockNo > 0); - - m_ownRef = numberToRef(m_ownBlockNo, m_ownNodeId); - assert(m_ownNodeId == tf->ownId()); - - ndbout_c("Phase 4 (TransPS): Connection %d to external REP node %d opened", - m_ownBlockNo, extRepNodeId); - - m_repSender->setNodeId(extRepNodeId); - m_repSender->setOwnRef(m_ownRef); - m_repSender->setTransporterFacade(tf); -#endif -} - -/***************************************************************************** - * Signal Queue Executor - *****************************************************************************/ - -class SigMatch -{ -public: - int gsn; - void (TransPS::* function)(NdbApiSignal *signal); - - SigMatch() { gsn = 0; function = NULL; }; - - SigMatch(int _gsn, void (TransPS::* _function)(NdbApiSignal *signal)) { - gsn = _gsn; - function = _function; - }; - - bool check(NdbApiSignal *signal) { - if(signal->readSignalNumber() == gsn) return true; - return false; - }; -}; - -extern "C" -void * -signalExecThread_C(void *r) -{ - TransPS *repps = (TransPS*)r; - - repps->signalExecThreadRun(); - - NdbThread_Exit(0); - /* NOTREACHED */ - return 0; -} - -void -TransPS::signalExecThreadRun() -{ - Vector<SigMatch> sl; - - /** - * Signals executed here - */ - sl.push_back(SigMatch(GSN_REP_GET_GCI_REQ, - &TransPS::execREP_GET_GCI_REQ)); - sl.push_back(SigMatch(GSN_REP_GET_GCIBUFFER_REQ, - &TransPS::execREP_GET_GCIBUFFER_REQ)); - sl.push_back(SigMatch(GSN_REP_CLEAR_PS_GCIBUFFER_REQ, - &TransPS::execREP_CLEAR_PS_GCIBUFFER_REQ)); - - /** - * Signals to be forwarded to GREP::PSCoord - */ - sl.push_back(SigMatch(GSN_GREP_SUB_CREATE_REQ, &TransPS::sendSignalGrep)); - - /** - * Signals to be forwarded to GREP::PSCoord - */ - sl.push_back(SigMatch(GSN_GREP_CREATE_SUBID_REQ, &TransPS::sendSignalGrep)); - sl.push_back(SigMatch(GSN_GREP_SUB_START_REQ, &TransPS::sendSignalGrep)); - sl.push_back(SigMatch(GSN_GREP_SUB_SYNC_REQ, &TransPS::sendSignalGrep)); - sl.push_back(SigMatch(GSN_GREP_SUB_REMOVE_REQ, &TransPS::sendSignalGrep)); - - while(1) { - SigMatch *handler = NULL; - NdbApiSignal *signal = NULL; - if(m_signalRecvQueue.waitFor(sl, handler, signal, DEFAULT_TIMEOUT)) { -#if 0 - ndbout_c("TransPS: Removed signal from queue (GSN: %d, QSize: %d)", - signal->readSignalNumber(), m_signalRecvQueue.size()); -#endif - if(handler->function != 0) { - (this->*handler->function)(signal); - delete signal; - signal = 0; - } else { - REPABORT("Illegal handler for signal"); - } - } - } -} - -void -TransPS::sendSignalRep(NdbApiSignal * s) -{ - m_repSender->sendSignal(s); -} - -void -TransPS::sendSignalGrep(NdbApiSignal * s) -{ - m_grepSender->sendSignal(s); -} - -void -TransPS::sendFragmentedSignalRep(NdbApiSignal * s, - LinearSectionPtr ptr[3], - Uint32 sections) -{ - m_repSender->sendFragmentedSignal(s, ptr, sections); -} - -void -TransPS::sendFragmentedSignalGrep(NdbApiSignal * s, - LinearSectionPtr ptr[3], - Uint32 sections) -{ - m_grepSender->sendFragmentedSignal(s, ptr, sections); -} - - -void -TransPS::execNodeStatus(void* obj, Uint16 nodeId, bool alive, bool nfCompleted) -{ -// TransPS * thisObj = (TransPS*)obj; - - RLOG(("Node changed state (NodeId %d, Alive %d, nfCompleted %d)", - nodeId, alive, nfCompleted)); - - if(!alive && !nfCompleted) { } - - if(!alive && nfCompleted) { } -} - -void -TransPS::execSignal(void* executeObj, NdbApiSignal* signal, - class LinearSectionPtr ptr[3]){ - - TransPS * executor = (TransPS *) executeObj; - - const Uint32 gsn = signal->readSignalNumber(); - const Uint32 len = signal->getLength(); - - NdbApiSignal * s = new NdbApiSignal(executor->m_ownRef); - switch(gsn){ - case GSN_REP_GET_GCI_REQ: - case GSN_REP_GET_GCIBUFFER_REQ: - case GSN_REP_CLEAR_PS_GCIBUFFER_REQ: - s->set(0, SSREPBLOCKNO, gsn, len); - memcpy(s->getDataPtrSend(), signal->getDataPtr(), 4 * len); - executor->m_signalRecvQueue.receive(s); - break; - case GSN_GREP_SUB_CREATE_REQ: - { - if(signal->m_noOfSections > 0) { - memcpy(s->getDataPtrSend(), signal->getDataPtr(), 4 * len); - s->set(0, GREP, gsn, - len); - executor->sendFragmentedSignalGrep(s,ptr,1); - delete s; - } else { - s->set(0, GREP, gsn, len); - memcpy(s->getDataPtrSend(), signal->getDataPtr(), 4 * len); - executor->m_signalRecvQueue.receive(s); - } - } - break; - case GSN_GREP_SUB_START_REQ: - case GSN_GREP_SUB_SYNC_REQ: - case GSN_GREP_SUB_REMOVE_REQ: - case GSN_GREP_CREATE_SUBID_REQ: - s->set(0, GREP, gsn, len); - memcpy(s->getDataPtrSend(), signal->getDataPtr(), 4 * len); - executor->m_signalRecvQueue.receive(s); - break; - default: - REPABORT1("Illegal signal received in execSignal", gsn); - } -#if 0 - ndbout_c("TransPS: Inserted signal into queue (GSN: %d, Len: %d)", - signal->readSignalNumber(), len); -#endif -} - -/***************************************************************************** - * Signal Receivers - *****************************************************************************/ - -void -TransPS::execREP_GET_GCIBUFFER_REQ(NdbApiSignal* signal) -{ - RepGetGciBufferReq * req = (RepGetGciBufferReq*)signal->getDataPtr(); - Uint32 firstGCI = req->firstGCI; - Uint32 lastGCI = req->lastGCI; - Uint32 nodeGrp = req->nodeGrp; - - RLOG(("Received request for %d:[%d-%d]", nodeGrp, firstGCI, lastGCI)); - - NodeGroupInfo * tmp = m_gciContainerPS->getNodeGroupInfo(); - Uint32 nodeId = tmp->getPrimaryNode(nodeGrp); - /** - * If there is no connected node in the nodegroup -> abort. - * @todo: Handle error when a nodegroup is "dead" - */ - if(!nodeId) { - RLOG(("There are no connected nodes in node group %d", nodeGrp)); - sendREP_GET_GCIBUFFER_REF(signal, firstGCI, lastGCI, nodeGrp, - GrepError::REP_NO_CONNECTED_NODES); - return; - } - - transferPages(firstGCI, lastGCI, nodeId, nodeGrp, signal); - - /** - * Done tfxing pages, sending GCIBuffer conf. - */ - Uint32 first, last; - m_gciContainerPS->getAvailableGCIBuffers(nodeGrp, &first, &last); - - RepGetGciBufferConf * conf = (RepGetGciBufferConf*)req; - conf->senderRef = m_ownRef; - conf->firstPSGCI = first; // Buffers found on REP PS (piggy-back info) - conf->lastPSGCI = last; - conf->firstSSGCI = firstGCI; // Now been transferred to REP SS - conf->lastSSGCI = lastGCI; - conf->nodeGrp = nodeGrp; - signal->set(0, SSREPBLOCKNO, GSN_REP_GET_GCIBUFFER_CONF, - RepGetGciBufferConf::SignalLength); - sendSignalRep(signal); - - RLOG(("Sent %d:[%d-%d] (Stored PS:%d:[%d-%d])", - nodeGrp, firstGCI, lastGCI, nodeGrp, first, last)); -} - -void -TransPS::transferPages(Uint32 firstGCI, Uint32 lastGCI, - Uint32 nodeId, Uint32 nodeGrp, - NdbApiSignal * signal) -{ - /** - * Transfer pages in GCI Buffer to SS - * When buffer is sent, send accounting information. - */ - RepDataPage * pageData = (RepDataPage*)signal->getDataPtr(); - LinearSectionPtr ptr[1]; - GCIPage * page; - for(Uint32 i=firstGCI; i<=lastGCI; i++) { - Uint32 totalSizeSent = 0; - GCIBuffer * buffer = m_gciContainerPS->getGCIBuffer(i, nodeId); - - if(buffer != 0) { - GCIBuffer::iterator it(buffer); - /** - * Send all pages to SS - */ - for (page = it.first(); page != 0; page = it.next()) { - ptr[0].p = page->getStoragePtr(); - ptr[0].sz = page->getStorageWordSize(); - totalSizeSent += ptr[0].sz; - pageData->gci = i; - pageData->nodeGrp = nodeGrp; - signal->set(0, SSREPBLOCKNO, GSN_REP_DATA_PAGE, - RepDataPage::SignalLength); - sendFragmentedSignalRep(signal, ptr, 1); - } - - /** - * Send accounting information to SS - */ - RepGciBufferAccRep * rep = (RepGciBufferAccRep *)pageData; - rep->gci = i; - rep->nodeGrp = nodeGrp; - rep->totalSentBytes = (4 * totalSizeSent); //words to bytes - signal->set(0, SSREPBLOCKNO, GSN_REP_GCIBUFFER_ACC_REP, - RepGciBufferAccRep::SignalLength); - sendSignalRep(signal); - - RLOG(("Sending %d:[%d] (%d bytes) to external REP (nodeId %d)", - nodeGrp, i, 4*totalSizeSent, nodeId)); - } - } - page = 0; -} - -void -TransPS::execREP_GET_GCI_REQ(NdbApiSignal* signal) -{ - RepGetGciReq * req = (RepGetGciReq*)signal->getDataPtr(); - Uint32 nodeGrp = req->nodeGrp; - - Uint32 first, last; - m_gciContainerPS->getAvailableGCIBuffers(nodeGrp, &first, &last); - - RepGetGciConf * conf = (RepGetGciConf*) req; - conf->firstPSGCI = first; - conf->lastPSGCI = last; - conf->senderRef = m_ownRef; - conf->nodeGrp = nodeGrp; - signal->set(0, SSREPBLOCKNO, GSN_REP_GET_GCI_CONF, - RepGetGciConf::SignalLength); - sendSignalRep(signal); -} - -/** - * REP_CLEAR_PS_GCIBUFFER_REQ - * destroy the GCI buffer in the GCI Container - * and send a CONF to Grep::SSCoord - */ -void -TransPS::execREP_CLEAR_PS_GCIBUFFER_REQ(NdbApiSignal * signal) -{ - RepClearPSGciBufferReq * const req = - (RepClearPSGciBufferReq*)signal->getDataPtr(); - Uint32 firstGCI = req->firstGCI; - Uint32 lastGCI = req->lastGCI; - Uint32 nodeGrp = req->nodeGrp; - - assert(firstGCI >= 0 && lastGCI > 0); - if(firstGCI<0 && lastGCI <= 0) - { - RLOG(("WARNING! Illegal delete request ignored")); - sendREP_CLEAR_PS_GCIBUFFER_REF(signal, firstGCI, lastGCI, - 0, nodeGrp, - GrepError::REP_DELETE_NEGATIVE_EPOCH); - } - - if(firstGCI==0 && lastGCI==(Uint32)0xFFFF) { - m_gciContainerPS->getAvailableGCIBuffers(nodeGrp, &firstGCI, &lastGCI); - RLOG(("Deleting PS:[%d-%d]", firstGCI, lastGCI)); - } - - if(firstGCI == 0) { - Uint32 f, l; - m_gciContainerPS->getAvailableGCIBuffers(nodeGrp, &f, &l); - - RLOG(("Deleting PS:[%d-%d]", f, l)); - - if(f>firstGCI) - firstGCI = f; - } - - /** - * Delete buffer - * Abort if we try to destroy a buffer that does not exist - * Deleting buffer from every node in the nodegroup - */ - for(Uint32 i=firstGCI; i<=lastGCI; i++) { - if(!m_gciContainerPS->destroyGCIBuffer(i, nodeGrp)) { - sendREP_CLEAR_PS_GCIBUFFER_REF(signal, firstGCI, lastGCI, i, nodeGrp, - GrepError::REP_DELETE_NONEXISTING_EPOCH); - return; - } - - RLOG(("Deleted PS:%d:[%d]", nodeGrp, i)); - } - - /** - * Send reply to Grep::SSCoord - */ - RepClearPSGciBufferConf * conf = (RepClearPSGciBufferConf*)req; - conf->firstGCI = firstGCI; - conf->lastGCI = lastGCI; - conf->nodeGrp = nodeGrp; - signal->set(0, SSREPBLOCKNO, GSN_REP_CLEAR_PS_GCIBUFFER_CONF, - RepClearPSGciBufferConf::SignalLength); - sendSignalRep(signal); -} - -/***************************************************************************** - * Signal Senders - *****************************************************************************/ - -void -TransPS::sendREP_GET_GCI_REF(NdbApiSignal* signal, - Uint32 nodeGrp, - Uint32 firstPSGCI, Uint32 lastPSGCI, - GrepError::Code err) -{ - RepGetGciRef * ref = (RepGetGciRef *)signal->getDataPtrSend(); - ref->firstPSGCI = firstPSGCI; - ref->lastPSGCI = lastPSGCI; - ref->firstSSGCI = 0; - ref->lastSSGCI = 0; - ref->nodeGrp = nodeGrp; - ref->err = err; - signal->set(0, SSREPBLOCKNO, GSN_REP_GET_GCI_REF, - RepGetGciRef::SignalLength); - sendSignalRep(signal); -} - -void -TransPS::sendREP_CLEAR_PS_GCIBUFFER_REF(NdbApiSignal* signal, - Uint32 firstGCI, Uint32 lastGCI, - Uint32 currentGCI, - Uint32 nodeGrp, - GrepError::Code err) -{ - RepClearPSGciBufferRef * ref = - (RepClearPSGciBufferRef *)signal->getDataPtrSend(); - ref->firstGCI = firstGCI; - ref->lastGCI = lastGCI; - ref->currentGCI = currentGCI; - ref->nodeGrp = nodeGrp; - ref->err = err; - signal->set(0, SSREPBLOCKNO, GSN_REP_CLEAR_PS_GCIBUFFER_REF, - RepClearPSGciBufferRef::SignalLength); - sendSignalRep(signal); -} - -void -TransPS::sendREP_GET_GCIBUFFER_REF(NdbApiSignal* signal, - Uint32 firstGCI, Uint32 lastGCI, - Uint32 nodeGrp, - GrepError::Code err) -{ - RepGetGciBufferRef * ref = - (RepGetGciBufferRef *)signal->getDataPtrSend(); - ref->firstPSGCI = firstGCI; - ref->lastPSGCI = lastGCI; - ref->firstSSGCI = 0; - ref->lastSSGCI = 0; - ref->nodeGrp = nodeGrp; - ref->err = err; - signal->set(0, SSREPBLOCKNO, GSN_REP_GET_GCIBUFFER_REF, - RepGetGciBufferRef::SignalLength); - sendSignalRep(signal); -} diff --git a/ndb/src/old_files/rep/transfer/TransPS.hpp b/ndb/src/old_files/rep/transfer/TransPS.hpp deleted file mode 100644 index 0464b9e47c0..00000000000 --- a/ndb/src/old_files/rep/transfer/TransPS.hpp +++ /dev/null @@ -1,136 +0,0 @@ -/* 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 */ - -#ifndef TransPS_HPP -#define TransPS_HPP - -#include <NdbTick.h> -#include <NdbMain.h> -#include <NdbOut.hpp> -#include <NdbSleep.h> - -#include <TransporterDefinitions.hpp> -#include <TransporterFacade.hpp> -#include <ClusterMgr.hpp> - -#include <rep/storage/GCIContainerPS.hpp> - -#include <signaldata/RepImpl.hpp> - -#include <rep/SignalQueue.hpp> -#include <rep/ExtSender.hpp> - -#include <rep/rep_version.hpp> - -extern "C" { -static void * signalExecThread_C(void *); -} - -/** - * @class TransPS - * @brief Responsible for REP-REP interface in Primary System role - */ -class TransPS { -public: - /*************************************************************************** - * Constructor / Destructor - ***************************************************************************/ - TransPS(GCIContainerPS * gciContainer); - ~TransPS(); - - void init(TransporterFacade * tf, const char * connectString = NULL); - - /*************************************************************************** - * Public Methods - ***************************************************************************/ - ExtSender * getRepSender() { return m_repSender; }; - void setGrepSender(ExtSender * es) { m_grepSender = es; }; - -private: - /*************************************************************************** - * Private Methods - ***************************************************************************/ - /** - * SignalQueue executor thread - */ - - friend void * signalExecThread_C(void *); - - void signalExecThreadRun(); - - static void execSignal(void* signalSender, NdbApiSignal* signal, - class LinearSectionPtr ptr[3]); - - static void execNodeStatus(void* signalSender, NodeId, - bool alive, bool nfCompleted); - - void sendSignalRep(NdbApiSignal * s); - void sendSignalGrep(NdbApiSignal * s); - - void sendFragmentedSignalRep(NdbApiSignal * s, LinearSectionPtr ptr[3], - Uint32 sections ); - void sendFragmentedSignalGrep(NdbApiSignal * s, LinearSectionPtr ptr[3], - Uint32 sections ); - - /*************************************************************************** - * Signal executors - ***************************************************************************/ - void execREP_CLEAR_PS_GCIBUFFER_REQ(NdbApiSignal*); - void execREP_GET_GCI_REQ(NdbApiSignal*); - void execREP_GET_GCIBUFFER_REQ(NdbApiSignal*); - - /*************************************************************************** - * Ref signal senders - ***************************************************************************/ - void sendREP_GET_GCI_REF(NdbApiSignal* signal, Uint32 nodeGrp, - Uint32 firstPSGCI, Uint32 lastPSGCI, - GrepError::Code err); - - void sendREP_CLEAR_PS_GCIBUFFER_REF(NdbApiSignal* signal, - Uint32 firstGCI, Uint32 lastGCI, - Uint32 currentGCI, Uint32 nodeGrp, - GrepError::Code err); - - void sendREP_GET_GCIBUFFER_REF(NdbApiSignal* signal, - Uint32 firstGCI, Uint32 lastGCI, - Uint32 nodeGrp, - GrepError::Code err); - - /*************************************************************************** - * Other Methods - ***************************************************************************/ - void transferPages(Uint32 firstGCI, Uint32 lastGCI, Uint32 id, - Uint32 nodeGrp, NdbApiSignal* signal); - - /************* - * Variables - *************/ - Uint32 m_ownNodeId; ///< NodeId of this node - Uint32 m_ownBlockNo; ///< BlockNo of this "block" - BlockReference m_ownRef; ///< Reference to this - - BlockReference m_extRepRef; ///< Node ref of REP at SS - - ExtSender * m_grepSender; ///< Responsible send to GREP - ExtSender * m_repSender; ///< Responsible send to REP - - struct NdbThread * m_signalExecThread; - class SignalQueue m_signalRecvQueue; - - GCIContainerPS * m_gciContainerPS; ///< Ref to gci container. -}; - -#endif diff --git a/ndb/src/old_files/rep/transfer/TransSS.cpp b/ndb/src/old_files/rep/transfer/TransSS.cpp deleted file mode 100644 index 376c6375bc4..00000000000 --- a/ndb/src/old_files/rep/transfer/TransSS.cpp +++ /dev/null @@ -1,653 +0,0 @@ -/* 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 "ConfigRetriever.hpp" - -#include <NdbApiSignal.hpp> -#include <AttributeHeader.hpp> - -#include <signaldata/RepImpl.hpp> -#include <signaldata/DictTabInfo.hpp> -#include <signaldata/GetTabInfo.hpp> -#include <signaldata/SumaImpl.hpp> -#include <signaldata/GrepImpl.hpp> - -#include <SimpleProperties.hpp> -#include <rep/rep_version.hpp> - -#include "TransSS.hpp" - -//#define DEBUG_REP_GET_GCI_CONF - -/***************************************************************************** - * Constructor / Destructor / Init - *****************************************************************************/ -TransSS::TransSS(GCIContainer * gciContainer, RepState * repState) -{ - m_repSender = new ExtSender(); - if (!m_repSender) REPABORT("Could not allocate new ExtSender"); - m_gciContainer = gciContainer; - m_repState = repState; -} - -TransSS::~TransSS() -{ - delete m_repSender; -} - -void -TransSS::init(const char * connectString) -{ - abort(); -#ifdef NOT_FUNCTIONAL - m_signalExecThread = NdbThread_Create(signalExecThread_C, - (void **)this, - 32768, - "TransSS_Service", - NDB_THREAD_PRIO_LOW); - ConfigRetriever configRetriever; - configRetriever.setConnectString(connectString); - - Properties* config = configRetriever.getConfig("REP", REP_VERSION_ID); - if (config == 0) { - ndbout << "Configuration error: "; - const char* erString = configRetriever.getErrorString(); - if (erString == 0) { - erString = "No error specified!"; - } - ndbout << erString << endl; - exit(-1); - } - Properties * extConfig; - - /** - * @todo Hardcoded standby system name - */ - if (!config->getCopy("EXTERNAL SYSTEM_External", &extConfig)) { - ndbout << "External System \"External\" not found in configuration. " - << "Check config.ini." << endl; - config->print(); - exit(-1); - } - m_ownNodeId = configRetriever.getOwnNodeId(); - extConfig->put("LocalNodeId", m_ownNodeId); - extConfig->put("LocalNodeType", "REP"); - Uint32 noOfConnections; - extConfig->get("NoOfConnections", &noOfConnections); - /* if (noOfConnections != 1) { - ndbout << "TransSS: There are " << noOfConnections << " connections " - << "defined in configuration" - << endl - << " There should be exactly one!" << endl; - exit(-1); - }*/ - - /****************************** - * Set node id of external REP - ******************************/ - const Properties * connection; - const char * extSystem; - - Uint32 extRepNodeId, tmpOwnNodeId; - - for(Uint32 i=0; i < noOfConnections; i++) { - extConfig->get("Connection", i, &connection); - if(connection == 0) REPABORT("Connection not found"); - - if(connection->get("System1", &extSystem)) { - connection->get("NodeId1", &extRepNodeId); - connection->get("NodeId2", &tmpOwnNodeId); - } else { - connection->get("System2", &extSystem); - connection->get("NodeId1", &tmpOwnNodeId); - connection->get("NodeId2", &extRepNodeId); - } - if(m_ownNodeId == tmpOwnNodeId) - break; - } - - if(extRepNodeId==0) REPABORT("External replication server not found"); - if(extSystem==0) REPABORT("External system not found"); - - m_transporterFacade = new TransporterFacade(); - if (!m_transporterFacade->init(extConfig)) - { - ndbout << "TransSS: Failed to initialize transporter facade" << endl; - exit(-1); - } - - m_ownBlockNo = m_transporterFacade->open(this, execSignal, execNodeStatus); - assert(m_ownBlockNo > 0); - m_ownRef = numberToRef(m_ownBlockNo, m_ownNodeId); - assert(m_ownNodeId == m_transporterFacade->ownId()); - - ndbout_c("Phase 2 (TransSS): Connection %d to external REP node %d opened", - m_ownBlockNo, extRepNodeId); - - m_repSender->setNodeId(extRepNodeId); - m_repSender->setOwnRef(m_ownRef); - m_repSender->setTransporterFacade(m_transporterFacade); -#endif -} - -/***************************************************************************** - * Signal Queue Executor - *****************************************************************************/ - -class SigMatch -{ -public: - int gsn; - void (TransSS::* function)(NdbApiSignal *signal); - - SigMatch() { gsn = 0; function = NULL; }; - - SigMatch(int _gsn, void (TransSS::* _function)(NdbApiSignal *signal)) { - gsn = _gsn; - function = _function; - }; - - bool check(NdbApiSignal *signal) { - if(signal->readSignalNumber() == gsn) - return true; - return false; - }; -}; - -extern "C" -void * -signalExecThread_C(void *r) -{ - TransSS *transss = (TransSS*)r; - - transss->signalExecThreadRun(); - NdbThread_Exit(0); - /* NOTREACHED */ - return 0; -} - -void -TransSS::signalExecThreadRun() -{ - Vector<SigMatch> sl; - /** - * Signals to be forwarded to TransPS - */ - sl.push_back(SigMatch(GSN_REP_GET_GCI_REQ, - &TransSS::sendSignalRep)); - sl.push_back(SigMatch(GSN_REP_GET_GCIBUFFER_REQ, - &TransSS::sendSignalRep)); - /** - * Signals to be executed - */ - sl.push_back(SigMatch(GSN_REP_GCIBUFFER_ACC_REP, - &TransSS::execREP_GCIBUFFER_ACC_REP)); - sl.push_back(SigMatch(GSN_REP_DISCONNECT_REP, - &TransSS::execREP_DISCONNECT_REP)); - sl.push_back(SigMatch(GSN_GREP_SUB_REMOVE_CONF, - &TransSS::execGREP_SUB_REMOVE_CONF)); - sl.push_back(SigMatch(GSN_REP_GET_GCIBUFFER_CONF, - &TransSS::execREP_GET_GCIBUFFER_CONF)); - - sl.push_back(SigMatch(GSN_REP_CLEAR_PS_GCIBUFFER_CONF, - &TransSS::execREP_CLEAR_PS_GCIBUFFER_CONF)); - sl.push_back(SigMatch(GSN_GREP_SUB_SYNC_CONF, - &TransSS::execGREP_SUB_SYNC_CONF)); - sl.push_back(SigMatch(GSN_GREP_SUB_SYNC_REF, - &TransSS::execGREP_SUB_SYNC_REF)); - sl.push_back(SigMatch(GSN_REP_GET_GCIBUFFER_REF, - &TransSS::execREP_GET_GCIBUFFER_REF)); - - /** - * Signals to be executed : Subscriptions - */ - sl.push_back(SigMatch(GSN_GREP_CREATE_SUBID_CONF, - &TransSS::execGREP_CREATE_SUBID_CONF)); - sl.push_back(SigMatch(GSN_GREP_CREATE_SUBID_REF, - &TransSS::execGREP_CREATE_SUBID_REF)); - sl.push_back(SigMatch(GSN_GREP_SUB_CREATE_CONF, - &TransSS::execGREP_SUB_CREATE_CONF)); - sl.push_back(SigMatch(GSN_GREP_SUB_CREATE_REF, - &TransSS::execGREP_SUB_CREATE_REF)); - sl.push_back(SigMatch(GSN_GREP_SUB_START_CONF, - &TransSS::execGREP_SUB_START_CONF)); - sl.push_back(SigMatch(GSN_GREP_SUB_START_REF, - &TransSS::execGREP_SUB_START_REF)); - - /** - * Signals to be executed and forwarded - */ - sl.push_back(SigMatch(GSN_REP_GET_GCI_CONF, - &TransSS::execREP_GET_GCI_CONF)); - - /** - * Signals to be forwarded - */ - sl.push_back(SigMatch(GSN_GREP_SUB_REMOVE_REF, - &TransSS::execGREP_SUB_REMOVE_REF)); - sl.push_back(SigMatch(GSN_REP_CLEAR_PS_GCIBUFFER_REF, - &TransSS::execREP_CLEAR_PS_GCIBUFFER_REF)); - sl.push_back(SigMatch(GSN_REP_GET_GCI_REF, - &TransSS::execREP_GET_GCI_REF)); - - while(1) { - SigMatch *handler = NULL; - NdbApiSignal *signal = NULL; - if(m_signalRecvQueue.waitFor(sl, handler, signal, DEFAULT_TIMEOUT)) - { -#if 0 - ndbout_c("TransSS: Removed signal from queue (GSN: %d, QSize: %d)", - signal->readSignalNumber(), m_signalRecvQueue.size()); -#endif - if(handler->function != 0) - { - (this->*handler->function)(signal); - delete signal; - signal = 0; - } else { - REPABORT("Illegal handler for signal"); - } - } - } -} - -void -TransSS::sendSignalRep(NdbApiSignal * s) -{ - m_repSender->sendSignal(s); -} - -void -TransSS::execNodeStatus(void* obj, Uint16 nodeId, - bool alive, bool nfCompleted) -{ - TransSS * thisObj = (TransSS*)obj; - - if (alive) { - thisObj->m_repState->eventNodeConnected(nodeId); - - } else if (!nfCompleted) { - thisObj->m_repState->eventNodeDisconnected(nodeId); - - } else if (nfCompleted) { - thisObj->m_repState->eventNodeConnectable(nodeId); - - } else { - REPABORT("Illegal state for execNodeStatus"); - } -} - -void -TransSS::execSignal(void* executorObj, NdbApiSignal* signal, - class LinearSectionPtr ptr[3]) -{ - TransSS * executor = (TransSS *) executorObj; - - const Uint32 gsn = signal->readSignalNumber(); - const Uint32 len = signal->getLength(); - - NdbApiSignal * s = new NdbApiSignal(executor->m_ownRef); - switch (gsn) { - case GSN_REP_GET_GCI_REQ: - case GSN_REP_GET_GCIBUFFER_REQ: - case GSN_REP_GET_GCIBUFFER_CONF: - case GSN_GREP_SUB_REMOVE_CONF: - case GSN_REP_DISCONNECT_REP: - case GSN_REP_GCIBUFFER_ACC_REP: - s->set(0, PSREPBLOCKNO, gsn, len); - memcpy(s->getDataPtrSend(), signal->getDataPtr(), 4 * len); - executor->m_signalRecvQueue.receive(s); - break; - case GSN_GREP_CREATE_SUBID_CONF: - case GSN_GREP_SUB_CREATE_CONF: - case GSN_GREP_SUB_START_CONF: - case GSN_GREP_SUB_SYNC_CONF: - case GSN_REP_GET_GCI_CONF: - case GSN_REP_CLEAR_PS_GCIBUFFER_CONF: - case GSN_GREP_CREATE_SUBID_REF: - case GSN_GREP_SUB_CREATE_REF: - case GSN_GREP_SUB_START_REF: - case GSN_GREP_SUB_SYNC_REF: - case GSN_GREP_SUB_REMOVE_REF: - case GSN_REP_GET_GCI_REF: - case GSN_REP_GET_GCIBUFFER_REF: - case GSN_REP_CLEAR_PS_GCIBUFFER_REF: - s->set(0, GREP, gsn, len); - memcpy(s->getDataPtrSend(), signal->getDataPtr(), 4 * len); - executor->m_signalRecvQueue.receive(s); - break; - case GSN_REP_DATA_PAGE: - executor->execREP_DATA_PAGE(signal, ptr); - delete s; s = 0; - break; - default: - REPABORT1("Illegal signal received in execSignal %d", gsn); - } - -#if 0 - ndbout_c("TransSS: Inserted signal into queue (GSN: %d, Len: %d)", - signal->readSignalNumber(), len); -#endif -} - -/***************************************************************************** - * Signal Executors - *****************************************************************************/ - -void -TransSS::execREP_DATA_PAGE(NdbApiSignal * signal, LinearSectionPtr ptr[3]) -{ - RepDataPage * const page = (RepDataPage*)signal->getDataPtr(); - m_gciContainer->insertPage(page->gci, page->nodeGrp, - (char*)(ptr[0].p), 4 * ptr[0].sz); -} - -/** - * Recd from TransPS - */ -void -TransSS::execREP_GCIBUFFER_ACC_REP(NdbApiSignal * signal) -{ - RepGciBufferAccRep * const rep = - (RepGciBufferAccRep * )signal->getDataPtr(); - - Uint32 gci = rep->gci; - Uint32 nodeGrp = rep->nodeGrp; - Uint32 totalSize = rep->totalSentBytes; - GCIBuffer * buffer = m_gciContainer->getGCIBuffer(gci, nodeGrp); - Uint32 getReceivedBytes = 0; - if (buffer != 0) - getReceivedBytes = buffer->getReceivedBytes(); - - RLOG(("TransSS: Received %d:[%d] (%d of %d bytes)", - nodeGrp, gci, getReceivedBytes, totalSize)); - - if(getReceivedBytes != totalSize) { - REPABORT("Did not receive correct number of bytes"); - } -} - -/** - * Received from primary system - */ -void -TransSS::execREP_GET_GCIBUFFER_CONF(NdbApiSignal * signal) -{ - RepGetGciBufferConf * conf = (RepGetGciBufferConf*)signal->getDataPtr(); - conf->senderRef = m_ownRef; - Uint32 first = conf->firstSSGCI; - Uint32 last = conf->lastSSGCI; - for(Uint32 i = first; i <= last; i++) { - m_gciContainer->setCompleted(i, conf->nodeGrp); - } - - /** - * Buffers @ PS - */ - Interval ps(conf->firstPSGCI, conf->lastPSGCI); - m_repState->add(Channel::PS, conf->nodeGrp, ps); - - /** - * Buffers @ SS - */ - Uint32 ssfirst, sslast; - m_gciContainer->getAvailableGCIBuffers(conf->nodeGrp, &ssfirst, &sslast); - Interval ss(ssfirst, sslast); - m_repState->clear(Channel::SS, conf->nodeGrp, universeInterval); - m_repState->add(Channel::SS, conf->nodeGrp, ss); - m_repState->clear(Channel::SSReq, conf->nodeGrp, ss); - - RLOG(("Transfered epochs (PS:%d[%d-%d], SS:%d[%d-%d])", - conf->nodeGrp, conf->firstPSGCI, conf->lastPSGCI, - conf->nodeGrp, conf->firstSSGCI, conf->lastSSGCI)); -} - -/** - * Received from primary system - */ -void -TransSS::execGREP_SUB_REMOVE_CONF(NdbApiSignal * signal) -{ - GrepSubRemoveConf * conf = (GrepSubRemoveConf* )signal->getDataPtr(); - Uint32 subId = conf->subscriptionId; - Uint32 subKey = conf->subscriptionKey; - - /** - * @todo Fix this sending - */ -#if 0 - signal->theData[0] = EventReport::GrepSubscriptionInfo; - signal->theData[1] = GrepEvent::GrepSS_SubRemoveConf; - signal->theData[2] = subId; - signal->theData[3] = subKey; - sendSignal(CMVMI_REF,GSN_EVENT_REP,signal, 4, JBB); -#endif - - m_repState->eventSubscriptionDeleted(subId, subKey); - RLOG(("Subscription deleted (SubId: %d, SubKey: %d)", subId, subKey)); -} - -void -TransSS::execGREP_SUB_REMOVE_REF(NdbApiSignal * signal) -{ - GrepSubRemoveRef * ref = (GrepSubRemoveRef* )signal->getDataPtr(); - Uint32 subId = ref->subscriptionId; - Uint32 subKey = ref->subscriptionKey; - - /** @todo: Add repevent for this */ - RLOG(("TransSS: Warning: Grep sub remove ref (SubId: %d, SubKey: %d)", - subId, subKey)); -} - -/** - * Received from primary system - */ -void -TransSS::execREP_GET_GCI_CONF(NdbApiSignal * signal) -{ - RepGetGciConf * conf = (RepGetGciConf*)signal->getDataPtr(); - Uint32 nodeGrp = conf->nodeGrp; - Interval i(conf->firstPSGCI, conf->lastPSGCI); - m_repState->add(Channel::PS, nodeGrp, i); - - Uint32 first, last; - m_gciContainer->getAvailableGCIBuffers(nodeGrp, &first, &last); - Interval j(first, last); - m_repState->clear(Channel::SS, nodeGrp, universeInterval); - m_repState->add(Channel::SS, nodeGrp, j); - -#ifdef DEBUG_REP_GET_GCI_CONF - RLOG(("TransSS: Requestor info received " - "(PS: %d:[%d-%d], SS: %d:[%d-%d])", - conf->nodeGrp, conf->firstPSGCI, conf->lastPSGCI, - conf->nodeGrp, conf->firstSSGCI, conf->lastSSGCI)); -#endif -} - -void -TransSS::execREP_GET_GCI_REF(NdbApiSignal * signal) -{ - RepGetGciRef * ref = (RepGetGciRef*)signal->getDataPtr(); - Uint32 nodeGrp = ref->nodeGrp; - - RLOG(("WARNING! Requestor info request failed (Nodegrp: %d)", nodeGrp)); -} - -/** - * Recd from GrepPS - * This signal means that a DB node has disconnected. - * @todo Do we need to know that a DB node disconnected? - * - * A node has disconnected (REP or PS DB) - * @todo let the requestor respond to this event - * in a proper way. - */ -void -TransSS::execREP_DISCONNECT_REP(NdbApiSignal * signal) -{ - RepDisconnectRep * const rep = - (RepDisconnectRep*)signal->getDataPtr(); - - //Uint32 nodeId = rep->nodeId; - Uint32 nodeType = rep->nodeType; - - if((RepDisconnectRep::NodeType)nodeType == RepDisconnectRep::REP) - { - m_repState->disable(); - } -} - -/** - * The buffer is now deleted on REP PS. We can now clear it from PS. - */ -void -TransSS::execREP_CLEAR_PS_GCIBUFFER_CONF(NdbApiSignal * signal) -{ - RepClearPSGciBufferConf * const conf = - (RepClearPSGciBufferConf*)signal->getDataPtr(); - Uint32 firstGCI = conf->firstGCI; - Uint32 lastGCI = conf->lastGCI; - Uint32 nodeGrp = conf->nodeGrp; - Interval i(firstGCI, lastGCI); - m_repState->clear(Channel::PS, nodeGrp, i); - m_repState->clear(Channel::DelReq, nodeGrp, i); - - RLOG(("Deleted PS:%d:[%d-%d]", nodeGrp, firstGCI, lastGCI)); -} - -/** - * Something went wrong when deleting buffer on REP PS - */ -void -TransSS::execREP_CLEAR_PS_GCIBUFFER_REF(NdbApiSignal * signal) -{ - RepClearPSGciBufferRef * const ref = - (RepClearPSGciBufferRef*)signal->getDataPtr(); - Uint32 firstGCI = ref->firstGCI; - Uint32 lastGCI = ref->lastGCI; - Uint32 nodeGrp = ref->nodeGrp; - - RLOG(("WARNING! Could not delete PS:%d:[%d-%d]", nodeGrp, firstGCI, lastGCI)); -} - -/***************************************************************************** - * Signal Executors : SCAN - *****************************************************************************/ - -/** - * Scan has started on PS side... (says PS REP) - */ -void -TransSS::execGREP_SUB_SYNC_CONF(NdbApiSignal* signal) -{ - GrepSubSyncConf * const conf = (GrepSubSyncConf * ) signal->getDataPtr(); - Uint32 subId = conf->subscriptionId; - Uint32 subKey = conf->subscriptionKey; - Interval epochs(conf->firstGCI, conf->lastGCI); - SubscriptionData::Part part = (SubscriptionData::Part) conf->part; - - switch(part) { - case SubscriptionData::MetaData: - RLOG(("Metascan completed. Subcription %d-%d, Epochs [%d-%d]", - subId, subKey, epochs.first(), epochs.last())); - m_repState->eventMetaScanCompleted(signal, subId, subKey, epochs); -#if 0 - signal->theData[0] = EventReport::GrepSubscriptionInfo; - signal->theData[1] = GrepEvent::GrepSS_SubSyncMetaConf; - signal->theData[2] = subId; - signal->theData[3] = subKey; - signal->theData[4] = gci; - sendSignal(CMVMI_REF,GSN_EVENT_REP,signal, 5, JBB); -#endif - break; - case SubscriptionData::TableData: - RLOG(("Datascan completed. Subcription %d-%d, Epochs [%d-%d]", - subId, subKey, epochs.first(), epochs.last())); - m_repState->eventDataScanCompleted(signal, subId, subKey, epochs); -#if 0 - signal->theData[0] = EventReport::GrepSubscriptionInfo; - signal->theData[1] = GrepEvent::GrepSS_SubSyncDataConf; - signal->theData[2] = subId; - signal->theData[3] = subKey; - signal->theData[4] = gci; - sendSignal(CMVMI_REF,GSN_EVENT_REP,signal, 5, JBB); -#endif - break; - default: - REPABORT3("Wrong subscription part", part, subId, subKey); - } -} - -void -TransSS::execGREP_SUB_SYNC_REF(NdbApiSignal* signal) -{ - GrepSubSyncRef * const ref = (GrepSubSyncRef * ) signal->getDataPtr(); - Uint32 subId = ref->subscriptionId; - Uint32 subKey = ref->subscriptionKey; - SubscriptionData::Part part = (SubscriptionData::Part) ref->part; - GrepError::Code error = (GrepError::Code) ref->err; - - switch(part) { - case SubscriptionData::MetaData: - m_repState->eventMetaScanFailed(subId, subKey, error); -#if 0 - signal->theData[0] = EventReport::GrepSubscriptionAlert; - signal->theData[1] = GrepEvent::GrepSS_SubSyncMetaRef; - signal->theData[2] = subId; - signal->theData[3] = subKey; - // signal->theData[4] = gci; - sendSignal(CMVMI_REF,GSN_EVENT_REP,signal, 5, JBB); -#endif - break; - case SubscriptionData::TableData: - m_repState->eventDataScanFailed(subId, subKey, error); -#if 0 - signal->theData[0] = EventReport::GrepSubscriptionAlert; - signal->theData[1] = GrepEvent::GrepSS_SubSyncDataRef; - signal->theData[2] = subId; - signal->theData[3] = subKey; - //signal->theData[4] = m_lastScanGCI; - sendSignal(CMVMI_REF,GSN_EVENT_REP,signal, 5, JBB); -#endif - break; - default: - REPABORT3("Wrong subscription part", part, subId, subKey); - } -} - -/** - * Something went wrong says REP PS - */ -void -TransSS::execREP_GET_GCIBUFFER_REF(NdbApiSignal* signal) -{ - RepGetGciBufferRef * const ref = (RepGetGciBufferRef*)signal->getDataPtr(); - /* - Uint32 senderData = ref->senderData; - Uint32 senderRef = ref->senderRef; - Uint32 firstPSGCI = ref->firstPSGCI; - Uint32 lastPSGCI = ref->lastPSGCI; - Uint32 firstSSGCI = ref->firstSSGCI; - Uint32 lastSSGCI = ref->lastSSGCI; - Uint32 currentGCIBuffer = ref->currentGCIBuffer; - Uint32 nodeGrp = ref->nodeGrp; - */ - GrepError::Code err = ref->err; - - RLOG(("WARNING! Request to get buffer failed. Error %d:%s", - err, GrepError::getErrorDesc(err))); -} diff --git a/ndb/src/old_files/rep/transfer/TransSS.hpp b/ndb/src/old_files/rep/transfer/TransSS.hpp deleted file mode 100644 index 3340038c8d1..00000000000 --- a/ndb/src/old_files/rep/transfer/TransSS.hpp +++ /dev/null @@ -1,145 +0,0 @@ -/* 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 */ - -#ifndef TransSS_HPP -#define TransSS_HPP - -#include <NdbTick.h> -#include <NdbMain.h> -#include <NdbOut.hpp> -#include <NdbSleep.h> - -#include <TransporterDefinitions.hpp> -#include <TransporterFacade.hpp> -#include <ClusterMgr.hpp> -#include <API.hpp> - -#include <rep/storage/GCIContainer.hpp> - -#include <rep/SignalQueue.hpp> -#include <rep/ExtSender.hpp> - -#include <rep/state/RepState.hpp> - -extern "C" { -static void * signalExecThread_C(void *); -} - -/** - * @class TransSS - * @brief Responsible for REP-REP interface in Standby System role - */ -class TransSS { -public: - /*************************************************************************** - * Constructor / Destructor / Init - ***************************************************************************/ - TransSS(GCIContainer * gciContainer, RepState * repState); - ~TransSS(); - void init(const char * connectString = NULL); - - /*************************************************************************** - * Public Methods - ***************************************************************************/ - ExtSender * getRepSender() { return m_repSender; }; - TransporterFacade * getTransporterFacade() { return m_transporterFacade; }; - -private: - /*************************************************************************** - * Private Methods - ***************************************************************************/ - friend void * signalExecThread_C(void *); - void signalExecThreadRun(); ///< SignalQueue executor thread - - static void execSignal(void* executorObj, NdbApiSignal* signal, - class LinearSectionPtr ptr[3]); - static void execNodeStatus(void* executorObj, NodeId, bool alive, - bool nfCompleted); - - void sendSignalRep(NdbApiSignal * s); - - /*************************************************************************** - * Signal receivers - ***************************************************************************/ - void execREP_GET_GCI_REQ(NdbApiSignal*); - void execREP_GET_GCI_CONF(NdbApiSignal*); - void execREP_GET_GCI_REF(NdbApiSignal*); - - void execREP_GET_GCIBUFFER_REQ(NdbApiSignal*); - void execREP_GET_GCIBUFFER_CONF(NdbApiSignal*); - void execREP_GET_GCIBUFFER_REF(NdbApiSignal*); - - void execGREP_SUB_REMOVE_CONF(NdbApiSignal *); - void execGREP_SUB_REMOVE_REF(NdbApiSignal *); - - void execREP_INSERT_GCIBUFFER_REQ(NdbApiSignal*); - void execREP_INSERT_GCIBUFFER_CONF(NdbApiSignal*); - void execREP_INSERT_GCIBUFFER_REF(NdbApiSignal*); - - void execREP_DATA_PAGE(NdbApiSignal* signal, LinearSectionPtr ptr[3]); - - void execREP_GCIBUFFER_ACC_REP(NdbApiSignal*); - void execREP_DISCONNECT_REP(NdbApiSignal*); - - - void execREP_CLEAR_PS_GCIBUFFER_CONF(NdbApiSignal*); - void execREP_CLEAR_PS_GCIBUFFER_REF(NdbApiSignal*); - - void execGREP_SUB_SYNC_CONF(NdbApiSignal*); - void execGREP_SUB_SYNC_REF(NdbApiSignal*); - - /*************************************************************************** - * Signal receivers : Subscriptions - ***************************************************************************/ - void execGREP_CREATE_SUBID_CONF(NdbApiSignal*); - void execGREP_CREATE_SUBID_REF(NdbApiSignal*); - void execGREP_SUB_CREATE_CONF(NdbApiSignal*); - void execGREP_SUB_CREATE_REF(NdbApiSignal*); - void execGREP_SUB_START_CONF(NdbApiSignal*); - void execGREP_SUB_START_REF(NdbApiSignal*); - - /*************************************************************************** - * Ref signal senders - ***************************************************************************/ - - void sendREP_GET_GCI_REF(NdbApiSignal* signal, Uint32 nodeGrp, - Uint32 firstSSGCI, Uint32 lastSSGCI, - GrepError::Code err); - - void sendREP_GET_GCIBUFFER_REF(NdbApiSignal* signal, - Uint32 firstGCI, Uint32 lastGCI, - Uint32 nodeGrp, GrepError::Code err); - - /*************************************************************************** - * Private Variables - ***************************************************************************/ - RepState * m_repState; - - struct NdbThread * m_signalExecThread; ///< Signal Queue executor - class SignalQueue m_signalRecvQueue; - - ExtSender * m_repSender; ///< Obj responsible send to REP - - Uint32 m_ownNodeId; ///< NodeId of this node - Uint32 m_ownBlockNo; ///< BlockNo of this "block" - BlockReference m_ownRef; ///< Reference to this - - GCIContainer * m_gciContainer; ///< Ref to gci container. - - TransporterFacade * m_transporterFacade; -}; - -#endif diff --git a/ndb/src/old_files/rep/transfer/TransSSSubscriptions.cpp b/ndb/src/old_files/rep/transfer/TransSSSubscriptions.cpp deleted file mode 100644 index 582ba8040a6..00000000000 --- a/ndb/src/old_files/rep/transfer/TransSSSubscriptions.cpp +++ /dev/null @@ -1,193 +0,0 @@ -/* 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 "TransSS.hpp" - -#include <signaldata/SumaImpl.hpp> -#include <GrepError.hpp> - -/***************************************************************************** - * CREATE SUBSCRIPTION ID - *****************************************************************************/ - -void -TransSS::execGREP_CREATE_SUBID_CONF(NdbApiSignal* signal) -{ - CreateSubscriptionIdConf const * conf = - (CreateSubscriptionIdConf *)signal->getDataPtr(); - Uint32 subId = conf->subscriptionId; - Uint32 subKey = conf->subscriptionKey; - - /** @todo Fix this */ -#if 0 - signal->theData[0] = EventReport::GrepSubscriptionInfo; - signal->theData[1] = GrepEvent::GrepSS_CreateSubIdConf; - signal->theData[2] = subId; - signal->theData[3] = subKey; - sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 4 ,JBB); -#endif - m_repState->eventSubscriptionIdCreated(subId, subKey); -} - -void -TransSS::execGREP_CREATE_SUBID_REF(NdbApiSignal* signal) -{ - CreateSubscriptionIdRef const * ref = - (CreateSubscriptionIdRef *)signal->getDataPtr(); - Uint32 subId = ref->subscriptionId; - Uint32 subKey = ref->subscriptionKey; - GrepError::Code err = (GrepError::Code) ref->err; - -#if 0 - signal->theData[0] = EventReport::GrepSubscriptionAlert; - signal->theData[1] = GrepEvent::GrepSS_CreateSubIdRef; - signal->theData[2] = subId; - signal->theData[3] = subKey; - signal->theData[4] = err; - sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 5 ,JBB); -#endif - m_repState->eventSubscriptionIdCreateFailed(subId, subKey, err); -} - -/***************************************************************************** - * CREATE SUBSCRIPTION - *****************************************************************************/ - -void -TransSS::execGREP_SUB_CREATE_CONF(NdbApiSignal* signal) -{ - GrepSubCreateConf * const conf = (GrepSubCreateConf *)signal->getDataPtr(); - Uint32 noOfNodeGroups = conf->noOfNodeGroups; - Uint32 subId = conf->subscriptionId; - Uint32 subKey = conf->subscriptionKey; - - m_repState->setNoOfNodeGroups(noOfNodeGroups); - -#if 0 - signal->theData[0] = EventReport::GrepSubscriptionInfo; - signal->theData[1] = GrepEvent::GrepSS_SubCreateConf; - signal->theData[2] = subId; - signal->theData[3] = subKey; - signal->theData[4] = noOfNodeGroups; - sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 5, JBB); -#endif - - m_repState->eventSubscriptionCreated(subId, subKey); -} - -void -TransSS::execGREP_SUB_CREATE_REF(NdbApiSignal* signal) -{ - GrepSubCreateRef * const ref = (GrepSubCreateRef *)signal->getDataPtr(); - Uint32 subId = ref->subscriptionId; - Uint32 subKey = ref->subscriptionKey; - GrepError::Code err = (GrepError::Code)ref->err; -#if 0 - signal->theData[0] = EventReport::GrepSubscriptionAlert; - signal->theData[1] = GrepEvent::GrepSS_SubCreateRef; - signal->theData[2] = subId; - signal->theData[3] = subKey; - sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 4, JBB); -#endif - - m_repState->eventSubscriptionCreateFailed(subId, subKey, err); -} - -/***************************************************************************** - * START SUBSCRIPTION - *****************************************************************************/ - -void -TransSS::execGREP_SUB_START_CONF(NdbApiSignal* signal) -{ - GrepSubStartConf * const conf = (GrepSubStartConf *)signal->getDataPtr(); - Uint32 subId = conf->subscriptionId; - Uint32 subKey = conf->subscriptionKey; - SubscriptionData::Part part = (SubscriptionData::Part) conf->part; - - switch(part) { - case SubscriptionData::MetaData: - RLOG(("Metalog started. Subscription %d-%d", subId, subKey)); - m_repState->eventMetaLogStarted(signal, subId, subKey); -#if 0 - signal->theData[0] = EventReport::GrepSubscriptionInfo; - signal->theData[1] = GrepEvent::GrepSS_SubStartMetaConf; - signal->theData[2] = m_requestor.getSubId(); - signal->theData[3] = m_requestor.getSubKey(); - sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 4, JBB); -#endif - break; - case SubscriptionData::TableData: - RLOG(("Datalog started. Subscription %d-%d", subId, subKey)); - m_repState->eventDataLogStarted(signal, subId, subKey); -#if 0 - signal->theData[0] = EventReport::GrepSubscriptionInfo; - signal->theData[1] = GrepEvent::GrepSS_SubStartDataConf; - signal->theData[2] = m_requestor.getSubId(); - signal->theData[3] = m_requestor.getSubKey(); - sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 4, JBB); -#endif - break; - default: - REPABORT("Illegal type of subscription"); - } -} - -void -TransSS::execGREP_SUB_START_REF(NdbApiSignal* signal) -{ - GrepSubStartRef * const ref = (GrepSubStartRef *)signal->getDataPtr(); - Uint32 subId = ref->subscriptionId; - Uint32 subKey = ref->subscriptionKey; - GrepError::Code err = (GrepError::Code)ref->err; - SubscriptionData::Part part = (SubscriptionData::Part) ref->part; - - switch(part) { - case SubscriptionData::MetaData: - m_repState->eventMetaLogStartFailed(subId, subKey, err); -#if 1 - ndbout_c("Requestor: Subscription FAILED to start on Meta Data"); - ndbout_c("Error code : %d. Error message: %s", - err, GrepError::getErrorDesc(err)); -#endif -#if 0 - signal->theData[0] = EventReport::GrepSubscriptionAlert; - signal->theData[1] = GrepEvent::GrepSS_SubStartMetaRef; - signal->theData[2] = subId; //@todo. manage subscriptions. - signal->theData[3] = subKey; //@todo. manage subscriptions. - sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 4, JBB); -#endif - break; - case SubscriptionData::TableData: - m_repState->eventDataLogStartFailed(subId, subKey, err); -#if 0 - signal->theData[0] = EventReport::GrepSubscriptionAlert; - signal->theData[1] = GrepEvent::GrepSS_SubStartDataRef; - signal->theData[2] = subId; //@todo. manage subscriptions. - signal->theData[3] = subKey; //@todo. manage subscriptions. - sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 4, JBB); -#endif -#if 1 - ndbout_c("Requestor: Subscription FAILED to start on Table Data"); -#endif - ndbout_c("Error code : %d. Error message: %s", - err, GrepError::getErrorDesc(err)); - - break; - default: - REPABORT("Illegal type of subscription"); - } -} |