mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 02:46:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			514 lines
		
	
	
	
		
			19 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			514 lines
		
	
	
	
		
			19 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*****************************************************************************
 | |
| 
 | |
| Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
 | |
| Copyright (c) 2017, 2022, MariaDB Corporation.
 | |
| 
 | |
| 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-1335 USA
 | |
| 
 | |
| *****************************************************************************/
 | |
| 
 | |
| /**************************************************//**
 | |
| @file include/trx0undo.h
 | |
| Transaction undo log
 | |
| 
 | |
| Created 3/26/1996 Heikki Tuuri
 | |
| *******************************************************/
 | |
| 
 | |
| #ifndef trx0undo_h
 | |
| #define trx0undo_h
 | |
| 
 | |
| #ifndef UNIV_INNOCHECKSUM
 | |
| #include "trx0sys.h"
 | |
| 
 | |
| /** The LSB of the "is insert" flag in DB_ROLL_PTR */
 | |
| #define ROLL_PTR_INSERT_FLAG_POS 55
 | |
| /** The LSB of the 7-bit trx_rseg_t::id in DB_ROLL_PTR */
 | |
| #define ROLL_PTR_RSEG_ID_POS 48
 | |
| /** The LSB of the 32-bit undo log page number in DB_ROLL_PTR */
 | |
| #define ROLL_PTR_PAGE_POS 16
 | |
| /** The LSB of the 16-bit byte offset within an undo log page in DB_ROLL_PTR */
 | |
| #define ROLL_PTR_BYTE_POS 0
 | |
| 
 | |
| /***********************************************************************//**
 | |
| Builds a roll pointer.
 | |
| @return roll pointer */
 | |
| UNIV_INLINE
 | |
| roll_ptr_t
 | |
| trx_undo_build_roll_ptr(
 | |
| /*====================*/
 | |
| 	bool	is_insert,	/*!< in: TRUE if insert undo log */
 | |
| 	ulint	rseg_id,	/*!< in: rollback segment id */
 | |
| 	uint32_t page_no,	/*!< in: page number */
 | |
| 	uint16_t offset);	/*!< in: offset of the undo entry within page */
 | |
| /***********************************************************************//**
 | |
| Decodes a roll pointer. */
 | |
| UNIV_INLINE
 | |
| void
 | |
| trx_undo_decode_roll_ptr(
 | |
| /*=====================*/
 | |
| 	roll_ptr_t	roll_ptr,	/*!< in: roll pointer */
 | |
| 	bool*		is_insert,	/*!< out: TRUE if insert undo log */
 | |
| 	ulint*		rseg_id,	/*!< out: rollback segment id */
 | |
| 	uint32_t*	page_no,	/*!< out: page number */
 | |
| 	uint16_t*	offset);	/*!< out: offset of the undo
 | |
| 					entry within page */
 | |
| /***********************************************************************//**
 | |
| Determine if DB_ROLL_PTR is of the insert type.
 | |
| @return true if insert */
 | |
| UNIV_INLINE
 | |
| bool
 | |
| trx_undo_roll_ptr_is_insert(
 | |
| /*========================*/
 | |
| 	roll_ptr_t	roll_ptr);	/*!< in: roll pointer */
 | |
| /***********************************************************************//**
 | |
| Returns true if the record is of the insert type.
 | |
| @return true if the record was freshly inserted (not updated). */
 | |
| UNIV_INLINE
 | |
| bool
 | |
| trx_undo_trx_id_is_insert(
 | |
| /*======================*/
 | |
| 	const byte*	trx_id)	/*!< in: DB_TRX_ID, followed by DB_ROLL_PTR */
 | |
| 	MY_ATTRIBUTE((warn_unused_result));
 | |
| /** Write DB_ROLL_PTR.
 | |
| @param[out]	ptr		buffer
 | |
| @param[in]	roll_ptr	DB_ROLL_PTR value */
 | |
| inline void trx_write_roll_ptr(byte* ptr, roll_ptr_t roll_ptr)
 | |
