MySQL  8.0.19
Source Code Documentation
trx0rseg.h
Go to the documentation of this file.
1 /*****************************************************************************
2 
3 Copyright (c) 1996, 2019, Oracle and/or its affiliates. All Rights Reserved.
4 
5 This program is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License, version 2.0, as published by the
7 Free Software Foundation.
8 
9 This program is also distributed with certain software (including but not
10 limited to OpenSSL) that is licensed under separate terms, as designated in a
11 particular file or component or in included license documentation. The authors
12 of MySQL hereby grant you an additional permission to link the program and
13 your derivative works with the separately licensed software that they have
14 included with MySQL.
15 
16 This program is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18 FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
19 for more details.
20 
21 You should have received a copy of the GNU General Public License along with
22 this program; if not, write to the Free Software Foundation, Inc.,
23 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 
25 *****************************************************************************/
26 
27 /** @file include/trx0rseg.h
28  Rollback segment
29 
30  Created 3/26/1996 Heikki Tuuri
31  *******************************************************/
32 
33 #ifndef trx0rseg_h
34 #define trx0rseg_h
35 
36 #include <vector>
37 #include "fut0lst.h"
38 #include "trx0sys.h"
39 #include "trx0types.h"
40 #include "univ.i"
41 
42 /** Gets a rollback segment header.
43 @param[in] space space where placed
44 @param[in] page_no page number of the header
45 @param[in] page_size page size
46 @param[in,out] mtr mini-transaction
47 @return rollback segment header, page x-latched */
48 UNIV_INLINE
50  const page_size_t &page_size, mtr_t *mtr);
51 
52 /** Gets a newly created rollback segment header.
53 @param[in] space space where placed
54 @param[in] page_no page number of the header
55 @param[in] page_size page size
56 @param[in,out] mtr mini-transaction
57 @return rollback segment header, page x-latched */
58 UNIV_INLINE
60  const page_size_t &page_size, mtr_t *mtr);
61 
62 /** Gets the file page number of the nth undo log slot.
63 @param[in] rsegf rollback segment header
64 @param[in] n index of slot
65 @param[in] mtr mtr
66 @return page number of the undo log segment */
67 UNIV_INLINE
69 
70 /** Sets the file page number of the nth undo log slot.
71 @param[in] rsegf rollback segment header
72 @param[in] n index of slot
73 @param[in] page_no page number of the undo log segment
74 @param[in] mtr mtr */
75 UNIV_INLINE
76 void trx_rsegf_set_nth_undo(trx_rsegf_t *rsegf, ulint n, page_no_t page_no,
77  mtr_t *mtr);
78 
79 /** Looks for a free slot for an undo log segment.
80 @param[in] rsegf rollback segment header
81 @param[in] mtr mtr
82 @return slot index or ULINT_UNDEFINED if not found */
83 UNIV_INLINE
84 ulint trx_rsegf_undo_find_free(trx_rsegf_t *rsegf, mtr_t *mtr);
85 
86 /** Creates a rollback segment header.
87 This function is called only when a new rollback segment is created in
88 the 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 trx sys
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
101 srv_rollback_segments of them. Use any rollback segment that already
102 exists so that the purge_queue can be filled and processed with any
103 existing undo log. If the rollback segments do not exist in this
104 tablespace and we need them according to target_rollback_segments,
105 then 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
109 were created. */
110 bool trx_rseg_adjust_rollback_segments(ulong target_rollback_segments);
111 
112 /** Create the requested number of Rollback Segments in a newly created undo
113 tablespace 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
117 were created. */
119  ulong target_rollback_segments);
120 
121 /** Create the memory copies for rollback segments and initialize the
122 rseg array in trx_sys at a database startup.
123 @param[in] purge_queue queue of rsegs to purge */
124 void trx_rsegs_init(purge_pq_t *purge_queue);
125 
126 /** Create and initialize a rollback segment object. Some of
127 the values for the fields are read from the segment header page.
128 The caller must insert it into the correct list.
129 @param[in] id rollback segment id
130 @param[in] space_id space where the segment is placed
131 @param[in] page_no page number of the segment header
132 @param[in] page_size page size
133 @param[in] gtid_trx_no trx number up to which GTID is persisted
134 @param[in,out] purge_queue rseg queue
135 @param[in,out] mtr mini-transaction
136 @return own: rollback segment object */
137 trx_rseg_t *trx_rseg_mem_create(ulint id, space_id_t space_id,
138  page_no_t page_no, const page_size_t &page_size,
139  trx_id_t gtid_trx_no, purge_pq_t *purge_queue,
140  mtr_t *mtr);
141 
142 /** Create a rollback segment in the given tablespace. This could be either
143 the system tablespace, the temporary tablespace, or an undo tablespace.
144 @param[in] space_id tablespace to get the rollback segment
145 @param[in] rseg_id slot number of the rseg within this tablespace
146 @return page number of the rollback segment header page created */
147 page_no_t trx_rseg_create(space_id_t space_id, ulint rseg_id);
148 
149 /** Build a list of unique undo tablespaces found in the TRX_SYS page.
150 Do not count the system tablespace. The vector will be sorted on space id.
151 @param[in,out] spaces_to_open list of undo tablespaces found. */
152 void trx_rseg_get_n_undo_tablespaces(Space_Ids *spaces_to_open);
153 
154 /** Upgrade the TRX_SYS page so that it no longer tracks rsegs in undo
155 tablespaces other than the system tablespace. Add these tablespaces to
156 undo::spaces and put FIL_NULL in the slots in TRX_SYS.*/
158 
159 /** Create the file page for the rollback segment directory in an undo
160 tablespace. This function is called just after an undo tablespace is
161 created so the next page created here should by FSP_FSEG_DIR_PAGE_NUM.
162 @param[in] space_id Undo Tablespace ID
163 @param[in] mtr mtr */
164 void trx_rseg_array_create(space_id_t space_id, mtr_t *mtr);
165 
166 /** Sets the page number of the nth rollback segment slot in the
167 independent undo tablespace.
168 @param[in] rsegs_header rollback segment array page header
169 @param[in] slot slot number on page == rseg id
170 @param[in] page_no rollback regment header page number
171 @param[in] mtr mtr */
172 UNIV_INLINE
173 void trx_rsegsf_set_page_no(trx_rsegsf_t *rsegs_header, ulint slot,
174  page_no_t page_no, mtr_t *mtr);
175 
176 /* Number of undo log slots in a rollback segment file copy */
177 #define TRX_RSEG_N_SLOTS (UNIV_PAGE_SIZE / 16)
178 
179 /* Maximum number of transactions supported by a single rollback segment */
180 #define TRX_RSEG_MAX_N_TRXS (TRX_RSEG_N_SLOTS / 2)
181 
182 /* Undo log segment slot in a rollback segment header */
183 /*-------------------------------------------------------------*/
184 #define TRX_RSEG_SLOT_PAGE_NO \
185  0 /* Page number of the header page of \
186  an undo log segment */
187 /*-------------------------------------------------------------*/
188 /* Slot size */
189 #define TRX_RSEG_SLOT_SIZE 4
190 
191 /* The offset of the rollback segment header on its page */
192 #define TRX_RSEG FSEG_PAGE_DATA
193 
194 /* Transaction rollback segment header */
195 /*-------------------------------------------------------------*/
196 #define TRX_RSEG_MAX_SIZE \
197  0 /* Maximum allowed size for rollback \
198  segment in pages */
199 #define TRX_RSEG_HISTORY_SIZE \
200  4 /* Number of file pages occupied \
201  by the logs in the history list */
202 #define TRX_RSEG_HISTORY \
203  8 /* The update undo logs for committed \
204  transactions */
205 /* Header for the file segment where
206 this page is placed */
207 #define TRX_RSEG_FSEG_HEADER (8 + FLST_BASE_NODE_SIZE)
208 /* Undo log segment slots */
209 #define TRX_RSEG_UNDO_SLOTS (8 + FLST_BASE_NODE_SIZE + FSEG_HEADER_SIZE)
210 
211 /* End of undo slots in rollback segment page. */
212 #define TRX_RSEG_SLOT_END \
213  (TRX_RSEG_UNDO_SLOTS + (TRX_RSEG_SLOT_SIZE * TRX_RSEG_N_SLOTS))
214 
215 /* Maximum transaction number ever added to this rollback segment history
216 list. It is always increasing number over lifetime starting from zero.
217 The size is 8 bytes. */
218 #define TRX_RSEG_MAX_TRX_NO TRX_RSEG_SLOT_END
219 
220 /*-------------------------------------------------------------*/
221 
222 /** The offset of the Rollback Segment Directory header on an RSEG_ARRAY page */
223 #define RSEG_ARRAY_HEADER FSEG_PAGE_DATA
224 
225 /** Rollback Segment Array Header */
226 /*------------------------------------------------------------- */
227 /** The RSEG ARRAY base version is a number derived from the string
228 'RSEG' [0x 52 53 45 47] for extra validation. Each new version
229 increments the base version by 1. */
230 #define RSEG_ARRAY_VERSION 0x52534547 + 1
231 
232 /** The RSEG ARRAY version offset in the header. */
233 #define RSEG_ARRAY_VERSION_OFFSET 0
234 
235 /** The current number of rollback segments being tracked in this array */
236 #define RSEG_ARRAY_SIZE_OFFSET 4
237 
238 /** This is the pointer to the file segment inode that tracks this
239 rseg array page. */
240 #define RSEG_ARRAY_FSEG_HEADER_OFFSET 8
241 
242 /** The start of the array of rollback segment header page numbers for this
243 undo tablespace. The potential size of this array is limited only by the
244 page size minus overhead. The actual size of the array is limited by
245 srv_rollback_segments. */
246 #define RSEG_ARRAY_PAGES_OFFSET (8 + FSEG_HEADER_SIZE)
247 
248 /** Reserved space at the end of an RSEG_ARRAY page reserved for future use. */
249 #define RSEG_ARRAY_RESERVED_BYTES 200
250 
251 /* Slot size of the array of rollback segment header page numbers */
252 #define RSEG_ARRAY_SLOT_SIZE 4
253 /*------------------------------------------------------------- */
254 
255 #include "trx0rseg.ic"
256 
257 #endif
page_no_t
uint32 page_no_t
Page number.
Definition: api0api.h:57
trx_rsegf_t
byte trx_rsegf_t
Rollback segment header.
Definition: trx0types.h:169
trx_rsegsf_t
byte trx_rsegsf_t
Rollback segment array header.
Definition: trx0types.h:167
trx0sys.h
trx_rseg_init_rollback_segments
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:747
trx_rsegf_get
UNIV_INLINE 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.
trx_rseg_array_create
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:854
trx_id_t
ib_id_t trx_id_t
Transaction identifier (DB_TRX_ID, DATA_TRX_ID)
Definition: trx0types.h:148
mtr_t
Mini-transaction handle and buffer.
Definition: mtr0mtr.h:169
trx_rsegf_undo_find_free
UNIV_INLINE ulint trx_rsegf_undo_find_free(trx_rsegf_t *rsegf, mtr_t *mtr)
Looks for a free slot for an undo log segment.
trx_rseg_t
The rollback segment memory object.
Definition: trx0types.h:187
trx_rseg_upgrade_undo_tablespaces
void trx_rseg_upgrade_undo_tablespaces()
Upgrade the TRX_SYS page so that it no longer tracks rsegs in undo tablespaces other than the system ...
Definition: trx0rseg.cc:806
trx_rsegs_init
void trx_rsegs_init(purge_pq_t *purge_queue)
Create the memory copies for rollback segments and initialize the rseg array in trx_sys at a database...
Definition: trx0rseg.cc:339
purge_pq_t
std::priority_queue< TrxUndoRsegs, std::vector< TrxUndoRsegs, ut_allocator< TrxUndoRsegs > >, TrxUndoRsegs > purge_pq_t
Definition: trx0types.h:536
page_size_t
Page size descriptor.
Definition: page0size.h:50
trx_rseg_get_n_undo_tablespaces
void trx_rseg_get_n_undo_tablespaces(Space_Ids *spaces_to_open)
Build a list of unique undo tablespaces found in the TRX_SYS page.
Definition: trx0rseg.cc:768
Space_Ids
List of undo tablespace IDs.
Definition: trx0sys.h:405
trx0types.h
trx_rseg_mem_create
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:220
trx_rsegf_get_nth_undo
UNIV_INLINE 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.
trx_rseg_adjust_rollback_segments
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:701
trx_rsegsf_set_page_no
UNIV_INLINE 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_rsegf_set_nth_undo
UNIV_INLINE 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.
trx_rsegf_get_new
UNIV_INLINE 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.
fut0lst.h
space_id_t
uint32 space_id_t
Tablespace identifier.
Definition: api0api.h:59
ulong
unsigned long ulong
Definition: my_inttypes.h:48
n
int n
Definition: xcom_base.c:425
trx_rseg_header_create
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:56
trx_rseg_create
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:436