Skip to content

Commit c27e53f

Browse files
committed
MDEV-23855: Use normal mutex for log_sys.mutex, log_sys.flush_order_mutex
With an unreasonably small innodb_log_file_size, the page cleaner thread would frequently acquire log_sys.flush_order_mutex and spend a significant portion of CPU time spinning on that mutex when determining the checkpoint LSN.
1 parent a5a2ef0 commit c27e53f

File tree

15 files changed

+149
-183
lines changed

15 files changed

+149
-183
lines changed

extra/mariabackup/xtrabackup.cc

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2711,7 +2711,7 @@ static bool xtrabackup_copy_logfile(bool last = false)
27112711

27122712
xtrabackup_io_throttling();
27132713

2714-
log_mutex_enter();
2714+
mysql_mutex_lock(&log_sys.mutex);
27152715
lsn_t lsn= start_lsn;
27162716
for (int retries= 0; retries < 100; retries++) {
27172717
if (log_sys.log.read_log_seg(&lsn, end_lsn)
@@ -2735,7 +2735,7 @@ static bool xtrabackup_copy_logfile(bool last = false)
27352735
mutex_exit(&recv_sys.mutex);
27362736
}
27372737

2738-
log_mutex_exit();
2738+
mysql_mutex_unlock(&log_sys.mutex);
27392739

27402740
if (!start_lsn) {
27412741
const char *reason = recv_sys.found_corrupt_log
@@ -2795,10 +2795,10 @@ static os_thread_ret_t DECLARE_THREAD(log_copying_thread)(void*)
27952795
break;
27962796
}
27972797

2798-
log_mutex_enter();
2798+
mysql_mutex_lock(&log_sys.mutex);
27992799
bool completed = metadata_to_lsn
28002800
&& metadata_to_lsn <= log_copy_scanned_lsn;
2801-
log_mutex_exit();
2801+
mysql_mutex_unlock(&log_sys.mutex);
28022802
if (completed) {
28032803
break;
28042804
}
@@ -3848,7 +3848,7 @@ static bool xtrabackup_backup_low()
38483848
{
38493849
ulint max_cp_field;
38503850

3851-
log_mutex_enter();
3851+
mysql_mutex_lock(&log_sys.mutex);
38523852

38533853
if (recv_find_max_checkpoint(&max_cp_field) == DB_SUCCESS
38543854
&& log_sys.log.format != 0) {
@@ -3865,7 +3865,7 @@ static bool xtrabackup_backup_low()
38653865
} else {
38663866
msg("Error: recv_find_max_checkpoint() failed.");
38673867
}
3868-
log_mutex_exit();
3868+
mysql_mutex_unlock(&log_sys.mutex);
38693869
}
38703870

38713871
stop_backup_threads();
@@ -4037,20 +4037,20 @@ static bool xtrabackup_backup_func()
40374037
/* get current checkpoint_lsn */
40384038
/* Look for the latest checkpoint from any of the log groups */
40394039

4040-
log_mutex_enter();
4040+
mysql_mutex_lock(&log_sys.mutex);
40414041

40424042
reread_log_header:
40434043
dberr_t err = recv_find_max_checkpoint(&max_cp_field);
40444044

40454045
if (err != DB_SUCCESS) {
40464046
msg("Error: cannot read redo log header");
4047-
log_mutex_exit();
4047+
mysql_mutex_unlock(&log_sys.mutex);
40484048
goto fail;
40494049
}
40504050

40514051
if (log_sys.log.format == 0) {
40524052
msg("Error: cannot process redo log before MariaDB 10.2.2");
4053-
log_mutex_exit();
4053+
mysql_mutex_unlock(&log_sys.mutex);
40544054
goto fail;
40554055
}
40564056

@@ -4067,7 +4067,7 @@ static bool xtrabackup_backup_func()
40674067
!= mach_read_from_8(buf + LOG_CHECKPOINT_OFFSET))
40684068
goto reread_log_header;
40694069

