summaryrefslogtreecommitdiff
path: root/storage/ndb/src/kernel/blocks/suma/Suma.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/kernel/blocks/suma/Suma.hpp')
-rw-r--r--storage/ndb/src/kernel/blocks/suma/Suma.hpp635
1 files changed, 0 insertions, 635 deletions
diff --git a/storage/ndb/src/kernel/blocks/suma/Suma.hpp b/storage/ndb/src/kernel/blocks/suma/Suma.hpp
deleted file mode 100644
index 095b7f93bb3..00000000000
--- a/storage/ndb/src/kernel/blocks/suma/Suma.hpp
+++ /dev/null
@@ -1,635 +0,0 @@
-/* Copyright (c) 2003-2007 MySQL AB
- Use is subject to license terms
-
- 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; version 2 of the License.
-
- 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
-
-#ifndef SUMA_H
-#define SUMA_H
-
-#include <ndb_limits.h>
-#include <SimulatedBlock.hpp>
-
-#include <NodeBitmask.hpp>
-
-#include <SLList.hpp>
-#include <DLList.hpp>
-#include <DLFifoList.hpp>
-#include <KeyTable.hpp>
-#include <DataBuffer.hpp>
-#include <SignalCounter.hpp>
-#include <AttributeHeader.hpp>
-#include <AttributeList.hpp>
-
-#include <signaldata/UtilSequence.hpp>
-#include <signaldata/SumaImpl.hpp>
-#include <ndbapi/NdbDictionary.hpp>
-
-class Suma : public SimulatedBlock {
- BLOCK_DEFINES(Suma);
-public:
- Suma(Block_context& ctx);
- virtual ~Suma();
-
- /**
- * Private interface
- */
- void execSUB_CREATE_REQ(Signal* signal);
- void execSUB_REMOVE_REQ(Signal* signal);
-
- void execSUB_START_REQ(Signal* signal);
- void execSUB_STOP_REQ(Signal* signal);
-
- void execSUB_SYNC_REQ(Signal* signal);
- void execSUB_ABORT_SYNC_REQ(Signal* signal);
-
- void execSUB_STOP_CONF(Signal* signal);
- void execSUB_STOP_REF(Signal* signal);
-
- /**
- * Dict interface
- */
-#if 0
- void execLIST_TABLES_REF(Signal* signal);
- void execLIST_TABLES_CONF(Signal* signal);
-#endif
- void execGET_TABINFOREF(Signal* signal);
- void execGET_TABINFO_CONF(Signal* signal);
-
- void execGET_TABLEID_CONF(Signal* signal);
- void execGET_TABLEID_REF(Signal* signal);
-
- void execDROP_TAB_CONF(Signal* signal);
- void execALTER_TAB_REQ(Signal* signal);
- void execCREATE_TAB_CONF(Signal* signal);
- /**
- * Scan interface
- */
- void execSCAN_HBREP(Signal* signal);
- void execSCAN_FRAGREF(Signal* signal);
- void execSCAN_FRAGCONF(Signal* signal);
- void execTRANSID_AI(Signal* signal);
- void execSUB_SYNC_CONTINUE_REF(Signal* signal);
- void execSUB_SYNC_CONTINUE_CONF(Signal* signal);
-
- /**
- * Trigger logging
- */
- void execTRIG_ATTRINFO(Signal* signal);
- void execFIRE_TRIG_ORD(Signal* signal);
- void execSUB_GCP_COMPLETE_REP(Signal* signal);
-
- /**
- * DIH signals
- */
- void execDI_FCOUNTREF(Signal* signal);
- void execDI_FCOUNTCONF(Signal* signal);
- void execDIGETPRIMREF(Signal* signal);
- void execDIGETPRIMCONF(Signal* signal);
-
- /**
- * Trigger administration
- */
- void execCREATE_TRIG_REF(Signal* signal);
- void execCREATE_TRIG_CONF(Signal* signal);
- void execDROP_TRIG_REF(Signal* signal);
- void execDROP_TRIG_CONF(Signal* signal);
-
- /**
- * continueb
- */
- void execCONTINUEB(Signal* signal);
-
-public:
-
- void suma_ndbrequire(bool v);
-
- typedef DataBuffer<15> TableList;
-
- union FragmentDescriptor {
- struct {
- Uint16 m_fragmentNo;
- Uint16 m_nodeId;
- } m_fragDesc;
- Uint32 m_dummy;
- };
-
- /**
- * Used when sending SCAN_FRAG
- */
- union AttributeDescriptor {
- struct {
- Uint16 attrId;
- Uint16 unused;
- } m_attrDesc;
- Uint32 m_dummy;
- };
-
- struct Subscriber {
- Uint32 m_senderRef;
- Uint32 m_senderData;
- Uint32 m_subPtrI; //reference to subscription
- Uint32 nextList;
-
- union { Uint32 nextPool; Uint32 prevList; };
- };
- typedef Ptr<Subscriber> SubscriberPtr;
-
- /**
- * Subscriptions
- */
-
- struct Subscription {
- Subscription() {}
- Uint32 m_senderRef;
- Uint32 m_senderData;
- Uint32 m_subscriptionId;
- Uint32 m_subscriptionKey;
- Uint32 m_subscriptionType;
- Uint16 m_options;
-
- enum Options {
- REPORT_ALL = 0x1,
- REPORT_SUBSCRIBE = 0x2
- };
-
- enum State {
- UNDEFINED,
- LOCKED,
- DEFINED,
- DROPPED
- };
- State m_state;
- Uint32 n_subscribers;
-
- Uint32 nextHash;
- union { Uint32 prevHash; Uint32 nextPool; };
-
- Uint32 hashValue() const {
- return m_subscriptionId + m_subscriptionKey;
- }
-
- bool equal(const Subscription & s) const {
- return
- m_subscriptionId == s.m_subscriptionId &&
- m_subscriptionKey == s.m_subscriptionKey;
- }
- /**
- * The following holds the tables included
- * in the subscription.
- */
- Uint32 m_tableId;
- Uint32 m_table_ptrI;
- Uint32 m_current_sync_ptrI;
- };
- typedef Ptr<Subscription> SubscriptionPtr;
-
- class Table;
- friend class Table;
- typedef Ptr<Table> TablePtr;
-
- struct SyncRecord {
- SyncRecord(Suma& s, DataBuffer<15>::DataBufferPool & p)
- : m_tableList(p), suma(s)
-#ifdef ERROR_INSERT
- , cerrorInsert(s.cerrorInsert)
-#endif
- {}
-
- void release();
-
- Uint32 m_senderRef;
- Uint32 m_senderData;
-
- Uint32 m_subscriptionPtrI;
- Uint32 m_error;
- Uint32 m_currentTable;
- TableList m_tableList; // Tables to sync
- TableList::DataBufferIterator m_tableList_it;
-
- /**
- * Sync data
- */
- Uint32 m_currentFragment; // Index in tabPtr.p->m_fragments
- DataBuffer<15>::Head m_attributeList; // Attribute if other than default
- DataBuffer<15>::Head m_tabList; // tables if other than default
-
- Uint32 m_currentTableId; // Current table
- Uint32 m_currentNoOfAttributes; // No of attributes for current table
-
- void startScan(Signal*);
- void nextScan(Signal*);
- bool getNextFragment(TablePtr * tab, FragmentDescriptor * fd);
- void completeScan(Signal*, int error= 0);
-
- Suma & suma;
-#ifdef ERROR_INSERT
- UintR &cerrorInsert;
-#endif
- BlockNumber number() const { return suma.number(); }
- void progError(int line, int cause, const char * extra) {
- suma.progError(line, cause, extra);
- }
-
- Uint32 prevList; Uint32 ptrI;
- union { Uint32 nextPool; Uint32 nextList; };
- };
- friend struct SyncRecord;
-
- int initTable(Signal *signal,Uint32 tableId, TablePtr &tabPtr,
- Ptr<SyncRecord> syncPtr);
- int initTable(Signal *signal,Uint32 tableId, TablePtr &tabPtr,
- SubscriberPtr subbPtr);
- int initTable(Signal *signal,Uint32 tableId, TablePtr &tabPtr);
-
- int completeOneSubscriber(Signal* signal, TablePtr tabPtr, SubscriberPtr subbPtr);
- void completeAllSubscribers(Signal* signal, TablePtr tabPtr);
- void completeInitTable(Signal* signal, TablePtr tabPtr);
-
- struct Table {
- Table() { m_tableId = ~0; n_subscribers = 0; }
- void release(Suma&);
- void checkRelease(Suma &suma);
-
- DLList<Subscriber>::Head c_subscribers;
- DLList<SyncRecord>::Head c_syncRecords;
-
- enum State {
- UNDEFINED,
- DEFINING,
- DEFINED,
- DROPPED,
- ALTERED
- };
- State m_state;
-
- Uint32 m_ptrI;
- SubscriberPtr m_drop_subbPtr;
-
- Uint32 n_subscribers;
- bool m_reportAll;
-
- bool parseTable(SegmentedSectionPtr ptr, Suma &suma);
- /**
- * Create triggers
- */
- int setupTrigger(Signal* signal, Suma &suma);
- void completeTrigger(Signal* signal);
- void createAttributeMask(AttributeMask&, Suma &suma);
-
- /**
- * Drop triggers
- */
- void dropTrigger(Signal* signal,Suma&);
- void runDropTrigger(Signal* signal, Uint32 triggerId,Suma&);
-
- /**
- * Sync meta
- */
-#if 0
- void runLIST_TABLES_CONF(Signal* signal);
-#endif
-
- union { Uint32 m_tableId; Uint32 key; };
- Uint32 m_schemaVersion;
- Uint8 m_hasTriggerDefined[3]; // Insert/Update/Delete
- Uint8 m_hasOutstandingTriggerReq[3]; // Insert/Update/Delete
- Uint32 m_triggerIds[3]; // Insert/Update/Delete
-
- Uint32 m_error;
- /**
- * Default order in which to ask for attributes during scan
- * 1) Fixed, not nullable
- * 2) Rest
- */
- DataBuffer<15>::Head m_attributes; // Attribute id's
-
- /**
- * Fragments
- */
- Uint32 m_fragCount;
- DataBuffer<15>::Head m_fragments; // Fragment descriptors
-
- /**
- * Hash table stuff
- */
- Uint32 nextHash;
- union { Uint32 prevHash; Uint32 nextPool; };
- Uint32 hashValue() const {
- return m_tableId;
- }
- bool equal(const Table& rec) const {
- return m_tableId == rec.m_tableId;
- }
- };
-
- /**
- *
- */
- DLList<Subscriber> c_metaSubscribers;
- DLList<Subscriber> c_removeDataSubscribers;
-
- /**
- * Lists
- */
- KeyTable<Table> c_tables;
- DLHashTable<Subscription> c_subscriptions;
-
- /**
- * Pools
- */
- ArrayPool<Subscriber> c_subscriberPool;
- ArrayPool<Table> c_tablePool;
- ArrayPool<Subscription> c_subscriptionPool;
- ArrayPool<SyncRecord> c_syncPool;
- DataBuffer<15>::DataBufferPool c_dataBufferPool;
-
- NodeBitmask c_failedApiNodes;
-
- /**
- * Functions
- */
- bool removeSubscribersOnNode(Signal *signal, Uint32 nodeId);
-
- bool checkTableTriggers(SegmentedSectionPtr ptr);
-
- void addTableId(Uint32 TableId,
- SubscriptionPtr subPtr, SyncRecord *psyncRec);
-
- void sendSubIdRef(Signal* signal,Uint32 senderRef,Uint32 senderData,Uint32 errorCode);
- void sendSubCreateRef(Signal* signal, Uint32 errorCode);
- void sendSubStartRef(Signal*, SubscriberPtr, Uint32 errorCode, SubscriptionData::Part);
- void sendSubStartRef(Signal* signal, Uint32 errorCode);
- void sendSubStopRef(Signal* signal, Uint32 errorCode);
- void sendSubSyncRef(Signal* signal, Uint32 errorCode);
- void sendSubRemoveRef(Signal* signal, const SubRemoveReq& ref,
- Uint32 errorCode);
- void sendSubStartComplete(Signal*, SubscriberPtr, Uint32,
- SubscriptionData::Part);
- void sendSubStopComplete(Signal*, SubscriberPtr);
- void sendSubStopReq(Signal* signal, bool unlock= false);
-
- void completeSubRemove(SubscriptionPtr subPtr);
-
- void reportAllSubscribers(Signal *signal,
- NdbDictionary::Event::_TableEvent table_event,
- SubscriptionPtr subPtr,
- SubscriberPtr subbPtr);
-
- Uint32 getFirstGCI(Signal* signal);
-
- /**
- * Table admin
- */
- void convertNameToId( SubscriptionPtr subPtr, Signal * signal);
-
- /**
- * Public interface
- */
- void execCREATE_SUBSCRIPTION_REQ(Signal* signal);
- void execDROP_SUBSCRIPTION_REQ(Signal* signal);
-
- void execSTART_SUBSCRIPTION_REQ(Signal* signal);
- void execSTOP_SUBSCRIPTION_REQ(Signal* signal);
-
- void execSYNC_SUBSCRIPTION_REQ(Signal* signal);
- void execABORT_SYNC_REQ(Signal* signal);
-
- /**
- * Framework signals
- */
-
- void getNodeGroupMembers(Signal* signal);
-
- void execREAD_CONFIG_REQ(Signal* signal);
-
- void execSTTOR(Signal* signal);
- void sendSTTORRY(Signal*);
- void execNDB_STTOR(Signal* signal);
- void execDUMP_STATE_ORD(Signal* signal);
- void execREAD_NODESCONF(Signal* signal);
- void execNODE_FAILREP(Signal* signal);
- void execINCL_NODEREQ(Signal* signal);
- void execSIGNAL_DROPPED_REP(Signal* signal);
- void execAPI_START_REP(Signal* signal);
- void execAPI_FAILREQ(Signal* signal) ;
-
- void execSUB_GCP_COMPLETE_ACK(Signal* signal);
-
- /**
- * Controller interface
- */
- void execSUB_CREATE_REF(Signal* signal);
- void execSUB_CREATE_CONF(Signal* signal);
-
- void execSUB_DROP_REF(Signal* signal);
- void execSUB_DROP_CONF(Signal* signal);
-
- void execSUB_START_REF(Signal* signal);
- void execSUB_START_CONF(Signal* signal);
-
- void execSUB_ABORT_SYNC_REF(Signal* signal);
- void execSUB_ABORT_SYNC_CONF(Signal* signal);
-
- void execSUMA_START_ME_REQ(Signal* signal);
- void execSUMA_START_ME_REF(Signal* signal);
- void execSUMA_START_ME_CONF(Signal* signal);
- void execSUMA_HANDOVER_REQ(Signal* signal);
- void execSUMA_HANDOVER_REF(Signal* signal);
- void execSUMA_HANDOVER_CONF(Signal* signal);
-
- /**
- * Subscription generation interface
- */
- void createSequence(Signal* signal);
- void createSequenceReply(Signal* signal,
- UtilSequenceConf* conf,
- UtilSequenceRef* ref);
- void execUTIL_SEQUENCE_CONF(Signal* signal);
- void execUTIL_SEQUENCE_REF(Signal* signal);
- void execCREATE_SUBID_REQ(Signal* signal);
-
- /**
- * for Suma that is restarting another
- */
-
- struct Restart {
- Restart(Suma& s);
-
- Suma & suma;
- Uint32 nodeId;
-
- DLHashTable<Subscription>::Iterator c_subIt;
- KeyTable<Table>::Iterator c_tabIt;
-
- void progError(int line, int cause, const char * extra) {
- suma.progError(line, cause, extra);
- }
-
- void resetNode(Uint32 sumaRef);
- void runSUMA_START_ME_REQ(Signal*, Uint32 sumaRef);
- void startNode(Signal*, Uint32 sumaRef);
-
- void createSubscription(Signal* signal, Uint32 sumaRef);
- void nextSubscription(Signal* signal, Uint32 sumaRef);
- void runSUB_CREATE_CONF(Signal* signal);
- void completeSubscription(Signal* signal, Uint32 sumaRef);
-
- void startSubscriber(Signal* signal, Uint32 sumaRef);
- void nextSubscriber(Signal* signal, Uint32 sumaRef, SubscriberPtr subbPtr);
- void sendSubStartReq(SubscriptionPtr subPtr, SubscriberPtr subbPtr,
- Signal* signal, Uint32 sumaRef);
- void runSUB_START_CONF(Signal* signal);
- void completeSubscriber(Signal* signal, Uint32 sumaRef);
-
- void completeRestartingNode(Signal* signal, Uint32 sumaRef);
- void resetRestart(Signal* signal);
- } Restart;
-
-private:
- friend class Restart;
- /**
- * Variables
- */
- NodeId c_masterNodeId;
- NdbNodeBitmask c_alive_nodes;
-
- /**
- * for restarting Suma not to start sending data too early
- */
- struct Startup
- {
- bool m_wait_handover;
- Uint32 m_restart_server_node_id;
- NdbNodeBitmask m_handover_nodes;
- } c_startup;
-
- NodeBitmask c_connected_nodes; // (NODE/API) START REP / (API/NODE) FAIL REQ
- NodeBitmask c_subscriber_nodes; //
-
- /**
- * for all Suma's to keep track of other Suma's in Node group
- */
- Uint32 c_nodeGroup;
- Uint32 c_noNodesInGroup;
- Uint32 c_nodesInGroup[MAX_REPLICAS];
- NdbNodeBitmask c_nodes_in_nodegroup_mask; // NodeId's of nodes in nodegroup
-
- void send_start_me_req(Signal* signal);
- void check_start_handover(Signal* signal);
- void send_handover_req(Signal* signal);
-
- Uint32 get_responsible_node(Uint32 B) const;
- Uint32 get_responsible_node(Uint32 B, const NdbNodeBitmask& mask) const;
- bool check_switchover(Uint32 bucket, Uint32 gci);
-
-public:
- struct Page_pos
- {
- Uint32 m_page_id;
- Uint32 m_page_pos;
- Uint32 m_max_gci; // max gci on page
- Uint32 m_last_gci; // last gci on page
- };
-private:
-
- struct Bucket
- {
- enum {
- BUCKET_STARTING = 0x1 // On starting node
- ,BUCKET_HANDOVER = 0x2 // On running node
- ,BUCKET_TAKEOVER = 0x4 // On takeing over node
- ,BUCKET_RESEND = 0x8 // On takeing over node
- };
- Uint16 m_state;
- Uint16 m_switchover_node;
- Uint16 m_nodes[MAX_REPLICAS];
- Uint32 m_switchover_gci;
- Uint32 m_max_acked_gci;
- Uint32 m_buffer_tail; // Page
- Page_pos m_buffer_head;
- };
-
- struct Buffer_page
- {
- STATIC_CONST( DATA_WORDS = 8192 - 9);
- Uint32 _tupdata1;
- Uint32 _tupdata2;
- Uint32 _tupdata3;
- Uint32 _tupdata4;
- Uint32 m_page_state; // Used by TUP buddy algorithm
- Uint32 m_page_chunk_ptr_i;
- Uint32 m_next_page;
- Uint32 m_words_used; //
- Uint32 m_max_gci; //
- Uint32 m_data[DATA_WORDS];
- };
-
- STATIC_CONST( NO_OF_BUCKETS = 24 ); // 24 = 4*3*2*1!
- Uint32 c_no_of_buckets;
- struct Bucket c_buckets[NO_OF_BUCKETS];
-
- STATIC_CONST( BUCKET_MASK_SIZE = (((NO_OF_BUCKETS+31)>> 5)) );
- typedef Bitmask<BUCKET_MASK_SIZE> Bucket_mask;
- Bucket_mask m_active_buckets;
- Bucket_mask m_switchover_buckets;
-
- class Dbtup* m_tup;
- void init_buffers();
- Uint32* get_buffer_ptr(Signal*, Uint32 buck, Uint32 gci, Uint32 sz);
- Uint32 seize_page();
- void free_page(Uint32 page_id, Buffer_page* page);
- void out_of_buffer(Signal*);
- void out_of_buffer_release(Signal* signal, Uint32 buck);
-
- void start_resend(Signal*, Uint32 bucket);
- void resend_bucket(Signal*, Uint32 bucket, Uint32 gci,
- Uint32 page_pos, Uint32 last_gci);
- void release_gci(Signal*, Uint32 bucket, Uint32 gci);
-
- Uint32 m_max_seen_gci; // FIRE_TRIG_ORD
- Uint32 m_max_sent_gci; // FIRE_TRIG_ORD -> send
- Uint32 m_last_complete_gci; // SUB_GCP_COMPLETE_REP
- Uint32 m_out_of_buffer_gci;
- Uint32 m_gcp_complete_rep_count;
-
- struct Gcp_record
- {
- Uint32 m_gci;
- NodeBitmask m_subscribers;
- union {
- Uint32 nextPool;
- Uint32 nextList;
- };
- Uint32 prevList;
- };
- ArrayPool<Gcp_record> c_gcp_pool;
- DLFifoList<Gcp_record> c_gcp_list;
-
- struct Page_chunk
- {
- Uint32 m_page_id;
- Uint32 m_size;
- Uint32 m_free;
- union {
- Uint32 nextPool;
- Uint32 nextList;
- };
- Uint32 prevList;
- };
-
- Uint32 m_first_free_page;
- ArrayPool<Page_chunk> c_page_chunk_pool;
-};
-
-#endif