| {
 | |
| 	compile_time_assert(DATA_ROLL_PTR_LEN == 7);
 | |
| 	mach_write_to_7(ptr, roll_ptr);
 | |
| }
 | |
| /** Read DB_ROLL_PTR.
 | |
| @param[in]	ptr	buffer
 | |
| @return roll ptr */
 | |
| inline roll_ptr_t trx_read_roll_ptr(const byte* ptr)
 | |
| {
 | |
| 	compile_time_assert(DATA_ROLL_PTR_LEN == 7);
 | |
| 	return mach_read_from_7(ptr);
 | |
| }
 | |
| 
 | |
| /** Get the next record in an undo log.
 | |
| @param[in]      undo_page       undo log page
 | |
| @param[in]      rec             undo record offset in the page
 | |
| @param[in]      page_no         undo log header page number
 | |
| @param[in]      offset          undo log header offset on page
 | |
| @return undo log record, the page latched, NULL if none */
 | |
| inline trx_undo_rec_t*
 | |
| trx_undo_page_get_next_rec(const buf_block_t *undo_page, uint16_t rec,
 | |
|                            uint32_t page_no, uint16_t offset);
 | |
| /** Get the previous record in an undo log.
 | |
| @param[in,out]  block   undo log page
 | |
| @param[in]      rec     undo record offset in the page
 | |
| @param[in]      page_no undo log header page number
 | |
| @param[in]      offset  undo log header offset on page
 | |
| @param[in]      shared  latching mode: true=RW_S_LATCH, false=RW_X_LATCH
 | |
| @param[in,out]  mtr     mini-transaction
 | |
| @return undo log record, the page latched, NULL if none */
 | |
| trx_undo_rec_t*
 | |
| trx_undo_get_prev_rec(buf_block_t *&block, uint16_t rec, uint32_t page_no,
 | |
|                       uint16_t offset, bool shared, mtr_t *mtr);
 | |
| 
 | |
| /** Get the first undo log record on a page.
 | |
| @param[in]	block	undo log page
 | |
| @param[in]	page_no	undo log header page number
 | |
| @param[in]	offset	undo log header page offset
 | |
| @return	pointer to first record
 | |
| @retval	nullptr	if none exists */
 | |
| trx_undo_rec_t*
 | |
| trx_undo_page_get_first_rec(const buf_block_t *block, uint32_t page_no,
 | |
|                             uint16_t offset);
 | |
| 
 | |
| /** Initialize an undo log page.
 | |
| NOTE: This corresponds to a redo log record and must not be changed!
 | |
| @see mtr_t::undo_create()
 | |
| @param[in,out]	block	undo log page */
 | |
| void trx_undo_page_init(const buf_block_t &block);
 | |
| 
 | |
| /** Allocate an undo log page.
 | |
| @param[in,out]	undo	undo log
 | |
| @param[in,out]	mtr	mini-transaction that does not hold any page latch
 | |
| @param[out]	err	error code
 | |
| @return	X-latched block if success
 | |
| @retval	nullptr	on failure */
 | |
| buf_block_t *trx_undo_add_page(trx_undo_t *undo, mtr_t *mtr, dberr_t *err)
 | |
|   MY_ATTRIBUTE((nonnull, warn_unused_result));
 | |
| 
 | |
| /** Free the last undo log page. The caller must hold the rseg mutex.
 | |
| @param[in,out]	undo	undo log
 | |
| @param[in,out]	mtr	mini-transaction that does not hold any undo log page
 | |
| 			or that has allocated the undo log page
 | |
| @return error code */
 | |
| dberr_t trx_undo_free_last_page(trx_undo_t *undo, mtr_t *mtr)
 | |
|   MY_ATTRIBUTE((nonnull, warn_unused_result));
 | |
| 
 | |
| /** Try to truncate the undo logs.
 | |
| @param trx transaction
 | |
| @return error code */
 | |
