@@ -18608,6 +18608,71 @@ buffer_pool_load_abort(
18608
18608
}
18609
18609
}
18610
18610
18611
+ static void innodb_log_file_disabled_update(THD *thd, st_mysql_sys_var*,
18612
+ void *var, const void *save)
18613
+ {
18614
+ ut_ad(var == &log_sys.disabled);
18615
+ mysql_mutex_unlock(&LOCK_global_system_variables);
18616
+
18617
+ if (high_level_read_only)
18618
+ ib_senderrf(thd, IB_LOG_LEVEL_ERROR, ER_READ_ONLY_MODE);
18619
+ else if (!*static_cast<const my_bool*>(save))
18620
+ {
18621
+ if (log_sys.disable())
18622
+ in_progress:
18623
+ my_printf_error(ER_WRONG_USAGE,
18624
+ "innodb_log_file_* change is already in progress",
18625
+ MYF(0));
18626
+ }
18627
+ else
18628
+ {
18629
+ switch (log_sys.resize_start(srv_log_file_size, thd)) {
18630
+ case log_t::RESIZE_NO_CHANGE:
18631
+ break;
18632
+ case log_t::RESIZE_IN_PROGRESS:
18633
+ goto in_progress;
18634
+ case log_t::RESIZE_FAILED:
18635
+ ib_senderrf(thd, IB_LOG_LEVEL_ERROR, ER_CANT_CREATE_HANDLER_FILE);
18636
+ break;
18637
+ case log_t::RESIZE_STARTED:
18638
+ for (timespec abstime;;)
18639
+ {
18640
+ if (thd_kill_level(thd))
18641
+ {
18642
+ log_sys.resize_abort(thd);
18643
+ break;
18644
+ }
18645
+
18646
+ set_timespec(abstime, 5);
18647
+ mysql_mutex_lock(&buf_pool.flush_list_mutex);
18648
+ lsn_t resizing= log_sys.resize_in_progress();
18649
+ if (resizing > buf_pool.get_oldest_modification(0))
18650
+ {
18651
+ buf_pool.page_cleaner_wakeup(true);
18652
+ my_cond_timedwait(&buf_pool.done_flush_list,
18653
+ &buf_pool.flush_list_mutex.m_mutex, &abstime);
18654
+ resizing= log_sys.resize_in_progress();
18655
+ }
18656
+ mysql_mutex_unlock(&buf_pool.flush_list_mutex);
18657
+ if (!resizing || !log_sys.resize_running(thd))
18658
+ break;
18659
+ log_sys.latch.wr_lock(SRW_LOCK_CALL);
18660
+ while (resizing > log_sys.get_lsn())
18661
+ {
18662
+ ut_ad(!log_sys.is_mmap());
18663
+ /* The server is almost idle. Write dummy FILE_CHECKPOINT records
18664
+ to ensure that the log resizing will complete. */
18665
+ mtr_t mtr;
18666
+ mtr.start();
18667
+ mtr.commit_files(log_sys.last_checkpoint_lsn);
18668
+ }
18669
+ log_sys.latch.wr_unlock();
18670
+ }
18671
+ }
18672
+ }
18673
+ mysql_mutex_lock(&LOCK_global_system_variables);
18674
+ }
18675
+
18611
18676
#if defined __linux__ || defined _WIN32
18612
18677
static void innodb_log_file_buffering_update(THD *thd, st_mysql_sys_var*,
18613
18678
void *, const void *save)
@@ -18630,18 +18695,19 @@ static void innodb_log_file_size_update(THD *thd, st_mysql_sys_var*,
18630
18695
#ifdef HAVE_PMEM
18631
18696
!log_sys.is_mmap() &&
18632
18697
#endif
18633
- *static_cast<const ulonglong*>(save) < log_sys.buf_size )
18698
+ *static_cast<const ulonglong*>(save) < log_sys.buf_size_requested )
18634
18699
my_printf_error(ER_WRONG_ARGUMENTS,
18635
18700
"innodb_log_file_size must be at least"
18636
- " innodb_log_buffer_size=%u", MYF(0), log_sys.buf_size);
18701
+ " innodb_log_buffer_size=%u", MYF(0),
18702
+ log_sys.buf_size_requested);
18637
18703
else
18638
18704
{
18639
18705
switch (log_sys.resize_start(*static_cast<const ulonglong*>(save), thd)) {
18640
18706
case log_t::RESIZE_NO_CHANGE:
18641
18707
break;
18642
18708
case log_t::RESIZE_IN_PROGRESS:
18643
18709
my_printf_error(ER_WRONG_USAGE,
18644
- "innodb_log_file_size change is already in progress",
18710
+ "innodb_log_file_* change is already in progress",
18645
18711
MYF(0));
18646
18712
break;
18647
18713
case log_t::RESIZE_FAILED:
@@ -19517,11 +19583,16 @@ static MYSQL_SYSVAR_ULONG(page_size, srv_page_size,
19517
19583
NULL, NULL, UNIV_PAGE_SIZE_DEF,
19518
19584
UNIV_PAGE_SIZE_MIN, UNIV_PAGE_SIZE_MAX, 0);
19519
19585
19520
- static MYSQL_SYSVAR_UINT(log_buffer_size, log_sys.buf_size ,
19586
+ static MYSQL_SYSVAR_UINT(log_buffer_size, log_sys.buf_size_requested ,
19521
19587
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
19522
19588
"Redo log buffer size in bytes.",
19523
19589
NULL, NULL, 16U << 20, 2U << 20, log_sys.buf_size_max, 4096);
19524
19590
19591
+ static MYSQL_SYSVAR_BOOL(log_file_disabled, log_sys.disabled,
19592
+ PLUGIN_VAR_OPCMDARG,
19593
+ "Whether the ib_logfile0 is disabled (and InnoDB is crash-unsafe)",
19594
+ nullptr, innodb_log_file_disabled_update, FALSE);
19595
+
19525
19596
static constexpr const char *innodb_log_file_mmap_description=
19526
19597
"Whether ib_logfile0"
19527
19598
" resides in persistent memory (when supported) or"
@@ -20003,6 +20074,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= {
20003
20074
MYSQL_SYSVAR(deadlock_report),
20004
20075
MYSQL_SYSVAR(page_size),
20005
20076
MYSQL_SYSVAR(log_buffer_size),
20077
+ MYSQL_SYSVAR(log_file_disabled),
20006
20078
MYSQL_SYSVAR(log_file_mmap),
20007
20079
#if defined __linux__ || defined _WIN32
20008
20080
MYSQL_SYSVAR(log_file_buffering),
0 commit comments