summaryrefslogtreecommitdiff
path: root/storage/ndb/src/kernel/blocks/trix/Trix.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/kernel/blocks/trix/Trix.hpp')
-rw-r--r--storage/ndb/src/kernel/blocks/trix/Trix.hpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/storage/ndb/src/kernel/blocks/trix/Trix.hpp b/storage/ndb/src/kernel/blocks/trix/Trix.hpp
new file mode 100644
index 00000000000..8dc01375fa1
--- /dev/null
+++ b/storage/ndb/src/kernel/blocks/trix/Trix.hpp
@@ -0,0 +1,191 @@
+/* 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 TRIX_H
+#define TRIX_H
+
+#include <SimulatedBlock.hpp>
+#include <trigger_definitions.h>
+#include <DataBuffer.hpp>
+#include <ArrayList.hpp>
+#include <SimpleProperties.hpp>
+#include <signaldata/DictTabInfo.hpp>
+#include <signaldata/CreateTrig.hpp>
+#include <signaldata/BuildIndx.hpp>
+
+// Error codes
+#define INTERNAL_ERROR_ILLEGAL_CALL 4344
+#define INTERNAL_ERROR_TRIX_BUSY 4345
+
+/**
+ * TRIX - This block manages triggers and index (in coop with DICT)
+ */
+class Trix : public SimulatedBlock
+{
+public:
+ Trix(const class Configuration & conf);
+ virtual ~Trix();
+
+public:
+ // Subscription data, when communicating with SUMA
+
+ enum RequestType {
+ TABLE_REORG = 0,
+ INDEX_BUILD = 1
+ };
+ typedef DataBuffer<11> AttrOrderBuffer;
+
+private:
+ // Private attributes
+
+ BLOCK_DEFINES(Trix);
+
+ // Declared but not defined
+ //DBtrix(const Trix &obj);
+ //void operator = (const Trix &);
+
+ // Block state
+ enum BlockState {
+ NOT_STARTED,
+ STARTED,
+ NODE_FAILURE,
+ IDLE,
+ BUSY
+ };
+
+ BlockState c_blockState;
+
+ // Node data needed when communicating with remote TRIX:es
+ struct NodeRecord {
+ bool alive;
+ BlockReference trixRef;
+ union {
+ Uint32 nextPool;
+ Uint32 nextList;
+ };
+ Uint32 prevList;
+ };
+
+ typedef Ptr<NodeRecord> NodeRecPtr;
+
+ /**
+ * The pool of node records
+ */
+ ArrayPool<NodeRecord> c_theNodeRecPool;
+
+ /**
+ * The list of other NDB nodes
+ */
+ ArrayList<NodeRecord> c_theNodes;
+
+ Uint32 c_masterNodeId;
+ BlockReference c_masterTrixRef;
+ Uint16 c_noNodesFailed;
+ Uint16 c_noActiveNodes;
+
+ AttrOrderBuffer::DataBufferPool c_theAttrOrderBufferPool;
+
+ struct SubscriptionRecord {
+ SubscriptionRecord(AttrOrderBuffer::DataBufferPool & aop):
+ attributeOrder(aop)
+ {}
+ RequestType requestType;
+ BlockReference userReference; // For user
+ Uint32 connectionPtr; // For user
+ Uint32 subscriptionId; // For Suma
+ Uint32 subscriptionKey; // For Suma
+ Uint32 prepareId; // For DbUtil
+ Uint32 indexType;
+ Uint32 sourceTableId;
+ Uint32 targetTableId;
+ AttrOrderBuffer attributeOrder;
+ Uint32 noOfIndexColumns;
+ Uint32 noOfKeyColumns;
+ Uint32 parallelism;
+ BuildIndxRef::ErrorCode errorCode;
+ bool subscriptionCreated;
+ bool pendingSubSyncContinueConf;
+ Uint32 expectedConf; // Count in n UTIL_EXECUTE_CONF + 1 SUB_SYNC_CONF
+ union {
+ Uint32 nextPool;
+ Uint32 nextList;
+ };
+ Uint32 prevList;
+ };
+
+ typedef Ptr<SubscriptionRecord> SubscriptionRecPtr;
+
+ /**
+ * The pool of node records
+ */
+ ArrayPool<SubscriptionRecord> c_theSubscriptionRecPool;
+
+ /**
+ * The list of other subscriptions
+ */
+ ArrayList<SubscriptionRecord> c_theSubscriptions;
+
+ // System start
+ void execSTTOR(Signal* signal);
+ void execNDB_STTOR(Signal* signal);
+
+ // Node management
+ void execREAD_NODESCONF(Signal* signal);
+ void execREAD_NODESREF(Signal* signal);
+ void execNODE_FAILREP(Signal* signal);
+ void execINCL_NODEREQ(Signal* signal);
+ // Debugging
+ void execDUMP_STATE_ORD(Signal* signal);
+
+ // Build index
+ void execBUILDINDXREQ(Signal* signal);
+ void execBUILDINDXCONF(Signal* signal);
+ void execBUILDINDXREF(Signal* signal);
+
+ void execUTIL_PREPARE_CONF(Signal* signal);
+ void execUTIL_PREPARE_REF(Signal* signal);
+ void execUTIL_EXECUTE_CONF(Signal* signal);
+ void execUTIL_EXECUTE_REF(Signal* signal);
+ void execUTIL_RELEASE_CONF(Signal* signal);
+ void execUTIL_RELEASE_REF(Signal* signal);
+
+ // Suma signals
+ void execSUB_CREATE_CONF(Signal* signal);
+ void execSUB_CREATE_REF(Signal* signal);
+ void execSUB_REMOVE_CONF(Signal* signal);
+ void execSUB_REMOVE_REF(Signal* signal);
+ void execSUB_SYNC_CONF(Signal* signal);
+ void execSUB_SYNC_REF(Signal* signal);
+ void execSUB_SYNC_CONTINUE_REQ(Signal* signal);
+ void execSUB_META_DATA(Signal* signal);
+ void execSUB_TABLE_DATA(Signal* signal);
+
+ // Utility functions
+ void setupSubscription(Signal* signal, SubscriptionRecPtr subRecPtr);
+ void setupTableScan(Signal* signal, SubscriptionRecPtr subRecPtr);
+ void startTableScan(Signal* signal, SubscriptionRecPtr subRecPtr);
+ void prepareInsertTransactions(Signal* signal, SubscriptionRecPtr subRecPtr);
+ void executeInsertTransaction(Signal* signal, SubscriptionRecPtr subRecPtr,
+ SegmentedSectionPtr headerPtr,
+ SegmentedSectionPtr dataPtr);
+ void buildComplete(Signal* signal, SubscriptionRecPtr subRecPtr);
+ void buildFailed(Signal* signal,
+ SubscriptionRecPtr subRecPtr,
+ BuildIndxRef::ErrorCode);
+ void checkParallelism(Signal* signal, SubscriptionRecord* subRec);
+};
+
+#endif