| dberr_t trx_undo_try_truncate(const trx_t &trx);
 | |
| 
 | |
| /** Truncate the head of an undo log.
 | |
| NOTE that only whole pages are freed; the header page is not
 | |
| freed, but emptied, if all the records there are below the limit.
 | |
| @param[in,out]	rseg		rollback segment
 | |
| @param[in]	hdr_page_no	header page number
 | |
| @param[in]	hdr_offset	header offset on the page
 | |
| @param[in]	limit		first undo number to preserve
 | |
| (everything below the limit will be truncated)
 | |
| @return error code */
 | |
| dberr_t
 | |
| trx_undo_truncate_start(
 | |
| 	trx_rseg_t*	rseg,
 | |
| 	uint32_t	hdr_page_no,
 | |
| 	uint16_t	hdr_offset,
 | |
| 	undo_no_t	limit)
 | |
| 	MY_ATTRIBUTE((nonnull, warn_unused_result));
 | |
| /** Mark that an undo log header belongs to a data dictionary transaction.
 | |
| @param[in]	trx	dictionary transaction
 | |
| @param[in,out]	undo	undo log
 | |
| @param[in,out]	mtr	mini-transaction */
 | |
| void trx_undo_mark_as_dict(const trx_t* trx, trx_undo_t* undo, mtr_t* mtr);
 | |
| /** Assign an undo log for a persistent transaction.
 | |
| A new undo log is created or a cached undo log reused.
 | |
| @param[in,out]	trx	transaction
 | |
| @param[out]	err	error code
 | |
| @param[in,out]	mtr	mini-transaction
 | |
| @return	the undo log block
 | |
| @retval	NULL	on error */
 | |
| buf_block_t*
 | |
| trx_undo_assign(trx_t* trx, dberr_t* err, mtr_t* mtr)
 | |
| 	MY_ATTRIBUTE((nonnull));
 | |
| /** Assign an undo log for a transaction.
 | |
| A new undo log is created or a cached undo log reused.
 | |
| @tparam is_temp  whether this is temporary undo log
 | |
| @param[in,out]	trx	transaction
 | |
| @param[in]	rseg	rollback segment
 | |
| @param[out]	undo	the undo log
 | |
| @param[in,out]	mtr	mini-transaction
 | |
| @param[out]	err	error code
 | |
| @return	the undo log block
 | |
| @retval	nullptr	on error */
 | |
| template<bool is_temp>
 | |
| buf_block_t*
 | |
| trx_undo_assign_low(trx_t *trx, trx_rseg_t *rseg, trx_undo_t **undo,
 | |
|                     mtr_t *mtr, dberr_t *err)
 | |
| 	MY_ATTRIBUTE((nonnull, warn_unused_result));
 | |
| 
 | |
| /** Set the state of the undo log segment at a XA PREPARE or XA ROLLBACK.
 | |
| @param[in,out]	trx		transaction
 | |
| @param[in,out]	undo		undo log
 | |
| @param[in]	rollback	false=XA PREPARE, true=XA ROLLBACK
 | |
| @param[in,out]	mtr		mini-transaction */
 | |
| void trx_undo_set_state_at_prepare(trx_t *trx, trx_undo_t *undo, bool rollback,
 | |
|                                    mtr_t *mtr)
 | |
|   MY_ATTRIBUTE((nonnull));
 | |
| 
 | |
| /** At shutdown, frees the undo logs of a transaction. */
 | |
| void
 | |
| trx_undo_free_at_shutdown(trx_t *trx);
 | |
| 
 | |
| /** Read an undo log when starting up the database.
 | |
| @param[in,out]	rseg		rollback segment
 | |
| @param[in]	id		rollback segment slot
 | |
| @param[in]	page_no		undo log segment page number
 | |
| @return	the undo log
 | |
| @retval nullptr on error */
 | |
| trx_undo_t *
 | |
| trx_undo_mem_create_at_db_start(trx_rseg_t *rseg, ulint id, uint32_t page_no);
 | |
