diff options
Diffstat (limited to 'storage/ndb/src/kernel/blocks/trix/Trix.hpp')
-rw-r--r-- | storage/ndb/src/kernel/blocks/trix/Trix.hpp | 191 |
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 |