MySQL 9.4.0
Source Code Documentation
trx0rseg.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 1996, 2025, 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/** Gets the file page number of the nth undo log slot.
65@param[in] rsegf rollback segment header
66@param[in] n index of slot
67@param[in] mtr mtr
68@return page number of the undo log segment */
70 mtr_t *mtr);
71
72/** Sets the file page number of the nth undo log slot.
73@param[in] rsegf rollback segment header
74@param[in] n index of slot
75@param[in] page_no page number of the undo log segment
76@param[in] mtr mtr */
77static inline void trx_rsegf_set_nth_undo(trx_rsegf_t *rsegf, ulint n,
78 page_no_t page_no, mtr_t *mtr);
79
80/** Looks for a free slot for an undo log segment.
81@param[in] rsegf rollback segment header
82@param[in] mtr mtr
83@return slot index or ULINT_UNDEFINED if not found */
84static inline ulint trx_rsegf_undo_find_free(trx_rsegf_t *rsegf, mtr_t *mtr);
85
86/** Creates a rollback segment header.
87This function is called only when a new rollback segment is created in
88the database.
89@param[in] space_id Space id
90@param[in] page_size Page size
91@param[in] max_size Max size in pages
92@param[in] rseg_slot Rseg id == slot number in RSEG_ARRAY
93@param[in,out] mtr Mini-transaction
94@return page number of the created segment, FIL_NULL if fail */
96 const page_size_t &page_size,
97 page_no_t max_size, ulint rseg_slot,
98 mtr_t *mtr);
99
100/** Add more rsegs to the rseg list in each tablespace until there are
101srv_rollback_segments of them. Use any rollback segment that already
102exists so that the purge_queue can be filled and processed with any
103existing undo log. If the rollback segments do not exist in this
104tablespace and we need them according to target_rollback_segments,
105then build them in the tablespace.
106@param[in] target_rollback_segments new number of rollback
107 segments per space
108@return true if all necessary rollback segments and trx_rseg_t objects
109were created. */
110bool trx_rseg_adjust_rollback_segments(ulong target_rollback_segments);
111
112/** Create the requested number of Rollback Segments in a newly created undo
113tablespace and add them to the Rsegs object.
114@param[in] space_id undo tablespace ID
115@param[in] target_rollback_segments number of rollback segments per space
116@return true if all necessary rollback segments and trx_rseg_t objects
117were created. */
119 ulong target_rollback_segments);
120
121/** Read each rollback segment slot in the TRX_SYS page and the RSEG_ARRAY
122page of each undo tablespace. Create trx_rseg_t objects for all rollback
123segments found. This runs at database startup and initializes the in-memory
124lists of trx_rseg_t objects. We need to look at all slots in TRX_SYS and
125each RSEG_ARRAY page because we need to look for any existing undo log that
126may need to be recovered by purge. No latch is needed since this is still
127single-threaded startup. If we find existing rseg slots in TRX_SYS page
128that reference undo tablespaces and have active undo logs, then quit.
129They require an upgrade of undo tablespaces and that cannot happen with
130active undo logs.
131@param[in] purge_queue queue of rsegs to purge */
132void trx_rsegs_init(purge_pq_t *purge_queue);
133
134/** Initialize rollback segments in parallel
135@param[in] purge_queue queue of rsegs to purge */
136void trx_rsegs_parallel_init(purge_pq_t *purge_queue);
137
138/** Create and initialize a rollback segment object. Some of
139the values for the fields are read from the segment header page.
140The caller must insert it into the correct list.
141@param[in] id Rollback segment id
142@param[in] space_id Space where the segment is placed
143@param[in] page_no Page number of the segment header
144@param[in] page_size Page size
145@param[in] gtid_trx_no Trx number up to which GTID is persisted
146@param[in,out] purge_queue Rseg queue
147@param[in,out] mtr Mini-transaction
148@return own: rollback segment object */
150 page_no_t page_no, const page_size_t &page_size,
151 trx_id_t gtid_trx_no, purge_pq_t *purge_queue,
152 mtr_t *mtr);
153
154/** Create a rollback segment in the given tablespace. This could be either
155the system tablespace, the temporary tablespace, or an undo tablespace.
156@param[in] space_id tablespace to get the rollback segment
157@param[in] rseg_id slot number of the rseg within this tablespace
158@return page number of the rollback segment header page created */
159page_no_t trx_rseg_create(space_id_t space_id, ulint rseg_id);
160
161/** Create the file page for the rollback segment directory in an undo
162tablespace. This function is called just after an undo tablespace is
163created so the next page created here should by FSP_FSEG_DIR_PAGE_NUM.
164@param[in] space_id Undo Tablespace ID
165@param[in] mtr mtr */
166void trx_rseg_array_create(space_id_t space_id, mtr_t *mtr);
167
168/** Sets the page number of the nth rollback segment slot in the
169independent undo tablespace.
170@param[in] rsegs_header rollback segment array page header
171@param[in] slot slot number on page == rseg id
172@param[in] page_no rollback regment header page number
173@param[in] mtr mtr */
174static inline void trx_rsegsf_set_page_no(trx_rsegsf_t *rsegs_header,
175 ulint slot, page_no_t page_no,
176 mtr_t *mtr);
177
178/** Number of undo log slots in a rollback segment file copy */
179#define TRX_RSEG_N_SLOTS (UNIV_PAGE_SIZE / 16)
180
181/** Maximum number of transactions supported by a single rollback segment */
182#define TRX_RSEG_MAX_N_TRXS (TRX_RSEG_N_SLOTS / 2)
183
184/* Undo log segment slot in a rollback segment header */
185/*-------------------------------------------------------------*/
186/** Page number of the header page of an undo log segment */
187constexpr uint32_t TRX_RSEG_SLOT_PAGE_NO = 0;
188/*-------------------------------------------------------------*/
189/** Slot size */
190constexpr uint32_t TRX_RSEG_SLOT_SIZE = 4;
191
192/** The offset of the rollback segment header on its page */
193constexpr uint32_t TRX_RSEG = FSEG_PAGE_DATA;
194
195/* Transaction rollback segment header */
196/*-------------------------------------------------------------*/
197/** Maximum allowed size for rollback segment in pages */
198constexpr uint32_t TRX_RSEG_MAX_SIZE = 0;
199/** Number of file pages occupied by the logs in the history list */
200constexpr uint32_t TRX_RSEG_HISTORY_SIZE = 4;
201/* The update undo logs for committed transactions */
202constexpr uint32_t TRX_RSEG_HISTORY = 8;
203/* Header for the file segment where this page is placed */
205/** Undo log segment slots */
206constexpr uint32_t TRX_RSEG_UNDO_SLOTS =
208
209/** End of undo slots in rollback segment page. */
210#define TRX_RSEG_SLOT_END \
211 (TRX_RSEG_UNDO_SLOTS + TRX_RSEG_SLOT_SIZE * TRX_RSEG_N_SLOTS)
212
213/* Maximum transaction number ever added to this rollback segment history
214list. It is always increasing number over lifetime starting from zero.
215The size is 8 bytes. */
216#define TRX_RSEG_MAX_TRX_NO TRX_RSEG_SLOT_END
217
218/*-------------------------------------------------------------*/
219
220/** The offset of the Rollback Segment Directory header on an RSEG_ARRAY
221 page */
223
224/** Rollback Segment Array Header */
225/*------------------------------------------------------------- */
226/** The RSEG ARRAY base version is a number derived from the string
227'RSEG' [0x 52 53 45 47] for extra validation. Each new version
228increments the base version by 1. */
229constexpr uint32_t RSEG_ARRAY_VERSION = 0x52534547 + 1;
230
231/** The RSEG ARRAY version offset in the header. */
232constexpr uint32_t RSEG_ARRAY_VERSION_OFFSET = 0;
233
234/** The current number of rollback segments being tracked in this array */
235constexpr uint32_t RSEG_ARRAY_SIZE_OFFSET = 4;
236
237/** This is the pointer to the file segment inode that tracks this
238rseg array page. */
239constexpr uint32_t RSEG_ARRAY_FSEG_HEADER_OFFSET = 8;
240
241/** The start of the array of rollback segment header page numbers for this
242undo tablespace. The potential size of this array is limited only by the
243page size minus overhead. The actual size of the array is limited by
244srv_rollback_segments. */
246
247/** Reserved space at the end of an RSEG_ARRAY page reserved for future use.
248 */
249constexpr uint32_t RSEG_ARRAY_RESERVED_BYTES = 200;
250
251/* Slot size of the array of rollback segment header page numbers */
252constexpr uint32_t RSEG_ARRAY_SLOT_SIZE = 4;
253/*------------------------------------------------------------- */
254
255#include "trx0rseg.ic"
256
257#endif
uint32_t space_id_t
Tablespace identifier.
Definition: api0api.h:48
uint32_t page_no_t
Page number.
Definition: api0api.h:46
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:177
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:643
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:957
constexpr uint32_t TRX_RSEG_UNDO_SLOTS
Undo log segment slots.
Definition: trx0rseg.h:206
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:980
constexpr uint32_t TRX_RSEG_MAX_SIZE
Maximum allowed size for rollback segment in pages.
Definition: trx0rseg.h:198
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:580
constexpr uint32_t RSEG_ARRAY_SIZE_OFFSET
The current number of rollback segments being tracked in this array.
Definition: trx0rseg.h:235
constexpr uint32_t RSEG_ARRAY_HEADER
The offset of the Rollback Segment Directory header on an RSEG_ARRAY page.
Definition: trx0rseg.h:222
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:60
void trx_rsegs_parallel_init(purge_pq_t *purge_queue)
Initialize rollback segments in parallel.
Definition: trx0rseg.cc:529
constexpr uint32_t RSEG_ARRAY_SLOT_SIZE
Definition: trx0rseg.h:252
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:245
constexpr uint32_t TRX_RSEG_HISTORY_SIZE
Number of file pages occupied by the logs in the history list.
Definition: trx0rseg.h:200
constexpr uint32_t TRX_RSEG_HISTORY
Definition: trx0rseg.h:202
constexpr uint32_t TRX_RSEG_SLOT_SIZE
Slot size.
Definition: trx0rseg.h:190
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:362
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:187
constexpr uint32_t RSEG_ARRAY_RESERVED_BYTES
Reserved space at the end of an RSEG_ARRAY page reserved for future use.
Definition: trx0rseg.h:249
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:232
constexpr uint32_t TRX_RSEG
The offset of the rollback segment header on its page.
Definition: trx0rseg.h:193
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:239
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:911
constexpr uint32_t TRX_RSEG_FSEG_HEADER
Definition: trx0rseg.h:204
constexpr uint32_t RSEG_ARRAY_VERSION
Rollback Segment Array Header.
Definition: trx0rseg.h:229
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:406
int n
Definition: xcom_base.cc:509