MySQL 26.7.0
Source Code Documentation
trx0rseg.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 1996, 2026, Oracle and/or its affiliates.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License, version 2.0, as published by the
7Free Software Foundation.
8
9This program is designed to work with certain software (including
10but not limited to OpenSSL) that is licensed under separate terms,
11as designated in a particular file or component or in included license
12documentation. The authors of MySQL hereby grant you an additional
13permission to link the program and your derivative works with the
14separately licensed software that they have either included with
15the program or referenced in the documentation.
16
17This program is distributed in the hope that it will be useful, but WITHOUT
18ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
20for more details.
21
22You should have received a copy of the GNU General Public License along with
23this program; if not, write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
26*****************************************************************************/
27
28/** @file include/trx0rseg.h
29 Rollback segment
30
31 Created 3/26/1996 Heikki Tuuri
32 *******************************************************/
33
34#ifndef trx0rseg_h
35#define trx0rseg_h
36
37#include <vector>
38#include "fut0lst.h"
39#include "trx0sys.h"
40#include "trx0types.h"
41#include "univ.i"
42
43/** Gets a rollback segment header.
44@param[in] space Space where placed
45@param[in] page_no Page number of the header
46@param[in] page_size Page size
47@param[in,out] mtr Mini-transaction
48@return rollback segment header, page x-latched */
49static inline trx_rsegf_t *trx_rsegf_get(space_id_t space, page_no_t page_no,
50 const page_size_t &page_size,
51 mtr_t *mtr);
52
53/** Gets a newly created rollback segment header.
54@param[in] space Space where placed
55@param[in] page_no Page number of the header
56@param[in] page_size Page size
57@param[in,out] mtr Mini-transaction
58@return rollback segment header, page x-latched */
60 page_no_t page_no,
61 const page_size_t &page_size,
62 mtr_t *mtr);
63
64/** Return a page number from a slot in the rseg_array page of an
65undo tablespace.
66@param[in] space_id undo tablespace ID
67@param[in] rseg_id rollback segment ID
68@return page_no Page number of the rollback segment header page */
70
71/** Gets the file page number of the nth undo log slot.
72@param[in] rsegf rollback segment header
73@param[in] n index of slot
74@param[in] mtr mtr
75@return page number of the undo log segment */
77 mtr_t *mtr);
78
79/** Sets the file page number of the nth undo log slot.
80@param[in] rsegf rollback segment header
81@param[in] n index of slot
82@param[in] page_no page number of the undo log segment
83@param[in] mtr mtr */
84static inline void trx_rsegf_set_nth_undo(trx_rsegf_t *rsegf, ulint n,
85 page_no_t page_no, mtr_t *mtr);
86
87/** Looks for a free slot for an undo log segment.
88@param[in] rsegf rollback segment header
89@param[in] mtr mtr
90@return slot index or ULINT_UNDEFINED if not found */
91static inline ulint trx_rsegf_undo_find_free(trx_rsegf_t *rsegf, mtr_t *mtr);
92
93/** Creates a rollback segment header.
94This function is called only when a new rollback segment is created in
95the database.
96@param[in] space_id Space id
97@param[in] page_size Page size
98@param[in] max_size Max size in pages
99@param[in] rseg_slot Rseg id == slot number in RSEG_ARRAY
100@param[in,out] mtr Mini-transaction
101@return page number of the created segment, FIL_NULL if fail */
103 const page_size_t &page_size,
104 page_no_t max_size, ulint rseg_slot,
105 mtr_t *mtr);
106
107/** Add more rsegs to the rseg list in each tablespace until there are
108srv_rollback_segments of them. Use any rollback segment that already
109exists so that the purge_queue can be filled and processed with any
110existing undo log. If the rollback segments do not exist in this
111tablespace and we need them according to target_rollback_segments,
112then build them in the tablespace.
113@param[in] target_rollback_segments new number of rollback
114 segments per space
115@return true if all necessary rollback segments and trx_rseg_t objects
116were created. */
117bool trx_rseg_adjust_rollback_segments(ulong target_rollback_segments);
118
119/** Create the requested number of Rollback Segments in a newly created undo
120tablespace and add them to the Rsegs object.
121@param[in] space_id undo tablespace ID
122@param[in] target_rollback_segments number of rollback segments per space
123@return true if all necessary rollback segments and trx_rseg_t objects
124were created. */
126 ulong target_rollback_segments);
127
128/** Read each rollback segment slot in the TRX_SYS page and the RSEG_ARRAY
129page of each undo tablespace. Create trx_rseg_t objects for all rollback
130segments found. This runs at database startup and initializes the in-memory
131lists of trx_rseg_t objects. We need to look at all slots in TRX_SYS and
132each RSEG_ARRAY page because we need to look for any existing undo log that
133may need to be recovered by purge. No latch is needed since this is still
134single-threaded startup. If we find existing rseg slots in TRX_SYS page
135that reference undo tablespaces and have active undo logs, then quit.
136They require an upgrade of undo tablespaces and that cannot happen with
137active undo logs.
138@param[in] purge_queue queue of rsegs to purge */
139void trx_rsegs_init(purge_pq_t *purge_queue);
140
141/** Initialize rollback segments in parallel
142@param[in] purge_queue queue of rsegs to purge */
143void trx_rsegs_parallel_init(purge_pq_t *purge_queue);
144
145/** Create and initialize a rollback segment object. Some of
146the values for the fields are read from the segment header page.
147The caller must insert it into the correct list.
148@param[in] id Rollback segment id
149@param[in] space_id Space where the segment is placed
150@param[in] page_no Page number of the segment header
151@param[in] page_size Page size
152@param[in] gtid_trx_no Trx number up to which GTID is persisted
153@param[in,out] purge_queue Rseg queue
154@param[in,out] mtr Mini-transaction
155@return own: rollback segment object */
157 page_no_t page_no, const page_size_t &page_size,
158 trx_id_t gtid_trx_no, purge_pq_t *purge_queue,
159 mtr_t *mtr);
160
161/** Create a rollback segment in the given tablespace. This could be either
162the system tablespace, the temporary tablespace, or an undo tablespace.
163@param[in] space_id tablespace to get the rollback segment
164@param[in] rseg_id slot number of the rseg within this tablespace
165@return page number of the rollback segment header page created */
166page_no_t trx_rseg_create(space_id_t space_id, ulint rseg_id);
167
168/** Create the file page for the rollback segment directory in an undo
169tablespace. This function is called just after an undo tablespace is
170created so the next page created here should by FSP_FSEG_DIR_PAGE_NUM.
171@param[in] space_id Undo Tablespace ID
172@param[in] mtr mtr */
173void trx_rseg_array_create(space_id_t space_id, mtr_t *mtr);
174
175/** Sets the page number of the nth rollback segment slot in the
176independent undo tablespace.
177@param[in] rsegs_header rollback segment array page header
178@param[in] slot slot number on page == rseg id
179@param[in] page_no rollback regment header page number
180@param[in] mtr mtr */
181static inline void trx_rsegsf_set_page_no(trx_rsegsf_t *rsegs_header,
182 ulint slot, page_no_t page_no,
183 mtr_t *mtr);
184
185/** Number of undo log slots in a rollback segment file copy */
186#define TRX_RSEG_N_SLOTS (UNIV_PAGE_SIZE / 16)
187
188/** Maximum number of transactions supported by a single rollback segment */
189#define TRX_RSEG_MAX_N_TRXS (TRX_RSEG_N_SLOTS / 2)
190
191/* Undo log segment slot in a rollback segment header */
192/*-------------------------------------------------------------*/
193/** Page number of the header page of an undo log segment */
194constexpr uint32_t TRX_RSEG_SLOT_PAGE_NO = 0;
195/*-------------------------------------------------------------*/
196/** Slot size */
197constexpr uint32_t TRX_RSEG_SLOT_SIZE = 4;
198
199/** The offset of the rollback segment header on its page */
200constexpr uint32_t TRX_RSEG = FSEG_PAGE_DATA;
201
202/* Transaction rollback segment header */
203/*-------------------------------------------------------------*/
204/** Maximum allowed size for rollback segment in pages */
205constexpr uint32_t TRX_RSEG_MAX_SIZE = 0;
206/** Number of file pages occupied by the logs in the history list */
207constexpr uint32_t TRX_RSEG_HISTORY_SIZE = 4;
208/* The update undo logs for committed transactions */
209constexpr uint32_t TRX_RSEG_HISTORY = 8;
210/* Header for the file segment where this page is placed */
212/** Undo log segment slots */
213constexpr uint32_t TRX_RSEG_UNDO_SLOTS =
215
216/** End of undo slots in rollback segment page. */
217#define TRX_RSEG_SLOT_END \
218 (TRX_RSEG_UNDO_SLOTS + TRX_RSEG_SLOT_SIZE * TRX_RSEG_N_SLOTS)
219
220/* Maximum transaction number ever added to this rollback segment history
221list. It is always increasing number over lifetime starting from zero.
222The size is 8 bytes. */
223#define TRX_RSEG_MAX_TRX_NO TRX_RSEG_SLOT_END
224
225/*-------------------------------------------------------------*/
226
227/** The offset of the Rollback Segment Directory header on an RSEG_ARRAY
228 page */
230
231/** Rollback Segment Array Header */
232/*------------------------------------------------------------- */
233/** The RSEG ARRAY base version is a number derived from the string
234'RSEG' [0x 52 53 45 47] for extra validation. Each new version
235increments the base version by 1. */
236constexpr uint32_t RSEG_ARRAY_VERSION = 0x52534547 + 1;
237
238/** The RSEG ARRAY version offset in the header. */
239constexpr uint32_t RSEG_ARRAY_VERSION_OFFSET = 0;
240
241/** The current number of rollback segments being tracked in this array */
242constexpr uint32_t RSEG_ARRAY_SIZE_OFFSET = 4;
243
244/** This is the pointer to the file segment inode that tracks this
245rseg array page. */
246constexpr uint32_t RSEG_ARRAY_FSEG_HEADER_OFFSET = 8;
247
248/** The start of the array of rollback segment header page numbers for this
249undo tablespace. The potential size of this array is limited only by the
250page size minus overhead. The actual size of the array is limited by
251srv_rollback_segments. */
253
254/** Reserved space at the end of an RSEG_ARRAY page reserved for future use.
255 */
256constexpr uint32_t RSEG_ARRAY_RESERVED_BYTES = 200;
257
258/* Slot size of the array of rollback segment header page numbers */
259constexpr uint32_t RSEG_ARRAY_SLOT_SIZE = 4;
260/*------------------------------------------------------------- */
261
262#include "trx0rseg.ic"
263
264#endif
uint32_t space_id_t
Tablespace identifier.
Definition: api0api.h:49
uint32_t page_no_t
Page number.
Definition: api0api.h:47
Page size descriptor.
Definition: page0size.h:50
constexpr uint32_t FSEG_PAGE_DATA
On a page of any file segment, data may be put starting from this offset.
Definition: fsp0types.h:79
constexpr uint32_t FSEG_HEADER_SIZE
Length of the file system header, in bytes.
Definition: fsp0types.h:94
File-based list utilities.
constexpr ulint FLST_BASE_NODE_SIZE
Definition: fut0lst.h:50
Mini-transaction handle and buffer.
Definition: mtr0mtr.h:174
The rollback segment memory object.
Definition: trx0types.h:214
page_no_t trx_rseg_create(space_id_t space_id, ulint rseg_id)
Create a rollback segment in the given tablespace.
Definition: trx0rseg.cc:640
bool trx_rseg_init_rollback_segments(space_id_t space_id, ulong target_rollback_segments)
Create the requested number of Rollback Segments in a newly created undo tablespace and add them to t...
Definition: trx0rseg.cc:961
constexpr uint32_t TRX_RSEG_UNDO_SLOTS
Undo log segment slots.
Definition: trx0rseg.h:213
void trx_rseg_array_create(space_id_t space_id, mtr_t *mtr)
Create the file page for the rollback segment directory in an undo tablespace.
Definition: trx0rseg.cc:985
constexpr uint32_t TRX_RSEG_MAX_SIZE
Maximum allowed size for rollback segment in pages.
Definition: trx0rseg.h:205
void trx_rsegs_init(purge_pq_t *purge_queue)
Read each rollback segment slot in the TRX_SYS page and the RSEG_ARRAY page of each undo tablespace.
Definition: trx0rseg.cc:576
constexpr uint32_t RSEG_ARRAY_SIZE_OFFSET
The current number of rollback segments being tracked in this array.
Definition: trx0rseg.h:242
constexpr uint32_t RSEG_ARRAY_HEADER
The offset of the Rollback Segment Directory header on an RSEG_ARRAY page.
Definition: trx0rseg.h:229
page_no_t trx_rseg_header_create(space_id_t space_id, const page_size_t &page_size, page_no_t max_size, ulint rseg_slot, mtr_t *mtr)
Creates a rollback segment header.
Definition: trx0rseg.cc:61
void trx_rsegs_parallel_init(purge_pq_t *purge_queue)
Initialize rollback segments in parallel.
Definition: trx0rseg.cc:525
page_no_t trx_rseg_get_page_no(space_id_t space_id, ulint rseg_id)
Return a page number from a slot in the rseg_array page of an undo tablespace.
Definition: trx0rseg.cc:320
constexpr uint32_t RSEG_ARRAY_SLOT_SIZE
Definition: trx0rseg.h:259
constexpr uint32_t RSEG_ARRAY_PAGES_OFFSET
The start of the array of rollback segment header page numbers for this undo tablespace.
Definition: trx0rseg.h:252
constexpr uint32_t TRX_RSEG_HISTORY_SIZE
Number of file pages occupied by the logs in the history list.
Definition: trx0rseg.h:207
constexpr uint32_t TRX_RSEG_HISTORY
Definition: trx0rseg.h:209
constexpr uint32_t TRX_RSEG_SLOT_SIZE
Slot size.
Definition: trx0rseg.h:197
static void trx_rsegsf_set_page_no(trx_rsegsf_t *rsegs_header, ulint slot, page_no_t page_no, mtr_t *mtr)
Sets the page number of the nth rollback segment slot in the independent undo tablespace.
trx_rseg_t * trx_rseg_mem_create(ulint id, space_id_t space_id, page_no_t page_no, const page_size_t &page_size, trx_id_t gtid_trx_no, purge_pq_t *purge_queue, mtr_t *mtr)
Create and initialize a rollback segment object.
Definition: trx0rseg.cc:358
static trx_rsegf_t * trx_rsegf_get_new(space_id_t space, page_no_t page_no, const page_size_t &page_size, mtr_t *mtr)
Gets a newly created rollback segment header.
static page_no_t trx_rsegf_get_nth_undo(trx_rsegf_t *rsegf, ulint n, mtr_t *mtr)
Gets the file page number of the nth undo log slot.
static trx_rsegf_t * trx_rsegf_get(space_id_t space, page_no_t page_no, const page_size_t &page_size, mtr_t *mtr)
Gets a rollback segment header.
constexpr uint32_t TRX_RSEG_SLOT_PAGE_NO
Page number of the header page of an undo log segment.
Definition: trx0rseg.h:194
constexpr uint32_t RSEG_ARRAY_RESERVED_BYTES
Reserved space at the end of an RSEG_ARRAY page reserved for future use.
Definition: trx0rseg.h:256
static void trx_rsegf_set_nth_undo(trx_rsegf_t *rsegf, ulint n, page_no_t page_no, mtr_t *mtr)
Sets the file page number of the nth undo log slot.
constexpr uint32_t RSEG_ARRAY_VERSION_OFFSET
The RSEG ARRAY version offset in the header.
Definition: trx0rseg.h:239
constexpr uint32_t TRX_RSEG
The offset of the rollback segment header on its page.
Definition: trx0rseg.h:200
constexpr uint32_t RSEG_ARRAY_FSEG_HEADER_OFFSET
This is the pointer to the file segment inode that tracks this rseg array page.
Definition: trx0rseg.h:246
static ulint trx_rsegf_undo_find_free(trx_rsegf_t *rsegf, mtr_t *mtr)
Looks for a free slot for an undo log segment.
bool trx_rseg_adjust_rollback_segments(ulong target_rollback_segments)
Add more rsegs to the rseg list in each tablespace until there are srv_rollback_segments of them.
Definition: trx0rseg.cc:915
constexpr uint32_t TRX_RSEG_FSEG_HEADER
Definition: trx0rseg.h:211
constexpr uint32_t RSEG_ARRAY_VERSION
Rollback Segment Array Header.
Definition: trx0rseg.h:236
Rollback segment.
Transaction system.
Transaction system global type definitions.
std::priority_queue< TrxUndoRsegs, std::vector< TrxUndoRsegs, ut::allocator< TrxUndoRsegs > >, TrxUndoRsegs > purge_pq_t
Definition: trx0types.h:631
byte trx_rsegsf_t
Rollback segment array header.
Definition: trx0types.h:157
byte trx_rsegf_t
Rollback segment header.
Definition: trx0types.h:159
ib_id_t trx_id_t
Transaction identifier (DB_TRX_ID, DATA_TRX_ID)
Definition: trx0types.h:138
Version control for database, common definitions, and include files.
unsigned long int ulint
Definition: univ.i:403
int n
Definition: xcom_base.cc:509