diff options
Diffstat (limited to 'storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp')
-rw-r--r-- | storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp | 1470 |
1 files changed, 1470 insertions, 0 deletions
diff --git a/storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp b/storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp new file mode 100644 index 00000000000..6a65da5bb6a --- /dev/null +++ b/storage/ndb/src/kernel/blocks/dbacc/Dbacc.hpp @@ -0,0 +1,1470 @@ +/* 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 DBACC_H +#define DBACC_H + + + +#include <pc.hpp> +#include <SimulatedBlock.hpp> + +// primary key is stored in TUP +#include <Dbtup.hpp> + +#ifdef DBACC_C +// Debug Macros +#define dbgWord32(ptr, ind, val) + +/* +#define dbgWord32(ptr, ind, val) \ +if(debug_jan){ \ +tmp_val = val; \ +switch(ind){ \ +case 1: strcpy(tmp_string, "ZPOS_PAGE_TYPE "); \ +break; \ +case 2: strcpy(tmp_string, "ZPOS_NO_ELEM_IN_PAGE"); \ +break; \ +case 3: strcpy(tmp_string, "ZPOS_CHECKSUM "); \ +break; \ +case 4: strcpy(tmp_string, "ZPOS_OVERFLOWREC "); \ +break; \ +case 5: strcpy(tmp_string, "ZPOS_FREE_AREA_IN_PAGE"); \ +break; \ +case 6: strcpy(tmp_string, "ZPOS_LAST_INDEX "); \ +break; \ +case 7: strcpy(tmp_string, "ZPOS_INSERT_INDEX "); \ +break; \ +case 8: strcpy(tmp_string, "ZPOS_ARRAY_POS "); \ +break; \ +case 9: strcpy(tmp_string, "ZPOS_NEXT_FREE_INDEX"); \ +break; \ +case 10: strcpy(tmp_string, "ZPOS_NEXT_PAGE "); \ +break; \ +case 11: strcpy(tmp_string, "ZPOS_PREV_PAGE "); \ +break; \ +default: sprintf(tmp_string, "%-20d", ind);\ +} \ +ndbout << "Ptr: " << ptr.p->word32 << " \tIndex: " << tmp_string << " \tValue: " << tmp_val << " \tLINE: " << __LINE__ << endl; \ +}\ +*/ + +#define dbgUndoword(ptr, ind, val) + +// Constants +/** ------------------------------------------------------------------------ + * THESE ARE CONSTANTS THAT ARE USED FOR DEFINING THE SIZE OF BUFFERS, THE + * SIZE OF PAGE HEADERS, THE NUMBER OF BUFFERS IN A PAGE AND A NUMBER OF + * OTHER CONSTANTS WHICH ARE CHANGED WHEN THE BUFFER SIZE IS CHANGED. + * ----------------------------------------------------------------------- */ +#define ZHEAD_SIZE 32 +#define ZCON_HEAD_SIZE 2 +#define ZBUF_SIZE 28 +#define ZEMPTYLIST 72 +#define ZUP_LIMIT 14 +#define ZDOWN_LIMIT 12 +#define ZSHIFT_PLUS 5 +#define ZSHIFT_MINUS 2 +#define ZFREE_LIMIT 65 +#define ZNO_CONTAINERS 64 +#define ZELEM_HEAD_SIZE 1 +/* ------------------------------------------------------------------------- */ +/* THESE CONSTANTS DEFINE THE USE OF THE PAGE HEADER IN THE INDEX PAGES. */ +/* ------------------------------------------------------------------------- */ +#define ZPOS_PAGE_ID 0 +#define ZPOS_PAGE_TYPE 1 +#define ZPOS_PAGE_TYPE_BIT 14 +#define ZPOS_EMPTY_LIST 1 +#define ZPOS_ALLOC_CONTAINERS 2 +#define ZPOS_CHECKSUM 3 +#define ZPOS_OVERFLOWREC 4 +#define ZPOS_NO_ELEM_IN_PAGE 2 +#define ZPOS_FREE_AREA_IN_PAGE 5 +#define ZPOS_LAST_INDEX 6 +#define ZPOS_INSERT_INDEX 7 +#define ZPOS_ARRAY_POS 8 +#define ZPOS_NEXT_FREE_INDEX 9 +#define ZPOS_NEXT_PAGE 10 +#define ZPOS_PREV_PAGE 11 +#define ZNORMAL_PAGE_TYPE 0 +#define ZOVERFLOW_PAGE_TYPE 1 +#define ZDEFAULT_LIST 3 +#define ZWORDS_IN_PAGE 2048 +/* --------------------------------------------------------------------------------- */ +/* CONSTANTS FOR THE ZERO PAGES */ +/* --------------------------------------------------------------------------------- */ +#define ZPAGEZERO_PREV_UNDOP 8 +#define ZPAGEZERO_NO_OVER_PAGE 9 +#define ZPAGEZERO_TABID 10 +#define ZPAGEZERO_FRAGID0 11 +#define ZPAGEZERO_FRAGID1 12 +#define ZPAGEZERO_HASH_CHECK 13 +#define ZPAGEZERO_DIRSIZE 14 +#define ZPAGEZERO_EXPCOUNTER 15 +#define ZPAGEZERO_NEXT_UNDO_FILE 16 +#define ZPAGEZERO_SLACK 17 +#define ZPAGEZERO_NO_PAGES 18 +#define ZPAGEZERO_HASHCHECKBIT 19 +#define ZPAGEZERO_K 20 +#define ZPAGEZERO_LHFRAGBITS 21 +#define ZPAGEZERO_LHDIRBITS 22 +#define ZPAGEZERO_LOCALKEYLEN 23 +#define ZPAGEZERO_MAXP 24 +#define ZPAGEZERO_MAXLOADFACTOR 25 +#define ZPAGEZERO_MINLOADFACTOR 26 +#define ZPAGEZERO_MYFID 27 +#define ZPAGEZERO_LAST_OVER_INDEX 28 +#define ZPAGEZERO_P 29 +#define ZPAGEZERO_NO_OF_ELEMENTS 30 +#define ZPAGEZERO_ELEMENT_LENGTH 31 +#define ZPAGEZERO_KEY_LENGTH 32 +#define ZPAGEZERO_NODETYPE 33 +#define ZPAGEZERO_SLACK_CHECK 34 +/* --------------------------------------------------------------------------------- */ +/* CONSTANTS IN ALPHABETICAL ORDER */ +/* --------------------------------------------------------------------------------- */ +#define ZADDFRAG 0 +#define ZCOPY_NEXT 1 +#define ZCOPY_NEXT_COMMIT 2 +#define ZCOPY_COMMIT 3 +#define ZCOPY_REPEAT 4 +#define ZCOPY_ABORT 5 +#define ZCOPY_CLOSE 6 +#define ZDIRARRAY 68 +#define ZDIRRANGESIZE 65 +//#define ZEMPTY_FRAGMENT 0 +#define ZFRAGMENTSIZE 64 +#define ZFIRSTTIME 1 +#define ZFS_CONNECTSIZE 300 +#define ZFS_OPSIZE 100 +#define ZKEYINKEYREQ 4 +#define ZLCP_CONNECTSIZE 30 +#define ZLEFT 1 +#define ZLOCALLOGFILE 2 +#define ZLOCKED 0 +#define ZMAXSCANSIGNALLEN 20 +#define ZMAINKEYLEN 8 +#define ZMAX_UNDO_VERSION 4 +#define ZNO_OF_DISK_VERSION 3 +#define ZNO_OF_OP_PER_SIGNAL 20 +//#define ZNOT_EMPTY_FRAGMENT 1 +#define ZNR_OF_UNDO_PAGE_GROUP 16 +#define ZOP_HEAD_INFO_LN 3 +#define ZOPRECSIZE 740 +#define ZOVERFLOWRECSIZE 5 +#define ZPAGE8_BASE_ADD 1 +#define ZPAGESIZE 128 +#define ZPARALLEL_QUEUE 1 +#define ZPDIRECTORY 1 +#define ZSCAN_MAX_LOCK 4 +#define ZSERIAL_QUEUE 2 +#define ZSPH1 1 +#define ZSPH2 2 +#define ZSPH3 3 +#define ZSPH6 6 +#define ZREADLOCK 0 +#define ZRIGHT 2 +#define ZROOTFRAGMENTSIZE 32 +#define ZSCAN_LOCK_ALL 3 +#define ZSCAN_OP 5 +#define ZSCAN_REC_SIZE 256 +#define ZSR_VERSION_REC_SIZE 16 +#define ZSTAND_BY 2 +#define ZTABLESIZE 16 +#define ZTABMAXINDEX 3 +#define ZUNDEFINED_OP 6 +#define ZUNDOHEADSIZE 7 +#define ZUNLOCKED 1 +#define ZUNDOPAGE_BASE_ADD 2 +#define ZUNDOPAGEINDEXBITS 13 +#define ZUNDOPAGEINDEX_MASK 0x1fff +#define ZWRITEPAGESIZE 8 +#define ZWRITE_UNDOPAGESIZE 2 +#define ZMIN_UNDO_PAGES_AT_COMMIT 4 +#define ZMIN_UNDO_PAGES_AT_OPERATION 10 +#define ZMIN_UNDO_PAGES_AT_EXPAND 16 + +/* --------------------------------------------------------------------------------- */ +/* CONTINUEB CODES */ +/* --------------------------------------------------------------------------------- */ +#define ZLOAD_BAL_LCP_TIMER 0 +#define ZINITIALISE_RECORDS 1 +#define ZSR_READ_PAGES_ALLOC 2 +#define ZSTART_UNDO 3 +#define ZSEND_SCAN_HBREP 4 +#define ZREL_ROOT_FRAG 5 +#define ZREL_FRAG 6 +#define ZREL_DIR 7 +#define ZREPORT_MEMORY_USAGE 8 +#define ZLCP_OP_WRITE_RT_BREAK 9 + +/* ------------------------------------------------------------------------- */ +/* ERROR CODES */ +/* ------------------------------------------------------------------------- */ +#define ZLIMIT_OF_ERROR 600 // Limit check for error codes +#define ZCHECKROOT_ERROR 601 // Delete fragment error code +#define ZCONNECT_SIZE_ERROR 602 // ACC_SEIZEREF +#define ZDIR_RANGE_ERROR 603 // Add fragment error code +#define ZFULL_FRAGRECORD_ERROR 604 // Add fragment error code +#define ZFULL_ROOTFRAGRECORD_ERROR 605 // Add fragment error code +#define ZROOTFRAG_STATE_ERROR 606 // Add fragment +#define ZOVERTAB_REC_ERROR 607 // Add fragment + +#define ZSCAN_REFACC_CONNECT_ERROR 608 // ACC_SCANREF +#define ZFOUR_ACTIVE_SCAN_ERROR 609 // ACC_SCANREF +#define ZNULL_SCAN_REC_ERROR 610 // ACC_SCANREF + +#define ZDIRSIZE_ERROR 623 +#define ZOVER_REC_ERROR 624 // Insufficient Space +#define ZPAGESIZE_ERROR 625 +#define ZTUPLE_DELETED_ERROR 626 +#define ZREAD_ERROR 626 +#define ZWRITE_ERROR 630 +#define ZTO_OP_STATE_ERROR 631 +#define ZTOO_EARLY_ACCESS_ERROR 632 +#define ZTEMPORARY_ACC_UNDO_FAILURE 677 +#endif + +class ElementHeader { + /** + * + * l = Locked -- If true contains operation else scan bits + hash value + * s = Scan bits + * h = Hash value + * o = Operation ptr I + * + * 1111111111222222222233 + * 01234567890123456789012345678901 + * lssssssssssss hhhhhhhhhhhhhhhh + * ooooooooooooooooooooooooooooooo + */ +public: + STATIC_CONST( HASH_VALUE_PART_MASK = 0xFFFF ); + + static bool getLocked(Uint32 data); + static bool getUnlocked(Uint32 data); + static Uint32 getScanBits(Uint32 data); + static Uint32 getHashValuePart(Uint32 data); + static Uint32 getOpPtrI(Uint32 data); + + static Uint32 setLocked(Uint32 opPtrI); + static Uint32 setUnlocked(Uint32 hashValuePart, Uint32 scanBits); + static Uint32 setScanBit(Uint32 header, Uint32 scanBit); + static Uint32 clearScanBit(Uint32 header, Uint32 scanBit); +}; + +inline +bool +ElementHeader::getLocked(Uint32 data){ + return (data & 1) == 0; +} + +inline +bool +ElementHeader::getUnlocked(Uint32 data){ + return (data & 1) == 1; +} + +inline +Uint32 +ElementHeader::getScanBits(Uint32 data){ + assert(getUnlocked(data)); + return (data >> 1) & ((1 << MAX_PARALLEL_SCANS_PER_FRAG) - 1); +} + +inline +Uint32 +ElementHeader::getHashValuePart(Uint32 data){ + assert(getUnlocked(data)); + return data >> 16; +} + +inline +Uint32 +ElementHeader::getOpPtrI(Uint32 data){ + assert(getLocked(data)); + return data >> 1; +} + +inline +Uint32 +ElementHeader::setLocked(Uint32 opPtrI){ + return (opPtrI << 1) + 0; +} +inline +Uint32 +ElementHeader::setUnlocked(Uint32 hashValue, Uint32 scanBits){ + return (hashValue << 16) + (scanBits << 1) + 1; +} + +inline +Uint32 +ElementHeader::setScanBit(Uint32 header, Uint32 scanBit){ + assert(getUnlocked(header)); + return header | (scanBit << 1); +} + +inline +Uint32 +ElementHeader::clearScanBit(Uint32 header, Uint32 scanBit){ + assert(getUnlocked(header)); + return header & (~(scanBit << 1)); +} + + +class Dbacc: public SimulatedBlock { +public: +// State values +enum State { + FREEFRAG = 0, + ACTIVEFRAG = 1, + SEND_QUE_OP = 2, + WAIT_ACC_LCPREQ = 3, + LCP_SEND_PAGES = 4, + LCP_SEND_OVER_PAGES = 5, + LCP_SEND_ZERO_PAGE = 6, + SR_READ_PAGES = 7, + SR_READ_OVER_PAGES = 8, + WAIT_ZERO_PAGE_STORED = 9, + WAIT_NOTHING = 10, + WAIT_OPEN_UNDO_LCP = 11, + WAIT_OPEN_UNDO_LCP_NEXT = 12, + WAIT_OPEN_DATA_FILE_FOR_READ = 13, + WAIT_OPEN_DATA_FILE_FOR_WRITE = 14, + OPEN_UNDO_FILE_SR = 15, + READ_UNDO_PAGE = 16, + READ_UNDO_PAGE_AND_CLOSE = 17, + WAIT_READ_DATA = 18, + WAIT_READ_PAGE_ZERO = 19, + WAIT_WRITE_DATA = 20, + WAIT_WRITE_UNDO = 21, + WAIT_WRITE_UNDO_EXIT = 22, + WAIT_CLOSE_UNDO = 23, + LCP_CLOSE_DATA = 24, + SR_CLOSE_DATA = 25, + WAIT_ONE_CONF = 26, + WAIT_TWO_CONF = 27, + LCP_FREE = 28, + LCP_ACTIVE = 29, + FREE_OP = 30, + WAIT_EXE_OP = 32, + WAIT_IN_QUEUE = 34, + EXE_OP = 35, + SCAN_ACTIVE = 36, + SCAN_WAIT_IN_QUEUE = 37, + IDLE = 39, + ACTIVE = 40, + WAIT_COMMIT_ABORT = 41, + ABORT = 42, + ABORTADDFRAG = 43, + REFUSEADDFRAG = 44, + DELETEFRAG = 45, + DELETETABLE = 46, + UNDEFINEDROOT = 47, + ADDFIRSTFRAG = 48, + ADDSECONDFRAG = 49, + DELETEFIRSTFRAG = 50, + DELETESECONDFRAG = 51, + ACTIVEROOT = 52, + LCP_CREATION = 53 +}; + +// Records + +/* --------------------------------------------------------------------------------- */ +/* UNDO HEADER RECORD */ +/* --------------------------------------------------------------------------------- */ + + struct UndoHeader { + enum UndoHeaderType{ + ZPAGE_INFO = 0, + ZOVER_PAGE_INFO = 1, + ZOP_INFO = 2, + ZNO_UNDORECORD_TYPES = 3 + }; + UintR tableId; + UintR rootFragId; + UintR localFragId; + UintR variousInfo; + UintR logicalPageId; + UintR prevUndoAddressForThisFrag; + UintR prevUndoAddress; + }; + +/* --------------------------------------------------------------------------------- */ +/* DIRECTORY RANGE */ +/* --------------------------------------------------------------------------------- */ + struct DirRange { + Uint32 dirArray[256]; + }; /* p2c: size = 1024 bytes */ + + typedef Ptr<DirRange> DirRangePtr; + +/* --------------------------------------------------------------------------------- */ +/* DIRECTORYARRAY */ +/* --------------------------------------------------------------------------------- */ +struct Directoryarray { + Uint32 pagep[256]; +}; /* p2c: size = 1024 bytes */ + + typedef Ptr<Directoryarray> DirectoryarrayPtr; + +/* --------------------------------------------------------------------------------- */ +/* FRAGMENTREC. ALL INFORMATION ABOUT FRAMENT AND HASH TABLE IS SAVED IN FRAGMENT */ +/* REC A POINTER TO FRAGMENT RECORD IS SAVED IN ROOTFRAGMENTREC FRAGMENT */ +/* --------------------------------------------------------------------------------- */ +struct Fragmentrec { +//----------------------------------------------------------------------------- +// References to long key pages with free area. Some type of buddy structure +// where references in higher index have more free space. +//----------------------------------------------------------------------------- + Uint32 longKeyPageArray[4]; + +//----------------------------------------------------------------------------- +// These variables keep track of allocated pages, the number of them and the +// start file page of them. Used during local checkpoints. +//----------------------------------------------------------------------------- + Uint32 datapages[8]; + Uint32 activeDataPage; + Uint32 activeDataFilePage; + +//----------------------------------------------------------------------------- +// Temporary variables used during shrink and expand process. +//----------------------------------------------------------------------------- + Uint32 expReceivePageptr; + Uint32 expReceiveIndex; + Uint32 expReceiveForward; + Uint32 expSenderDirIndex; + Uint32 expSenderDirptr; + Uint32 expSenderIndex; + Uint32 expSenderPageptr; + +//----------------------------------------------------------------------------- +// List of lock owners and list of lock waiters to support LCP handling +//----------------------------------------------------------------------------- + Uint32 lockOwnersList; + Uint32 firstWaitInQueOp; + Uint32 lastWaitInQueOp; + Uint32 sentWaitInQueOp; + +//----------------------------------------------------------------------------- +// References to Directory Ranges (which in turn references directories, which +// in its turn references the pages) for the bucket pages and the overflow +// bucket pages. +//----------------------------------------------------------------------------- + Uint32 directory; + Uint32 dirsize; + Uint32 overflowdir; + Uint32 lastOverIndex; + +//----------------------------------------------------------------------------- +// These variables are used to support LCP and Restore from disk. +// lcpDirIndex: used during LCP as the frag page id currently stored. +// lcpMaxDirIndex: The dirsize at start of LCP. +// lcpMaxOverDirIndex: The xx at start of LCP +// During a LCP one writes the minimum of the number of pages in the directory +// and the number of pages at the start of the LCP. +// noStoredPages: Number of bucket pages written in LCP used at restore +// noOfOverStoredPages: Number of overflow pages written in LCP used at restore +// This variable is also used during LCP to calculate this number. +//----------------------------------------------------------------------------- + Uint32 lcpDirIndex; + Uint32 lcpMaxDirIndex; + Uint32 lcpMaxOverDirIndex; + Uint32 noStoredPages; + Uint32 noOfStoredOverPages; + +//----------------------------------------------------------------------------- +// We have a list of overflow pages with free areas. We have a special record, +// the overflow record representing these pages. The reason is that the +// same record is also used to represent pages in the directory array that have +// been released since they were empty (there were however higher indexes with +// data in them). These are put in the firstFreeDirIndexRec-list. +// An overflow record representing a page can only be in one of these lists. +//----------------------------------------------------------------------------- + Uint32 firstOverflowRec; + Uint32 lastOverflowRec; + Uint32 firstFreeDirindexRec; + +//----------------------------------------------------------------------------- +// localCheckpId is used during execution of UNDO log to ensure that we only +// apply UNDO log records from the restored LCP of the fragment. +// lcpLqhPtr keeps track of LQH record for this fragment to checkpoint +//----------------------------------------------------------------------------- + Uint32 localCheckpId; + Uint32 lcpLqhPtr; + +//----------------------------------------------------------------------------- +// Counter keeping track of how many times we have expanded. We need to ensure +// that we do not shrink so many times that this variable becomes negative. +//----------------------------------------------------------------------------- + Uint32 expandCounter; +//----------------------------------------------------------------------------- +// Reference to record for open file at LCP and restore +//----------------------------------------------------------------------------- + Uint32 fsConnPtr; + +//----------------------------------------------------------------------------- +// These variables are important for the linear hashing algorithm. +// localkeylen is the size of the local key (1 and 2 is currently supported) +// maxloadfactor is the factor specifying when to expand +// minloadfactor is the factor specifying when to shrink (hysteresis model) +// maxp and p +// maxp and p is the variables most central to linear hashing. p + maxp + 1 is the +// current number of buckets. maxp is the largest value of the type 2**n - 1 +// which is smaller than the number of buckets. These values are used to find +// correct bucket with the aid of the hash value. +// +// slack is the variable keeping track of whether we have inserted more than +// the current size is suitable for or less. Slack together with the boundaries +// set by maxloadfactor and minloadfactor decides when to expand/shrink +// slackCheck When slack goes over this value it is time to expand. +// slackCheck = (maxp + p + 1)*(maxloadfactor - minloadfactor) or +// bucketSize * hysteresis +//----------------------------------------------------------------------------- + Uint32 localkeylen; + Uint32 maxp; + Uint32 maxloadfactor; + Uint32 minloadfactor; + Uint32 p; + Uint32 slack; + Uint32 slackCheck; + +//----------------------------------------------------------------------------- +// myfid is the fragment id of the fragment +// myroot is the reference to the root fragment record +// nextfreefrag is the next free fragment if linked into a free list +//----------------------------------------------------------------------------- + Uint32 myfid; + Uint32 myroot; + Uint32 myTableId; + Uint32 nextfreefrag; + +//----------------------------------------------------------------------------- +// This variable is used during restore to keep track of page id of read pages. +// During read of bucket pages this is used to calculate the page id and also +// to verify that the page id of the read page is correct. During read of over- +// flow pages it is only used to keep track of the number of pages read. +//----------------------------------------------------------------------------- + Uint32 nextAllocPage; + +//----------------------------------------------------------------------------- +// Keeps track of undo position for fragment during LCP and restore. +//----------------------------------------------------------------------------- + Uint32 prevUndoposition; + +//----------------------------------------------------------------------------- +// Page reference during LCP and restore of page zero where fragment data is +// saved +//----------------------------------------------------------------------------- + Uint32 zeroPagePtr; + +//----------------------------------------------------------------------------- +// Number of pages read from file during restore +//----------------------------------------------------------------------------- + Uint32 noOfExpectedPages; + +//----------------------------------------------------------------------------- +// Fragment State, mostly applicable during LCP and restore +//----------------------------------------------------------------------------- + State fragState; + +//----------------------------------------------------------------------------- +// Keep track of number of outstanding writes of UNDO log records to ensure that +// we have saved all UNDO info before concluding local checkpoint. +//----------------------------------------------------------------------------- + Uint32 nrWaitWriteUndoExit; + +//----------------------------------------------------------------------------- +// lastUndoIsStored is used to handle parallel writes of UNDO log and pages to +// know when LCP is completed +//----------------------------------------------------------------------------- + Uint8 lastUndoIsStored; + +//----------------------------------------------------------------------------- +// Set to ZTRUE when local checkpoint freeze occurs and set to ZFALSE when +// local checkpoint concludes. +//----------------------------------------------------------------------------- + Uint8 createLcp; + +//----------------------------------------------------------------------------- +// Flag indicating whether we are in the load phase of restore still. +//----------------------------------------------------------------------------- + Uint8 loadingFlag; + +//----------------------------------------------------------------------------- +// elementLength: Length of element in bucket and overflow pages +// keyLength: Length of key +//----------------------------------------------------------------------------- + Uint8 elementLength; + Uint16 keyLength; + +//----------------------------------------------------------------------------- +// This flag is used to avoid sending a big number of expand or shrink signals +// when simultaneously committing many inserts or deletes. +//----------------------------------------------------------------------------- + Uint8 expandFlag; + +//----------------------------------------------------------------------------- +// hashcheckbit is the bit to check whether to send element to split bucket or not +// k (== 6) is the number of buckets per page +// lhfragbits is the number of bits used to calculate the fragment id +// lhdirbits is the number of bits used to calculate the page id +//----------------------------------------------------------------------------- + Uint8 hashcheckbit; + Uint8 k; + Uint8 lhfragbits; + Uint8 lhdirbits; + +//----------------------------------------------------------------------------- +// nodetype can only be STORED in this release. Is currently only set, never read +// stopQueOp is indicator that locked operations will not start until LCP have +// released the lock on the fragment +//----------------------------------------------------------------------------- + Uint8 nodetype; + Uint8 stopQueOp; + +//----------------------------------------------------------------------------- +// flag to avoid accessing table record if no char attributes +//----------------------------------------------------------------------------- + Uint8 hasCharAttr; +}; + + typedef Ptr<Fragmentrec> FragmentrecPtr; + +/* --------------------------------------------------------------------------------- */ +/* FS_CONNECTREC */ +/* --------------------------------------------------------------------------------- */ +struct FsConnectrec { + Uint32 fsNext; + Uint32 fsPrev; + Uint32 fragrecPtr; + Uint32 fsPtr; + State fsState; + Uint8 activeFragId; + Uint8 fsPart; +}; /* p2c: size = 24 bytes */ + + typedef Ptr<FsConnectrec> FsConnectrecPtr; + +/* --------------------------------------------------------------------------------- */ +/* FS_OPREC */ +/* --------------------------------------------------------------------------------- */ +struct FsOprec { + Uint32 fsOpnext; + Uint32 fsOpfragrecPtr; + Uint32 fsConptr; + State fsOpstate; + Uint16 fsOpMemPage; +}; /* p2c: size = 20 bytes */ + + typedef Ptr<FsOprec> FsOprecPtr; + +/* --------------------------------------------------------------------------------- */ +/* LCP_CONNECTREC */ +/* --------------------------------------------------------------------------------- */ +struct LcpConnectrec { + Uint32 nextLcpConn; + Uint32 lcpUserptr; + Uint32 rootrecptr; + State syncUndopageState; + State lcpstate; + Uint32 lcpUserblockref; + Uint16 localCheckPid; + Uint8 noOfLcpConf; +}; + typedef Ptr<LcpConnectrec> LcpConnectrecPtr; + +/* --------------------------------------------------------------------------------- */ +/* OPERATIONREC */ +/* --------------------------------------------------------------------------------- */ +struct Operationrec { + Uint32 keydata[8]; + Uint32 localdata[2]; + Uint32 elementIsforward; + Uint32 elementPage; + Uint32 elementPointer; + Uint32 fid; + Uint32 fragptr; + Uint32 hashvaluePart; + Uint32 hashValue; + Uint32 insertDeleteLen; + Uint32 keyinfoPage; + Uint32 nextLockOwnerOp; + Uint32 nextOp; + Uint32 nextParallelQue; + Uint32 nextQueOp; + Uint32 nextSerialQue; + Uint32 prevOp; + Uint32 prevLockOwnerOp; + Uint32 prevParallelQue; + Uint32 prevQueOp; + Uint32 prevSerialQue; + Uint32 scanRecPtr; + Uint32 transId1; + Uint32 transId2; + Uint32 longPagePtr; + Uint32 longKeyPageIndex; + State opState; + Uint32 userptr; + State transactionstate; + Uint16 elementContainer; + Uint16 tupkeylen; + Uint32 xfrmtupkeylen; + Uint32 userblockref; + Uint32 scanBits; + Uint8 elementIsDisappeared; + Uint8 insertIsDone; + Uint8 lockMode; + Uint8 lockOwner; + Uint8 nodeType; + Uint8 operation; + Uint8 opSimple; + Uint8 dirtyRead; + Uint8 commitDeleteCheckFlag; + Uint8 isAccLockReq; + Uint8 isUndoLogReq; +}; /* p2c: size = 168 bytes */ + + typedef Ptr<Operationrec> OperationrecPtr; + +/* --------------------------------------------------------------------------------- */ +/* OVERFLOW_RECORD */ +/* --------------------------------------------------------------------------------- */ +struct OverflowRecord { + Uint32 dirindex; + Uint32 nextOverRec; + Uint32 nextOverList; + Uint32 prevOverRec; + Uint32 prevOverList; + Uint32 overpage; + Uint32 nextfreeoverrec; +}; + + typedef Ptr<OverflowRecord> OverflowRecordPtr; + +/* --------------------------------------------------------------------------------- */ +/* PAGE8 */ +/* --------------------------------------------------------------------------------- */ +struct Page8 { + Uint32 word32[2048]; +}; /* p2c: size = 8192 bytes */ + + typedef Ptr<Page8> Page8Ptr; + +/* --------------------------------------------------------------------------------- */ +/* ROOTFRAGMENTREC */ +/* DURING EXPAND FRAGMENT PROCESS, EACH FRAGMEND WILL BE EXPAND INTO TWO */ +/* NEW FRAGMENTS.TO MAKE THIS PROCESS EASIER, DURING ADD FRAGMENT PROCESS */ +/* NEXT FRAGMENT IDENTIIES WILL BE CALCULATED, AND TWO FRAGMENTS WILL BE */ +/* ADDED IN (NDBACC). THEREBY EXPAND OF FRAGMENT CAN BE PERFORMED QUICK AND */ +/* EASY.THE NEW FRAGMENT ID SENDS TO TUP MANAGER FOR ALL OPERATION PROCESS. */ +/* --------------------------------------------------------------------------------- */ +struct Rootfragmentrec { + Uint32 scan[MAX_PARALLEL_SCANS_PER_FRAG]; + Uint32 fragmentptr[2]; + Uint32 fragmentid[2]; + Uint32 lcpPtr; + Uint32 mytabptr; + Uint32 nextroot; + Uint32 roothashcheck; + Uint32 noOfElements; + Uint32 m_commit_count; + State rootState; +}; /* p2c: size = 72 bytes */ + + typedef Ptr<Rootfragmentrec> RootfragmentrecPtr; + +/* --------------------------------------------------------------------------------- */ +/* SCAN_REC */ +/* --------------------------------------------------------------------------------- */ +struct ScanRec { + enum ScanState { + WAIT_NEXT, + SCAN_DISCONNECT + }; + enum ScanBucketState { + FIRST_LAP, + SECOND_LAP, + SCAN_COMPLETED + }; + Uint32 activeLocalFrag; + Uint32 rootPtr; + Uint32 nextBucketIndex; + Uint32 scanNextfreerec; + Uint32 scanFirstActiveOp; + Uint32 scanFirstLockedOp; + Uint32 scanLastLockedOp; + Uint32 scanFirstQueuedOp; + Uint32 scanLastQueuedOp; + Uint32 scanUserptr; + Uint32 scanTrid1; + Uint32 scanTrid2; + Uint32 startNoOfBuckets; + Uint32 minBucketIndexToRescan; + Uint32 maxBucketIndexToRescan; + Uint32 scanOpsAllocated; + ScanBucketState scanBucketState; + ScanState scanState; + Uint16 scanLockHeld; + Uint32 scanUserblockref; + Uint32 scanMask; + Uint8 scanLockMode; + Uint8 scanKeyinfoFlag; + Uint8 scanTimer; + Uint8 scanContinuebCounter; + Uint8 scanReadCommittedFlag; +}; + + typedef Ptr<ScanRec> ScanRecPtr; + +/* --------------------------------------------------------------------------------- */ +/* SR_VERSION_REC */ +/* --------------------------------------------------------------------------------- */ +struct SrVersionRec { + Uint32 nextFreeSr; + Uint32 checkPointId; + Uint32 prevAddress; + Uint32 srUnused; /* p2c: Not used */ +}; /* p2c: size = 16 bytes */ + + typedef Ptr<SrVersionRec> SrVersionRecPtr; + +/* --------------------------------------------------------------------------------- */ +/* TABREC */ +/* --------------------------------------------------------------------------------- */ +struct Tabrec { + Uint32 fragholder[MAX_FRAG_PER_NODE]; + Uint32 fragptrholder[MAX_FRAG_PER_NODE]; + Uint32 tabUserPtr; + BlockReference tabUserRef; + + Uint8 noOfKeyAttr; + Uint8 hasCharAttr; + struct KeyAttr { + Uint32 attributeDescriptor; + CHARSET_INFO* charsetInfo; + } keyAttr[MAX_ATTRIBUTES_IN_INDEX]; +}; + typedef Ptr<Tabrec> TabrecPtr; + +/* --------------------------------------------------------------------------------- */ +/* UNDOPAGE */ +/* --------------------------------------------------------------------------------- */ +struct Undopage { + Uint32 undoword[8192]; +}; /* p2c: size = 32768 bytes */ + + typedef Ptr<Undopage> UndopagePtr; + +public: + Dbacc(const class Configuration &); + virtual ~Dbacc(); + + // pointer to TUP instance in this thread + Dbtup* c_tup; + +private: + BLOCK_DEFINES(Dbacc); + + // Transit signals + void execDEBUG_SIG(Signal* signal); + void execCONTINUEB(Signal* signal); + void execACC_CHECK_SCAN(Signal* signal); + void execEXPANDCHECK2(Signal* signal); + void execSHRINKCHECK2(Signal* signal); + void execACC_OVER_REC(Signal* signal); + void execACC_SAVE_PAGES(Signal* signal); + void execNEXTOPERATION(Signal* signal); + void execREAD_PSUEDO_REQ(Signal* signal); + + // Received signals + void execSTTOR(Signal* signal); + void execSR_FRAGIDREQ(Signal* signal); + void execLCP_FRAGIDREQ(Signal* signal); + void execLCP_HOLDOPREQ(Signal* signal); + void execEND_LCPREQ(Signal* signal); + void execACC_LCPREQ(Signal* signal); + void execSTART_RECREQ(Signal* signal); + void execACC_CONTOPREQ(Signal* signal); + void execACCKEYREQ(Signal* signal); + void execACCSEIZEREQ(Signal* signal); + void execACCFRAGREQ(Signal* signal); + void execTC_SCHVERREQ(Signal* signal); + void execACC_SRREQ(Signal* signal); + void execNEXT_SCANREQ(Signal* signal); + void execACC_ABORTREQ(Signal* signal); + void execACC_SCANREQ(Signal* signal); + void execACCMINUPDATE(Signal* signal); + void execACC_COMMITREQ(Signal* signal); + void execACC_TO_REQ(Signal* signal); + void execACC_LOCKREQ(Signal* signal); + void execFSOPENCONF(Signal* signal); + void execFSOPENREF(Signal* signal); + void execFSCLOSECONF(Signal* signal); + void execFSCLOSEREF(Signal* signal); + void execFSWRITECONF(Signal* signal); + void execFSWRITEREF(Signal* signal); + void execFSREADCONF(Signal* signal); + void execFSREADREF(Signal* signal); + void execNDB_STTOR(Signal* signal); + void execDROP_TAB_REQ(Signal* signal); + void execFSREMOVECONF(Signal* signal); + void execFSREMOVEREF(Signal* signal); + void execREAD_CONFIG_REQ(Signal* signal); + void execSET_VAR_REQ(Signal* signal); + void execDUMP_STATE_ORD(Signal* signal); + + // Statement blocks + void ACCKEY_error(Uint32 fromWhere); + + void commitDeleteCheck(); + + void initRootFragPageZero(RootfragmentrecPtr, Page8Ptr); + void initRootFragSr(RootfragmentrecPtr, Page8Ptr); + void initFragAdd(Signal*, Uint32 rootFragIndex, Uint32 rootIndex, FragmentrecPtr); + void initFragPageZero(FragmentrecPtr, Page8Ptr); + void initFragSr(FragmentrecPtr, Page8Ptr); + void initFragGeneral(FragmentrecPtr); + void verifyFragCorrect(FragmentrecPtr regFragPtr); + void sendFSREMOVEREQ(Signal* signal, Uint32 tableId); + void releaseFragResources(Signal* signal, Uint32 fragIndex); + void releaseRootFragRecord(Signal* signal, RootfragmentrecPtr rootPtr); + void releaseRootFragResources(Signal* signal, Uint32 tableId); + void releaseDirResources(Signal* signal, + Uint32 fragIndex, + Uint32 dirIndex, + Uint32 startIndex); + void releaseDirectoryResources(Signal* signal, + Uint32 fragIndex, + Uint32 dirIndex, + Uint32 startIndex, + Uint32 directoryIndex); + void releaseOverflowResources(Signal* signal, FragmentrecPtr regFragPtr); + void releaseDirIndexResources(Signal* signal, FragmentrecPtr regFragPtr); + void releaseFragRecord(Signal* signal, FragmentrecPtr regFragPtr); + Uint32 remainingUndoPages(); + void updateLastUndoPageIdWritten(Signal* signal, Uint32 aNewValue); + void updateUndoPositionPage(Signal* signal, Uint32 aNewValue); + void srCheckPage(Signal* signal); + void srCheckContainer(Signal* signal); + void initScanFragmentPart(Signal* signal); + Uint32 checkScanExpand(Signal* signal); + Uint32 checkScanShrink(Signal* signal); + void initialiseDirRec(Signal* signal); + void initialiseDirRangeRec(Signal* signal); + void initialiseFragRec(Signal* signal); + void initialiseFsConnectionRec(Signal* signal); + void initialiseFsOpRec(Signal* signal); + void initialiseLcpConnectionRec(Signal* signal); + void initialiseOperationRec(Signal* signal); + void initialiseOverflowRec(Signal* signal); + void initialisePageRec(Signal* signal); + void initialiseLcpPages(Signal* signal); + void initialiseRootfragRec(Signal* signal); + void initialiseScanRec(Signal* signal); + void initialiseSrVerRec(Signal* signal); + void initialiseTableRec(Signal* signal); + bool addfragtotab(Signal* signal, Uint32 rootIndex, Uint32 fragId); + void initOpRec(Signal* signal); + void sendAcckeyconf(Signal* signal); + Uint32 placeReadInLockQueue(Signal* signal); + void placeSerialQueueRead(Signal* signal); + void checkOnlyReadEntry(Signal* signal); + void getNoParallelTransaction(Signal* signal); + void moveLastParallelQueue(Signal* signal); + void moveLastParallelQueueWrite(Signal* signal); + Uint32 placeWriteInLockQueue(Signal* signal); + void placeSerialQueueWrite(Signal* signal); + void expandcontainer(Signal* signal); + void shrinkcontainer(Signal* signal); + void nextcontainerinfoExp(Signal* signal); + void lcpCopyPage(Signal* signal); + void lcpUpdatePage(Signal* signal); + void checkUndoPages(Signal* signal); + void undoWritingProcess(Signal* signal); + void writeUndoDataInfo(Signal* signal); + void writeUndoHeader(Signal* signal, + Uint32 logicalPageId, + UndoHeader::UndoHeaderType pageType); + void writeUndoOpInfo(Signal* signal); + void checksumControl(Signal* signal, Uint32 checkPage); + void startActiveUndo(Signal* signal); + void releaseAndCommitActiveOps(Signal* signal); + void releaseAndCommitQueuedOps(Signal* signal); + void releaseAndAbortLockedOps(Signal* signal); + void containerinfo(Signal* signal); + bool getScanElement(Signal* signal); + void initScanOpRec(Signal* signal); + void nextcontainerinfo(Signal* signal); + void putActiveScanOp(Signal* signal); + void putOpScanLockQue(); + void putReadyScanQueue(Signal* signal, Uint32 scanRecIndex); + void releaseScanBucket(Signal* signal); + void releaseScanContainer(Signal* signal); + void releaseScanRec(Signal* signal); + bool searchScanContainer(Signal* signal); + void sendNextScanConf(Signal* signal); + void setlock(Signal* signal); + void takeOutActiveScanOp(Signal* signal); + void takeOutScanLockQueue(Uint32 scanRecIndex); + void takeOutReadyScanQueue(Signal* signal); + void insertElement(Signal* signal); + void insertContainer(Signal* signal); + void addnewcontainer(Signal* signal); + void getfreelist(Signal* signal); + void increaselistcont(Signal* signal); + void seizeLeftlist(Signal* signal); + void seizeRightlist(Signal* signal); + Uint32 readTablePk(Uint32 localkey1); + void getElement(Signal* signal); + void getdirindex(Signal* signal); + void commitdelete(Signal* signal, bool systemRestart); + void deleteElement(Signal* signal); + void getLastAndRemove(Signal* signal); + void releaseLeftlist(Signal* signal); + void releaseRightlist(Signal* signal); + void checkoverfreelist(Signal* signal); + void abortOperation(Signal* signal); + void accAbortReqLab(Signal* signal, bool sendConf); + void commitOperation(Signal* signal); + void copyOpInfo(Signal* signal); + Uint32 executeNextOperation(Signal* signal); + void releaselock(Signal* signal); + void takeOutFragWaitQue(Signal* signal); + void allocOverflowPage(Signal* signal); + bool getrootfragmentrec(Signal* signal, RootfragmentrecPtr&, Uint32 fragId); + void insertLockOwnersList(Signal* signal, const OperationrecPtr&); + void takeOutLockOwnersList(Signal* signal, const OperationrecPtr&); + void initFsOpRec(Signal* signal); + void initLcpConnRec(Signal* signal); + void initOverpage(Signal* signal); + void initPage(Signal* signal); + void initRootfragrec(Signal* signal); + void putOpInFragWaitQue(Signal* signal); + void putOverflowRecInFrag(Signal* signal); + void putRecInFreeOverdir(Signal* signal); + void releaseDirectory(Signal* signal); + void releaseDirrange(Signal* signal); + void releaseFsConnRec(Signal* signal); + void releaseFsOpRec(Signal* signal); + void releaseLcpConnectRec(Signal* signal); + void releaseOpRec(Signal* signal); + void releaseOverflowRec(Signal* signal); + void releaseOverpage(Signal* signal); + void releasePage(Signal* signal); + void releaseLcpPage(Signal* signal); + void releaseSrRec(Signal* signal); + void releaseLogicalPage(Fragmentrec * fragP, Uint32 logicalPageId); + void seizeDirectory(Signal* signal); + void seizeDirrange(Signal* signal); + void seizeFragrec(Signal* signal); + void seizeFsConnectRec(Signal* signal); + void seizeFsOpRec(Signal* signal); + void seizeLcpConnectRec(Signal* signal); + void seizeOpRec(Signal* signal); + void seizeOverRec(Signal* signal); + void seizePage(Signal* signal); + void seizeLcpPage(Page8Ptr&); + void seizeRootfragrec(Signal* signal); + void seizeScanRec(Signal* signal); + void seizeSrVerRec(Signal* signal); + void sendSystemerror(Signal* signal); + void takeRecOutOfFreeOverdir(Signal* signal); + void takeRecOutOfFreeOverpage(Signal* signal); + void sendScanHbRep(Signal* signal, Uint32); + + void addFragRefuse(Signal* signal, Uint32 errorCode); + void ndbsttorryLab(Signal* signal); + void srCloseDataFileLab(Signal* signal); + void acckeyref1Lab(Signal* signal, Uint32 result_code); + void insertelementLab(Signal* signal); + void startUndoLab(Signal* signal); + void checkNextFragmentLab(Signal* signal); + void endofexpLab(Signal* signal); + void endofshrinkbucketLab(Signal* signal); + void srStartUndoLab(Signal* signal); + void senddatapagesLab(Signal* signal); + void undoNext2Lab(Signal* signal); + void sttorrysignalLab(Signal* signal); + void sendholdconfsignalLab(Signal* signal); + void accIsLockedLab(Signal* signal); + void insertExistElemLab(Signal* signal); + void refaccConnectLab(Signal* signal); + void srReadOverPagesLab(Signal* signal); + void releaseScanLab(Signal* signal); + void lcpOpenUndofileConfLab(Signal* signal); + void srFsOpenConfLab(Signal* signal); + void checkSyncUndoPagesLab(Signal* signal); + void sendaccSrconfLab(Signal* signal); + void checkSendLcpConfLab(Signal* signal); + void endsaveoverpageLab(Signal* signal); + void lcpCloseDataFileLab(Signal* signal); + void srOpenDataFileLoopLab(Signal* signal); + void srReadPagesLab(Signal* signal); + void srDoUndoLab(Signal* signal); + void ndbrestart1Lab(Signal* signal); + void initialiseRecordsLab(Signal* signal, Uint32 ref, Uint32 data); + void srReadPagesAllocLab(Signal* signal); + void checkNextBucketLab(Signal* signal); + void endsavepageLab(Signal* signal); + void saveZeroPageLab(Signal* signal); + void srAllocPage0011Lab(Signal* signal); + void sendLcpFragidconfLab(Signal* signal); + void savepagesLab(Signal* signal); + void saveOverPagesLab(Signal* signal); + void srReadPageZeroLab(Signal* signal); + void storeDataPageInDirectoryLab(Signal* signal); + void lcpFsOpenConfLab(Signal* signal); + + void zpagesize_error(const char* where); + + void reportMemoryUsage(Signal* signal, int gth); + void lcp_write_op_to_undolog(Signal* signal); + void reenable_expand_after_redo_log_exection_complete(Signal*); + + // charsets + void xfrmKeyData(Signal* signal); + + // Initialisation + void initData(); + void initRecords(); + + // Variables +/* --------------------------------------------------------------------------------- */ +/* DIRECTORY RANGE */ +/* --------------------------------------------------------------------------------- */ + DirRange *dirRange; + DirRangePtr expDirRangePtr; + DirRangePtr gnsDirRangePtr; + DirRangePtr newDirRangePtr; + DirRangePtr rdDirRangePtr; + DirRangePtr nciOverflowrangeptr; + Uint32 cdirrangesize; + Uint32 cfirstfreeDirrange; +/* --------------------------------------------------------------------------------- */ +/* DIRECTORYARRAY */ +/* --------------------------------------------------------------------------------- */ + Directoryarray *directoryarray; + DirectoryarrayPtr expDirptr; + DirectoryarrayPtr rdDirptr; + DirectoryarrayPtr sdDirptr; + DirectoryarrayPtr nciOverflowDirptr; + Uint32 cdirarraysize; + Uint32 cdirmemory; + Uint32 cfirstfreedir; +/* --------------------------------------------------------------------------------- */ +/* FRAGMENTREC. ALL INFORMATION ABOUT FRAMENT AND HASH TABLE IS SAVED IN FRAGMENT */ +/* REC A POINTER TO FRAGMENT RECORD IS SAVED IN ROOTFRAGMENTREC FRAGMENT */ +/* --------------------------------------------------------------------------------- */ + Fragmentrec *fragmentrec; + FragmentrecPtr fragrecptr; + Uint32 cfirstfreefrag; + Uint32 cfragmentsize; +/* --------------------------------------------------------------------------------- */ +/* FS_CONNECTREC */ +/* --------------------------------------------------------------------------------- */ + FsConnectrec *fsConnectrec; + FsConnectrecPtr fsConnectptr; + Uint32 cfsConnectsize; + Uint32 cfsFirstfreeconnect; +/* --------------------------------------------------------------------------------- */ +/* FS_OPREC */ +/* --------------------------------------------------------------------------------- */ + FsOprec *fsOprec; + FsOprecPtr fsOpptr; + Uint32 cfsOpsize; + Uint32 cfsFirstfreeop; +/* --------------------------------------------------------------------------------- */ +/* LCP_CONNECTREC */ +/* --------------------------------------------------------------------------------- */ + LcpConnectrec *lcpConnectrec; + LcpConnectrecPtr lcpConnectptr; + Uint32 clcpConnectsize; + Uint32 cfirstfreelcpConnect; +/* --------------------------------------------------------------------------------- */ +/* OPERATIONREC */ +/* --------------------------------------------------------------------------------- */ + Operationrec *operationrec; + OperationrecPtr operationRecPtr; + OperationrecPtr idrOperationRecPtr; + OperationrecPtr copyInOperPtr; + OperationrecPtr copyOperPtr; + OperationrecPtr mlpqOperPtr; + OperationrecPtr queOperPtr; + OperationrecPtr readWriteOpPtr; + OperationrecPtr tgnptMainOpPtr; + Uint32 cfreeopRec; + Uint32 coprecsize; +/* --------------------------------------------------------------------------------- */ +/* OVERFLOW_RECORD */ +/* --------------------------------------------------------------------------------- */ + OverflowRecord *overflowRecord; + OverflowRecordPtr iopOverflowRecPtr; + OverflowRecordPtr tfoOverflowRecPtr; + OverflowRecordPtr porOverflowRecPtr; + OverflowRecordPtr priOverflowRecPtr; + OverflowRecordPtr rorOverflowRecPtr; + OverflowRecordPtr sorOverflowRecPtr; + OverflowRecordPtr troOverflowRecPtr; + Uint32 cfirstfreeoverrec; + Uint32 coverflowrecsize; + +/* --------------------------------------------------------------------------------- */ +/* PAGE8 */ +/* --------------------------------------------------------------------------------- */ + Page8 *page8; + /* 8 KB PAGE */ + Page8Ptr ancPageptr; + Page8Ptr colPageptr; + Page8Ptr ccoPageptr; + Page8Ptr datapageptr; + Page8Ptr delPageptr; + Page8Ptr excPageptr; + Page8Ptr expPageptr; + Page8Ptr gdiPageptr; + Page8Ptr gePageptr; + Page8Ptr gflPageptr; + Page8Ptr idrPageptr; + Page8Ptr ilcPageptr; + Page8Ptr inpPageptr; + Page8Ptr iopPageptr; + Page8Ptr lastPageptr; + Page8Ptr lastPrevpageptr; + Page8Ptr lcnPageptr; + Page8Ptr lcnCopyPageptr; + Page8Ptr lupPageptr; + Page8Ptr priPageptr; + Page8Ptr pwiPageptr; + Page8Ptr ciPageidptr; + Page8Ptr gsePageidptr; + Page8Ptr isoPageptr; + Page8Ptr nciPageidptr; + Page8Ptr rsbPageidptr; + Page8Ptr rscPageidptr; + Page8Ptr slPageidptr; + Page8Ptr sscPageidptr; + Page8Ptr rlPageptr; + Page8Ptr rlpPageptr; + Page8Ptr ropPageptr; + Page8Ptr rpPageptr; + Page8Ptr slPageptr; + Page8Ptr spPageptr; + Uint32 cfirstfreepage; + Uint32 cfreepage; + Uint32 cpagesize; + Uint32 cfirstfreeLcpPage; + Uint32 cnoOfAllocatedPages; + Uint32 cnoLcpPages; +/* --------------------------------------------------------------------------------- */ +/* ROOTFRAGMENTREC */ +/* DURING EXPAND FRAGMENT PROCESS, EACH FRAGMEND WILL BE EXPAND INTO TWO */ +/* NEW FRAGMENTS.TO MAKE THIS PROCESS EASIER, DURING ADD FRAGMENT PROCESS */ +/* NEXT FRAGMENT IDENTIIES WILL BE CALCULATED, AND TWO FRAGMENTS WILL BE */ +/* ADDED IN (NDBACC). THEREBY EXPAND OF FRAGMENT CAN BE PERFORMED QUICK AND */ +/* EASY.THE NEW FRAGMENT ID SENDS TO TUP MANAGER FOR ALL OPERATION PROCESS. */ +/* --------------------------------------------------------------------------------- */ + Rootfragmentrec *rootfragmentrec; + RootfragmentrecPtr rootfragrecptr; + Uint32 crootfragmentsize; + Uint32 cfirstfreerootfrag; +/* --------------------------------------------------------------------------------- */ +/* SCAN_REC */ +/* --------------------------------------------------------------------------------- */ + ScanRec *scanRec; + ScanRecPtr scanPtr; + Uint32 cscanRecSize; + Uint32 cfirstFreeScanRec; +/* --------------------------------------------------------------------------------- */ +/* SR_VERSION_REC */ +/* --------------------------------------------------------------------------------- */ + SrVersionRec *srVersionRec; + SrVersionRecPtr srVersionPtr; + Uint32 csrVersionRecSize; + Uint32 cfirstFreeSrVersionRec; +/* --------------------------------------------------------------------------------- */ +/* TABREC */ +/* --------------------------------------------------------------------------------- */ + Tabrec *tabrec; + TabrecPtr tabptr; + Uint32 ctablesize; +/* --------------------------------------------------------------------------------- */ +/* UNDOPAGE */ +/* --------------------------------------------------------------------------------- */ + Undopage *undopage; + /* 32 KB PAGE */ + UndopagePtr undopageptr; + Uint32 tpwiElementptr; + Uint32 tpriElementptr; + Uint32 tgseElementptr; + Uint32 tgseContainerptr; + Uint32 trlHead; + Uint32 trlRelCon; + Uint32 trlNextused; + Uint32 trlPrevused; + Uint32 tlcnChecksum; + Uint32 tlupElemIndex; + Uint32 tlupIndex; + Uint32 tlupForward; + Uint32 tancNext; + Uint32 tancBufType; + Uint32 tancContainerptr; + Uint32 tancPageindex; + Uint32 tancPageid; + Uint32 tidrResult; + Uint32 tidrElemhead; + Uint32 tidrForward; + Uint32 tidrPageindex; + Uint32 tidrContainerptr; + Uint32 tidrContainerhead; + Uint32 tlastForward; + Uint32 tlastPageindex; + Uint32 tlastContainerlen; + Uint32 tlastElementptr; + Uint32 tlastContainerptr; + Uint32 tlastContainerhead; + Uint32 trlPageindex; + Uint32 tdelContainerptr; + Uint32 tdelElementptr; + Uint32 tdelForward; + Uint32 tiopPageId; + Uint32 tipPageId; + Uint32 tgeLocked; + Uint32 tgeResult; + Uint32 tgeContainerptr; + Uint32 tgeElementptr; + Uint32 tgeForward; + Uint32 tundoElemIndex; + Uint32 texpReceivedBucket; + Uint32 texpDirInd; + Uint32 texpDirRangeIndex; + Uint32 texpDirPageIndex; + Uint32 tdata0; + Uint32 tcheckpointid; + Uint32 tciContainerptr; + Uint32 tnciContainerptr; + Uint32 tisoContainerptr; + Uint32 trscContainerptr; + Uint32 tsscContainerptr; + Uint32 tciContainerlen; + Uint32 trscContainerlen; + Uint32 tsscContainerlen; + Uint32 tciContainerhead; + Uint32 tnciContainerhead; + Uint32 tslElementptr; + Uint32 tisoElementptr; + Uint32 tsscElementptr; + Uint32 tfid; + Uint32 tscanFlag; + Uint32 theadundoindex; + Uint32 tgflBufType; + Uint32 tgseIsforward; + Uint32 tsscIsforward; + Uint32 trscIsforward; + Uint32 tciIsforward; + Uint32 tnciIsforward; + Uint32 tisoIsforward; + Uint32 tgseIsLocked; + Uint32 tsscIsLocked; + Uint32 tkeylen; + Uint32 tmp; + Uint32 tmpP; + Uint32 tmpP2; + Uint32 tmp1; + Uint32 tmp2; + Uint32 tgflPageindex; + Uint32 tmpindex; + Uint32 tslNextfree; + Uint32 tslPageindex; + Uint32 tgsePageindex; + Uint32 tnciNextSamePage; + Uint32 tslPrevfree; + Uint32 tciPageindex; + Uint32 trsbPageindex; + Uint32 tnciPageindex; + Uint32 tlastPrevconptr; + Uint32 tresult; + Uint32 tslUpdateHeader; + Uint32 tuserptr; + BlockReference tuserblockref; + Uint32 tundoindex; + Uint32 tlqhPointer; + Uint32 tholdSentOp; + Uint32 tholdMore; + Uint32 tlcpLqhCheckV; + Uint32 tgdiPageindex; + Uint32 tiopIndex; + Uint32 tnciTmp; + Uint32 tullIndex; + Uint32 turlIndex; + Uint32 tlfrTmp1; + Uint32 tlfrTmp2; + Uint32 tgnptNrTransaction; + Uint32 tscanTrid1; + Uint32 tscanTrid2; + + Uint16 clastUndoPageIdWritten; + Uint32 cactiveCheckpId; + Uint32 cactiveRootfrag; + Uint32 cactiveSrFsPtr; + Uint32 cactiveUndoFilePage; + Uint32 cactiveOpenUndoFsPtr; + Uint32 cactiveSrUndoPage; + Uint32 cprevUndoaddress; + Uint32 creadyUndoaddress; + Uint32 ctest; + Uint32 cundoLogActive; + Uint32 clqhPtr; + BlockReference clqhBlockRef; + Uint32 cminusOne; + NodeId cmynodeid; + Uint32 cactiveUndoFileVersion; + BlockReference cownBlockref; + BlockReference cndbcntrRef; + Uint16 csignalkey; + Uint32 cundopagesize; + Uint32 cundoposition; + Uint32 cundoElemIndex; + Uint32 cundoinfolength; + Uint32 czero; + Uint32 csrVersList[16]; + Uint32 clblPageCounter; + Uint32 clblPageOver; + Uint32 clblPagesPerTick; + Uint32 clblPagesPerTickAfterSr; + Uint32 csystemRestart; + Uint32 cexcForward; + Uint32 cexcPageindex; + Uint32 cexcContainerptr; + Uint32 cexcContainerhead; + Uint32 cexcContainerlen; + Uint32 cexcElementptr; + Uint32 cexcPrevconptr; + Uint32 cexcMovedLen; + Uint32 cexcPrevpageptr; + Uint32 cexcPrevpageindex; + Uint32 cexcPrevforward; + Uint32 clocalkey[32]; + union { + Uint32 ckeys[2048]; + Uint64 ckeys_align; + }; + + Uint32 c_errorInsert3000_TableId; + Uint32 cSrUndoRecords[UndoHeader::ZNO_UNDORECORD_TYPES]; +}; + +#endif |