126
127
static const ulint FILE_FORMAT_NAME_N
127
128
= sizeof(file_format_name_map) / sizeof(file_format_name_map[0]);
130
#ifdef UNIV_PFS_MUTEX
131
/* Key to register the mutex with performance schema */
132
UNIV_INTERN mysql_pfs_key_t trx_doublewrite_mutex_key;
133
UNIV_INTERN mysql_pfs_key_t file_format_max_mutex_key;
134
#endif /* UNIV_PFS_MUTEX */
129
136
#ifndef UNIV_HOTBACKUP
130
137
/** This is used to track the maximum file format id known to InnoDB. It's
131
138
updated via SET GLOBAL innodb_file_format_check = 'x' or when we open
179
186
os_do_not_call_flush_at_each_write = TRUE;
180
187
#endif /* UNIV_DO_FLUSH */
182
mutex_create(&trx_doublewrite->mutex, SYNC_DOUBLEWRITE);
189
mutex_create(trx_doublewrite_mutex_key,
190
&trx_doublewrite->mutex, SYNC_DOUBLEWRITE);
184
192
trx_doublewrite->first_free = 0;
903
912
sys_header = trx_sysf_get(mtr);
905
914
/* Start counting transaction ids from number 1 up */
906
mlog_write_dulint(sys_header + TRX_SYS_TRX_ID_STORE,
907
ut_dulint_create(0, 1), mtr);
909
/* Reset the rollback segment slots */
910
for (i = 0; i < TRX_SYS_N_RSEGS; i++) {
912
trx_sysf_rseg_set_space(sys_header, i, ULINT_UNDEFINED, mtr);
913
trx_sysf_rseg_set_page_no(sys_header, i, FIL_NULL, mtr);
916
/* The remaining area (up to the page trailer) is uninitialized.
917
Silence Valgrind warnings about it. */
918
UNIV_MEM_VALID(sys_header + (TRX_SYS_RSEGS
919
+ TRX_SYS_N_RSEGS * TRX_SYS_RSEG_SLOT_SIZE
920
+ TRX_SYS_RSEG_SPACE),
921
(UNIV_PAGE_SIZE - FIL_PAGE_DATA_END
923
+ TRX_SYS_N_RSEGS * TRX_SYS_RSEG_SLOT_SIZE
924
+ TRX_SYS_RSEG_SPACE))
925
+ page - sys_header);
915
mach_write_to_8(sys_header + TRX_SYS_TRX_ID_STORE,
916
ut_dulint_create(0, 1));
918
/* Reset the rollback segment slots. Old versions of InnoDB
919
define TRX_SYS_N_RSEGS as 256 (TRX_SYS_OLD_N_RSEGS) and expect
920
that the whole array is initialized. */
921
ptr = TRX_SYS_RSEGS + sys_header;
922
len = ut_max(TRX_SYS_OLD_N_RSEGS, TRX_SYS_N_RSEGS)
923
* TRX_SYS_RSEG_SLOT_SIZE;
924
memset(ptr, 0xff, len);
926
ut_a(ptr <= page + (UNIV_PAGE_SIZE - FIL_PAGE_DATA_END));
928
/* Initialize all of the page. This part used to be uninitialized. */
929
memset(ptr, 0, UNIV_PAGE_SIZE - FIL_PAGE_DATA_END + page - ptr);
931
mlog_log_string(sys_header, UNIV_PAGE_SIZE - FIL_PAGE_DATA_END
932
+ page - sys_header, mtr);
927
934
/* Create the first rollback segment in the SYSTEM tablespace */
928
page_no = trx_rseg_header_create(TRX_SYS_SPACE, 0, ULINT_MAX, &slot_no,
935
slot_no = trx_sysf_rseg_find_free(mtr);
936
page_no = trx_rseg_header_create(TRX_SYS_SPACE, 0, ULINT_MAX, slot_no,
930
938
ut_a(slot_no == TRX_SYS_SYSTEM_RSEG_ID);
931
ut_a(page_no != FIL_NULL);
939
ut_a(page_no == FSP_FIRST_RSEG_PAGE_NO);
933
941
mutex_exit(&kernel_mutex);
1283
1291
trx_sys_file_format_init(void)
1284
1292
/*==========================*/
1286
mutex_create(&file_format_max.mutex, SYNC_FILE_FORMAT_TAG);
1294
mutex_create(file_format_max_mutex_key,
1295
&file_format_max.mutex, SYNC_FILE_FORMAT_TAG);
1288
1297
/* We don't need a mutex here, as this function should only
1289
1298
be called once at start up. */
1303
1312
/* Does nothing at the moment */
1315
/*********************************************************************
1316
Creates the rollback segments */
1319
trx_sys_create_rsegs(
1320
/*=================*/
1321
ulint n_rsegs) /*!< number of rollback segments to create */
1323
ulint new_rsegs = 0;
1325
/* Do not create additional rollback segments if
1326
innodb_force_recovery has been set and the database
1327
was not shutdown cleanly. */
1328
if (!srv_force_recovery && !recv_needed_recovery) {
1331
for (i = 0; i < n_rsegs; ++i) {
1333
if (trx_rseg_create() != NULL) {
1341
if (new_rsegs > 0) {
1343
"InnoDB: %lu rollback segment(s) active.\n",
1305
1348
#else /* !UNIV_HOTBACKUP */
1306
1349
/*****************************************************************//**
1307
1350
Prints to stderr the MySQL binlog info in the system header if the