96
84
trx_sys_doublewrite_init_or_restore_pages(
97
85
/*======================================*/
98
ibool restore_corrupt_pages); /*!< in: TRUE=restore pages */
99
/****************************************************************//**
86
ibool restore_corrupt_pages);
87
/********************************************************************
100
88
Marks the trx sys header when we have successfully upgraded to the >= 4.1.x
101
89
multiple tablespace format. */
104
92
trx_sys_mark_upgraded_to_multiple_tablespaces(void);
105
93
/*===============================================*/
106
/****************************************************************//**
107
Determines if a page number is located inside the doublewrite buffer.
108
@return TRUE if the location is inside the two blocks of the
109
doublewrite buffer */
94
/********************************************************************
95
Determines if a page number is located inside the doublewrite buffer. */
112
98
trx_doublewrite_page_inside(
113
99
/*========================*/
114
ulint page_no); /*!< in: page number */
115
/***************************************************************//**
116
Checks if a page address is the trx sys header page.
117
@return TRUE if trx sys header page */
100
/* out: TRUE if the location is inside
101
the two blocks of the doublewrite buffer */
102
ulint page_no); /* in: page number */
103
/*******************************************************************
104
Checks if a page address is the trx sys header page. */
120
107
trx_sys_hdr_page(
121
108
/*=============*/
122
ulint space, /*!< in: space */
123
ulint page_no);/*!< in: page number */
124
/*****************************************************************//**
109
/* out: TRUE if trx sys header page */
110
ulint space, /* in: space */
111
ulint page_no);/* in: page number */
112
/*********************************************************************
125
113
Creates and initializes the central memory structures for the transaction
126
114
system. This is called when the database is started. */
129
117
trx_sys_init_at_db_start(void);
130
118
/*==========================*/
131
/*****************************************************************//**
119
/*********************************************************************
132
120
Creates and initializes the transaction system at the database creation. */
135
123
trx_sys_create(void);
136
124
/*================*/
137
/****************************************************************//**
138
Looks for a free slot for a rollback segment in the trx system file copy.
139
@return slot index or ULINT_UNDEFINED if not found */
125
/********************************************************************
126
Looks for a free slot for a rollback segment in the trx system file copy. */
142
129
trx_sysf_rseg_find_free(
143
130
/*====================*/
144
mtr_t* mtr); /*!< in: mtr */
145
/***************************************************************//**
146
Gets the pointer in the nth slot of the rseg array.
147
@return pointer to rseg object, NULL if slot not in use */
131
/* out: slot index or ULINT_UNDEFINED
133
mtr_t* mtr); /* in: mtr */
134
/*******************************************************************
135
Gets the pointer in the nth slot of the rseg array. */
150
138
trx_sys_get_nth_rseg(
151
139
/*=================*/
152
trx_sys_t* sys, /*!< in: trx system */
153
ulint n); /*!< in: index of slot */
154
/***************************************************************//**
140
/* out: pointer to rseg object, NULL if slot
142
trx_sys_t* sys, /* in: trx system */
143
ulint n); /* in: index of slot */
144
/*******************************************************************
155
145
Sets the pointer in the nth slot of the rseg array. */
158
148
trx_sys_set_nth_rseg(
159
149
/*=================*/
160
trx_sys_t* sys, /*!< in: trx system */
161
ulint n, /*!< in: index of slot */
162
trx_rseg_t* rseg); /*!< in: pointer to rseg object, NULL if slot
150
trx_sys_t* sys, /* in: trx system */
151
ulint n, /* in: index of slot */
152
trx_rseg_t* rseg); /* in: pointer to rseg object, NULL if slot
164
/**********************************************************************//**
165
Gets a pointer to the transaction system file copy and x-locks its page.
166
@return pointer to system file copy, page x-locked */
154
/**************************************************************************
155
Gets a pointer to the transaction system file copy and x-locks its page. */
171
mtr_t* mtr); /*!< in: mtr */
172
/*****************************************************************//**
160
/* out: pointer to system file copy, page x-locked */
161
mtr_t* mtr); /* in: mtr */
162
/*********************************************************************
173
163
Gets the space of the nth rollback segment slot in the trx system
178
167
trx_sysf_rseg_get_space(
179
168
/*====================*/
180
trx_sysf_t* sys_header, /*!< in: trx sys file copy */
181
ulint i, /*!< in: slot index == rseg id */
182
mtr_t* mtr); /*!< in: mtr */
183
/*****************************************************************//**
170
trx_sysf_t* sys_header, /* in: trx sys file copy */
171
ulint i, /* in: slot index == rseg id */
172
mtr_t* mtr); /* in: mtr */
173
/*********************************************************************
184
174
Gets the page number of the nth rollback segment slot in the trx system
186
@return page number, FIL_NULL if slot unused */
189
178
trx_sysf_rseg_get_page_no(
190
179
/*======================*/
191
trx_sysf_t* sys_header, /*!< in: trx sys file copy */
192
ulint i, /*!< in: slot index == rseg id */
193
mtr_t* mtr); /*!< in: mtr */
194
/*****************************************************************//**
180
/* out: page number, FIL_NULL
182
trx_sysf_t* sys_header, /* in: trx sys file copy */
183
ulint i, /* in: slot index == rseg id */
184
mtr_t* mtr); /* in: mtr */
185
/*********************************************************************
195
186
Sets the space id of the nth rollback segment slot in the trx system
199
190
trx_sysf_rseg_set_space(
200
191
/*====================*/
201
trx_sysf_t* sys_header, /*!< in: trx sys file copy */
202
ulint i, /*!< in: slot index == rseg id */
203
ulint space, /*!< in: space id */
204
mtr_t* mtr); /*!< in: mtr */
205
/*****************************************************************//**
192
trx_sysf_t* sys_header, /* in: trx sys file copy */
193
ulint i, /* in: slot index == rseg id */
194
ulint space, /* in: space id */
195
mtr_t* mtr); /* in: mtr */
196
/*********************************************************************
206
197
Sets the page number of the nth rollback segment slot in the trx system
210
201
trx_sysf_rseg_set_page_no(
211
202
/*======================*/
212
trx_sysf_t* sys_header, /*!< in: trx sys file copy */
213
ulint i, /*!< in: slot index == rseg id */
214
ulint page_no, /*!< in: page number, FIL_NULL if
203
trx_sysf_t* sys_header, /* in: trx sys file copy */
204
ulint i, /* in: slot index == rseg id */
205
ulint page_no, /* in: page number, FIL_NULL if
215
206
the slot is reset to unused */
216
mtr_t* mtr); /*!< in: mtr */
217
/*****************************************************************//**
218
Allocates a new transaction id.
219
@return new, allocated trx id */
207
mtr_t* mtr); /* in: mtr */
208
/*********************************************************************
209
Allocates a new transaction id. */
222
212
trx_sys_get_new_trx_id(void);
223
213
/*========================*/
224
/*****************************************************************//**
225
Allocates a new transaction number.
226
@return new, allocated trx number */
214
/* out: new, allocated trx id */
215
/*********************************************************************
216
Allocates a new transaction number. */
229
219
trx_sys_get_new_trx_no(void);
230
220
/*========================*/
231
#endif /* !UNIV_HOTBACKUP */
232
/*****************************************************************//**
221
/* out: new, allocated trx number */
222
/*********************************************************************
233
223
Writes a trx id to an index page. In case that the id size changes in
234
224
some future version, this function should be used instead of
235
225
mach_write_... */
334
336
trx_sys_file_format_tag_init(void);
335
337
/*==============================*/
336
#ifndef UNIV_HOTBACKUP
337
/*****************************************************************//**
338
Shutdown/Close the transaction system. */
343
#endif /* !UNIV_HOTBACKUP */
344
/*****************************************************************//**
345
Get the name representation of the file format from its id.
346
@return pointer to the name */
338
/*********************************************************************
339
Get the name representation of the file format from its id. */
349
342
trx_sys_file_format_id_to_name(
350
343
/*===========================*/
351
const ulint id); /*!< in: id of the file format */
352
/*****************************************************************//**
344
/* out: pointer to the name */
345
const ulint id); /* in: id of the file format */
346
/*********************************************************************
353
347
Set the file format id unconditionally except if it's already the
355
@return TRUE if value updated */
358
351
trx_sys_file_format_max_set(
359
352
/*========================*/
360
ulint format_id, /*!< in: file format id */
361
const char** name); /*!< out: max file format name or
353
/* out: TRUE if value updated */
354
ulint format_id, /* in: file format id */
355
const char** name); /* out: max file format name or
362
356
NULL if not needed. */
363
/*****************************************************************//**
364
Get the name representation of the file format from its id.
365
@return pointer to the max format name */
357
/*********************************************************************
358
Get the name representation of the file format from its id. */
368
361
trx_sys_file_format_max_get(void);
369
362
/*=============================*/
370
/*****************************************************************//**
371
Check for the max file format tag stored on disk.
372
@return DB_SUCCESS or error code */
363
/* out: pointer to the max format name */
364
/*********************************************************************
365
Check for the max file format tag stored on disk. */
375
368
trx_sys_file_format_max_check(
376
369
/*==========================*/
377
ulint max_format_id); /*!< in: the max format id to check */
378
/********************************************************************//**
370
/* out: DB_SUCCESS or error code */
371
ulint max_format_id); /* in: the max format id to check */
372
/************************************************************************
379
373
Update the file format tag in the system tablespace only if the given
380
format id is greater than the known max id.
381
@return TRUE if format_id was bigger than the known max id */
374
format id is greater than the known max id. */
384
377
trx_sys_file_format_max_upgrade(
385
378
/*============================*/
386
const char** name, /*!< out: max file format name */
387
ulint format_id); /*!< in: file format identifier */
388
#else /* !UNIV_HOTBACKUP */
389
/*****************************************************************//**
390
Prints to stderr the MySQL binlog info in the system header if the
391
magic number shows it valid. */
394
trx_sys_print_mysql_binlog_offset_from_page(
395
/*========================================*/
396
const byte* page); /*!< in: buffer containing the trx
397
system header page, i.e., page number
398
TRX_SYS_PAGE_NO in the tablespace */
399
/*****************************************************************//**
400
Reads the file format id from the first system table space file.
401
Even if the call succeeds and returns TRUE, the returned format id
402
may be ULINT_UNDEFINED signalling that the format id was not present
404
@return TRUE if call succeeds */
407
trx_sys_read_file_format_id(
408
/*========================*/
409
const char *pathname, /*!< in: pathname of the first system
411
ulint *format_id); /*!< out: file format of the system table
413
/*****************************************************************//**
414
Reads the file format id from the given per-table data file.
415
@return TRUE if call succeeds */
418
trx_sys_read_pertable_file_format_id(
419
/*=================================*/
420
const char *pathname, /*!< in: pathname of a per-table
422
ulint *format_id); /*!< out: file format of the per-table
424
/*****************************************************************//**
425
Get the name representation of the file format from its id.
426
@return pointer to the name */
429
trx_sys_file_format_id_to_name(
430
/*===========================*/
431
const ulint id); /*!< in: id of the file format */
433
#endif /* !UNIV_HOTBACKUP */
434
/*********************************************************************
435
Creates the rollback segments */
438
trx_sys_create_rsegs(
439
/*=================*/
440
ulint n_rsegs); /*!< number of rollback segments to create */
379
/* out: TRUE if format_id was
380
bigger than the known max id */
381
const char** name, /* out: max file format name */
382
ulint format_id); /* in: file format identifier */
442
383
/* The automatically created system rollback segment has this id */
443
384
#define TRX_SYS_SYSTEM_RSEG_ID 0
445
386
/* Space id and page no where the trx system file copy resides */
446
387
#define TRX_SYS_SPACE 0 /* the SYSTEM tablespace */
448
388
#define TRX_SYS_PAGE_NO FSP_TRX_SYS_PAGE_NO
450
390
/* The offset of the transaction system header on the page */
451
391
#define TRX_SYS FSEG_PAGE_DATA
453
/** Transaction system header */
454
/*------------------------------------------------------------- @{ */
455
#define TRX_SYS_TRX_ID_STORE 0 /*!< the maximum trx id or trx
457
TRX_SYS_TRX_ID_UPDATE_MARGIN
393
/* Transaction system header */
394
/*-------------------------------------------------------------*/
395
#define TRX_SYS_TRX_ID_STORE 0 /* the maximum trx id or trx number
396
modulo TRX_SYS_TRX_ID_UPDATE_MARGIN
458
397
written to a file page by any
459
398
transaction; the assignment of
460
transaction ids continues from
461
this number rounded up by
462
TRX_SYS_TRX_ID_UPDATE_MARGIN
464
TRX_SYS_TRX_ID_UPDATE_MARGIN
399
transaction ids continues from this
400
number rounded up by .._MARGIN plus
401
.._MARGIN when the database is
467
#define TRX_SYS_FSEG_HEADER 8 /*!< segment header for the
468
tablespace segment the trx
469
system is created into */
403
#define TRX_SYS_FSEG_HEADER 8 /* segment header for the tablespace
404
segment the trx system is created
470
406
#define TRX_SYS_RSEGS (8 + FSEG_HEADER_SIZE)
471
/*!< the start of the array of
472
rollback segment specification
474
/*------------------------------------------------------------- @} */
407
/* the start of the array of rollback
408
segment specification slots */
409
/*-------------------------------------------------------------*/
476
411
/* Max number of rollback segments: the number of segment specification slots
477
in the transaction system array; rollback segment id must fit in one (signed)
478
byte, therefore 128; each slot is currently 8 bytes in size. If you want
479
to raise the level to 256 then you will need to fix some assertions that
480
impose the 7 bit restriction. e.g., mach_write_to_3() */
481
#define TRX_SYS_N_RSEGS 128
482
/* Originally, InnoDB defined TRX_SYS_N_RSEGS as 256 but created only one
483
rollback segment. It initialized some arrays with this number of entries.
484
We must remember this limit in order to keep file compatibility. */
485
#define TRX_SYS_OLD_N_RSEGS 256
412
in the transaction system array; rollback segment id must fit in one byte,
413
therefore 256; each slot is currently 8 bytes in size */
414
#define TRX_SYS_N_RSEGS 256
487
/** Maximum length of MySQL binlog file name, in bytes.
488
@see trx_sys_mysql_master_log_name
489
@see trx_sys_mysql_bin_log_name */
490
416
#define TRX_SYS_MYSQL_LOG_NAME_LEN 512
491
/** Contents of TRX_SYS_MYSQL_LOG_MAGIC_N_FLD */
492
417
#define TRX_SYS_MYSQL_LOG_MAGIC_N 873422344
494
419
#if UNIV_PAGE_SIZE < 4096
495
420
# error "UNIV_PAGE_SIZE < 4096"
497
/** The offset of the MySQL replication info in the trx system header;
422
/* The offset of the MySQL replication info in the trx system header;
498
423
this contains the same fields as TRX_SYS_MYSQL_LOG_INFO below */
499
424
#define TRX_SYS_MYSQL_MASTER_LOG_INFO (UNIV_PAGE_SIZE - 2000)
501
/** The offset of the MySQL binlog offset info in the trx system header */
426
/* The offset of the MySQL binlog offset info in the trx system header */
502
427
#define TRX_SYS_MYSQL_LOG_INFO (UNIV_PAGE_SIZE - 1000)
503
#define TRX_SYS_MYSQL_LOG_MAGIC_N_FLD 0 /*!< magic number which is
504
TRX_SYS_MYSQL_LOG_MAGIC_N
428
#define TRX_SYS_MYSQL_LOG_MAGIC_N_FLD 0 /* magic number which shows
505
429
if we have valid data in the
507
#define TRX_SYS_MYSQL_LOG_OFFSET_HIGH 4 /*!< high 4 bytes of the offset
509
#define TRX_SYS_MYSQL_LOG_OFFSET_LOW 8 /*!< low 4 bytes of the offset
511
#define TRX_SYS_MYSQL_LOG_NAME 12 /*!< MySQL log file name */
430
MySQL binlog info; the value
431
is ..._MAGIC_N if yes */
432
#define TRX_SYS_MYSQL_LOG_OFFSET_HIGH 4 /* high 4 bytes of the offset
434
#define TRX_SYS_MYSQL_LOG_OFFSET_LOW 8 /* low 4 bytes of the offset
436
#define TRX_SYS_MYSQL_LOG_NAME 12 /* MySQL log file name */
513
/** Doublewrite buffer */
515
/** The offset of the doublewrite buffer header on the trx system header page */
438
/* The offset of the doublewrite buffer header on the trx system header page */
516
439
#define TRX_SYS_DOUBLEWRITE (UNIV_PAGE_SIZE - 200)
517
440
/*-------------------------------------------------------------*/
518
#define TRX_SYS_DOUBLEWRITE_FSEG 0 /*!< fseg header of the fseg
441
#define TRX_SYS_DOUBLEWRITE_FSEG 0 /* fseg header of the fseg
519
442
containing the doublewrite
521
444
#define TRX_SYS_DOUBLEWRITE_MAGIC FSEG_HEADER_SIZE
522
/*!< 4-byte magic number which
445
/* 4-byte magic number which
523
446
shows if we already have
524
447
created the doublewrite
526
449
#define TRX_SYS_DOUBLEWRITE_BLOCK1 (4 + FSEG_HEADER_SIZE)
527
/*!< page number of the
450
/* page number of the
528
451
first page in the first
530
453
(= FSP_EXTENT_SIZE) consecutive
531
454
pages in the doublewrite
533
456
#define TRX_SYS_DOUBLEWRITE_BLOCK2 (8 + FSEG_HEADER_SIZE)
534
/*!< page number of the
457
/* page number of the
535
458
first page in the second
536
459
sequence of 64 consecutive
537
460
pages in the doublewrite
539
#define TRX_SYS_DOUBLEWRITE_REPEAT 12 /*!< we repeat
540
TRX_SYS_DOUBLEWRITE_MAGIC,
541
TRX_SYS_DOUBLEWRITE_BLOCK1,
542
TRX_SYS_DOUBLEWRITE_BLOCK2
543
so that if the trx sys
544
header is half-written
545
to disk, we still may
546
be able to recover the
548
/** If this is not yet set to TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N,
549
we must reset the doublewrite buffer, because starting from 4.1.x the
550
space id of a data page is stored into
551
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_NO. */
462
#define TRX_SYS_DOUBLEWRITE_REPEAT 12 /* we repeat the above 3
463
numbers so that if the trx
464
sys header is half-written
465
to disk, we still may be able
466
to recover the information */
552
467
#define TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED (24 + FSEG_HEADER_SIZE)
468
/* If this is not yet set to
469
.._N, we must reset the
470
doublewrite buffer, because
471
starting from 4.1.x the space
472
id of a data page is stored to
473
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_NO */
554
474
/*-------------------------------------------------------------*/
555
/** Contents of TRX_SYS_DOUBLEWRITE_MAGIC */
556
475
#define TRX_SYS_DOUBLEWRITE_MAGIC_N 536853855
557
/** Contents of TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED */
558
476
#define TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N 1783657386
560
/** Size of the doublewrite block in pages */
561
479
#define TRX_SYS_DOUBLEWRITE_BLOCK_SIZE FSP_EXTENT_SIZE
564
#ifndef UNIV_HOTBACKUP
565
/** File format tag */
567
/** The offset of the file format tag on the trx system header page
568
(TRX_SYS_PAGE_NO of TRX_SYS_SPACE) */
481
/* The offset of the file format tag on the trx system header page */
569
482
#define TRX_SYS_FILE_FORMAT_TAG (UNIV_PAGE_SIZE - 16)
571
/** Contents of TRX_SYS_FILE_FORMAT_TAG when valid. The file format
572
identifier is added to this constant. */
484
/* We use these random constants to reduce the probability of reading
485
garbage (from previous versions) that maps to an actual format id. We
486
use these as bit masks at the time of reading and writing from/to disk. */
573
487
#define TRX_SYS_FILE_FORMAT_TAG_MAGIC_N_LOW 3645922177UL
574
/** Contents of TRX_SYS_FILE_FORMAT_TAG+4 when valid */
575
488
#define TRX_SYS_FILE_FORMAT_TAG_MAGIC_N_HIGH 2745987765UL
576
/** Contents of TRX_SYS_FILE_FORMAT_TAG when valid. The file format
577
identifier is added to this 64-bit constant. */
578
#define TRX_SYS_FILE_FORMAT_TAG_MAGIC_N \
579
((ib_uint64_t) TRX_SYS_FILE_FORMAT_TAG_MAGIC_N_HIGH << 32 \
580
| TRX_SYS_FILE_FORMAT_TAG_MAGIC_N_LOW)
583
/** Doublewrite control struct */
490
/* Doublewrite control struct */
584
491
struct trx_doublewrite_struct{
585
mutex_t mutex; /*!< mutex protecting the first_free field and
492
mutex_t mutex; /* mutex protecting the first_free field and
587
ulint block1; /*!< the page number of the first
494
ulint block1; /* the page number of the first
588
495
doublewrite block (64 pages) */
589
ulint block2; /*!< page number of the second block */
590
ulint first_free; /*!< first free position in write_buf measured
496
ulint block2; /* page number of the second block */
497
ulint first_free; /* first free position in write_buf measured
591
498
in units of UNIV_PAGE_SIZE */
592
byte* write_buf; /*!< write buffer used in writing to the
499
byte* write_buf; /* write buffer used in writing to the
593
500
doublewrite buffer, aligned to an
594
501
address divisible by UNIV_PAGE_SIZE
595
502
(which is required by Windows aio) */
596
byte* write_buf_unaligned;
597
/*!< pointer to write_buf, but unaligned */
503
byte* write_buf_unaligned; /* pointer to write_buf, but unaligned */
599
buf_block_arr; /*!< array to store pointers to the buffer
505
buf_block_arr; /* array to store pointers to the buffer
600
506
blocks which have been cached to write_buf */
603
/** The transaction system central memory data structure; protected by the
509
/* The transaction system central memory data structure; protected by the
605
511
struct trx_sys_struct{
606
trx_id_t max_trx_id; /*!< The smallest number not yet
512
dulint max_trx_id; /* The smallest number not yet
607
513
assigned as a transaction id or
608
514
transaction number */
609
515
UT_LIST_BASE_NODE_T(trx_t) trx_list;
610
/*!< List of active and committed in
516
/* List of active and committed in
611
517
memory transactions, sorted on trx id,
613
519
UT_LIST_BASE_NODE_T(trx_t) mysql_trx_list;
614
/*!< List of transactions created
520
/* List of transactions created
616
522
UT_LIST_BASE_NODE_T(trx_rseg_t) rseg_list;
617
/*!< List of rollback segment
619
trx_rseg_t* latest_rseg; /*!< Latest rollback segment in the
523
/* List of rollback segment objects */
524
trx_rseg_t* latest_rseg; /* Latest rollback segment in the
620
525
round-robin assignment of rollback
621
526
segments to transactions */
622
527
trx_rseg_t* rseg_array[TRX_SYS_N_RSEGS];
623
/*!< Pointer array to rollback
624
segments; NULL if slot not in use */
625
ulint rseg_history_len;/*!< Length of the TRX_RSEG_HISTORY
528
/* Pointer array to rollback segments;
529
NULL if slot not in use */
530
ulint rseg_history_len;/* Length of the TRX_RSEG_HISTORY
626
531
list (update undo logs for committed
627
532
transactions), protected by
629
534
UT_LIST_BASE_NODE_T(read_view_t) view_list;
630
/*!< List of read views sorted
631
on trx no, biggest first */
535
/* List of read views sorted on trx no,
634
/** When a trx id which is zero modulo this number (which must be a power of
539
/* When a trx id which is zero modulo this number (which must be a power of
635
540
two) is assigned, the field TRX_SYS_TRX_ID_STORE on the transaction system
636
541
page is updated */
637
542
#define TRX_SYS_TRX_ID_WRITE_MARGIN 256
638
#endif /* !UNIV_HOTBACKUP */
640
544
#ifndef UNIV_NONINL
641
545
#include "trx0sys.ic"