4070-
log_mutex_exit();
4070+
mysql_mutex_unlock(&log_sys.mutex);
40714071

40724072
xtrabackup_init_datasinks();
40734073

@@ -4603,7 +4603,7 @@ xb_delta_open_matching_space(
46034603
return OS_FILE_CLOSED;
46044604
}
46054605

4606-
log_mutex_enter();
4606+
mysql_mutex_lock(&log_sys.mutex);
46074607
if (!fil_is_user_tablespace_id(info.space_id)) {
46084608
found:
46094609
/* open the file and return its handle */
@@ -4616,7 +4616,7 @@ xb_delta_open_matching_space(
46164616
msg("mariabackup: Cannot open file %s\n", real_name);
46174617
}
46184618
exit:
4619-
log_mutex_exit();
4619+
mysql_mutex_unlock(&log_sys.mutex);
46204620
return file;
46214621
}
46224622

storage/innobase/buf/buf0flu.cc

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ static void buf_flush_validate_skip()
132132
void buf_flush_insert_into_flush_list(buf_block_t* block, lsn_t lsn)
133133
{
134134
mysql_mutex_assert_not_owner(&buf_pool.mutex);
135-
ut_ad(log_flush_order_mutex_own());
135+
mysql_mutex_assert_owner(&log_sys.flush_order_mutex);
136136
ut_ad(lsn);
137137

138138
mysql_mutex_lock(&buf_pool.flush_list_mutex);
@@ -1564,7 +1564,7 @@ ulint buf_flush_lists(ulint max_n, lsn_t lsn)
15641564
static bool log_checkpoint_low(lsn_t oldest_lsn, lsn_t end_lsn)
15651565
{
15661566
ut_ad(!srv_read_only_mode);
1567-
ut_ad(log_mutex_own());
1567+
mysql_mutex_assert_owner(&log_sys.mutex);
15681568
ut_ad(oldest_lsn <= end_lsn);
15691569
ut_ad(end_lsn == log_sys.get_lsn());
15701570
ut_ad(!recv_no_log_write);
@@ -1581,7 +1581,7 @@ static bool log_checkpoint_low(lsn_t oldest_lsn, lsn_t end_lsn)
15811581
{
15821582
/* Do nothing, because nothing was logged (other than a
15831583
FILE_CHECKPOINT record) since the previous checkpoint. */
1584-
log_mutex_exit();
1584+
mysql_mutex_unlock(&log_sys.mutex);
15851585
return true;
15861586
}
15871587

@@ -1602,12 +1602,12 @@ static bool log_checkpoint_low(lsn_t oldest_lsn, lsn_t end_lsn)
16021602
{
16031603
flush_lsn= log_sys.get_lsn();
16041604
ut_ad(flush_lsn >= end_lsn + SIZE_OF_FILE_CHECKPOINT);
1605-
log_mutex_exit();
1605+
mysql_mutex_unlock(&log_sys.mutex);
16061606
log_write_up_to(flush_lsn, true, true);
1607-
log_mutex_enter();
1607+
mysql_mutex_lock(&log_sys.mutex);
16081608
if (log_sys.last_checkpoint_lsn >= oldest_lsn)
16091609
{
1610-
log_mutex_exit();
1610+
mysql_mutex_unlock(&log_sys.mutex);
16111611
return true;
16121612
}
16131613
}
@@ -1619,13 +1619,13 @@ static bool log_checkpoint_low(lsn_t oldest_lsn, lsn_t end_lsn)
16191619
if (log_sys.n_pending_checkpoint_writes)
16201620
{
16211621
/* A checkpoint write is running */
1622-
log_mutex_exit();
1622+
mysql_mutex_unlock(&log_sys.mutex);
16231623
return false;
16241624
}
16251625

16261626
log_sys.next_checkpoint_lsn= oldest_lsn;
16271627
log_write_checkpoint_info(end_lsn);
1628-
ut_ad(!log_mutex_own());
1628+
mysql_mutex_assert_not_owner(&log_sys.mutex);
16291629

16301630
return true;
16311631
}
@@ -1649,13 +1649,13 @@ static bool log_checkpoint()
16491649
fil_flush_file_spaces();
16501650
}
16511651