| 
 | |
| #endif /* !UNIV_INNOCHECKSUM */
 | |
| 
 | |
| /** the only rollback segment type since MariaDB 10.3.1 */
 | |
| constexpr uint16_t TRX_UNDO_UPDATE= 2;
 | |
| /* TRX_UNDO_STATE values of an undo log segment */
 | |
| /** contains an undo log of an active transaction */
 | |
| constexpr uint16_t TRX_UNDO_ACTIVE = 1;
 | |
| /** cached for quick reuse */
 | |
| constexpr uint16_t TRX_UNDO_CACHED = 2;
 | |
| /** can be freed in purge when all undo data in it is removed */
 | |
| constexpr uint16_t TRX_UNDO_TO_PURGE = 4;
 | |
| /** contains an undo log of a prepared transaction */
 | |
| constexpr uint16_t TRX_UNDO_PREPARED = 5;
 | |
| 
 | |
| #ifndef UNIV_INNOCHECKSUM
 | |
| 
 | |
| /** Transaction undo log memory object; modified by the thread associated
 | |
| with the transaction. */
 | |
| 
 | |
| struct trx_undo_t {
 | |
| 	/*-----------------------------*/
 | |
| 	ulint		id;		/*!< undo log slot number within the
 | |
| 					rollback segment */
 | |
| 	ulint		state;		/*!< state of the corresponding undo log
 | |
| 					segment */
 | |
| 	trx_id_t	trx_id;		/*!< id of the trx assigned to the undo
 | |
| 					log */
 | |
| 	XID		xid;		/*!< X/Open XA transaction
 | |
| 					identification */
 | |
| 	bool		dict_operation;	/*!< TRUE if a dict operation trx */
 | |
| 	trx_rseg_t*	rseg;		/*!< rseg where the undo log belongs */
 | |
| 	/*-----------------------------*/
 | |
| 	uint32_t	hdr_page_no;	/*!< page number of the header page in
 | |
| 					the undo log */
 | |
| 	uint32_t	last_page_no;	/*!< page number of the last page in the
 | |
| 					undo log; this may differ from
 | |
| 					top_page_no during a rollback */
 | |
| 	uint16_t	hdr_offset;	/*!< header offset of the undo log on
 | |
| 				       	the page */
 | |
| 	uint32_t	size;		/*!< current size in pages */
 | |
| 	/*-----------------------------*/
 | |
| 	uint32_t	top_page_no;	/*!< page number where the latest undo
 | |
| 					log record was catenated; during
 | |
| 					rollback the page from which the latest
 | |
| 					undo record was chosen */
 | |
| 	uint16_t	top_offset;	/*!< offset of the latest undo record,
 | |
| 					i.e., the topmost element in the undo
 | |
| 					log if we think of it as a stack */
 | |
| 	undo_no_t	top_undo_no;	/*!< undo number of the latest record
 | |
| 					(IB_ID_MAX if the undo log is empty) */
 | |
| 	buf_block_t*	guess_block;	/*!< guess for the buffer block where
 | |
| 					the top page might reside */
 | |
| 
 | |
| 	/** @return whether the undo log is empty */
 | |
| 	bool empty() const { return top_undo_no == IB_ID_MAX; }
 | |
| 
 | |
| 	/*-----------------------------*/
 | |
| 	UT_LIST_NODE_T(trx_undo_t) undo_list;
 | |
| 					/*!< undo log objects in the rollback
 | |
| 					segment are chained into lists */
 | |
| };
 | |
| 
 | |
| /** Cache a pointer to an undo record in a latched buffer pool page,
 | |
| parse the undo log record and store the record type, update vector
 | |
| and compiler information */
 | |
| class UndorecApplier
 | |
