summaryrefslogtreecommitdiff
path: root/storage/innobase/log/log0log.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/log/log0log.cc')
-rw-r--r--storage/innobase/log/log0log.cc138
1 files changed, 42 insertions, 96 deletions
diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc
index 7d4e0459610..d8e4ba6fe98 100644
--- a/storage/innobase/log/log0log.cc
+++ b/storage/innobase/log/log0log.cc
@@ -44,6 +44,7 @@ Created 12/9/1995 Heikki Tuuri
#include "fil0fil.h"
#include "dict0boot.h"
#include "dict0stats_bg.h"
+#include "btr0defragment.h"
#include "srv0srv.h"
#include "srv0start.h"
#include "trx0sys.h"
@@ -666,18 +667,14 @@ log_group_set_fields(
group->lsn = lsn;
}
-/*****************************************************************//**
-Calculates the recommended highest values for lsn - last_checkpoint_lsn
+/** Calculate the recommended highest values for lsn - last_checkpoint_lsn
and lsn - buf_get_oldest_modification().
@retval true on success
@retval false if the smallest log group is too small to
accommodate the number of OS threads in the database server */
-static MY_ATTRIBUTE((warn_unused_result))
bool
-log_calc_max_ages(void)
-/*===================*/
+log_set_capacity()
{
- log_group_t* group;
lsn_t margin;
ulint free;
bool success = true;
@@ -685,21 +682,7 @@ log_calc_max_ages(void)
log_mutex_enter();
- group = UT_LIST_GET_FIRST(log_sys->log_groups);
-
- ut_ad(group);
-
- smallest_capacity = LSN_MAX;
-
- while (group) {
- if (log_group_get_capacity(group) < smallest_capacity) {
-
- smallest_capacity = log_group_get_capacity(group);
- }
-
- group = UT_LIST_GET_NEXT(log_groups, group);
- }
-
+ smallest_capacity = log_group_get_capacity(&log_sys->log);
/* Add extra safety */
smallest_capacity = smallest_capacity - smallest_capacity / 10;
@@ -746,11 +729,9 @@ failure:
return(success);
}
-/******************************************************//**
-Initializes the log. */
+/** Initializes the redo logging subsystem. */
void
-log_init(void)
-/*==========*/
+log_sys_init()
{
log_sys = static_cast<log_t*>(ut_zalloc_nokey(sizeof(log_t)));
@@ -779,7 +760,6 @@ log_init(void)
log_sys->max_buf_free = log_sys->buf_size / LOG_BUF_FLUSH_RATIO
- LOG_BUF_FLUSH_MARGIN;
log_sys->check_flush_or_checkpoint = true;
- UT_LIST_INIT(log_sys->log_groups, &log_group_t::log_groups);
log_sys->n_log_ios_old = log_sys->n_log_ios;
log_sys->last_printout_time = time(NULL);
@@ -823,32 +803,20 @@ log_init(void)
}
}
-/******************************************************************//**
-Inits a log group to the log system.
-@return true if success, false if not */
-MY_ATTRIBUTE((warn_unused_result))
-bool
-log_group_init(
-/*===========*/
- ulint id, /*!< in: group id */
- ulint n_files, /*!< in: number of log files */
- lsn_t file_size, /*!< in: log file size in bytes */
- ulint space_id) /*!< in: space id of the file space
- which contains the log files of this
- group */
+/** Initialize the redo log.
+@param[in] n_files number of files
+@param[in] file_size file size in bytes */
+void
+log_init(ulint n_files, lsn_t file_size)
{
ulint i;
- log_group_t* group;
+ log_group_t* group = &log_sys->log;
- group = static_cast<log_group_t*>(ut_malloc_nokey(sizeof(log_group_t)));
-
- group->id = id;
group->n_files = n_files;
group->format = srv_encrypt_log
? LOG_HEADER_FORMAT_CURRENT | LOG_HEADER_FORMAT_ENCRYPTED
: LOG_HEADER_FORMAT_CURRENT;
group->file_size = file_size;
- group->space_id = space_id;
group->state = LOG_GROUP_OK;
group->lsn = LOG_START_LSN;
group->lsn_offset = LOG_FILE_HDR_SIZE;
@@ -874,9 +842,6 @@ log_group_init(
group->checkpoint_buf = static_cast<byte*>(
ut_align(group->checkpoint_buf_ptr,OS_FILE_LOG_BLOCK_SIZE));
-
- UT_LIST_ADD_LAST(log_sys->log_groups, group);
- return(log_calc_max_ages());
}
/******************************************************//**
@@ -899,12 +864,11 @@ log_io_complete(
case SRV_O_DIRECT:
case SRV_O_DIRECT_NO_FSYNC:
case SRV_ALL_O_DIRECT_FSYNC:
- fil_flush(group->space_id);
+ fil_flush(SRV_LOG_SPACE_FIRST_ID);
}
- DBUG_PRINT("ib_log", ("checkpoint info written to group %u",
- unsigned(group->id)));
+ DBUG_PRINT("ib_log", ("checkpoint info written"));
log_io_complete_checkpoint();
return;
@@ -931,7 +895,6 @@ log_group_file_header_flush(
ut_ad(log_write_mutex_own());
ut_ad(!recv_no_log_write);
- ut_ad(group->id == 0);
ut_a(nth_file < group->n_files);
ut_ad((group->format & ~LOG_HEADER_FORMAT_ENCRYPTED)
== LOG_HEADER_FORMAT_CURRENT);
@@ -950,9 +913,8 @@ log_group_file_header_flush(
dest_offset = nth_file * group->file_size;
DBUG_PRINT("ib_log", ("write " LSN_PF
- " group " ULINTPF
" file " ULINTPF " header",
- start_lsn, group->id, nth_file));
+ start_lsn, nth_file));
log_sys->n_log_ios++;
@@ -964,7 +926,7 @@ log_group_file_header_flush(
= (ulint) (dest_offset / univ_page_size.physical());
fil_io(IORequestLogWrite, true,
- page_id_t(group->space_id, page_no),
+ page_id_t(SRV_LOG_SPACE_FIRST_ID, page_no),
univ_page_size,
(ulint) (dest_offset % univ_page_size.physical()),
OS_FILE_LOG_BLOCK_SIZE, buf, group);
@@ -1050,10 +1012,10 @@ loop:
DBUG_PRINT("ib_log",
("write " LSN_PF " to " LSN_PF
- ": group " ULINTPF " len " ULINTPF
+ ": len " ULINTPF
" blocks " ULINTPF ".." ULINTPF,
start_lsn, next_offset,
- group->id, write_len,
+ write_len,
log_block_get_hdr_no(buf),
log_block_get_hdr_no(
buf + write_len
@@ -1091,7 +1053,7 @@ loop:
= (ulint) (next_offset / univ_page_size.physical());
fil_io(IORequestLogWrite, true,
- page_id_t(group->space_id, page_no),
+ page_id_t(SRV_LOG_SPACE_FIRST_ID, page_no),
univ_page_size,
(ulint) (next_offset % UNIV_PAGE_SIZE), write_len, buf,
group);
@@ -1259,7 +1221,6 @@ loop:
return;
}
- log_group_t* group;
ulint start_offset;
ulint end_offset;
ulint area_start;
@@ -1303,9 +1264,7 @@ loop:
log_buffer_switch();
- group = UT_LIST_GET_FIRST(log_sys->log_groups);
-
- log_group_set_fields(group, log_sys->write_lsn);
+ log_group_set_fields(&log_sys->log, log_sys->write_lsn);
log_mutex_exit();
/* Calculate pad_size if needed. */
@@ -1316,7 +1275,7 @@ loop:
end_offset = log_group_calc_lsn_offset(
ut_uint64_align_up(write_lsn,
OS_FILE_LOG_BLOCK_SIZE),
- group);
+ &log_sys->log);
end_offset_in_unit = (ulint) (end_offset % write_ahead_size);
if (end_offset_in_unit > 0
@@ -1335,7 +1294,7 @@ loop:
}
/* Do the write to the log files */
log_group_write_buf(
- group, write_buf + area_start,
+ &log_sys->log, write_buf + area_start,
area_end - area_start + pad_size,
#ifdef UNIV_DEBUG
pad_size,
@@ -1538,11 +1497,10 @@ log_io_complete_checkpoint(void)
}
/** Write checkpoint info to the log header.
-@param[in,out] group redo log
@param[in] end_lsn start LSN of the MLOG_CHECKPOINT mini-transaction */
static
void
-log_group_checkpoint(log_group_t* group, lsn_t end_lsn)
+log_group_checkpoint(lsn_t end_lsn)
{
lsn_t lsn_offset;
byte* buf;
@@ -1555,10 +1513,11 @@ log_group_checkpoint(log_group_t* group, lsn_t end_lsn)
|| srv_shutdown_state != SRV_SHUTDOWN_NONE);
DBUG_PRINT("ib_log", ("checkpoint " UINT64PF " at " LSN_PF
- " written to group " ULINTPF,
+ " written",
log_sys->next_checkpoint_no,
- log_sys->next_checkpoint_lsn,
- group->id));
+ log_sys->next_checkpoint_lsn));
+
+ log_group_t* group = &log_sys->log;
buf = group->checkpoint_buf;
memset(buf, 0, OS_FILE_LOG_BLOCK_SIZE);
@@ -1600,7 +1559,7 @@ log_group_checkpoint(log_group_t* group, lsn_t end_lsn)
file write and a checkpoint field write */
fil_io(IORequestLogWrite, false,
- page_id_t(group->space_id, 0),
+ page_id_t(SRV_LOG_SPACE_FIRST_ID, 0),
univ_page_size,
(log_sys->next_checkpoint_no & 1)
? LOG_CHECKPOINT_2 : LOG_CHECKPOINT_1,
@@ -1625,7 +1584,8 @@ log_group_header_read(
MONITOR_INC(MONITOR_LOG_IO);
fil_io(IORequestLogRead, true,
- page_id_t(group->space_id, header / univ_page_size.physical()),
+ page_id_t(SRV_LOG_SPACE_FIRST_ID,
+ header / univ_page_size.physical()),
univ_page_size, header % univ_page_size.physical(),
OS_FILE_LOG_BLOCK_SIZE, log_sys->checkpoint_buf, NULL);
}
@@ -1639,12 +1599,7 @@ log_write_checkpoint_info(bool sync, lsn_t end_lsn)
ut_ad(log_mutex_own());
ut_ad(!srv_read_only_mode);
- for (log_group_t* group = UT_LIST_GET_FIRST(log_sys->log_groups);
- group;
- group = UT_LIST_GET_NEXT(log_groups, group)) {
-
- log_group_checkpoint(group, end_lsn);
- }
+ log_group_checkpoint(end_lsn);
log_mutex_exit();
@@ -2010,6 +1965,8 @@ loop:
thread_name = "lock_wait_timeout_thread";
} else if (srv_buf_dump_thread_active) {
thread_name = "buf_dump_thread";
+ } else if (btr_defragment_thread_active) {
+ thread_name = "btr_defragment_thread";
} else if (srv_fast_shutdown != 2 && trx_rollback_or_clean_is_active) {
thread_name = "rollback of recovered transactions";
} else {
@@ -2031,8 +1988,8 @@ wait_suspend_loop:
switch (srv_get_active_thread_type()) {
case SRV_NONE:
- srv_shutdown_state = SRV_SHUTDOWN_FLUSH_PHASE;
if (!srv_n_fil_crypt_threads_started) {
+ srv_shutdown_state = SRV_SHUTDOWN_FLUSH_PHASE;
break;
}
os_event_set(fil_crypt_threads_event);
@@ -2280,13 +2237,11 @@ log_refresh_stats(void)
log_sys->last_printout_time = time(NULL);
}
-/********************************************************//**
-Closes a log group. */
+/** Close a log group.
+@param[in,out] group log group to close */
static
void
-log_group_close(
-/*===========*/
- log_group_t* group) /* in,own: log group to close */
+log_group_close(log_group_t* group)
{
ulint i;
@@ -2297,7 +2252,10 @@ log_group_close(
ut_free(group->file_header_bufs_ptr);
ut_free(group->file_header_bufs);
ut_free(group->checkpoint_buf_ptr);
- ut_free(group);
+ group->n_files = 0;
+ group->file_header_bufs_ptr = NULL;
+ group->file_header_bufs = NULL;
+ group->checkpoint_buf_ptr = NULL;
}
/********************************************************//**
@@ -2306,19 +2264,7 @@ void
log_group_close_all(void)
/*=====================*/
{
- log_group_t* group;
-
- group = UT_LIST_GET_FIRST(log_sys->log_groups);
-
- while (UT_LIST_GET_LEN(log_sys->log_groups) > 0) {
- log_group_t* prev_group = group;
-
- group = UT_LIST_GET_NEXT(log_groups, group);
-
- UT_LIST_REMOVE(log_sys->log_groups, prev_group);
-
- log_group_close(prev_group);
- }
+ log_group_close(&log_sys->log);
}
/********************************************************//**