1652-
log_mutex_enter();
1652+
mysql_mutex_lock(&log_sys.mutex);
16531653
const lsn_t end_lsn= log_sys.get_lsn();
1654-
log_flush_order_mutex_enter();
1654+
mysql_mutex_lock(&log_sys.flush_order_mutex);
16551655
mysql_mutex_lock(&buf_pool.flush_list_mutex);
16561656
const lsn_t oldest_lsn= buf_pool.get_oldest_modification(end_lsn);
16571657
mysql_mutex_unlock(&buf_pool.flush_list_mutex);
1658-
log_flush_order_mutex_exit();
1658+
mysql_mutex_unlock(&log_sys.flush_order_mutex);
16591659
return log_checkpoint_low(oldest_lsn, end_lsn);
16601660
}
16611661

@@ -1672,7 +1672,7 @@ ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn)
16721672
{
16731673
ut_ad(sync_lsn);
16741674
ut_ad(sync_lsn < LSN_MAX);
1675-
ut_ad(!log_mutex_own());
1675+
mysql_mutex_assert_not_owner(&log_sys.mutex);
16761676
ut_ad(!srv_read_only_mode);
16771677

16781678
if (recv_recovery_is_on())
@@ -1732,7 +1732,7 @@ ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn)
17321732
@param lsn buf_pool.get_oldest_modification(LSN_MAX) target */
17331733
void buf_flush_ahead(lsn_t lsn)
17341734
{
1735-
ut_ad(!log_mutex_own());
1735+
mysql_mutex_assert_not_owner(&log_sys.mutex);
17361736
ut_ad(!srv_read_only_mode);
17371737

17381738
if (recv_recovery_is_on())
@@ -1792,12 +1792,12 @@ ATTRIBUTE_COLD static void buf_flush_sync_for_checkpoint(lsn_t lsn)
17921792
fil_flush_file_spaces();
17931793
}
17941794

1795-
log_mutex_enter();
1795+
mysql_mutex_lock(&log_sys.mutex);
17961796
const lsn_t newest_lsn= log_sys.get_lsn();
1797-
log_flush_order_mutex_enter();
1797+
mysql_mutex_lock(&log_sys.flush_order_mutex);
17981798
mysql_mutex_lock(&buf_pool.flush_list_mutex);
17991799
lsn_t measure= buf_pool.get_oldest_modification(0);
1800-
log_flush_order_mutex_exit();
1800+
mysql_mutex_unlock(&log_sys.flush_order_mutex);
18011801
const lsn_t checkpoint_lsn= measure ? measure : newest_lsn;
18021802

18031803
if (checkpoint_lsn > log_sys.last_checkpoint_lsn + SIZE_OF_FILE_CHECKPOINT)
@@ -1809,12 +1809,12 @@ ATTRIBUTE_COLD static void buf_flush_sync_for_checkpoint(lsn_t lsn)
18091809
}
18101810
else
18111811
{
1812-
log_mutex_exit();
1812+
mysql_mutex_unlock(&log_sys.mutex);
18131813
if (!measure)
18141814
measure= LSN_MAX;
18151815
}
18161816

1817-
ut_ad(!log_mutex_own());
1817+
mysql_mutex_assert_not_owner(&log_sys.mutex);
18181818

18191819
/* After attempting log checkpoint, check if we have reached our target. */
18201820
const lsn_t target= buf_flush_sync_lsn;

storage/innobase/fil/fil0fil.cc

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -885,18 +885,18 @@ fil_space_free(
885885
}
886886

887887
if (!recv_recovery_is_on()) {
888-
log_mutex_enter();
888+
mysql_mutex_lock(&log_sys.mutex);
889889
}
890890

891-
ut_ad(log_mutex_own());
891+
mysql_mutex_assert_owner(&log_sys.mutex);
892892

