summaryrefslogtreecommitdiff
path: root/ndb/src/old_files/rep
diff options
context:
space:
mode:
Diffstat (limited to 'ndb/src/old_files/rep')
-rw-r--r--ndb/src/old_files/rep/ExtSender.cpp149
-rw-r--r--ndb/src/old_files/rep/ExtSender.hpp76
-rw-r--r--ndb/src/old_files/rep/Makefile28
-rw-r--r--ndb/src/old_files/rep/NodeConnectInfo.hpp29
-rw-r--r--ndb/src/old_files/rep/README147
-rw-r--r--ndb/src/old_files/rep/RepApiInterpreter.cpp80
-rw-r--r--ndb/src/old_files/rep/RepApiInterpreter.hpp54
-rw-r--r--ndb/src/old_files/rep/RepApiService.cpp318
-rw-r--r--ndb/src/old_files/rep/RepApiService.hpp59
-rw-r--r--ndb/src/old_files/rep/RepCommandInterpreter.cpp456
-rw-r--r--ndb/src/old_files/rep/RepCommandInterpreter.hpp45
-rw-r--r--ndb/src/old_files/rep/RepComponents.cpp138
-rw-r--r--ndb/src/old_files/rep/RepComponents.hpp60
-rw-r--r--ndb/src/old_files/rep/RepMain.cpp97
-rw-r--r--ndb/src/old_files/rep/Requestor.cpp224
-rw-r--r--ndb/src/old_files/rep/Requestor.hpp154
-rw-r--r--ndb/src/old_files/rep/RequestorSubscriptions.cpp60
-rw-r--r--ndb/src/old_files/rep/SignalQueue.cpp106
-rw-r--r--ndb/src/old_files/rep/SignalQueue.hpp117
-rw-r--r--ndb/src/old_files/rep/TODO119
-rw-r--r--ndb/src/old_files/rep/adapters/AppNDB.cpp583
-rw-r--r--ndb/src/old_files/rep/adapters/AppNDB.hpp141
-rw-r--r--ndb/src/old_files/rep/adapters/ExtAPI.cpp31
-rw-r--r--ndb/src/old_files/rep/adapters/ExtAPI.hpp107
-rw-r--r--ndb/src/old_files/rep/adapters/ExtNDB.cpp559
-rw-r--r--ndb/src/old_files/rep/adapters/ExtNDB.hpp118
-rw-r--r--ndb/src/old_files/rep/adapters/Makefile11
-rw-r--r--ndb/src/old_files/rep/adapters/TableInfoPs.hpp118
-rw-r--r--ndb/src/old_files/rep/dbug_hack.cpp75
-rw-r--r--ndb/src/old_files/rep/rep_version.hpp88
-rw-r--r--ndb/src/old_files/rep/repapi/Makefile25
-rw-r--r--ndb/src/old_files/rep/repapi/repapi.cpp598
-rw-r--r--ndb/src/old_files/rep/repapi/repapi.h216
-rw-r--r--ndb/src/old_files/rep/state/Channel.cpp487
-rw-r--r--ndb/src/old_files/rep/state/Channel.hpp206
-rw-r--r--ndb/src/old_files/rep/state/Interval.cpp171
-rw-r--r--ndb/src/old_files/rep/state/Interval.hpp107
-rw-r--r--ndb/src/old_files/rep/state/Makefile17
-rw-r--r--ndb/src/old_files/rep/state/RepState.cpp869
-rw-r--r--ndb/src/old_files/rep/state/RepState.hpp276
-rw-r--r--ndb/src/old_files/rep/state/RepStateEvent.cpp284
-rw-r--r--ndb/src/old_files/rep/state/RepStateRequests.cpp294
-rw-r--r--ndb/src/old_files/rep/state/testInterval/Makefile12
-rw-r--r--ndb/src/old_files/rep/state/testInterval/testInterval.cpp127
-rw-r--r--ndb/src/old_files/rep/state/testRepState/Makefile15
-rw-r--r--ndb/src/old_files/rep/state/testRepState/testRequestor.cpp166
-rw-r--r--ndb/src/old_files/rep/state/testRepState/testRequestor.hpp24
-rw-r--r--ndb/src/old_files/rep/storage/GCIBuffer.cpp173
-rw-r--r--ndb/src/old_files/rep/storage/GCIBuffer.hpp112
-rw-r--r--ndb/src/old_files/rep/storage/GCIContainer.cpp272
-rw-r--r--ndb/src/old_files/rep/storage/GCIContainer.hpp121
-rw-r--r--ndb/src/old_files/rep/storage/GCIContainerPS.cpp128
-rw-r--r--ndb/src/old_files/rep/storage/GCIContainerPS.hpp90
-rw-r--r--ndb/src/old_files/rep/storage/GCIPage.cpp165
-rw-r--r--ndb/src/old_files/rep/storage/GCIPage.hpp114
-rw-r--r--ndb/src/old_files/rep/storage/LogRecord.hpp81
-rw-r--r--ndb/src/old_files/rep/storage/Makefile14
-rw-r--r--ndb/src/old_files/rep/storage/NodeConnectInfo.hpp29
-rw-r--r--ndb/src/old_files/rep/storage/NodeGroup.cpp149
-rw-r--r--ndb/src/old_files/rep/storage/NodeGroup.hpp109
-rw-r--r--ndb/src/old_files/rep/storage/NodeGroupInfo.cpp218
-rw-r--r--ndb/src/old_files/rep/storage/NodeGroupInfo.hpp145
-rw-r--r--ndb/src/old_files/rep/transfer/Makefile11
-rw-r--r--ndb/src/old_files/rep/transfer/TransPS.cpp553
-rw-r--r--ndb/src/old_files/rep/transfer/TransPS.hpp136
-rw-r--r--ndb/src/old_files/rep/transfer/TransSS.cpp653
-rw-r--r--ndb/src/old_files/rep/transfer/TransSS.hpp145
-rw-r--r--ndb/src/old_files/rep/transfer/TransSSSubscriptions.cpp193
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");
- }
-}