| {
 | |
|   /** Undo log block page id */
 | |
|   page_id_t page_id;
 | |
|   /** Pointer to within undo log record */
 | |
|   const trx_undo_rec_t *undo_rec;
 | |
|   /** Undo log record type */
 | |
|   byte type;
 | |
|   /** compiler information */
 | |
|   byte cmpl_info;
 | |
|   /** page_offset(undo_rec) of the start of undo_rec */
 | |
|   uint16_t offset;
 | |
|   /** Transaction id of the undo log */
 | |
|   const trx_id_t trx_id;
 | |
|   /** Update vector */
 | |
|   upd_t *update;
 | |
|   /** memory heap which can be used to build previous version of
 | |
|   the index record and its offsets */
 | |
|   mem_heap_t *heap;
 | |
|   /** mini-transaction for accessing B-tree pages */
 | |
|   mtr_t mtr;
 | |
| 
 | |
| public:
 | |
|   UndorecApplier(page_id_t page_id, trx_id_t trx_id) :
 | |
|     page_id(page_id), trx_id(trx_id), heap(mem_heap_create(100))
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   /** Assign the next page id */
 | |
|   void assign_next(const page_id_t next_page_id)
 | |
|   {
 | |
|     page_id= next_page_id;
 | |
|   }
 | |
| 
 | |
|   page_id_t get_page_id() const { return page_id; }
 | |
| 
 | |
|   /** Handle the DML undo log and apply it on online indexes */
 | |
|   inline void apply_undo_rec(const trx_undo_rec_t *rec, uint16_t offset);
 | |
| 
 | |
|   ~UndorecApplier()
 | |
|   {
 | |
|     mem_heap_free(heap);
 | |
|   }
 | |
| 
 | |
| private:
 | |
|   /** Handle the insert undo log and apply it on online indexes
 | |
|   @param  tuple		row reference from undo log record
 | |
|   @param  clust_index	clustered index */
 | |
|   void log_insert(const dtuple_t &tuple, dict_index_t *clust_index);
 | |
| 
 | |
|   /** Handle the update, delete undo log and apply it on online
 | |
|   indexes.
 | |
|   @param  tuple		row reference from undo log record
 | |
|   @param  clust_index	clustered index */
 | |
|   void log_update(const dtuple_t &tuple, dict_index_t *clust_index);
 | |
| 
 | |
|   /** Check whether the given roll pointer is generated by
 | |
|   the current undo log record information stored.
 | |
|   @return true if roll pointer matches with current undo log info */
 | |
|   inline bool is_same(roll_ptr_t roll_ptr) const;
 | |
| 
 | |
|   /** Clear the undo log record information */
 | |
|   void clear_undo_rec()
 | |
|   {
 | |
|     undo_rec= nullptr;
 | |
|     cmpl_info= 0;
 | |
|     type= 0;
 | |
|     update= nullptr;
 | |
|     mem_heap_empty(heap);
 | |
|   }
 | |
| 
 | |
|   /** Get the correct version of the clustered index record that
 | |
|   was modified by the current undo log record. Because there could
 | |
|   be the multiple successive updates of the same record within the
 | |
|   same transaction.
 | |
|   @param	tuple		tuple contains primary key value
 | |
|   @param	index		clustered index
 | |
|   @param[out]	clust_rec	current clustered index record
 | |
|   @param	offsets		offsets points to the record
 | |
|   @return clustered index record which was changed by
 | |
|   the undo log record or nullptr when there is no clustered
 | |
|   index record changed by undo log record */
 | |
|   const rec_t* get_old_rec(const dtuple_t &tuple, dict_index_t *index,
 | |
|                            const rec_t **clust_rec, rec_offs **offsets);
 | |
| };
 | |
| 
 | |
| #endif /* !UNIV_INNOCHECKSUM */
 | |
| 
 | |
| /** The offset of the undo log page header on pages of the undo log */
 | |
| #define	TRX_UNDO_PAGE_HDR	FSEG_PAGE_DATA
 | |
| /*-------------------------------------------------------------*/
 | |
| /** Transaction undo log page header offsets */
 | |
| /* @{ */
 | |