893893
if (space->max_lsn != 0) {
894894
ut_d(space->max_lsn = 0);
895895
UT_LIST_REMOVE(fil_system.named_spaces, space);
896896
}
897897

898898
if (!recv_recovery_is_on()) {
899-
log_mutex_exit();
899+
mysql_mutex_unlock(&log_sys.mutex);
900900
}
901901

902902
fil_space_free_low(space);
@@ -1916,14 +1916,14 @@ dberr_t fil_delete_tablespace(ulint id, bool if_exists,
19161916
}
19171917
mutex_exit(&fil_system.mutex);
19181918

1919-
log_mutex_enter();
1919+
mysql_mutex_lock(&log_sys.mutex);
19201920

19211921
if (space->max_lsn != 0) {
19221922
ut_d(space->max_lsn = 0);
19231923
UT_LIST_REMOVE(fil_system.named_spaces, space);
19241924
}
19251925

1926-
log_mutex_exit();
1926+
mysql_mutex_unlock(&log_sys.mutex);
19271927
fil_space_free_low(space);
19281928

19291929
if (!os_file_delete(innodb_data_file_key, path)
@@ -2204,11 +2204,11 @@ fil_rename_tablespace(
22042204

22052205
if (!recv_recovery_is_on()) {
22062206
fil_name_write_rename(id, old_file_name, new_file_name);
2207-
log_mutex_enter();
2207+
mysql_mutex_lock(&log_sys.mutex);
22082208
}
22092209

22102210
/* log_sys.mutex is above fil_system.mutex in the latching order */
2211-
ut_ad(log_mutex_own());
2211+
mysql_mutex_assert_owner(&log_sys.mutex);
22122212
mutex_enter(&fil_system.mutex);
22132213
space->release();
22142214
ut_ad(space->name == old_space_name);
@@ -2230,7 +2230,7 @@ fil_rename_tablespace(
22302230
}
22312231

22322232
if (!recv_recovery_is_on()) {
2233-
log_mutex_exit();
2233+
mysql_mutex_unlock(&log_sys.mutex);
22342234
}
22352235

22362236
ut_ad(space->name == old_space_name);
@@ -3667,7 +3667,7 @@ void
36673667
fil_names_dirty(
36683668
fil_space_t* space)
36693669
{
3670-
ut_ad(log_mutex_own());
3670+
mysql_mutex_assert_owner(&log_sys.mutex);
36713671
ut_ad(recv_recovery_is_on());
36723672
ut_ad(log_sys.get_lsn() != 0);
36733673
ut_ad(space->max_lsn == 0);
@@ -3683,7 +3683,7 @@ fil_names_clear().
36833683
@param[in,out] space tablespace */
36843684
void fil_names_dirty_and_write(fil_space_t* space)
36853685
{
3686-
ut_ad(log_mutex_own());
3686+
mysql_mutex_assert_owner(&log_sys.mutex);
36873687
ut_d(fil_space_validate_for_mtr_commit(space));
36883688
ut_ad(space->max_lsn == log_sys.get_lsn());
36893689

@@ -3724,7 +3724,7 @@ fil_names_clear(
37243724
mtr_checkpoint_size = 75 * 1024;
37253725
);
37263726

3727-
ut_ad(log_mutex_own());
3727+
mysql_mutex_assert_owner(&log_sys.mutex);
37283728
ut_ad(lsn);
37293729

37303730
mtr.start();

storage/innobase/include/fil0fil.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1780,7 +1780,7 @@ for the first time since the latest fil_names_clear().
17801780
@return whether any FILE_MODIFY record was written */
17811781
inline bool fil_names_write_if_was_clean(fil_space_t* space)
17821782
{
1783-
ut_ad(log_mutex_own());
1783+
mysql_mutex_assert_owner(&log_sys.mutex);
17841784

17851785
if (space == NULL) {
17861786
return(false);

0 commit comments

Comments
 (0)