/* Copyright (C) 2014 InfiniDB, Inc. 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. */ /****************************************************************************** * $Id: dbrm.h 1878 2013-05-02 15:17:12Z dcathey $ * *****************************************************************************/ /** @file * class DBRM */ #ifndef DBRM_H_ #define DBRM_H_ #include #include #include #include #include #include #include #include #include "brmtypes.h" #include "messagequeue.h" #include "extentmap.h" #include "vss.h" #include "vbbm.h" #include "copylocks.h" #include "calpontsystemcatalog.h" #include "sessionmanagerserver.h" #include "configcpp.h" #include "mastersegmenttable.h" #if defined(_MSC_VER) && defined(xxxDBRM_DLLEXPORT) #define EXPORT __declspec(dllexport) #else #define EXPORT #endif #ifdef BRM_DEBUG #define DBRM_THROW #else #define DBRM_THROW throw() #endif namespace BRM { /** @brief The interface to the Distributed BRM system. * * There are 3 components of the Distributed BRM (DBRM). * \li The interface * \li The Master node * \li Slave nodes * * The DBRM class is the interface, which is identical to the single-node * version, the BlockResolutionManager class. * * The DBRM components effectively implement a networking & synchronization * layer to the BlockResolutionManager class so that every node that needs * BRM data always has an up-to-date copy of it locally. An operation that changes * BRM data is duplicated on all hosts that run a Slave node so that every * node has identical copies. All "read" operations are satisfied locally. * * Calpont configuration file entries are necessary for the interface, Master, * and Slave to find each other. Config file entries look like * \code * * * * N * * * * * * ... * * * * * \endcode */ class DBRM { public: // The param noBRMFcns suppresses init of the ExtentMap, VSS, VBBM, and CopyLocks. // It can speed up init if the caller only needs the other structures. EXPORT DBRM(bool noBRMFcns = false); EXPORT ~DBRM(); EXPORT static void refreshShm() { MasterSegmentTableImpl::refreshShm(); ExtentMapImpl::refreshShm(); FreeListImpl::refreshShm(); } // @bug 1055+ - Added functions below for multiple files per OID enhancement. /** @brief Get the OID, offset, db root, partition, and segment of a logical block ID. * * Get the OID, offset, db root, and partition of a logical block ID. * @param lbid (in) The LBID to look up * @param verid (in) The version of the LBID to look up * @param vbFlags (in) If true, look for the block in the version buffer * if false, the extent map * @param oid (out) The OID of the file the LBID is allocated to * @param fileBlockOffset (out) The file block offset of the LBID * @param dbRoot (out) The DBRoot number that contains the file. * @param partitionNum (out) The partition number for the file. * @param segmentNum (out) The segment number for the file. * * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int lookupLocal(LBID_t lbid, VER_t verid, bool vbFlag, OID_t& oid, uint16_t& dbRoot, uint32_t& partitionNum, uint16_t& segmentNum, uint32_t& fileBlockOffset) throw(); /** @brief Get the LBID assigned to the given OID, block offset, partion, and segment. * * Get the LBID assigned to the given OID, block offset, partition, and segment. * @param oid (in) The OID * @param partitionNum (in) The partition number * @parm segmentNum (in) The segment number * @param fileBlockOffset (in) The offset in the OID to return the LBID of * @param lbid (out) The LBID of the offset of the OID. * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int lookupLocal(OID_t oid, uint32_t partitionNum, uint16_t segmentNum, uint32_t fileBlockOffset, LBID_t& lbid) throw(); /** @brief A dbroot-specific version of lookupLocal() */ EXPORT int lookupLocal_DBroot(OID_t oid, uint32_t dbroot, uint32_t partitionNum, uint16_t segmentNum, uint32_t fileBlockOffset, LBID_t& lbid) throw(); // @bug 1055- /** @brief Get the starting LBID assigned to the extent containing * the specified OID, block offset, partition, and segment. * * Get the LBID assigned to the given OID, partition, segment, * and block offset. * @param oid (in) The OID * @param partitionNum (in) The partition number * @parm segmentNum (in) The segment number * @param fileBlockOffset (in) The requested offset in the specified OID * @param lbid (out) The starting LBID of extent with specified offset * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int lookupLocalStartLbid(OID_t oid, uint32_t partitionNum, uint16_t segmentNum, uint32_t fileBlockOffset, LBID_t& lbid) throw(); /**@brief Do a VSS lookup. * * Do a VSS lookup. Gets the version ID of the block the caller should use * and determines whether it is in the version buffer or the main database. * @param lbid (in) The block number * @param qc (in) The SCN & txn list provided by SessionManager::verID(). * @param txnID (in) If the caller has a transaction ID, put it here. * Otherwise use 0. * @param outVer (out) The version the caller should use. * @param vbFlag (out) If true, the block is in the version buffer; * false, the block is in the main database. * @param vbOnly (in) If true, it will only consider entries in the Version Buffer * (vbFlag will be true on return). If false, it will also consider the main DB * entries. This defaults to false. * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int vssLookup(LBID_t lbid, const QueryContext& qc, VER_t txnID, VER_t* outVer, bool* vbFlag, bool vbOnly = false) throw(); /** @brief Do many VSS lookups under one lock * * Do many VSS lookups under one lock. * @param lbids (in) The LBIDs to look up * @param qc (in) The input version info, equivalent to the verID param in vssLookup() * @param txnID (in) The input transaction number, equivalent to the txnID param in vssLookup() * @param out (out) The values equivalent to the out parameters in vssLookup() including the individual return codes, ordered as the lbid list. * @return 0 on success, -1 on a fatal error. */ EXPORT int bulkVSSLookup(const std::vector& lbids, const QueryContext_vss& qc, VER_t txnID, std::vector* out); /// returns the version in the main DB files or 0 if none exist EXPORT VER_t getCurrentVersion(LBID_t lbid, bool* isLocked = NULL) const; /// returns the highest version # in the version buffer, or -1 if none exist EXPORT VER_t getHighestVerInVB(LBID_t lbid, VER_t max = std::numeric_limits::max()) const; // returns /// returns true if that block is in the version buffer, false otherwise including on error EXPORT bool isVersioned(LBID_t lbid, VER_t version) const; /// Do many getCurrentVersion lookups under one lock grab EXPORT int bulkGetCurrentVersion(const std::vector& lbids, std::vector* versions, std::vector* isLocked = NULL) const; /** @brief Get a complete list of LBIDs assigned to an OID * * Get a complete list of LBIDs assigned to an OID. */ EXPORT int lookup(OID_t oid, LBIDRange_v& lbidList) throw(); /** @brief Allocate a "stripe" of extents for columns in a table. * * Allocate a "stripe" of extents for the specified columns and DBRoot * @param cols (in) List of column OIDs and column widths * @param dbRoot (in) DBRoot for requested extents. * @param partitionNum (in/out) Partition number in file path. * If allocating OID's first extent for this DBRoot, then * partitionNum is input, else it is an output arg. * @param segmentNum (out) Segment number selected for new extents. * @param extents (out) list of lbids, numBlks, and fbo for new extents * @return 0 on success, -1 on error */ EXPORT int createStripeColumnExtents( const std::vector& cols, uint16_t dbRoot, uint32_t& partitionNum, uint16_t& segmentNum, std::vector& extents) DBRM_THROW; /** @brief Allocate an extent for a column file * * Allocate a column extent for the specified OID and DBRoot. * @param OID (in) The OID requesting the extent. * @param colWidth (in) Column width of the OID. * @param dbRoot (in) DBRoot where extent is to be added. * @param partitionNum (in/out) Partition number in file path. * If allocating OID's first extent for this DBRoot, then * partitionNum is input, else it is an output arg. * @param segmentNum (out) Segment number in file path. * @param colDataType (in) the column type * @param lbid (out) The first LBID of the extent created. * @param allocdSize (out) The total number of LBIDs allocated. * @param startBlockOffset (out) The first block of the extent created. * @return 0 on success, -1 on error */ // @bug 4091: To be deprecated. Replaced by createStripeColumnExtents(). EXPORT int createColumnExtent_DBroot(OID_t oid, uint32_t colWidth, uint16_t dbRoot, uint32_t& partitionNum, uint16_t& segmentNum, execplan::CalpontSystemCatalog::ColDataType colDataType, LBID_t& lbid, int& allocdSize, uint32_t& startBlockOffset) DBRM_THROW; /** @brief Allocate extent for specified segment file * * Allocate column extent for the exact segment file * specified by OID, DBRoot, partition, and segment. * @param OID (in) The OID requesting the extent. * @param colWidth (in) Column width of the OID. * @param dbRoot (in) DBRoot where extent is to be added. * @param partitionNum (in) Partition number in file path. * @param segmentNum (in) Segment number in file path. * @param lbid (out) The first LBID of the extent created. * @param allocdSize (out) The total number of LBIDs allocated. * @param startBlockOffset (out) The first block of the extent created. * @return 0 on success, -1 on error */ EXPORT int createColumnExtentExactFile(OID_t oid, uint32_t colWidth, uint16_t dbRoot, uint32_t partitionNum, uint16_t segmentNum, execplan::CalpontSystemCatalog::ColDataType colDataType, LBID_t& lbid, int& allocdSize, uint32_t& startBlockOffset) DBRM_THROW; /** @brief Allocate an extent for a dictionary store file * * Allocate a dictionary store extent for the specified OID, dbRoot, * partition number, and segment number. * @param OID (in) The OID requesting the extent. * @param dbRoot (in) DBRoot to assign to the extent. * @param partitionNum (in) Partition number to assign to the extent. * @param segmentNum (in) Segment number to assign to the extent. * @param colDataType (in) the column type * @param lbid (out) The first LBID of the extent created. * @param allocdSize (out) The total number of LBIDs allocated. * @return 0 on success, -1 on error */ EXPORT int createDictStoreExtent(OID_t oid, uint16_t dbRoot, uint32_t partitionNum, uint16_t segmentNum, LBID_t& lbid, int& allocdSize) DBRM_THROW; /** @brief Rollback (delete) set of column extents for specific OID & DBRoot * * Deletes all the extents that logically follow the specified * column extent; and sets the HWM for the specified extent. * @param oid OID of the extents to be deleted. * @param bDeleteAll Indicates if all extents in the oid and dbroot are to * be deleted; else part#, seg#, and hwm are used. * @param dbRoot DBRoot of the extents to be deleted. * @param partitionNum Last partition to be kept. * @param segmentNum Last segment in partitionNum to be kept. * @param hwm HWM to be assigned to the last extent that is kept. * @return 0 on success */ EXPORT int rollbackColumnExtents_DBroot(OID_t oid, bool bDeleteAll, uint16_t dbRoot, uint32_t partitionNum, uint16_t segmentNum, HWM_t hwm) DBRM_THROW; /** @brief Rollback (delete) a set of dict store extents for an OID & DBRoot * * Arguments specify the last stripe. Any extents after this are * deleted. The hwm's of the extents in the last stripe are updated * based on the contents of the hwm vector. If hwms is a partial list, * (as in the first stripe of a partition), then any extents in sub- * sequent segment files for that partition are deleted. if hwms is empty * then all the extents in dbRoot are deleted. * @param oid OID of the extents to be deleted or updated. * @param dbRoot DBRoot of the extents to be deleted. * @param partitionNum Last partition to be kept. * @param segNums Vector of segment numbers for last partition to be kept. * @param hwms Vector of hwms for the last partition to be kept. * @return 0 on success */ EXPORT int rollbackDictStoreExtents_DBroot(OID_t oid, uint16_t dbRoot, uint32_t partitionNum, const std::vector& segNums, const std::vector& hwms) DBRM_THROW; /** @brief delete of column extents for the specified extents. * * Deletes the extents from extent map * @param extentInfo the information for extents */ EXPORT int deleteEmptyColExtents(const std::vector& extentsInfo) DBRM_THROW; /** @brief delete of dictionary extents for the specified extents. * * Deletes the extents from extent map * @param extentInfo the information for extents */ EXPORT int deleteEmptyDictStoreExtents(const std::vector& extentsInfo) DBRM_THROW; /** @brief Delete the extents of an OID and invalidate VSS references to them * * Delete the extents assigned to an OID and deletes entries in the VSS * that refer to the LBIDs used by it. * @note The old version of this function deliberately did not delete the entries * in the version buffer. * @note This function is ridiculously slow right now. * @param OID The OID of the object being deleted * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int deleteOID(OID_t oid) DBRM_THROW; /** @brief Delete the extents of an OID and invalidate VSS references to them * * Delete the extents assigned to an OID and deletes entries in the VSS * that refer to the LBIDs used by it. * @note The old version of this function deliberately did not delete the entries * in the version buffer. * @note This function is ridiculously slow right now. * @param OID The OID of the object being deleted * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int deleteOIDs( const std::vector& oids) DBRM_THROW; /** @brief Gets the last local high water mark for an OID and dbRoot * * Get last local high water mark of an OID for a given dbRoot, relative to * a segment file. The partition and segment numbers for the pertinent * segment are also returned. * @param OID (in) The OID * @param dbRoot (in) The relevant DBRoot * @param partitionNum (out) The relevant partition number * @param segmentNum (out) The relevant segment number * @param hwm (out) Last local high water mark for specified input * @param status (out) State of the extent (Available, OutOfService, etc) * @param bFound (out) Indicates whether an extent was found on the dbRoot * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int getLastHWM_DBroot(int OID, uint16_t dbRoot, uint32_t& partitionNum, uint16_t& segmentNum, HWM_t& hwm, int& status, bool& bFound) throw(); /** @brief Get the "high water mark" of an OID, partition, and segment * * Get local high water mark (aka, the highest numbered written block * offset) for an OID,partition,segment relative to the segment file. * This applies to either column or dictionary store OIDs. * @param oid (in) The OID * @param partitionNum (in) Relevant partition number. * @param segmentNum (in) Relevant segment number. * @param hwm (out) The high water mark of oid * @param status (out) State of the extent (Available, OutOfService, etc) * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int getLocalHWM(OID_t oid, uint32_t partitionNum, uint16_t segmentNum, HWM_t& hwm, int& status) throw(); /** @brief Set the "high water mark" of an OID, partition, and segment * * Set the local high water mark (aka, the highest numbered written * block offset) for the segment file referenced by the specified OID, * partition, and segment number. * This applies to either column or dictionary store OIDs. * @param oid (in) The OID * @param partitionNum (in) Relevant partition number. * @param segmentNum (in) Relevant segment number. * @param hwm (in) The high water mark of oid * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int setLocalHWM(OID_t oid, uint32_t partitionNum, uint16_t segmentNum, HWM_t hwm) DBRM_THROW; EXPORT int bulkSetHWM(const std::vector&, VER_t transID = 0) DBRM_THROW; /** @brief Does setLocalHWM, casual partitioning changes, & commit. The HWM & * CP changes are atomic with this fcn. All functionality is optional. Passing * in an empty vector for any of these parms makes it do nothing for the * corresponding operation. * * It returns 0 if all operations succeed, -1 if any operation fails. * The controllernode will undo all changes made on error. */ EXPORT int bulkSetHWMAndCP(const std::vector& hwmArgs, const std::vector& setCPDataArgs, const std::vector& mergeCPDataArgs, VER_t transID) DBRM_THROW; EXPORT int bulkUpdateDBRoot(const std::vector&); /** @brief Get HWM information about last segment file for each DBRoot * assigned to a specific PM. * * Vector will contain an entry for each DBRoot. If no "available" extents * are found for a DBRoot, then totalBlocks will be 0 (and hwmExtentIndex * will be -1) for that DBRoot. * @param oid The oid of interest. * @param pmNumber The PM number of interest. * @param emDbRootHwmInfos The vector of DbRoot/HWM related objects. */ EXPORT int getDbRootHWMInfo(OID_t oid, uint16_t pmNumber, EmDbRootHWMInfo_v& emDbRootHwmInfos) throw(); /** @brief Get the status (AVAILABLE, OUTOFSERVICE, etc) for the * segment file represented by the specified OID, part# and seg#. * * Unlike many of the other DBRM functions, this function does * not return a bad return code if no extent is found; the "found" * flag indicates whether an extent was found or not. * * @param oid (in) The OID of interest * @param partitionNum (in) The partition number of interest * @param segmentNum (in) The segment number of interest * @param bFound (out) Indicates if extent was found or not * @param status (out) The state of the extents in the specified * segment file. * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int getExtentState(OID_t oid, uint32_t partitionNum, uint16_t segmentNum, bool& bFound, int& status) throw(); /** @brief Gets the extents of a given OID * * Gets the extents of a given OID. * @param OID (in) The OID to get the extents for. * @param entries (out) A snapshot of the OID's Extent Map entries * sorted by starting LBID; note that The Real Entries can change at * any time. Also, internally the size of an extent is measured in * multiples of 1024 LBIDs. So, if the size field is 10, it represents * 10240 LBIDs. * @param sorted (in) indicates if output is to be sorted * @param notFoundErr (in) indicates if no extents is considered an err * @param incOutOfService (in) include/exclude out of service extents * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int getExtents(int OID, std::vector& entries, bool sorted = true, bool notFoundErr = true, bool incOutOfService = false); /** @brief Gets the extents of a given OID under specified dbroot * * Gets the extents of a given OID under specified dbroot. * @param OID (in) The OID to get the extents for. * @param entries (out) A snapshot of the OID's Extent Map entries * @param dbroot (in) dbroot * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int getExtents_dbroot(int OID, std::vector& entries, const uint16_t dbroot) throw(); /** @brief Gets the number of extents for the specified OID and DBRoot * * @param OID (in) The OID of interest * @param dbroot (in) The DBRoot of interest * @param incOutOfService (in) include/exclude out of service extents * @param numExtents (out) number of extents found for OID and dbroot * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int getExtentCount_dbroot(int OID, uint16_t dbroot, bool incOutOfService, uint64_t& numExtents) throw(); /** @brief Gets the number of rows in an extent * * Gets the number of rows in an extent. * @return The extent size */ // dmc-getExtentSize() to be deprecated, replaced by getExtentRows() EXPORT int getExtentSize() throw(); EXPORT unsigned getExtentRows() throw(); /** @brief Gets the DBRoot for the specified system catalog OID * * Function should only be called for System Catalog OIDs, as it assumes * the OID is fully contained on a single DBRoot, returning the first * DBRoot found. This only makes since for a System Catalog OID, because * all other column OIDs can span multiple DBRoots. * * @param oid The system catalog OID * @param dbRoot (out) the DBRoot holding the system catalog OID */ EXPORT int getSysCatDBRoot(OID_t oid, uint16_t& dbRoot) throw(); /** @brief Delete a Partition for the specified OID(s). * * @param OID (in) the OID of interest. * @param partitionNums (in) the set of partitions to be deleted. */ EXPORT int deletePartition(const std::vector& oids, const std::set& partitionNums, std::string& emsg) DBRM_THROW; /** @brief Mark a Partition for the specified OID(s) as out of service. * * @param OID (in) the OID of interest. * @param partitionNums (in) the set of partitions to be marked out of service. */ EXPORT int markAllPartitionForDeletion(const std::vector& oids) DBRM_THROW; /** @brief Mark a Partition for the specified OID(s) as out of service. * * @param OID (in) the OID of interest. * @param partitionNums (in) the set of partitions to be marked out of service. */ EXPORT int markPartitionForDeletion(const std::vector& oids, const std::set& partitionNums, std::string& emsg) DBRM_THROW; /** @brief Restore a Partition for the specified OID(s). * * @param OID (in) the OID of interest. * @param partitionNums (in) the set of partitions to be restored. */ EXPORT int restorePartition(const std::vector& oids, const std::set& partitionNums, std::string& emsg) DBRM_THROW; /** @brief Get the list of out-of-service partitions for a given OID * * @param OID (in) the OID of interest. * @param partitionNums (out) the out-of-service partitions for the oid. * partitionNums will be in sorted order. */ EXPORT int getOutOfServicePartitions(OID_t oid, std::set& partitionNums) throw(); /** @brief Delete all rows in the extent map that reside on the given DBRoot * * @param dbroot (in) the dbroot to be deleted */ EXPORT int deleteDBRoot(uint16_t dbroot) DBRM_THROW; /** @brief Is the specified DBRoot empty with no extents. * Returns error if extentmap shared memory is not loaded. * * @param dbroot DBRoot of interest * @param isEmpty (output) Flag indiicating whether DBRoot is empty * @param errMsg (output) Error message corresponding to bad return code * @return ERR_OK on success */ EXPORT int isDBRootEmpty(uint16_t dbroot, bool& isEmpty, std::string& errMsg) throw(); /** @brief Registers a version buffer entry. * * Registers a version buffer entry at with * values of . * @note The version buffer locations must hold the 'copy' lock * first. * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int writeVBEntry(VER_t transID, LBID_t lbid, OID_t vbOID, uint32_t vbFBO) DBRM_THROW; /** @brief Bulk registers a version buffer entry. * * Similar to writeVBEntry, but registers the version buffer * entries in bulk for a list of lbids and vbFBOs, for a given * transID and vbOID. * @note The version buffer locations must hold the 'copy' lock * first. * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int bulkWriteVBEntry(VER_t transID, const std::vector& lbids, OID_t vbOID, const std::vector& vbFBOs) DBRM_THROW; /** @brief Retrieves a list of uncommitted LBIDs. * * Retrieves a list of uncommitted LBIDs for the given transaction ID. * @param lbidList (out) On success this contains the ranges of LBIDs * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int getUncommittedLBIDs(VER_t transID, std::vector& lbidList) throw(); /** @brief Does what you think it does. * * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int getDBRootsForRollback(VER_t transID, std::vector* dbRootList) throw(); // @bug 1509. Added getUncommittedExtentLBIDs function. /** @brief Retrieves a list of uncommitted extent LBIDs. * * Retrieves a list of uncommitted LBIDs for the given transaction ID. * This function differs from getUncommittedLBIDs in that only one LBID per * extent is returned. It is used to return a list that can be used to update * casual partitioning information which is tracked at the extent level rather * than the block level. * @param lbidList (out) On success this contains the ranges of LBIDs * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int getUncommittedExtentLBIDs(VER_t transID, std::vector& lbidList) throw(); /** @brief Atomically prepare to copy data to the version buffer * * Atomically sets the copy flag on the specified LBID ranges * and allocate blocks in the version buffer to copy them to. * If any LBID in the range cannot be locked, none will be * and this will return -1. * @param transID The transaction ID doing the operation * @param ranges (in) A list of LBID ranges that will be copied * @param freeList (out) On success, a list of ranges of the version * buffer blocks to copy the LBID range to. * @note The caller must do a rollback or commit immediately after getting ERR_DEADLOCK (6). * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int beginVBCopy(VER_t transID, uint16_t dbRoot, const LBIDRange_v& ranges, VBRange_v& freeList) DBRM_THROW; /** @brief Atomically unset the copy lock & update the VSS. Beware! Read the warning! * * Atomically unset the copy lock for the specified LBID ranges * and add a new locked VSS entry for each LBID in the range. * @note The elements of the ranges parameter MUST be the * same elements passed to beginVBCopy(). The number and order of the * elements can be different, but every element in ranges must also * have been an element in beginVBCopy's ranges. * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int endVBCopy(VER_t transID, const LBIDRange_v& ranges) DBRM_THROW; /** @brief Commit the changes made for the given transaction. * * This unlocks the VSS entries with VerID = transID. * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int vbCommit(VER_t transID) DBRM_THROW; /** @brief Reverse the changes made during the given transaction. * * Record that the given LBID was reverted to version verID. * @warning This removes the copy locks held on all ranges by transID. * @param transID The transaction ID * @param lbidList The list of ranges to rollback. * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int vbRollback(VER_t transID, const LBIDRange_v& lbidList) DBRM_THROW; /** @brief Reverse the changes made during the given transaction. * * Record that the given LBID was reverted to version verID. * @warning This removes the copy locks held on all ranges by transID. * @param transID The transaction ID * @param lbidList The list of singular LBIDs to rollback. * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int vbRollback(VER_t transID, const std::vector& lbidList) DBRM_THROW; EXPORT int getUnlockedLBIDs(BlockList_t* list) DBRM_THROW; /** @brief Reinitialize the versioning data structures. * * This entry point empties the VSS and VBBM structures on the * slave nodes. At system startup and after recovery, the data left in * the VSS and VBBM are unnecessary. The primary purpose of this function * is to free up memory. * @return 0 on success, non-0 on error (see brmtypes.h). */ EXPORT int clear() DBRM_THROW; /** @brief Check the consistency of each data structure * * Check the consistency of each data structure * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int checkConsistency() throw(); /** @brief Get a list of the transactions currently in progress. * * Get a list of the transactions currently in progress. This scans * the copy locks & VSS for LBIDs that are locked by some transaction * and stores the transaction ID. * * @param txnList Caller-supplied set to store the results in. * @return 0 on success, non-0 on error (see brmtypes.h) */ EXPORT int getCurrentTxnIDs(std::set& txnList) throw(); /** @brief Persistence API. Saves the local Extent Map to a file. * * Persistence API. Saves the local Extent Map to a file. * * @param filename Relative or absolute path to save to. * @return 0 on success, -1 on error */ EXPORT int saveExtentMap(const std::string& filename) throw(); /** @brief Persistence API. Saves all BRM structures. * * Saves all local BRM structures to files. * * @param filename The filename prefix to use. Saves 4 files with that prefix. * @return 0 on success, -1 on error */ EXPORT int saveState(std::string filename) throw(); /** @brief Persistence API. Saves all BRM structures using the filenames from Columnstore.xml. * * Saves all local BRM structures to files. * * @param filename The filename prefix to use. Saves 4 files with that prefix. * @return 0 on success, -1 on error */ EXPORT int saveState() throw(); /** @brief A function that forces the BRM to write a snapshot of its data structures to disk * * A function that forces the BRM to write a snapshot of its data structures to disk. * This happens automatically after commits and rollbacks. Bulk imports should call * this fcn after an import. * * @return 0 on success, non-0 on error (see brmtypes.h). */ EXPORT int takeSnapshot() throw(); /* SessionManager interface */ EXPORT const QueryContext verID(); EXPORT const QueryContext sysCatVerID(); EXPORT const TxnID newTxnID(const SessionManagerServer::SID session, bool block, bool isDDL = false); EXPORT void committed(BRM::TxnID& txnid); EXPORT void rolledback(BRM::TxnID& txnid); EXPORT const BRM::TxnID getTxnID(const SessionManagerServer::SID session); EXPORT boost::shared_array SIDTIDMap(int& len); EXPORT void sessionmanager_reset(); /* Note, these pull #s from two separate sequences. That is, they both return 0, then 1, 2, 3, etc. */ EXPORT uint32_t getUnique32(); EXPORT uint64_t getUnique64(); /* New table lock interface */ /* returns a unique ID (> 0) for the lock on success, 0 on failure. * Also, on failure, the ownerName, pid, and session ID parameters will be set * to the owner of one of the overlapping locks. */ EXPORT uint64_t getTableLock(const std::vector& pmList, uint32_t tableOID, std::string* ownerName, uint32_t* ownerPID, int32_t* ownerSessionID, int32_t* ownerTxnID, LockState state); EXPORT bool releaseTableLock(uint64_t id); EXPORT bool changeState(uint64_t id, LockState state); EXPORT bool changeOwner(uint64_t id, const std::string& ownerName, uint32_t ownerPID, int32_t ownerSessionID, int32_t ownerTxnID); EXPORT bool checkOwner(uint64_t id); EXPORT std::vector getAllTableLocks(); EXPORT void releaseAllTableLocks(); EXPORT bool getTableLockInfo(uint64_t id, TableLockInfo* out); /** Casual partitioning support **/ EXPORT int markExtentInvalid(const LBID_t lbid, execplan::CalpontSystemCatalog::ColDataType colDataType) DBRM_THROW; EXPORT int markExtentsInvalid(const std::vector& lbids, const std::vector& colDataTypes) DBRM_THROW; EXPORT int getExtentMaxMin(const LBID_t lbid, int64_t& max, int64_t& min, int32_t& seqNum) throw(); EXPORT int setExtentMaxMin(const LBID_t lbid, const int64_t max, const int64_t min, const int32_t seqNum) DBRM_THROW; /** @brief Updates the max and min casual partitioning info for the passed extents. * * @bug 1970. * * @param cpInfos vector of CPInfo objects. The firstLbid must be the first LBID in the extent. * @return 0 on success, -1 on error */ EXPORT int setExtentsMaxMin(const CPInfoList_t& cpInfos) DBRM_THROW; /** @brief Merges max/min casual partitioning info for the specified * extents, with the current CP info. * * @param cpInfos vector of CPInfo objects. The Lbids must be the * starting LBID in the relevant extent. * @return 0 on success, -1 on error */ EXPORT int mergeExtentsMaxMin(const CPInfoMergeList_t& cpInfos) DBRM_THROW; /* read-side interface for locking LBID ranges (used by PrimProc) */ EXPORT void lockLBIDRange(LBID_t start, uint32_t count); EXPORT void releaseLBIDRange(LBID_t start, uint32_t count); /* write-side interface for locking LBID ranges (used by DML) */ EXPORT int dmlLockLBIDRanges(const std::vector& ranges, int txnID); EXPORT int dmlReleaseLBIDRanges(const std::vector& ranges); /* OAM Interface */ EXPORT int halt() DBRM_THROW; EXPORT int resume() DBRM_THROW; EXPORT int forceReload() DBRM_THROW; EXPORT int setReadOnly(bool b) DBRM_THROW; EXPORT int isReadWrite() throw(); EXPORT bool isEMEmpty() throw(); EXPORT std::vector getEMFreeListEntries() throw(); /** @brief Check if the system is ready for updates * * Check is the system has completed rollback processing and is * ready for updates */ EXPORT int getSystemReady() throw(); /** @brief Check if the system is ready for queries * * Check is the system has completed rollback processing and is * ready for updates */ EXPORT int getSystemQueryReady() throw(); /** @brief Check if the system is suspended * * Suspended is caused by user at calpont-console * @return 0 - system is not suspended, > 0 - system is * suspended, < 0 on error */ EXPORT int getSystemSuspended() throw(); /** @brief Check if system suspension is pending * * If the user at calpont-console asks for suspension, but ddl, * dml or cpimport are running, then we can't suspend. If user * says suspend when all work completed, then this flag is set * to prevent new work from starting. * @param bRollback (out) if true, system is in a rollback mode * before suspension. * @return 0 - system is not in a suspend pending state, > 0 - * system is in a suspend pending state, < 0 on error */ EXPORT int getSystemSuspendPending(bool& bRollback) throw(); /** @brief Check if system shutdown is pending * * If the user at calpont-console asks for shutdown, but ddl, * dml or cpimport are running, then we can't shutdown. If user * says shutdown when all work completed, then this flag is set * to prevent new work from starting. * @param bRollback (out) if true, system is in rollback mode * before shutdown. * @param bForce (out) if true, system is in force shutdown * mode. No work of any kind should be done. * @return 0 - system is not pending a shutdown, > 0 - system is * pending a shutdown, < 0 on error */ EXPORT int getSystemShutdownPending(bool& bRollback, bool& bForce) throw(); /** @brief Mark the system as ready for updates * * The system has completed rollback processing and is therefore ready for updates * @param bReady the state the ready flag should be set to. * @return < 0 on error */ EXPORT int setSystemReady(bool bReady) throw(); /** @brief Mark the system as ready for queries * * The system has completed bring up all modules and is ready for queries * Queries are allowed during DMLRollback, so SS_READY won't fork for queries. * @param bReady the state the ready flag should be set to. * @return < 0 on error */ EXPORT int setSystemQueryReady(bool bReady) throw(); /** @brief Mark the system as suspended (or not) * * @param bSuspended the suspend state the system should be set * to. * @return < 0 on error */ EXPORT int setSystemSuspended(bool bSuspended) throw(); /** @brief Mark the system as suspension pending * * @param bPending the suspend pending state the system should * be set to. * @param bRollback if true, rollback all active transactions * before full suspension of writes (only used * if bPending is true). * @return < 0 on error */ EXPORT int setSystemSuspendPending(bool bPending, bool bRollback = false) throw(); /** @brief Mark the system as shutdown pending * * @param bPending the suspend pending state the system should * be set to. * @param bRollback if true, rollback all active transactions * before shutting down. (only used if bPending * is true). * @param bForce if true, we're shutting down now. No further * work, including rollback, should be done. * (only used if bPending is true). * @return < 0 on error */ EXPORT int setSystemShutdownPending(bool bPending, bool bRollback = false, bool bForce = false) throw(); /** @brief get the flags in the system state bit map. * @param stateFlags (out) * @return < 0 on error */ int getSystemState(uint32_t& stateFlags) throw(); /** @brief set the flags in the system state bit map. * * sets the flags that are set in stateFlags leaving other flags undisturbed * @param stateFlags (out) * @return < 0 on error */ int setSystemState(uint32_t stateFlags) throw(); /** @brief set the flags in the system state bit map. * * Clears the flags that are set in stateFlags leaving other flags undisturbed * @param stateFlags (out) * @return < 0 on error */ int clearSystemState(uint32_t stateFlags) throw(); /** @brief Check to see if Controller Node is functioning */ bool isDBRMReady() throw(); /* OID Manager interface. See oidserver.h for the API documentation. */ EXPORT int allocOIDs(int num); EXPORT void returnOIDs(int start, int end); EXPORT int oidm_size(); EXPORT int allocVBOID(uint32_t dbroot); EXPORT int getDBRootOfVBOID(uint32_t vbOID); EXPORT std::vector getVBOIDToDBRootMap(); /* Autoincrement interface */ EXPORT void startAISequence(uint32_t OID, uint64_t firstNum, uint32_t colWidth, execplan::CalpontSystemCatalog::ColDataType colDataType); EXPORT bool getAIRange(uint32_t OID, uint32_t count, uint64_t* firstNum); EXPORT bool getAIValue(uint32_t OID, uint64_t* value); EXPORT void resetAISequence(uint32_t OID, uint64_t value); EXPORT void getAILock(uint32_t OID); EXPORT void releaseAILock(uint32_t OID); /* Added to support unsigned */ /** @brief Invalidate the casual partitioning for all uncommited * extents. * * Either txnid or plbidList can be passed . Only one will be * used. * @param txnid (in) - The transaction for which to get the lbid * list. * @param plbidList (in) - a list of lbids whose extents are to * be invalidated. Only one lbid per extent should * be in this list, such as returned in * getUncommittedExtentLBIDs(). * @return nothing. */ EXPORT void invalidateUncommittedExtentLBIDs(execplan::CalpontSystemCatalog::SCN txnid, std::vector* plbidList = NULL); private: DBRM(const DBRM& brm); DBRM& operator=(const DBRM& brm); int8_t send_recv(const messageqcpp::ByteStream& in, messageqcpp::ByteStream& out) throw(); void deleteAISequence(uint32_t OID); // called as part of deleteOID & deleteOIDs boost::scoped_ptr mst; boost::scoped_ptr em; boost::scoped_ptr vbbm; boost::scoped_ptr vss; boost::scoped_ptr copylocks; messageqcpp::MessageQueueClient* msgClient; std::string masterName; boost::mutex mutex; config::Config* config; bool fDebug; }; } #undef EXPORT #endif