| #define	TRX_UNDO_PAGE_TYPE	0	/*!< unused; 0 (before MariaDB 10.3.1:
 | |
| 					1=TRX_UNDO_INSERT or
 | |
| 					2=TRX_UNDO_UPDATE) */
 | |
| #define	TRX_UNDO_PAGE_START	2	/*!< Byte offset where the undo log
 | |
| 					records for the LATEST transaction
 | |
| 					start on this page (remember that
 | |
| 					in an update undo log, the first page
 | |
| 					can contain several undo logs) */
 | |
| #define	TRX_UNDO_PAGE_FREE	4	/*!< On each page of the undo log this
 | |
| 					field contains the byte offset of the
 | |
| 					first free byte on the page */
 | |
| #define TRX_UNDO_PAGE_NODE	6	/*!< The file list node in the chain
 | |
| 					of undo log pages */
 | |
| /*-------------------------------------------------------------*/
 | |
| #define TRX_UNDO_PAGE_HDR_SIZE	(6 + FLST_NODE_SIZE)
 | |
| 					/*!< Size of the transaction undo
 | |
| 					log page header, in bytes */
 | |
| /* @} */
 | |
| 
 | |
| /** An update undo segment with just one page can be reused if it has
 | |
| at most this many bytes used; we must leave space at least for one new undo
 | |
| log header on the page */
 | |
| 
 | |
| #define TRX_UNDO_PAGE_REUSE_LIMIT	(3 << (srv_page_size_shift - 2))
 | |
| 
 | |
| /* An update undo log segment may contain several undo logs on its first page
 | |
| if the undo logs took so little space that the segment could be cached and
 | |
| reused. All the undo log headers are then on the first page, and the last one
 | |
| owns the undo log records on subsequent pages if the segment is bigger than
 | |
| one page. If an undo log is stored in a segment, then on the first page it is
 | |
| allowed to have zero undo records, but if the segment extends to several
 | |
| pages, then all the rest of the pages must contain at least one undo log
 | |
| record. */
 | |
| 
 | |
| /** The offset of the undo log segment header on the first page of the undo
 | |
| log segment */
 | |
| 
 | |
| #define	TRX_UNDO_SEG_HDR	(TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE)
 | |
| /** Undo log segment header */
 | |
| /* @{ */
 | |
| /*-------------------------------------------------------------*/
 | |
| #define	TRX_UNDO_STATE		0	/*!< TRX_UNDO_ACTIVE, ... */
 | |
| 
 | |
| #ifndef UNIV_INNOCHECKSUM
 | |
| 
 | |
| #define	TRX_UNDO_LAST_LOG	2	/*!< Offset of the last undo log header
 | |
| 					on the segment header page, 0 if
 | |
| 					none */
 | |
| #define	TRX_UNDO_FSEG_HEADER	4	/*!< Header for the file segment which
 | |
| 					the undo log segment occupies */
 | |
| #define	TRX_UNDO_PAGE_LIST	(4 + FSEG_HEADER_SIZE)
 | |
| 					/*!< Base node for the list of pages in
 | |
| 					the undo log segment; defined only on
 | |
| 					the undo log segment's first page */
 | |
| /*-------------------------------------------------------------*/
 | |
| /** Size of the undo log segment header */
 | |
| #define TRX_UNDO_SEG_HDR_SIZE	(4 + FSEG_HEADER_SIZE + FLST_BASE_NODE_SIZE)
 | |
| /* @} */
 | |
| 
 | |
| /** The undo log header. There can be several undo log headers on the first
 | |
| page of an update undo log segment. */
 | |
| /* @{ */
 | |
| /*-------------------------------------------------------------*/
 | |
| /** Transaction start identifier, or 0 if the undo log segment has been
 | |
| completely purged and trx_purge_free_segment() has started freeing it */
 | |
| #define	TRX_UNDO_TRX_ID		0
 | |
| /** Transaction end identifier (if the log is in a history list),
 | |
| or 0 if the transaction has not been committed */
 | |
