1 | /***************************************************************************** |
2 | |
3 | Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. |
4 | Copyright (c) 2017, 2018, MariaDB Corporation. |
5 | |
6 | This program is free software; you can redistribute it and/or modify it under |
7 | the terms of the GNU General Public License as published by the Free Software |
8 | Foundation; version 2 of the License. |
9 | |
10 | This program is distributed in the hope that it will be useful, but WITHOUT |
11 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
12 | FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. |
13 | |
14 | You should have received a copy of the GNU General Public License along with |
15 | this program; if not, write to the Free Software Foundation, Inc., |
16 | 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA |
17 | |
18 | *****************************************************************************/ |
19 | |
20 | /**************************************************//** |
21 | @file include/trx0undo.h |
22 | Transaction undo log |
23 | |
24 | Created 3/26/1996 Heikki Tuuri |
25 | *******************************************************/ |
26 | |
27 | #ifndef trx0undo_h |
28 | #define trx0undo_h |
29 | |
30 | #ifndef UNIV_INNOCHECKSUM |
31 | #include "trx0sys.h" |
32 | |
33 | /** The LSB of the "is insert" flag in DB_ROLL_PTR */ |
34 | #define ROLL_PTR_INSERT_FLAG_POS 55 |
35 | /** The LSB of the 7-bit trx_rseg_t::id in DB_ROLL_PTR */ |
36 | #define ROLL_PTR_RSEG_ID_POS 48 |
37 | /** The LSB of the 32-bit undo log page number in DB_ROLL_PTR */ |
38 | #define ROLL_PTR_PAGE_POS 16 |
39 | /** The LSB of the 16-bit byte offset within an undo log page in DB_ROLL_PTR */ |
40 | #define ROLL_PTR_BYTE_POS 0 |
41 | |
42 | /***********************************************************************//** |
43 | Builds a roll pointer. |
44 | @return roll pointer */ |
45 | UNIV_INLINE |
46 | roll_ptr_t |
47 | trx_undo_build_roll_ptr( |
48 | /*====================*/ |
49 | ibool is_insert, /*!< in: TRUE if insert undo log */ |
50 | ulint rseg_id, /*!< in: rollback segment id */ |
51 | ulint page_no, /*!< in: page number */ |
52 | ulint offset); /*!< in: offset of the undo entry within page */ |
53 | /***********************************************************************//** |
54 | Decodes a roll pointer. */ |
55 | UNIV_INLINE |
56 | void |
57 | trx_undo_decode_roll_ptr( |
58 | /*=====================*/ |
59 | roll_ptr_t roll_ptr, /*!< in: roll pointer */ |
60 | ibool* is_insert, /*!< out: TRUE if insert undo log */ |
61 | ulint* rseg_id, /*!< out: rollback segment id */ |
62 | ulint* page_no, /*!< out: page number */ |
63 | ulint* offset); /*!< out: offset of the undo |
64 | entry within page */ |
65 | /***********************************************************************//** |
66 | Returns TRUE if the roll pointer is of the insert type. |
67 | @return TRUE if insert undo log */ |
68 | UNIV_INLINE |
69 | ibool |
70 | trx_undo_roll_ptr_is_insert( |
71 | /*========================*/ |
72 | roll_ptr_t roll_ptr); /*!< in: roll pointer */ |
73 | /***********************************************************************//** |
74 | Returns true if the record is of the insert type. |
75 | @return true if the record was freshly inserted (not updated). */ |
76 | UNIV_INLINE |
77 | bool |
78 | trx_undo_trx_id_is_insert( |
79 | /*======================*/ |
80 | const byte* trx_id) /*!< in: DB_TRX_ID, followed by DB_ROLL_PTR */ |
81 | MY_ATTRIBUTE((warn_unused_result)); |
82 | /*****************************************************************//** |
83 | Writes a roll ptr to an index page. In case that the size changes in |
84 | some future version, this function should be used instead of |
85 | mach_write_... */ |
86 | UNIV_INLINE |
87 | void |
88 | trx_write_roll_ptr( |
89 | /*===============*/ |
90 | byte* ptr, /*!< in: pointer to memory where |
91 | written */ |
92 | roll_ptr_t roll_ptr); /*!< in: roll ptr */ |
93 | /*****************************************************************//** |
94 | Reads a roll ptr from an index page. In case that the roll ptr size |
95 | changes in some future version, this function should be used instead of |
96 | mach_read_... |
97 | @return roll ptr */ |
98 | UNIV_INLINE |
99 | roll_ptr_t |
100 | trx_read_roll_ptr( |
101 | /*==============*/ |
102 | const byte* ptr); /*!< in: pointer to memory from where to read */ |
103 | |
104 | /** Gets an undo log page and x-latches it. |
105 | @param[in] page_id page id |
106 | @param[in,out] mtr mini-transaction |
107 | @return pointer to page x-latched */ |
108 | UNIV_INLINE |
109 | page_t* |
110 | trx_undo_page_get(const page_id_t& page_id, mtr_t* mtr); |
111 | |
112 | /** Gets an undo log page and s-latches it. |
113 | @param[in] page_id page id |
114 | @param[in,out] mtr mini-transaction |
115 | @return pointer to page s-latched */ |
116 | UNIV_INLINE |
117 | page_t* |
118 | trx_undo_page_get_s_latched(const page_id_t& page_id, mtr_t* mtr); |
119 | |
120 | /******************************************************************//** |
121 | Returns the next undo log record on the page in the specified log, or |
122 | NULL if none exists. |
123 | @return pointer to record, NULL if none */ |
124 | UNIV_INLINE |
125 | trx_undo_rec_t* |
126 | trx_undo_page_get_next_rec( |
127 | /*=======================*/ |
128 | trx_undo_rec_t* rec, /*!< in: undo log record */ |
129 | ulint page_no,/*!< in: undo log header page number */ |
130 | ulint offset);/*!< in: undo log header offset on page */ |
131 | /***********************************************************************//** |
132 | Gets the previous record in an undo log. |
133 | @return undo log record, the page s-latched, NULL if none */ |
134 | trx_undo_rec_t* |
135 | trx_undo_get_prev_rec( |
136 | /*==================*/ |
137 | trx_undo_rec_t* rec, /*!< in: undo record */ |
138 | ulint page_no,/*!< in: undo log header page number */ |
139 | ulint offset, /*!< in: undo log header offset on page */ |
140 | bool shared, /*!< in: true=S-latch, false=X-latch */ |
141 | mtr_t* mtr); /*!< in: mtr */ |
142 | /***********************************************************************//** |
143 | Gets the next record in an undo log. |
144 | @return undo log record, the page s-latched, NULL if none */ |
145 | trx_undo_rec_t* |
146 | trx_undo_get_next_rec( |
147 | /*==================*/ |
148 | trx_undo_rec_t* rec, /*!< in: undo record */ |
149 | ulint page_no,/*!< in: undo log header page number */ |
150 | ulint offset, /*!< in: undo log header offset on page */ |
151 | mtr_t* mtr); /*!< in: mtr */ |
152 | |
153 | /** Gets the first record in an undo log. |
154 | @param[in] space undo log header space |
155 | @param[in] page_no undo log header page number |
156 | @param[in] offset undo log header offset on page |
157 | @param[in] mode latching mode: RW_S_LATCH or RW_X_LATCH |
158 | @param[in,out] mtr mini-transaction |
159 | @return undo log record, the page latched, NULL if none */ |
160 | trx_undo_rec_t* |
161 | trx_undo_get_first_rec( |
162 | fil_space_t* space, |
163 | ulint page_no, |
164 | ulint offset, |
165 | ulint mode, |
166 | mtr_t* mtr); |
167 | |
168 | /** Allocate an undo log page. |
169 | @param[in,out] undo undo log |
170 | @param[in,out] mtr mini-transaction that does not hold any page latch |
171 | @return X-latched block if success |
172 | @retval NULL on failure */ |
173 | buf_block_t* trx_undo_add_page(trx_undo_t* undo, mtr_t* mtr) |
174 | MY_ATTRIBUTE((nonnull, warn_unused_result)); |
175 | |
176 | /** Free the last undo log page. The caller must hold the rseg mutex. |
177 | @param[in,out] undo undo log |
178 | @param[in,out] mtr mini-transaction that does not hold any undo log page |
179 | or that has allocated the undo log page */ |
180 | void |
181 | trx_undo_free_last_page(trx_undo_t* undo, mtr_t* mtr) |
182 | MY_ATTRIBUTE((nonnull)); |
183 | |
184 | /** Truncate the tail of an undo log during rollback. |
185 | @param[in,out] undo undo log |
186 | @param[in] limit all undo logs after this limit will be discarded |
187 | @param[in] is_temp whether this is temporary undo log */ |
188 | void |
189 | trx_undo_truncate_end(trx_undo_t* undo, undo_no_t limit, bool is_temp) |
190 | MY_ATTRIBUTE((nonnull)); |
191 | |
192 | /** Truncate the head of an undo log. |
193 | NOTE that only whole pages are freed; the header page is not |
194 | freed, but emptied, if all the records there are below the limit. |
195 | @param[in,out] rseg rollback segment |
196 | @param[in] hdr_page_no header page number |
197 | @param[in] hdr_offset header offset on the page |
198 | @param[in] limit first undo number to preserve |
199 | (everything below the limit will be truncated) */ |
200 | void |
201 | trx_undo_truncate_start( |
202 | trx_rseg_t* rseg, |
203 | ulint hdr_page_no, |
204 | ulint hdr_offset, |
205 | undo_no_t limit); |
206 | /** Assign an undo log for a persistent transaction. |
207 | A new undo log is created or a cached undo log reused. |
208 | @param[in,out] trx transaction |
209 | @param[out] err error code |
210 | @param[in,out] mtr mini-transaction |
211 | @return the undo log block |
212 | @retval NULL on error */ |
213 | buf_block_t* |
214 | trx_undo_assign(trx_t* trx, dberr_t* err, mtr_t* mtr) |
215 | MY_ATTRIBUTE((nonnull)); |
216 | /** Assign an undo log for a transaction. |
217 | A new undo log is created or a cached undo log reused. |
218 | @param[in,out] trx transaction |
219 | @param[in] rseg rollback segment |
220 | @param[out] undo the undo log |
221 | @param[out] err error code |
222 | @param[in,out] mtr mini-transaction |
223 | @return the undo log block |
224 | @retval NULL on error */ |
225 | buf_block_t* |
226 | trx_undo_assign_low(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** undo, |
227 | dberr_t* err, mtr_t* mtr) |
228 | MY_ATTRIBUTE((nonnull, warn_unused_result)); |
229 | /******************************************************************//** |
230 | Sets the state of the undo log segment at a transaction finish. |
231 | @return undo log segment header page, x-latched */ |
232 | page_t* |
233 | trx_undo_set_state_at_finish( |
234 | /*=========================*/ |
235 | trx_undo_t* undo, /*!< in: undo log memory copy */ |
236 | mtr_t* mtr); /*!< in: mtr */ |
237 | |
238 | /** Set the state of the undo log segment at a XA PREPARE or XA ROLLBACK. |
239 | @param[in,out] trx transaction |
240 | @param[in,out] undo undo log |
241 | @param[in] rollback false=XA PREPARE, true=XA ROLLBACK |
242 | @param[in,out] mtr mini-transaction |
243 | @return undo log segment header page, x-latched */ |
244 | page_t* |
245 | trx_undo_set_state_at_prepare( |
246 | trx_t* trx, |
247 | trx_undo_t* undo, |
248 | bool rollback, |
249 | mtr_t* mtr); |
250 | |
251 | /** Free an old insert or temporary undo log after commit or rollback. |
252 | The information is not needed after a commit or rollback, therefore |
253 | the data can be discarded. |
254 | @param[in,out] undo undo log |
255 | @param[in] is_temp whether this is temporary undo log */ |
256 | void |
257 | trx_undo_commit_cleanup(trx_undo_t* undo, bool is_temp); |
258 | |
259 | /** At shutdown, frees the undo logs of a transaction. */ |
260 | void |
261 | trx_undo_free_at_shutdown(trx_t *trx); |
262 | |
263 | /* Forward declaration. */ |
264 | namespace undo { |
265 | class Truncate; |
266 | }; |
267 | |
268 | /** Truncate UNDO tablespace, reinitialize header and rseg. |
269 | @param[in] undo_trunc UNDO tablespace handler |
270 | @return true if success else false. */ |
271 | bool |
272 | trx_undo_truncate_tablespace( |
273 | undo::Truncate* undo_trunc); |
274 | |
275 | /** Parse MLOG_UNDO_INIT. |
276 | @param[in] ptr log record |
277 | @param[in] end_ptr end of log record buffer |
278 | @param[in,out] page page or NULL |
279 | @param[in,out] mtr mini-transaction |
280 | @return end of log record |
281 | @retval NULL if the log record is incomplete */ |
282 | byte* |
283 | trx_undo_parse_page_init(const byte* ptr, const byte* end_ptr, page_t* page); |
284 | /** Parse MLOG_UNDO_HDR_REUSE for crash-upgrade from MariaDB 10.2. |
285 | @param[in] ptr redo log record |
286 | @param[in] end_ptr end of log buffer |
287 | @param[in,out] page undo page or NULL |
288 | @return end of log record or NULL */ |
289 | byte* |
290 | trx_undo_parse_page_header_reuse( |
291 | const byte* ptr, |
292 | const byte* end_ptr, |
293 | page_t* page); |
294 | |
295 | /** Parse the redo log entry of an undo log page header create. |
296 | @param[in] ptr redo log record |
297 | @param[in] end_ptr end of log buffer |
298 | @param[in,out] page page frame or NULL |
299 | @param[in,out] mtr mini-transaction or NULL |
300 | @return end of log record or NULL */ |
301 | byte* |
302 | trx_undo_parse_page_header( |
303 | const byte* ptr, |
304 | const byte* end_ptr, |
305 | page_t* page, |
306 | mtr_t* mtr); |
307 | /** Read an undo log when starting up the database. |
308 | @param[in,out] rseg rollback segment |
309 | @param[in] id rollback segment slot |
310 | @param[in] page_no undo log segment page number |
311 | @param[in,out] max_trx_id the largest observed transaction ID |
312 | @return size of the undo log in pages */ |
313 | ulint |
314 | trx_undo_mem_create_at_db_start(trx_rseg_t* rseg, ulint id, ulint page_no, |
315 | trx_id_t& max_trx_id); |
316 | |
317 | #endif /* !UNIV_INNOCHECKSUM */ |
318 | |
319 | /* Types of an undo log segment */ |
320 | #define TRX_UNDO_INSERT 1 /* contains undo entries for inserts */ |
321 | #define TRX_UNDO_UPDATE 2 /* contains undo entries for updates |
322 | and delete markings: in short, |
323 | modifys (the name 'UPDATE' is a |
324 | historical relic) */ |
325 | /* States of an undo log segment */ |
326 | #define TRX_UNDO_ACTIVE 1 /* contains an undo log of an active |
327 | transaction */ |
328 | #define TRX_UNDO_CACHED 2 /* cached for quick reuse */ |
329 | #define TRX_UNDO_TO_FREE 3 /* insert undo segment can be freed */ |
330 | #define TRX_UNDO_TO_PURGE 4 /* update undo segment will not be |
331 | reused: it can be freed in purge when |
332 | all undo data in it is removed */ |
333 | #define TRX_UNDO_PREPARED 5 /* contains an undo log of an |
334 | prepared transaction */ |
335 | |
336 | #ifndef UNIV_INNOCHECKSUM |
337 | |
338 | /** Transaction undo log memory object; modified by the thread associated |
339 | with the transaction. */ |
340 | |
341 | struct trx_undo_t { |
342 | /*-----------------------------*/ |
343 | ulint id; /*!< undo log slot number within the |
344 | rollback segment */ |
345 | ulint state; /*!< state of the corresponding undo log |
346 | segment */ |
347 | trx_id_t trx_id; /*!< id of the trx assigned to the undo |
348 | log */ |
349 | XID xid; /*!< X/Open XA transaction |
350 | identification */ |
351 | ibool dict_operation; /*!< TRUE if a dict operation trx */ |
352 | table_id_t table_id; /*!< if a dict operation, then the table |
353 | id */ |
354 | trx_rseg_t* rseg; /*!< rseg where the undo log belongs */ |
355 | /*-----------------------------*/ |
356 | ulint hdr_page_no; /*!< page number of the header page in |
357 | the undo log */ |
358 | ulint hdr_offset; /*!< header offset of the undo log on |
359 | the page */ |
360 | ulint last_page_no; /*!< page number of the last page in the |
361 | undo log; this may differ from |
362 | top_page_no during a rollback */ |
363 | ulint size; /*!< current size in pages */ |
364 | /*-----------------------------*/ |
365 | ulint top_page_no; /*!< page number where the latest undo |
366 | log record was catenated; during |
367 | rollback the page from which the latest |
368 | undo record was chosen */ |
369 | ulint top_offset; /*!< offset of the latest undo record, |
370 | i.e., the topmost element in the undo |
371 | log if we think of it as a stack */ |
372 | undo_no_t top_undo_no; /*!< undo number of the latest record |
373 | (IB_ID_MAX if the undo log is empty) */ |
374 | buf_block_t* guess_block; /*!< guess for the buffer block where |
375 | the top page might reside */ |
376 | ulint withdraw_clock; /*!< the withdraw clock value of the |
377 | buffer pool when guess_block was stored */ |
378 | |
379 | /** @return whether the undo log is empty */ |
380 | bool empty() const { return top_undo_no == IB_ID_MAX; } |
381 | |
382 | /*-----------------------------*/ |
383 | UT_LIST_NODE_T(trx_undo_t) undo_list; |
384 | /*!< undo log objects in the rollback |
385 | segment are chained into lists */ |
386 | }; |
387 | #endif /* !UNIV_INNOCHECKSUM */ |
388 | |
389 | /** The offset of the undo log page header on pages of the undo log */ |
390 | #define TRX_UNDO_PAGE_HDR FSEG_PAGE_DATA |
391 | /*-------------------------------------------------------------*/ |
392 | /** Transaction undo log page header offsets */ |
393 | /* @{ */ |
394 | #define TRX_UNDO_PAGE_TYPE 0 /*!< unused; 0 (before MariaDB 10.3.1: |
395 | TRX_UNDO_INSERT or TRX_UNDO_UPDATE) */ |
396 | #define TRX_UNDO_PAGE_START 2 /*!< Byte offset where the undo log |
397 | records for the LATEST transaction |
398 | start on this page (remember that |
399 | in an update undo log, the first page |
400 | can contain several undo logs) */ |
401 | #define TRX_UNDO_PAGE_FREE 4 /*!< On each page of the undo log this |
402 | field contains the byte offset of the |
403 | first free byte on the page */ |
404 | #define TRX_UNDO_PAGE_NODE 6 /*!< The file list node in the chain |
405 | of undo log pages */ |
406 | /*-------------------------------------------------------------*/ |
407 | #define TRX_UNDO_PAGE_HDR_SIZE (6 + FLST_NODE_SIZE) |
408 | /*!< Size of the transaction undo |
409 | log page header, in bytes */ |
410 | /* @} */ |
411 | |
412 | /** An update undo segment with just one page can be reused if it has |
413 | at most this many bytes used; we must leave space at least for one new undo |
414 | log header on the page */ |
415 | |
416 | #define TRX_UNDO_PAGE_REUSE_LIMIT (3 << (srv_page_size_shift - 2)) |
417 | |
418 | /* An update undo log segment may contain several undo logs on its first page |
419 | if the undo logs took so little space that the segment could be cached and |
420 | reused. All the undo log headers are then on the first page, and the last one |
421 | owns the undo log records on subsequent pages if the segment is bigger than |
422 | one page. If an undo log is stored in a segment, then on the first page it is |
423 | allowed to have zero undo records, but if the segment extends to several |
424 | pages, then all the rest of the pages must contain at least one undo log |
425 | record. */ |
426 | |
427 | /** The offset of the undo log segment header on the first page of the undo |
428 | log segment */ |
429 | |
430 | #define TRX_UNDO_SEG_HDR (TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE) |
431 | /** Undo log segment header */ |
432 | /* @{ */ |
433 | /*-------------------------------------------------------------*/ |
434 | #define TRX_UNDO_STATE 0 /*!< TRX_UNDO_ACTIVE, ... */ |
435 | |
436 | #ifndef UNIV_INNOCHECKSUM |
437 | |
438 | #define TRX_UNDO_LAST_LOG 2 /*!< Offset of the last undo log header |
439 | on the segment header page, 0 if |
440 | none */ |
441 | #define TRX_UNDO_FSEG_HEADER 4 /*!< Header for the file segment which |
442 | the undo log segment occupies */ |
443 | #define TRX_UNDO_PAGE_LIST (4 + FSEG_HEADER_SIZE) |
444 | /*!< Base node for the list of pages in |
445 | the undo log segment; defined only on |
446 | the undo log segment's first page */ |
447 | /*-------------------------------------------------------------*/ |
448 | /** Size of the undo log segment header */ |
449 | #define TRX_UNDO_SEG_HDR_SIZE (4 + FSEG_HEADER_SIZE + FLST_BASE_NODE_SIZE) |
450 | /* @} */ |
451 | |
452 | /** The undo log header. There can be several undo log headers on the first |
453 | page of an update undo log segment. */ |
454 | /* @{ */ |
455 | /*-------------------------------------------------------------*/ |
456 | /** Transaction start identifier, or 0 if the undo log segment has been |
457 | completely purged and trx_purge_free_segment() has started freeing it */ |
458 | #define TRX_UNDO_TRX_ID 0 |
459 | /** Transaction end identifier (if the log is in a history list), |
460 | or 0 if the transaction has not been committed */ |
461 | #define TRX_UNDO_TRX_NO 8 |
462 | /** Before MariaDB 10.3.1, when purge did not reset DB_TRX_ID of |
463 | surviving user records, this used to be called TRX_UNDO_DEL_MARKS. |
464 | |
465 | The value 1 indicates that purge needs to process the undo log segment. |
466 | The value 0 indicates that all of it has been processed, and |
467 | trx_purge_free_segment() has been invoked, so the log is not safe to access. |
468 | |
469 | Before MariaDB 10.3.1, a log segment may carry the value 0 even before |
470 | trx_purge_free_segment() was called, for those undo log records for |
471 | which purge would not result in removing delete-marked records. */ |
472 | #define TRX_UNDO_NEEDS_PURGE 16 |
473 | #define TRX_UNDO_LOG_START 18 /*!< Offset of the first undo log record |
474 | of this log on the header page; purge |
475 | may remove undo log record from the |
476 | log start, and therefore this is not |
477 | necessarily the same as this log |
478 | header end offset */ |
479 | #define TRX_UNDO_XID_EXISTS 20 /*!< TRUE if undo log header includes |
480 | X/Open XA transaction identification |
481 | XID */ |
482 | #define TRX_UNDO_DICT_TRANS 21 /*!< TRUE if the transaction is a table |
483 | create, index create, or drop |
484 | transaction: in recovery |
485 | the transaction cannot be rolled back |
486 | in the usual way: a 'rollback' rather |
487 | means dropping the created or dropped |
488 | table, if it still exists */ |
489 | #define TRX_UNDO_TABLE_ID 22 /*!< Id of the table if the preceding |
490 | field is TRUE */ |
491 | #define TRX_UNDO_NEXT_LOG 30 /*!< Offset of the next undo log header |
492 | on this page, 0 if none */ |
493 | #define TRX_UNDO_PREV_LOG 32 /*!< Offset of the previous undo log |
494 | header on this page, 0 if none */ |
495 | #define TRX_UNDO_HISTORY_NODE 34 /*!< If the log is put to the history |
496 | list, the file list node is here */ |
497 | /*-------------------------------------------------------------*/ |
498 | /** Size of the undo log header without XID information */ |
499 | #define TRX_UNDO_LOG_OLD_HDR_SIZE (34 + FLST_NODE_SIZE) |
500 | |
501 | /* Note: the writing of the undo log old header is coded by a log record |
502 | MLOG_UNDO_HDR_CREATE. The appending of an XID to the |
503 | header is logged separately. In this sense, the XID is not really a member |
504 | of the undo log header. TODO: do not append the XID to the log header if XA |
505 | is not needed by the user. The XID wastes about 150 bytes of space in every |
506 | undo log. In the history list we may have millions of undo logs, which means |
507 | quite a large overhead. */ |
508 | |
509 | /** X/Open XA Transaction Identification (XID) */ |
510 | /* @{ */ |
511 | /** xid_t::formatID */ |
512 | #define TRX_UNDO_XA_FORMAT (TRX_UNDO_LOG_OLD_HDR_SIZE) |
513 | /** xid_t::gtrid_length */ |
514 | #define TRX_UNDO_XA_TRID_LEN (TRX_UNDO_XA_FORMAT + 4) |
515 | /** xid_t::bqual_length */ |
516 | #define TRX_UNDO_XA_BQUAL_LEN (TRX_UNDO_XA_TRID_LEN + 4) |
517 | /** Distributed transaction identifier data */ |
518 | #define TRX_UNDO_XA_XID (TRX_UNDO_XA_BQUAL_LEN + 4) |
519 | /*--------------------------------------------------------------*/ |
520 | #define TRX_UNDO_LOG_XA_HDR_SIZE (TRX_UNDO_XA_XID + XIDDATASIZE) |
521 | /*!< Total size of the undo log header |
522 | with the XA XID */ |
523 | /* @} */ |
524 | |
525 | #include "trx0undo.ic" |
526 | #endif /* !UNIV_INNOCHECKSUM */ |
527 | |
528 | #endif |
529 | |