diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2017-05-26 14:04:19 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2017-06-06 12:06:41 +0300 |
commit | 86927cc712b6589f15fb1306a5fc42bb705c5302 (patch) | |
tree | 8d3cd8fa5651b9fdc95bcc3590213dbe7c52e60e /extra | |
parent | ed2976caf005e65bc2b5eae1d174dfe72535683f (diff) | |
download | mariadb-git-86927cc712b6589f15fb1306a5fc42bb705c5302.tar.gz |
Remove traces of multiple InnoDB redo logs
InnoDB never supported more than one copy of a redo log.
There were provisions to do that. For Mariabackup, let us clean up
this code.
log_sys_init(): Renamed from log_init().
log_set_capacity(): Renamed from log_calc_max_ages().
log_init(): Renamed from log_group_init(). Remove the parameters
id, space_id. Let the caller invoke log_set_capacity() when needed.
log_group_t: Remove id, space_id, log_groups.
log_t: Replace log_groups with a single log.
recv_find_max_checkpoint(): Declare globally. Remove the first parameter.
xtrabackup_choose_lsn_offset(): Remove (dead code).
Diffstat (limited to 'extra')
-rw-r--r-- | extra/mariabackup/xb0xb.h | 1 | ||||
-rw-r--r-- | extra/mariabackup/xtrabackup.cc | 300 | ||||
-rw-r--r-- | extra/mariabackup/xtrabackup.h | 9 |
3 files changed, 77 insertions, 233 deletions
diff --git a/extra/mariabackup/xb0xb.h b/extra/mariabackup/xb0xb.h index c6e4ae22de6..919d1190806 100644 --- a/extra/mariabackup/xb0xb.h +++ b/extra/mariabackup/xb0xb.h @@ -66,7 +66,6 @@ void innodb_log_checksum_func_update( /*============================*/ ulint algorithm) /*!< in: algorithm */; -dberr_t recv_find_max_checkpoint(log_group_t** max_group, ulint* max_field); dberr_t srv_undo_tablespaces_init( /*======================*/ diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 16a39c58d5c..bb8140718b2 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -564,7 +564,6 @@ enum options_xtrabackup OPT_INNODB_LOG_BUFFER_SIZE, OPT_INNODB_LOG_FILE_SIZE, OPT_INNODB_LOG_FILES_IN_GROUP, - OPT_INNODB_MIRRORED_LOG_GROUPS, OPT_INNODB_OPEN_FILES, OPT_INNODB_SYNC_SPIN_LOOPS, OPT_INNODB_THREAD_CONCURRENCY, @@ -2605,96 +2604,6 @@ skip: return(FALSE); } -static -void -xtrabackup_choose_lsn_offset(lsn_t start_lsn) -{ -#if SUPPORT_PERCONA_5_5 - ulint no, alt_no, expected_no; - ulint blocks_in_group; - lsn_t tmp_offset, end_lsn; - int lsn_chosen = 0; - log_group_t *group; - - start_lsn = ut_uint64_align_down(start_lsn, OS_FILE_LOG_BLOCK_SIZE); - end_lsn = start_lsn + RECV_SCAN_SIZE; - - group = UT_LIST_GET_FIRST(log_sys->log_groups); - - if (mysql_server_version < 50500 || mysql_server_version > 50600) { - /* only make sense for Percona Server 5.5 */ - return; - } - - if (server_flavor == FLAVOR_PERCONA_SERVER) { - /* it is Percona Server 5.5 */ - group->alt_offset_chosen = true; - group->lsn_offset = group->lsn_offset_alt; - return; - } - - if (group->lsn_offset_alt == group->lsn_offset || - group->lsn_offset_alt == (lsn_t) -1) { - /* we have only one option */ - return; - } - - no = alt_no = (ulint) -1; - lsn_chosen = 0; - - blocks_in_group = log_block_convert_lsn_to_no( - log_group_get_capacity(group)) - 1; - - /* read log block number from usual offset */ - if (group->lsn_offset < group->file_size * group->n_files && - (log_group_calc_lsn_offset(start_lsn, group) % - UNIV_PAGE_SIZE) % OS_MIN_LOG_BLOCK_SIZE == 0) { - log_group_read_log_seg(LOG_RECOVER, log_sys->buf, - group, start_lsn, end_lsn); - no = log_block_get_hdr_no(log_sys->buf); - } - - /* read log block number from Percona Server 5.5 offset */ - tmp_offset = group->lsn_offset; - group->lsn_offset = group->lsn_offset_alt; - - if (group->lsn_offset < group->file_size * group->n_files && - (log_group_calc_lsn_offset(start_lsn, group) % - UNIV_PAGE_SIZE) % OS_MIN_LOG_BLOCK_SIZE == 0) { - log_group_read_log_seg(LOG_RECOVER, log_sys->buf, - group, start_lsn, end_lsn); - alt_no = log_block_get_hdr_no(log_sys->buf); - } - - expected_no = log_block_convert_lsn_to_no(start_lsn); - - ut_a(!(no == expected_no && alt_no == expected_no)); - - group->lsn_offset = tmp_offset; - - if ((no <= expected_no && - ((expected_no - no) % blocks_in_group) == 0) || - ((expected_no | 0x40000000UL) - no) % blocks_in_group == 0) { - /* default offset looks ok */ - ++lsn_chosen; - } - - if ((alt_no <= expected_no && - ((expected_no - alt_no) % blocks_in_group) == 0) || - ((expected_no | 0x40000000UL) - alt_no) % blocks_in_group == 0) { - /* PS 5.5 style offset looks ok */ - ++lsn_chosen; - group->alt_offset_chosen = true; - group->lsn_offset = group->lsn_offset_alt; - } - - /* We are in trouble, because we can not make a - decision to choose one over the other. Die just - like a Buridan's ass */ - ut_a(lsn_chosen == 1); -#endif -} - extern ibool log_block_checksum_is_ok_or_old_format(const byte* block); /*******************************************************//** @@ -2862,8 +2771,6 @@ static my_bool xtrabackup_copy_logfile(lsn_t from_lsn, my_bool is_last) { /* definition from recv_recovery_from_checkpoint_start() */ - log_group_t* group; - lsn_t group_scanned_lsn; lsn_t contiguous_lsn; ut_a(dst_log_file != NULL); @@ -2873,66 +2780,50 @@ xtrabackup_copy_logfile(lsn_t from_lsn, my_bool is_last) /* TODO: We must check the contiguous_lsn still exists in log file.. */ - group = UT_LIST_GET_FIRST(log_sys->log_groups); - - while (group) { - bool finished; - lsn_t start_lsn; - lsn_t end_lsn; - - /* reference recv_group_scan_log_recs() */ - finished = false; + bool finished; + lsn_t start_lsn; + lsn_t end_lsn; - start_lsn = contiguous_lsn; + /* reference recv_group_scan_log_recs() */ - while (!finished) { + start_lsn = contiguous_lsn; - end_lsn = start_lsn + RECV_SCAN_SIZE; + do { + end_lsn = start_lsn + RECV_SCAN_SIZE; - xtrabackup_io_throttling(); + xtrabackup_io_throttling(); - mutex_enter(&log_sys->mutex); + log_mutex_enter(); - log_group_read_log_seg(LOG_RECOVER, log_sys->buf, - group, start_lsn, end_lsn, false); - - if (!xtrabackup_scan_log_recs(group, is_last, - start_lsn, &contiguous_lsn, &group_scanned_lsn, - &finished)) { - goto error; - } + log_group_read_log_seg(LOG_RECOVER, log_sys->buf, + &log_sys->log, start_lsn, end_lsn); - mutex_exit(&log_sys->mutex); + bool success = xtrabackup_scan_log_recs( + &log_sys->log, is_last, + start_lsn, &contiguous_lsn, + &log_sys->log.scanned_lsn, + &finished); - start_lsn = end_lsn; + log_mutex_exit(); + if (!success) { + ds_close(dst_log_file); + msg("xtrabackup: Error: xtrabackup_copy_logfile()" + " failed.\n"); + return(TRUE); } - group->scanned_lsn = group_scanned_lsn; - - msg_ts(">> log scanned up to (" LSN_PF ")\n", - group->scanned_lsn); - - group = UT_LIST_GET_NEXT(log_groups, group); - - /* update global variable*/ - log_copy_scanned_lsn = group_scanned_lsn; + start_lsn = end_lsn; + } while (!finished); - /* innodb_mirrored_log_groups must be 1, no other groups */ - ut_a(group == NULL); - - debug_sync_point("xtrabackup_copy_logfile_pause"); - - } + msg_ts(">> log scanned up to (" LSN_PF ")\n", + log_sys->log.scanned_lsn); + /* update global variable*/ + log_copy_scanned_lsn = log_sys->log.scanned_lsn; + debug_sync_point("xtrabackup_copy_logfile_pause"); return(FALSE); - -error: - mutex_exit(&log_sys->mutex); - ds_close(dst_log_file); - msg("xtrabackup: Error: xtrabackup_copy_logfile() failed.\n"); - return(TRUE); } static @@ -3244,13 +3135,12 @@ xb_fil_io_init(void) Populates the tablespace memory cache by scanning for and opening data files. @returns DB_SUCCESS or error code.*/ static -ulint -xb_load_tablespaces(void) -/*=====================*/ +dberr_t +xb_load_tablespaces() { ulint i; ibool create_new_db; - ulint err; + dberr_t err; ulint sum_of_new_sizes; lsn_t min_arch_logno, max_arch_logno; @@ -3321,9 +3211,9 @@ xb_load_tablespaces(void) Initialize the tablespace memory cache and populate it by scanning for and opening data files. @returns DB_SUCCESS or error code.*/ -ulint -xb_data_files_init(void) -/*====================*/ +static +dberr_t +xb_data_files_init() { xb_fil_io_init(); @@ -3332,9 +3222,9 @@ xb_data_files_init(void) /************************************************************************ Destroy the tablespace memory cache. */ +static void -xb_data_files_close(void) -/*====================*/ +xb_data_files_close() { ulint i; @@ -3745,7 +3635,6 @@ open_or_create_log_file( ibool log_file_has_been_opened,/*!< in: TRUE if a log file has been opened before: then it is an error to try to create another log file */ - ulint k, /*!< in: log group number */ ulint i) /*!< in: log file number in group */ { ibool ret; @@ -3755,8 +3644,6 @@ open_or_create_log_file( UT_NOT_USED(create_new_db); UT_NOT_USED(log_file_has_been_opened); - UT_NOT_USED(k); - ut_ad(k == 0); *log_file_created = FALSE; @@ -3804,20 +3691,14 @@ open_or_create_log_file( which is for this log group */ fil_space_create(name, - 2 * k + SRV_LOG_SPACE_FIRST_ID, 0, FIL_LOG, 0, 0); + SRV_LOG_SPACE_FIRST_ID, 0, FIL_TYPE_LOG, 0, 0); + log_init(srv_n_log_files, srv_log_file_size * UNIV_PAGE_SIZE); } ut_a(fil_validate()); ut_a(fil_node_create(name, (ulint)srv_log_file_size, - 2 * k + SRV_LOG_SPACE_FIRST_ID, FALSE)); - if (i == 0) { - log_group_init(k, srv_n_log_files, - srv_log_file_size * UNIV_PAGE_SIZE, - 2 * k + SRV_LOG_SPACE_FIRST_ID, - SRV_LOG_SPACE_FIRST_ID + 1); /* dummy arch - space id */ - } + SRV_LOG_SPACE_FIRST_ID, FALSE)); return(DB_SUCCESS); } @@ -3911,7 +3792,7 @@ xtrabackup_backup_func(void) lsn_t latest_cp; uint i; uint count; - os_ib_mutex_t count_mutex; + pthread_mutex_t count_mutex; data_thread_ctxt_t *data_threads; #ifdef USE_POSIX_FADVISE @@ -4031,13 +3912,13 @@ xtrabackup_backup_func(void) xb_fil_io_init(); - log_init(); + log_sys_init(); lock_sys_create(srv_lock_table_size); for (i = 0; i < srv_n_log_files; i++) { err = open_or_create_log_file(FALSE, &log_file_created, - log_opened, 0, i); + log_opened, i); if (err != DB_SUCCESS) { //return((int) err); @@ -4092,72 +3973,60 @@ xtrabackup_backup_func(void) fil_system_t* f_system = fil_system; /* definition from recv_recovery_from_checkpoint_start() */ - log_group_t* max_cp_group; ulint max_cp_field; - byte* buf; - byte* log_hdr_buf_; - byte* log_hdr_buf; - ulint err; /* start back ground thread to copy newer log */ os_thread_id_t log_copying_thread_id; datafiles_iter_t *it; - log_hdr_buf_ = static_cast<byte *> - (ut_malloc(LOG_FILE_HDR_SIZE + UNIV_PAGE_SIZE_MAX)); - log_hdr_buf = static_cast<byte *> - (ut_align(log_hdr_buf_, UNIV_PAGE_SIZE_MAX)); - /* get current checkpoint_lsn */ /* Look for the latest checkpoint from any of the log groups */ - mutex_enter(&log_sys->mutex); + log_mutex_enter(); - err = recv_find_max_checkpoint(&max_cp_group, &max_cp_field); + dberr_t err = recv_find_max_checkpoint(&max_cp_field); if (err != DB_SUCCESS) { + exit(EXIT_FAILURE); + } - ut_free(log_hdr_buf_); + if (log_sys->log.format == 0) { +old_format: + msg("xtrabackup: Error: cannot process redo log" + " before MariaDB 10.2.2\n"); exit(EXIT_FAILURE); } - log_group_read_checkpoint_info(max_cp_group, max_cp_field); - buf = log_sys->checkpoint_buf; + ut_ad(!((log_sys->log.format ^ LOG_HEADER_FORMAT_CURRENT) + & ~LOG_HEADER_FORMAT_ENCRYPTED)); + + const byte* buf = log_sys->checkpoint_buf; checkpoint_lsn_start = mach_read_from_8(buf + LOG_CHECKPOINT_LSN); checkpoint_no_start = mach_read_from_8(buf + LOG_CHECKPOINT_NO); - mutex_exit(&log_sys->mutex); - reread_log_header: - fil_io(OS_FILE_READ | OS_FILE_LOG, true, max_cp_group->space_id, - 0, - 0, 0, LOG_FILE_HDR_SIZE, - log_hdr_buf, max_cp_group, NULL); - - /* check consistency of log file header to copy */ - mutex_enter(&log_sys->mutex); + err = recv_find_max_checkpoint(&max_cp_field); - err = recv_find_max_checkpoint(&max_cp_group, &max_cp_field); - - if (err != DB_SUCCESS) { + if (err != DB_SUCCESS) { + exit(EXIT_FAILURE); + } - ut_free(log_hdr_buf_); - exit(EXIT_FAILURE); - } + if (log_sys->log.format == 0) { + goto old_format; + } - log_group_read_checkpoint_info(max_cp_group, max_cp_field); - buf = log_sys->checkpoint_buf; + ut_ad(!((log_sys->log.format ^ LOG_HEADER_FORMAT_CURRENT) + & ~LOG_HEADER_FORMAT_ENCRYPTED)); if(checkpoint_no_start != mach_read_from_8(buf + LOG_CHECKPOINT_NO)) { checkpoint_lsn_start = mach_read_from_8(buf + LOG_CHECKPOINT_LSN); checkpoint_no_start = mach_read_from_8(buf + LOG_CHECKPOINT_NO); - mutex_exit(&log_sys->mutex); goto reread_log_header; } - mutex_exit(&log_sys->mutex); + log_mutex_exit(); xtrabackup_init_datasinks(); @@ -4204,10 +4073,6 @@ reread_log_header: &io_watching_thread_id); } - mutex_enter(&log_sys->mutex); - xtrabackup_choose_lsn_offset(checkpoint_lsn_start); - mutex_exit(&log_sys->mutex); - /* copy log file by current position */ if(xtrabackup_copy_logfile(checkpoint_lsn_start, FALSE)) exit(EXIT_FAILURE); @@ -4220,7 +4085,7 @@ reread_log_header: err = xb_load_tablespaces(); if (err != DB_SUCCESS) { msg("xtrabackup: error: xb_load_tablespaces() failed with" - "error code %lu\n", err); + "error code %u\n", err); exit(EXIT_FAILURE); } @@ -4297,35 +4162,24 @@ reread_log_header: } /* read the latest checkpoint lsn */ - latest_cp = 0; { - log_group_t* max_cp_group; ulint max_cp_field; - ulint err; - - mutex_enter(&log_sys->mutex); - err = recv_find_max_checkpoint(&max_cp_group, &max_cp_field); + log_mutex_enter(); - if (err != DB_SUCCESS) { + if (recv_find_max_checkpoint(&max_cp_field) == DB_SUCCESS + && log_sys->log.format != 0) { + latest_cp = mach_read_from_8(log_sys->checkpoint_buf + + LOG_CHECKPOINT_LSN); + msg("xtrabackup: The latest check point" + " (for incremental): '" LSN_PF "'\n", latest_cp); + } else { + latest_cp = 0; msg("xtrabackup: Error: recv_find_max_checkpoint() failed.\n"); - mutex_exit(&log_sys->mutex); - goto skip_last_cp; } - - log_group_read_checkpoint_info(max_cp_group, max_cp_field); - - xtrabackup_choose_lsn_offset(checkpoint_lsn_start); - - latest_cp = mach_read_from_8(log_sys->checkpoint_buf + - LOG_CHECKPOINT_LSN); - - mutex_exit(&log_sys->mutex); - - msg("xtrabackup: The latest check point (for incremental): " - "'" LSN_PF "'\n", latest_cp); + log_mutex_exit(); } -skip_last_cp: + /* stop log_copying_thread */ log_copying = FALSE; os_event_set(log_copying_stop); diff --git a/extra/mariabackup/xtrabackup.h b/extra/mariabackup/xtrabackup.h index d3c4c486d9f..371466aad2c 100644 --- a/extra/mariabackup/xtrabackup.h +++ b/extra/mariabackup/xtrabackup.h @@ -182,15 +182,6 @@ datafiles_iter_t *datafiles_iter_new(fil_system_t *f_system); fil_node_t *datafiles_iter_next(datafiles_iter_t *it); void datafiles_iter_free(datafiles_iter_t *it); -/************************************************************************ -Initialize the tablespace memory cache and populate it by scanning for and -opening data files */ -ulint xb_data_files_init(void); - -/************************************************************************ -Destroy the tablespace memory cache. */ -void xb_data_files_close(void); - /*********************************************************************** Reads the space flags from a given data file and returns the compressed page size, or 0 if the space is not compressed. */ |