| #define	TRX_UNDO_TRX_NO		8
 | |
| /* Before MariaDB 10.3.1, when purge did not reset DB_TRX_ID of
 | |
| surviving user records, this used to be called TRX_UNDO_DEL_MARKS.
 | |
| 
 | |
| This field was removed in MariaDB 11.0.
 | |
| 
 | |
| The value 1 indicates that purge needs to process the undo log segment.
 | |
| The value 0 indicates that all of it has been processed, and
 | |
| trx_purge_free_segment() has been invoked, so the log is not safe to access.
 | |
| 
 | |
| Before MariaDB 10.3.1, a log segment may carry the value 0 even before
 | |
| trx_purge_free_segment() was called, for those undo log records for
 | |
| which purge would not result in removing delete-marked records. */
 | |
| /*#define	TRX_UNDO_NEEDS_PURGE	16*/
 | |
| #define	TRX_UNDO_LOG_START	18	/*!< Offset of the first undo log record
 | |
| 					of this log on the header page; purge
 | |
| 					may remove undo log record from the
 | |
| 					log start, and therefore this is not
 | |
| 					necessarily the same as this log
 | |
| 					header end offset */
 | |
| #define	TRX_UNDO_XID_EXISTS	20	/*!< TRUE if undo log header includes
 | |
| 					X/Open XA transaction identification
 | |
| 					XID */
 | |
| #define	TRX_UNDO_DICT_TRANS	21	/*!< TRUE if the transaction is a table
 | |
| 					create, index create, or drop
 | |
| 					transaction: in recovery
 | |
| 					the transaction cannot be rolled back
 | |
| 					in the usual way: a 'rollback' rather
 | |
| 					means dropping the created or dropped
 | |
| 					table, if it still exists */
 | |
| #define TRX_UNDO_TABLE_ID	22	/*!< Id of the table if the preceding
 | |
| 					field is TRUE */
 | |
| #define	TRX_UNDO_NEXT_LOG	30	/*!< Offset of the next undo log header
 | |
| 					on this page, 0 if none */
 | |
| #define	TRX_UNDO_PREV_LOG	32	/*!< Offset of the previous undo log
 | |
| 					header on this page, 0 if none */
 | |
| #define TRX_UNDO_HISTORY_NODE	34	/*!< If the log is put to the history
 | |
| 					list, the file list node is here */
 | |
| /*-------------------------------------------------------------*/
 | |
| /** Size of the undo log header without XID information */
 | |
| #define TRX_UNDO_LOG_OLD_HDR_SIZE (34 + FLST_NODE_SIZE)
 | |
| 
 | |
| /** X/Open XA Transaction Identification (XID) */
 | |
| /* @{ */
 | |
| /** xid_t::formatID */
 | |
| #define	TRX_UNDO_XA_FORMAT	(TRX_UNDO_LOG_OLD_HDR_SIZE)
 | |
| /** xid_t::gtrid_length */
 | |
| #define	TRX_UNDO_XA_TRID_LEN	(TRX_UNDO_XA_FORMAT + 4)
 | |
| /** xid_t::bqual_length */
 | |
| #define	TRX_UNDO_XA_BQUAL_LEN	(TRX_UNDO_XA_TRID_LEN + 4)
 | |
| /** Distributed transaction identifier data */
 | |
| #define	TRX_UNDO_XA_XID		(TRX_UNDO_XA_BQUAL_LEN + 4)
 | |
| /*--------------------------------------------------------------*/
 | |
| #define TRX_UNDO_LOG_XA_HDR_SIZE (TRX_UNDO_XA_XID + XIDDATASIZE)
 | |
| 					/*!< Total size of the undo log header
 | |
| 					with the XA XID */
 | |
| /* @} */
 | |
| 
 | |
| #include "trx0undo.inl"
 | |
| #endif /* !UNIV_INNOCHECKSUM */
 | |
| 
 | |
| #endif
 | 
