Skip to content
Permalink
Browse files

MDEV-12975 InnoDB redo log minimum size check uses detected file size…

… instead of requested innodb_log_file_size

log_calc_max_ages(): Use the requested size in the check, instead of
the detected redo log size. The redo log will be resized at startup
if it differs from what has been requested.
  • Loading branch information...
dr-m committed Jun 19, 2017
1 parent 3a37afe commit 5e4f4ec8211b61e71ec29069161d0f41f4c05376
Showing with 71 additions and 127 deletions.
  1. +7 −1 mysql-test/suite/innodb/t/log_file_size.test
  2. +32 −63 storage/innobase/log/log0log.cc
  3. +32 −63 storage/xtradb/log/log0log.cc
@@ -1,6 +1,6 @@
# Test resizing the InnoDB redo log.

--source include/have_innodb.inc
--source include/innodb_page_size.inc

# Embedded server does not support crashing
--source include/not_embedded.inc
@@ -37,6 +37,12 @@ call mtr.add_suppression("Attempting backtrace");
FLUSH TABLES;
--enable_query_log

--let $restart_parameters= --innodb-thread-concurrency=1 --innodb-log-file-size=1m --innodb-log-files-in-group=2
--source include/restart_mysqld.inc

--let $restart_parameters= --innodb-thread-concurrency=100 --innodb-log-file-size=10M --innodb-log-files-in-group=2
--source include/restart_mysqld.inc

CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
BEGIN;
INSERT INTO t1 VALUES (42);
@@ -734,43 +734,16 @@ ibool
log_calc_max_ages(void)
/*===================*/
{
log_group_t* group;
lsn_t margin;
ulint free;
ibool success = TRUE;
lsn_t smallest_capacity;
lsn_t archive_margin;
lsn_t smallest_archive_margin;

mutex_enter(&(log_sys->mutex));

group = UT_LIST_GET_FIRST(log_sys->log_groups);

ut_ad(group);

smallest_capacity = LSN_MAX;
smallest_archive_margin = LSN_MAX;

while (group) {
if (log_group_get_capacity(group) < smallest_capacity) {

smallest_capacity = log_group_get_capacity(group);
}

archive_margin = log_group_get_capacity(group)
- (group->file_size - LOG_FILE_HDR_SIZE)
- LOG_ARCHIVE_EXTRA_MARGIN;

if (archive_margin < smallest_archive_margin) {

smallest_archive_margin = archive_margin;
}

group = UT_LIST_GET_NEXT(log_groups, group);
}
lsn_t smallest_capacity = ((srv_log_file_size_requested
<< srv_page_size_shift)
- LOG_FILE_HDR_SIZE)
* srv_n_log_files;

/* Add extra safety */
smallest_capacity = smallest_capacity - smallest_capacity / 10;
smallest_capacity -= smallest_capacity / 10;

/* For each OS thread we must reserve so much free space in the
smallest log group that it can accommodate the log entries produced
@@ -780,36 +753,6 @@ log_calc_max_ages(void)
free = LOG_CHECKPOINT_FREE_PER_THREAD * (10 + srv_thread_concurrency)
+ LOG_CHECKPOINT_EXTRA_FREE;
if (free >= smallest_capacity / 2) {
success = FALSE;

goto failure;
} else {
margin = smallest_capacity - free;
}

margin = margin - margin / 10; /* Add still some extra safety */

log_sys->log_group_capacity = smallest_capacity;

log_sys->max_modified_age_async = margin
- margin / LOG_POOL_PREFLUSH_RATIO_ASYNC;
log_sys->max_modified_age_sync = margin
- margin / LOG_POOL_PREFLUSH_RATIO_SYNC;

log_sys->max_checkpoint_age_async = margin - margin
/ LOG_POOL_CHECKPOINT_RATIO_ASYNC;
log_sys->max_checkpoint_age = margin;

#ifdef UNIV_LOG_ARCHIVE
log_sys->max_archived_lsn_age = smallest_archive_margin;

log_sys->max_archived_lsn_age_async = smallest_archive_margin
- smallest_archive_margin / LOG_ARCHIVE_RATIO_ASYNC;
#endif /* UNIV_LOG_ARCHIVE */
failure:
mutex_exit(&(log_sys->mutex));

if (!success) {
fprintf(stderr,
"InnoDB: Error: ib_logfiles are too small"
" for innodb_thread_concurrency %lu.\n"
@@ -829,8 +772,34 @@ log_calc_max_ages(void)

exit(1);
}
margin = smallest_capacity - free;
margin = margin - margin / 10; /* Add still some extra safety */

return(success);
mutex_enter(&log_sys->mutex);

log_sys->log_group_capacity = smallest_capacity;

log_sys->max_modified_age_async = margin
- margin / LOG_POOL_PREFLUSH_RATIO_ASYNC;
log_sys->max_modified_age_sync = margin
- margin / LOG_POOL_PREFLUSH_RATIO_SYNC;

log_sys->max_checkpoint_age_async = margin - margin
/ LOG_POOL_CHECKPOINT_RATIO_ASYNC;
log_sys->max_checkpoint_age = margin;

#ifdef UNIV_LOG_ARCHIVE
lsn_t archive_margin = smallest_capacity
- (srv_log_file_size_requested - LOG_FILE_HDR_SIZE)
- LOG_ARCHIVE_EXTRA_MARGIN;
log_sys->max_archived_lsn_age = archive_margin;

log_sys->max_archived_lsn_age_async = archive_margin
- archive_margin / LOG_ARCHIVE_RATIO_ASYNC;
#endif /* UNIV_LOG_ARCHIVE */
mutex_exit(&log_sys->mutex);

return(true);
}

/******************************************************//**
@@ -839,43 +839,16 @@ ibool
log_calc_max_ages(void)
/*===================*/
{
log_group_t* group;
lsn_t margin;
ulint free;
ibool success = TRUE;
lsn_t smallest_capacity;
lsn_t archive_margin;
lsn_t smallest_archive_margin;

mutex_enter(&(log_sys->mutex));

group = UT_LIST_GET_FIRST(log_sys->log_groups);

ut_ad(group);

smallest_capacity = LSN_MAX;
smallest_archive_margin = LSN_MAX;

while (group) {
if (log_group_get_capacity(group) < smallest_capacity) {

smallest_capacity = log_group_get_capacity(group);
}

archive_margin = log_group_get_capacity(group)
- (group->file_size - LOG_FILE_HDR_SIZE)
- LOG_ARCHIVE_EXTRA_MARGIN;

if (archive_margin < smallest_archive_margin) {

smallest_archive_margin = archive_margin;
}

group = UT_LIST_GET_NEXT(log_groups, group);
}
lsn_t smallest_capacity = ((srv_log_file_size_requested
<< srv_page_size_shift)
- LOG_FILE_HDR_SIZE)
* srv_n_log_files;

/* Add extra safety */
smallest_capacity = smallest_capacity - smallest_capacity / 10;
smallest_capacity -= smallest_capacity / 10;

/* For each OS thread we must reserve so much free space in the
smallest log group that it can accommodate the log entries produced
@@ -885,36 +858,6 @@ log_calc_max_ages(void)
free = LOG_CHECKPOINT_FREE_PER_THREAD * (10 + srv_thread_concurrency)
+ LOG_CHECKPOINT_EXTRA_FREE;
if (free >= smallest_capacity / 2) {
success = FALSE;

goto failure;
} else {
margin = smallest_capacity - free;
}

margin = margin - margin / 10; /* Add still some extra safety */

log_sys->log_group_capacity = smallest_capacity;

log_sys->max_modified_age_async = margin
- margin / LOG_POOL_PREFLUSH_RATIO_ASYNC;
log_sys->max_modified_age_sync = margin
- margin / LOG_POOL_PREFLUSH_RATIO_SYNC;

log_sys->max_checkpoint_age_async = margin - margin
/ LOG_POOL_CHECKPOINT_RATIO_ASYNC;
log_sys->max_checkpoint_age = margin;

#ifdef UNIV_LOG_ARCHIVE
log_sys->max_archived_lsn_age = smallest_archive_margin;

log_sys->max_archived_lsn_age_async = smallest_archive_margin
- smallest_archive_margin / LOG_ARCHIVE_RATIO_ASYNC;
#endif /* UNIV_LOG_ARCHIVE */
failure:
mutex_exit(&(log_sys->mutex));

if (!success) {
fprintf(stderr,
"InnoDB: Error: ib_logfiles are too small"
" for innodb_thread_concurrency %lu.\n"
@@ -934,8 +877,34 @@ log_calc_max_ages(void)

exit(1);
}
margin = smallest_capacity - free;
margin = margin - margin / 10; /* Add still some extra safety */

mutex_enter(&log_sys->mutex);

log_sys->log_group_capacity = smallest_capacity;

log_sys->max_modified_age_async = margin
- margin / LOG_POOL_PREFLUSH_RATIO_ASYNC;
log_sys->max_modified_age_sync = margin
- margin / LOG_POOL_PREFLUSH_RATIO_SYNC;

log_sys->max_checkpoint_age_async = margin - margin
/ LOG_POOL_CHECKPOINT_RATIO_ASYNC;
log_sys->max_checkpoint_age = margin;

#ifdef UNIV_LOG_ARCHIVE
lsn_t archive_margin = smallest_capacity
- (srv_log_file_size_requested - LOG_FILE_HDR_SIZE)
- LOG_ARCHIVE_EXTRA_MARGIN;
log_sys->max_archived_lsn_age = archive_margin;

log_sys->max_archived_lsn_age_async = archive_margin
- archive_margin / LOG_ARCHIVE_RATIO_ASYNC;
#endif /* UNIV_LOG_ARCHIVE */
mutex_exit(&log_sys->mutex);

return(success);
return(true);
}

/******************************************************//**

0 comments on commit 5e4f4ec

Please sign in to comment.
You can’t perform that action at this time.