/* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. 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 St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef SUMA_IMPL_HPP #define SUMA_IMPL_HPP #include "SignalData.hpp" #include #define JAM_FILE_ID 79 struct SubCreateReq { friend bool printSUB_CREATE_REQ(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 7 ); enum SubscriptionType { SingleTableScan = 1, // DatabaseSnapshot = 2, // All tables/all data (including new ones) TableEvent = 3, // SelectiveTableSnapshot = 4, // User defines tables RemoveFlags = 0xff, GetFlags = 0xff << 16, RestartFlag = 0x2 << 16, ReportAll = 0x4 << 16, ReportSubscribe= 0x8 << 16, NoReportDDL = 0x10 << 16, NR_Sub_Dropped = 0x1 << 24 // sub is dropped but needs to be copied }; Uint32 senderRef; Uint32 senderData; Uint32 subscriptionId; Uint32 subscriptionKey; Uint32 subscriptionType; Uint32 tableId; Uint32 schemaTransId; }; struct SubCreateRef { friend bool printSUB_CREATE_REF(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 3 ); Uint32 senderRef; Uint32 senderData; Uint32 errorCode; enum ErrorCode { SubscriptionAlreadyExist = 1415 ,OutOfSubscriptionRecords = 1422 ,OutOfTableRecords = 1423 ,TableDropped = 1417 ,NF_FakeErrorREF = 11 ,NotStarted = 1428 }; }; struct SubCreateConf { friend bool printSUB_CREATE_CONF(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 2 ); Uint32 senderRef; Uint32 senderData; }; struct SubscriptionData { enum Part { MetaData = 1, TableData = 2 }; }; struct SubStartReq { /** * Sender(s)/Reciver(s) */ friend class Suma; friend bool printSUB_START_REQ(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 7 ); Uint32 senderRef; Uint32 senderData; Uint32 subscriptionId; Uint32 subscriptionKey; Uint32 part; // SubscriptionData::Part Uint32 subscriberData; Uint32 subscriberRef; }; struct SubStartRef { /** * Sender(s)/Reciver(s) */ friend class Suma; friend bool printSUB_START_REF(FILE *, const Uint32 *, Uint32, Uint16); enum ErrorCode { Undefined = 1, NF_FakeErrorREF = 11, Busy = 701, PartiallyConnected = 1421, NoSuchSubscription = 1407, Locked = 1411, Dropped = 1418, Defining = 1418, OutOfSubscriberRecords = 1412, OutOfSubOpRecords = 1424, NotMaster = 702, // For API/DICT communication BusyWithNR = 1405, NodeDied = 1427 ,NotStarted = 1428 ,SubscriberNodeIdUndefined = 1429 }; STATIC_CONST( SignalLength = 7 ); STATIC_CONST( SignalLength2 = SignalLength+1 ); STATIC_CONST( SL_MasterNode = 9 ); Uint32 senderRef; Uint32 senderData; Uint32 subscriptionId; Uint32 subscriptionKey; Uint32 part; // SubscriptionData::Part Uint32 subscriberData; // do not change the order here! Uint32 errorCode; // with SignalLength2 union { Uint32 subscriberRef; Uint32 m_masterNodeId; }; }; struct SubStartConf { /** * Sender(s)/Reciver(s) */ friend bool printSUB_START_CONF(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 9 ); Uint32 senderRef; Uint32 senderData; Uint32 subscriptionId; Uint32 subscriptionKey; Uint32 firstGCI; Uint32 part; // SubscriptionData::Part Uint32 subscriberData; Uint32 bucketCount; Uint32 nodegroup; }; struct SubStopReq { /** * Sender(s)/Reciver(s) */ friend class Suma; enum RequestInfo { RI_ABORT_START = 0x1 }; friend bool printSUB_STOP_REQ(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 8 ); Uint32 senderRef; Uint32 senderData; Uint32 subscriptionId; Uint32 subscriptionKey; Uint32 part; // SubscriptionData::Part Uint32 subscriberData; Uint32 subscriberRef; Uint32 requestInfo; }; struct SubStopRef { /** * Sender(s)/Reciver(s) */ friend class Suma; friend bool printSUB_STOP_REF(FILE *, const Uint32 *, Uint32, Uint16); enum ErrorCode { Undefined = 1, NF_FakeErrorREF = 11, Busy = 701, NoSuchSubscription = 1407, Locked = 1411, Defining = 1425, OutOfSubOpRecords = 1424, NoSuchSubscriber = 1426, NotMaster = 702, BusyWithNR = 1405 ,NotStarted = 1428 }; STATIC_CONST( SignalLength = 8 ); STATIC_CONST( SL_MasterNode = 9 ); Uint32 senderRef; Uint32 senderData; Uint32 subscriptionId; Uint32 subscriptionKey; Uint32 part; // SubscriptionData::Part Uint32 subscriberData; Uint32 subscriberRef; Uint32 errorCode; Uint32 m_masterNodeId; }; struct SubStopConf { /** * Sender(s)/Reciver(s) */ friend bool printSUB_STOP_CONF(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLengthWithGci = 9 ); STATIC_CONST( SignalLength = 9 ); Uint32 senderRef; Uint32 senderData; Uint32 subscriptionId; Uint32 subscriptionKey; Uint32 part; // SubscriptionData::Part Uint32 subscriberData; Uint32 subscriberRef; // Uint32 gci_hi; Uint32 gci_lo; }; struct SubSyncReq { /** * Sender(s)/Reciver(s) */ friend class Suma; friend bool printSUB_SYNC_REQ(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 8 ); Uint32 senderRef; Uint32 senderData; Uint32 subscriptionId; Uint32 subscriptionKey; Uint32 part; // SubscriptionData::Part Uint32 requestInfo; Uint32 fragCount; Uint32 fragId; // ZNIL if not used enum { LM_Exclusive = 0x1 ,Reorg = 0x2 ,NoDisk = 0x4 ,TupOrder = 0x8 ,LM_CommittedRead = 0x10 ,RangeScan = 0x20 ,StatScan = 0x40 }; SECTION( ATTRIBUTE_LIST = 0); // Used when doing SingelTableScan SECTION( TABLE_LIST = 1 ); SECTION( TUX_BOUND_INFO = 1); // If range scan }; struct SubSyncRef { /** * Sender(s)/Reciver(s) */ friend class Suma; friend bool printSUB_SYNC_REF(FILE *, const Uint32 *, Uint32, Uint16); enum ErrorCode { Undefined = 1 }; STATIC_CONST( SignalLength = 3 ); Uint32 senderRef; Uint32 senderData; Uint32 errorCode; Uint32 masterNodeId; }; struct SubSyncConf { /** * Sender(s)/Reciver(s) */ friend class Suma; friend bool printSUB_SYNC_CONF(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 2 ); Uint32 senderRef; Uint32 senderData; }; struct SubTableData { friend bool printSUB_TABLE_DATA(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 8 ); STATIC_CONST( SignalLengthWithTransId = 10 ); SECTION( DICT_TAB_INFO = 0 ); SECTION( ATTR_INFO = 0 ); SECTION( AFTER_VALUES = 1 ); SECTION( BEFORE_VALUES = 2 ); enum Flags { SCAN = 1, LOG = 2, REMOVE_FLAGS = 0xff }; Uint32 senderData; Uint32 gci_hi; Uint32 tableId; Uint32 requestInfo; Uint32 flags; union { Uint32 changeMask; Uint32 anyValue; Uint32 takeOver; }; Uint32 totalLen; Uint32 gci_lo; Uint32 transId1; Uint32 transId2; static void setOperation(Uint32& ri, Uint32 val) { ri = (ri & 0xFFFFFF00) | val; } static void setReqNodeId(Uint32& ri, Uint32 val) { ri = (ri & 0xFFFF00FF) | (val << 8); } static void setNdbdNodeId(Uint32& ri, Uint32 val) { ri = (ri & 0xFF00FFFF) | (val << 16); } static Uint32 getOperation(const Uint32 & ri){ return (ri & 0xFF); } static Uint32 getReqNodeId(const Uint32 & ri){ return (ri >> 8) & 0xFF; } static Uint32 getNdbdNodeId(const Uint32 & ri){ return (ri >> 16) & 0xFF; } }; struct SubSyncContinueReq { /** * Sender(s)/Reciver(s) */ friend class Trix; friend bool printSUB_SYNC_CONTINUE_REQ(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 3 ); Uint32 subscriberData; Uint32 noOfRowsSent; Uint32 senderData; }; struct SubSyncContinueRef { /** * Sender(s)/Reciver(s) */ friend class Trix; friend bool printSUB_SYNC_CONTINUE_REF(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 3 ); Uint32 subscriptionId; Uint32 subscriptionKey; Uint32 senderData; }; struct SubSyncContinueConf { /** * Sender(s)/Reciver(s) */ friend class Trix; friend bool printSUB_SYNC_CONTINUE_CONF(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 3 ); Uint32 subscriptionId; Uint32 subscriptionKey; Uint32 senderData; }; struct SubGcpCompleteRep { /** * Sender(s)/Reciver(s) */ friend class Dbdih; friend class Trix; friend bool printSUB_GCP_COMPLETE_REP(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 5 ); STATIC_CONST( ON_DISK = 1 ); STATIC_CONST( IN_MEMORY = 2 ); STATIC_CONST( MISSING_DATA = 4 ); STATIC_CONST( ADD_CNT = 8 ); // Uses hi 16-bit for delta STATIC_CONST( SUB_CNT = 16); // Uses hi 16-bit for delta STATIC_CONST( SUB_DATA_STREAMS_IN_SIGNAL = 32); // Whether sub datat stream identifiers are appended to signal // If the number of sub data streams increase in future, we may need to put the identifiers in a separate section. Uint32 gci_hi; Uint32 senderRef; Uint32 gcp_complete_rep_count; Uint32 gci_lo; Uint32 flags; /** * If SUB_DATA_STREAMS_IN_SIGNAL flag is set, * gcp_complete_rep_count will indicate the number of 16-bit data * stream identifiers appended. A word is packed with two stream * identifiers. If and odd number of identifiers are indicated, * the high 16-bit of last word are not used, but should be zero * filled. */ Uint32 sub_data_streams[1]; }; struct SubGcpCompleteAck { /** * Sender(s)/Reciver(s) */ STATIC_CONST( SignalLength = SubGcpCompleteRep::SignalLength ); SubGcpCompleteRep rep; }; struct SubRemoveReq { friend bool printSUB_REMOVE_REQ(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 4 ); Uint32 senderRef; Uint32 senderData; Uint32 subscriptionId; Uint32 subscriptionKey; }; struct SubRemoveRef { friend bool printSUB_REMOVE_REF(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 5 ); enum ErrorCode { Undefined = 1, NF_FakeErrorREF = 11, Busy = 701, NoSuchSubscription = 1407, Locked = 1411, Defining = 1418, AlreadyDropped = 1419 ,NotStarted = 1428 }; Uint32 senderRef; Uint32 subscriptionId; Uint32 subscriptionKey; Uint32 errorCode; Uint32 senderData; }; struct SubRemoveConf { friend bool printSUB_REMOVE_CONF(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 5 ); Uint32 senderRef; Uint32 subscriptionId; Uint32 subscriptionKey; Uint32 errorCode; Uint32 senderData; }; struct CreateSubscriptionIdReq { friend bool printCREATE_SUBSCRIPTION_ID_REQ(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 2 ); Uint32 senderRef; Uint32 senderData; }; struct CreateSubscriptionIdConf { friend bool printCREATE_SUBSCRIPTION_ID_CONF(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 4 ); Uint32 senderRef; Uint32 senderData; Uint32 subscriptionId; Uint32 subscriptionKey; }; struct CreateSubscriptionIdRef { friend bool printCREATE_SUBSCRIPTION_ID_REF(FILE *, const Uint32 *, Uint32, Uint16); STATIC_CONST( SignalLength = 3 ); Uint32 senderRef; Uint32 senderData; Uint32 errorCode; }; struct SumaStartMeReq { STATIC_CONST( SignalLength = 1 ); Uint32 unused; }; struct SumaStartMeRef { STATIC_CONST( SignalLength = 1 ); Uint32 errorCode; enum { Busy = 0x1 ,NotStarted = 0x2 }; }; struct SumaStartMeConf { STATIC_CONST( SignalLength = 1 ); Uint32 unused; }; struct SumaHandoverReq { STATIC_CONST( SignalLength = 4 ); Uint32 gci; Uint32 nodeId; Uint32 theBucketMask[1]; Uint32 requestType; enum RequestType { RT_START_NODE = 0, RT_STOP_NODE = 1 }; }; struct SumaHandoverConf { STATIC_CONST( SignalLength = 4 ); Uint32 gci; Uint32 nodeId; Uint32 theBucketMask[1]; Uint32 requestType; }; struct SumaContinueB { enum { RESEND_BUCKET = 1 ,RELEASE_GCI = 2 ,OUT_OF_BUFFER_RELEASE = 3 ,API_FAIL_GCI_LIST = 4 ,API_FAIL_SUBSCRIBER_LIST = 5 ,API_FAIL_SUBSCRIPTION = 6 ,SUB_STOP_REQ = 7 ,RETRY_DICT_LOCK = 8 ,HANDOVER_WAIT_TIMEOUT = 9 }; }; #undef JAM_FILE_ID #endif