Skip to content

Commit

Permalink
MDEV-16045: Allocate log_sys statically
Browse files Browse the repository at this point in the history
There is only one redo log subsystem in InnoDB. Allocate the object
statically, to avoid unnecessary dereferencing of the pointer.

log_t::create(): Renamed from log_sys_init().

log_t::close(): Renamed from log_shutdown().

log_t::checkpoint_buf_ptr: Remove. Allocate log_t::checkpoint_buf
statically.
  • Loading branch information
dr-m committed Apr 29, 2018
1 parent 715e4f4 commit d73a898
Show file tree
Hide file tree
Showing 19 changed files with 472 additions and 477 deletions.
40 changes: 20 additions & 20 deletions extra/mariabackup/xtrabackup.cc
Expand Up @@ -2445,7 +2445,7 @@ lsn_t
xtrabackup_copy_log(copy_logfile copy, lsn_t start_lsn, lsn_t end_lsn)
{
lsn_t scanned_lsn = start_lsn;
const byte* log_block = log_sys->buf;
const byte* log_block = log_sys.buf;
bool more_data = false;

for (ulint scanned_checkpoint = 0;
Expand Down Expand Up @@ -2494,18 +2494,18 @@ xtrabackup_copy_log(copy_logfile copy, lsn_t start_lsn, lsn_t end_lsn)

recv_sys_justify_left_parsing_buf();

log_sys->log.scanned_lsn = scanned_lsn;
log_sys.log.scanned_lsn = scanned_lsn;

end_lsn = copy == COPY_LAST
? ut_uint64_align_up(scanned_lsn, OS_FILE_LOG_BLOCK_SIZE)
: scanned_lsn & ~lsn_t(OS_FILE_LOG_BLOCK_SIZE - 1);

if (ulint write_size = ulint(end_lsn - start_lsn)) {
if (srv_encrypt_log) {
log_crypt(log_sys->buf, start_lsn, write_size);
log_crypt(log_sys.buf, start_lsn, write_size);
}

if (ds_write(dst_log_file, log_sys->buf, write_size)) {
if (ds_write(dst_log_file, log_sys.buf, write_size)) {
msg("mariabackup: Error: "
"write to logfile failed\n");
return(0);
Expand Down Expand Up @@ -2544,7 +2544,7 @@ xtrabackup_copy_logfile(copy_logfile copy)

lsn_t lsn= start_lsn;
for(int retries= 0; retries < 100; retries++) {
if (log_group_read_log_seg(log_sys->buf, &log_sys->log,
if (log_group_read_log_seg(log_sys.buf, &log_sys.log,
&lsn, end_lsn)){
break;
}
Expand All @@ -2565,7 +2565,7 @@ xtrabackup_copy_logfile(copy_logfile copy)
}
} while (start_lsn == end_lsn);

ut_ad(start_lsn == log_sys->log.scanned_lsn);
ut_ad(start_lsn == log_sys.log.scanned_lsn);

msg_ts(">> log scanned up to (" LSN_PF ")\n", start_lsn);

Expand Down Expand Up @@ -3656,9 +3656,9 @@ xtrabackup_backup_low()
log_mutex_enter();

if (recv_find_max_checkpoint(&max_cp_field) == DB_SUCCESS
&& log_sys->log.format != 0) {
&& log_sys.log.format != 0) {
metadata_to_lsn = mach_read_from_8(
log_sys->checkpoint_buf + LOG_CHECKPOINT_LSN);
log_sys.checkpoint_buf + LOG_CHECKPOINT_LSN);
msg("mariabackup: The latest check point"
" (for incremental): '" LSN_PF "'\n",
metadata_to_lsn);
Expand Down Expand Up @@ -3818,7 +3818,7 @@ xtrabackup_backup_func()
os_aio_init(srv_n_read_io_threads, srv_n_write_io_threads,
SRV_MAX_N_PENDING_SYNC_IOS);

log_sys_init();
log_sys.create();
log_init(srv_n_log_files);
fil_space_t* space = fil_space_create(
"innodb_redo_log", SRV_LOG_SPACE_FIRST_ID, 0,
Expand Down Expand Up @@ -3894,37 +3894,37 @@ xtrabackup_backup_func()
goto fail;
}

if (log_sys->log.format == 0) {
if (log_sys.log.format == 0) {
old_format:
msg("mariabackup: Error: cannot process redo log"
" before MariaDB 10.2.2\n");
log_mutex_exit();
goto log_fail;
}

ut_ad(!((log_sys->log.format ^ LOG_HEADER_FORMAT_CURRENT)
ut_ad(!((log_sys.log.format ^ LOG_HEADER_FORMAT_CURRENT)
& ~LOG_HEADER_FORMAT_ENCRYPTED));

const byte* buf = log_sys->checkpoint_buf;
const byte* buf = log_sys.checkpoint_buf;

reread_log_header:
checkpoint_lsn_start = log_sys->log.lsn;
checkpoint_no_start = log_sys->next_checkpoint_no;
checkpoint_lsn_start = log_sys.log.lsn;
checkpoint_no_start = log_sys.next_checkpoint_no;

err = recv_find_max_checkpoint(&max_cp_field);

if (err != DB_SUCCESS) {
goto log_fail;
}

if (log_sys->log.format == 0) {
if (log_sys.log.format == 0) {
goto old_format;
}

ut_ad(!((log_sys->log.format ^ LOG_HEADER_FORMAT_CURRENT)
ut_ad(!((log_sys.log.format ^ LOG_HEADER_FORMAT_CURRENT)
& ~LOG_HEADER_FORMAT_ENCRYPTED));

log_group_header_read(&log_sys->log, max_cp_field);
log_group_header_read(&log_sys.log, max_cp_field);

if (checkpoint_no_start != mach_read_from_8(buf + LOG_CHECKPOINT_NO)) {
goto reread_log_header;
Expand All @@ -3950,7 +3950,7 @@ xtrabackup_backup_func()
/* label it */
byte MY_ALIGNED(OS_FILE_LOG_BLOCK_SIZE) log_hdr[OS_FILE_LOG_BLOCK_SIZE];
memset(log_hdr, 0, sizeof log_hdr);
mach_write_to_4(LOG_HEADER_FORMAT + log_hdr, log_sys->log.format);
mach_write_to_4(LOG_HEADER_FORMAT + log_hdr, log_sys.log.format);
mach_write_to_8(LOG_HEADER_START_LSN + log_hdr, checkpoint_lsn_start);
strcpy(reinterpret_cast<char*>(LOG_HEADER_CREATOR + log_hdr),
"Backup " MYSQL_SERVER_VERSION);
Expand Down Expand Up @@ -4936,7 +4936,7 @@ xtrabackup_prepare_func(char** argv)
ut_d(sync_check_enable());
ut_crc32_init();
recv_sys_init();
log_sys_init();
log_sys.create();
recv_recovery_on = true;

#ifdef WITH_INNODB_DISALLOW_WRITES
Expand Down Expand Up @@ -4970,7 +4970,7 @@ xtrabackup_prepare_func(char** argv)
os_event_destroy(srv_allow_writes_event);
#endif
innodb_free_param();
log_shutdown();
log_sys.close();
sync_check_close();
if (!ok) goto error_cleanup;
}
Expand Down
2 changes: 1 addition & 1 deletion mysql-test/suite/encryption/t/innodb-scrub-log.test
@@ -1,7 +1,7 @@
--source include/have_innodb.inc

#
# MDEV-11705: InnoDB: Failing assertion: (&log_sys->mutex)->is_owned() if server started with innodb-scrub-log
# MDEV-11705: InnoDB: Failing assertion: (&log_sys.mutex)->is_owned() if server started with innodb-scrub-log
#

create table t1(a int not null primary key auto_increment,
Expand Down
2 changes: 1 addition & 1 deletion storage/innobase/btr/btr0bulk.cc
Expand Up @@ -725,7 +725,7 @@ BtrBulk::pageCommit(
void
BtrBulk::logFreeCheck()
{
if (log_sys->check_flush_or_checkpoint) {
if (log_sys.check_flush_or_checkpoint) {
release();

log_free_check();
Expand Down
10 changes: 5 additions & 5 deletions storage/innobase/buf/buf0buf.cc
Expand Up @@ -1191,11 +1191,11 @@ buf_madvise_do_dump()
buf_pool_t* buf_pool;
buf_chunk_t* chunk;

/* mirrors allocation in log_sys_init() */
if (log_sys->buf) {
ret+= madvise(log_sys->first_in_use
? log_sys->buf
: log_sys->buf - srv_log_buffer_size,
/* mirrors allocation in log_t::create() */
if (log_sys.buf) {
ret+= madvise(log_sys.first_in_use
? log_sys.buf
: log_sys.buf - srv_log_buffer_size,
srv_log_buffer_size * 2,
MADV_DODUMP);
}
Expand Down
2 changes: 1 addition & 1 deletion storage/innobase/buf/buf0flu.cc
Expand Up @@ -2439,7 +2439,7 @@ page_cleaner_flush_pages_recommendation(

cur_lsn = log_get_lsn_nowait();

/* log_get_lsn_nowait tries to get log_sys->mutex with
/* log_get_lsn_nowait tries to get log_sys.mutex with
mutex_enter_nowait, if this does not succeed function
returns 0, do not use that value to update stats. */
if (cur_lsn == 0) {
Expand Down
12 changes: 6 additions & 6 deletions storage/innobase/fil/fil0fil.cc
Expand Up @@ -3122,7 +3122,7 @@ fil_rename_tablespace(
log_mutex_enter();
}

/* log_sys->mutex is above fil_system.mutex in the latching order */
/* log_sys.mutex is above fil_system.mutex in the latching order */
ut_ad(log_mutex_own());
mutex_enter(&fil_system.mutex);
ut_ad(space->name == old_space_name);
Expand Down Expand Up @@ -5120,12 +5120,12 @@ fil_names_dirty(
{
ut_ad(log_mutex_own());
ut_ad(recv_recovery_is_on());
ut_ad(log_sys->lsn != 0);
ut_ad(log_sys.lsn != 0);
ut_ad(space->max_lsn == 0);
ut_d(fil_space_validate_for_mtr_commit(space));

UT_LIST_ADD_LAST(fil_system.named_spaces, space);
space->max_lsn = log_sys->lsn;
space->max_lsn = log_sys.lsn;
}

/** Write MLOG_FILE_NAME records when a non-predefined persistent
Expand All @@ -5140,7 +5140,7 @@ fil_names_dirty_and_write(
{
ut_ad(log_mutex_own());
ut_d(fil_space_validate_for_mtr_commit(space));
ut_ad(space->max_lsn == log_sys->lsn);
ut_ad(space->max_lsn == log_sys.lsn);

UT_LIST_ADD_LAST(fil_system.named_spaces, space);
fil_names_write(space, mtr);
Expand Down Expand Up @@ -5177,8 +5177,8 @@ fil_names_clear(

ut_ad(log_mutex_own());

if (log_sys->append_on_checkpoint) {
mtr_write_log(log_sys->append_on_checkpoint);
if (log_sys.append_on_checkpoint) {
mtr_write_log(log_sys.append_on_checkpoint);
do_write = true;
}

Expand Down
10 changes: 5 additions & 5 deletions storage/innobase/handler/ha_innodb.cc
Expand Up @@ -18562,16 +18562,16 @@ checkpoint_now_set(
check function */
{
if (*(my_bool*) save) {
while (log_sys->last_checkpoint_lsn
while (log_sys.last_checkpoint_lsn
+ SIZE_OF_MLOG_CHECKPOINT
+ (log_sys->append_on_checkpoint != NULL
? log_sys->append_on_checkpoint->size() : 0)
< log_sys->lsn) {
+ (log_sys.append_on_checkpoint != NULL
? log_sys.append_on_checkpoint->size() : 0)
< log_sys.lsn) {
log_make_checkpoint_at(LSN_MAX, TRUE);
fil_flush_file_spaces(FIL_TYPE_LOG);
}

dberr_t err = fil_write_flushed_lsn(log_sys->lsn);
dberr_t err = fil_write_flushed_lsn(log_sys.lsn);

if (err != DB_SUCCESS) {
ib::warn() << "Checkpoint set failed " << err;
Expand Down
10 changes: 5 additions & 5 deletions storage/innobase/include/fil0fil.h
Expand Up @@ -82,7 +82,7 @@ struct fil_space_t {
/*!< LSN of the most recent
fil_names_write_if_was_clean().
Reset to 0 by fil_names_clear().
Protected by log_sys->mutex.
Protected by log_sys.mutex.
If and only if this is nonzero, the
tablespace will be in named_spaces. */
bool stop_ios;/*!< true if we want to rename the
Expand Down Expand Up @@ -286,7 +286,7 @@ struct fil_space_t {
struct fil_node_t {
/** tablespace containing this file */
fil_space_t* space;
/** file name; protected by fil_system.mutex and log_sys->mutex. */
/** file name; protected by fil_system.mutex and log_sys.mutex. */
char* name;
/** file handle (valid if is_open) */
pfs_os_file_t handle;
Expand Down Expand Up @@ -628,7 +628,7 @@ struct fil_system_t {
for which a MLOG_FILE_NAME
record has been written since
the latest redo log checkpoint.
Protected only by log_sys->mutex. */
Protected only by log_sys.mutex. */
UT_LIST_BASE_NODE_T(fil_space_t) rotation_list;
/*!< list of all file spaces needing
key rotation.*/
Expand Down Expand Up @@ -1326,8 +1326,8 @@ fil_names_write_if_was_clean(
}

const bool was_clean = space->max_lsn == 0;
ut_ad(space->max_lsn <= log_sys->lsn);
space->max_lsn = log_sys->lsn;
ut_ad(space->max_lsn <= log_sys.lsn);
space->max_lsn = log_sys.lsn;

if (was_clean) {
fil_names_dirty_and_write(space, mtr);
Expand Down

0 comments on commit d73a898

Please sign in to comment.