diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 6274ce1f6596b..969ffb6907db0 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -5515,7 +5515,7 @@ static bool xtrabackup_backup_func() /* get current checkpoint_lsn */ { - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); mysql_mutex_lock(&recv_sys.mutex); dberr_t err = recv_sys.find_checkpoint(); log_sys.latch.wr_unlock(); diff --git a/mysql-test/suite/perfschema/r/sxlock_func.result b/mysql-test/suite/perfschema/r/sxlock_func.result index d6bbce28ee19c..ff556c1e0115f 100644 --- a/mysql-test/suite/perfschema/r/sxlock_func.result +++ b/mysql-test/suite/perfschema/r/sxlock_func.result @@ -10,7 +10,6 @@ name wait/synch/rwlock/innodb/dict_operation_lock wait/synch/rwlock/innodb/fil_space_latch wait/synch/rwlock/innodb/lock_latch -wait/synch/rwlock/innodb/log_latch wait/synch/rwlock/innodb/trx_i_s_cache_lock wait/synch/rwlock/innodb/trx_purge_latch wait/synch/rwlock/innodb/trx_rseg_latch @@ -44,7 +43,6 @@ ORDER BY event_name; event_name wait/synch/rwlock/innodb/fil_space_latch wait/synch/rwlock/innodb/lock_latch -wait/synch/rwlock/innodb/log_latch SELECT event_name FROM performance_schema.events_waits_history_long WHERE event_name = 'wait/synch/sxlock/innodb/index_tree_rw_lock' AND operation IN ('try_shared_lock','shared_lock') LIMIT 1; diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 8b0934de874c0..e1d153b0cc9aa 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -1854,7 +1854,7 @@ inline void log_t::write_checkpoint(lsn_t checkpoint, lsn_t end_lsn) noexcept if (srv_file_flush_method != SRV_O_DSYNC) ut_a(log.flush()); - latch.wr_lock(SRW_LOCK_CALL); + latch.wr_lock(); resizing= resize_lsn.load(std::memory_order_relaxed); } @@ -2009,7 +2009,7 @@ static void log_checkpoint_low(lsn_t oldest_lsn, lsn_t end_lsn) noexcept { log_sys.latch.wr_unlock(); log_write_up_to(flush_lsn, true); - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); } ut_ad(oldest_lsn > log_sys.last_checkpoint_lsn); @@ -2042,7 +2042,7 @@ static void log_checkpoint() noexcept fil_flush_file_spaces(); } - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); const lsn_t end_lsn= log_sys.get_lsn(); mysql_mutex_lock(&buf_pool.flush_list_mutex); const lsn_t oldest_lsn= buf_pool.get_oldest_modification(end_lsn); @@ -2089,7 +2089,7 @@ ATTRIBUTE_COLD void buf_flush_wait(lsn_t lsn, bool checkpoint) noexcept mysql_mutex_unlock(&buf_pool.flush_list_mutex); os_aio_wait_until_no_pending_writes(false); - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); mysql_mutex_lock(&buf_pool.flush_list_mutex); if (checkpoint) @@ -2216,7 +2216,7 @@ static void buf_flush_sync_for_checkpoint(lsn_t lsn) noexcept fil_flush_file_spaces(); } - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); const lsn_t newest_lsn= log_sys.get_lsn(); mysql_mutex_lock(&buf_pool.flush_list_mutex); lsn_t measure= buf_pool.get_oldest_modification(0); @@ -2228,7 +2228,7 @@ static void buf_flush_sync_for_checkpoint(lsn_t lsn) noexcept { mysql_mutex_unlock(&buf_pool.flush_list_mutex); log_checkpoint_low(checkpoint_lsn, newest_lsn); - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); mysql_mutex_lock(&buf_pool.flush_list_mutex); measure= buf_pool.get_oldest_modification(0); } @@ -2791,7 +2791,7 @@ ATTRIBUTE_COLD void buf_flush_sync_batch(lsn_t lsn, bool checkpoint) noexcept { thd_wait_begin(nullptr, THD_WAIT_DISKIO); tpool::tpool_wait_begin(); - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); lsn= std::max(lsn, log_sys.get_lsn()); mysql_mutex_lock(&buf_pool.flush_list_mutex); buf_flush_wait(lsn, checkpoint); diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 6001ed2e1d76d..728cba5fd918f 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -917,7 +917,7 @@ bool fil_space_free(uint32_t id, bool x_latched) noexcept } if (!recv_recovery_is_on()) { - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); if (space->max_lsn) { ut_d(space->max_lsn = 0); @@ -1596,7 +1596,7 @@ fil_space_t *fil_space_t::drop(uint32_t id, pfs_os_file_t *detached_handle) fil_system.named_spaces. Before we set the STOPPING_WRITES flag, another concurrent operation could have marked the tablespace dirty again. This clean-up corresponds to fil_space_free(). */ - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); ut_ad((space->pending() & ~NEEDS_FSYNC) == (STOPPING | CLOSING)); if (space->max_lsn != 0) { diff --git a/storage/innobase/fsp/fsp0sysspace.cc b/storage/innobase/fsp/fsp0sysspace.cc index 84708a4268e2d..c205b3464c63a 100644 --- a/storage/innobase/fsp/fsp0sysspace.cc +++ b/storage/innobase/fsp/fsp0sysspace.cc @@ -616,7 +616,7 @@ inline dberr_t SysTablespace::read_lsn_and_check_flags() if (!log_sys.file_size && log_sys.format == log_t::FORMAT_3_23 && srv_operation == SRV_OPERATION_NORMAL && srv_force_recovery < SRV_FORCE_NO_LOG_REDO) { - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); /* Upgrade from 0-sized ib_logfile0. */ log_sys.last_checkpoint_lsn = mach_read_from_8( first_page + 26/*FIL_PAGE_FILE_FLUSH_LSN*/); diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 7716bc9365ef4..ee9d8e8ceba6a 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -243,7 +243,7 @@ static void innodb_max_purge_lag_wait_update(THD *thd, st_mysql_sys_var *, if (thd_kill_level(thd)) break; /* Adjust for purge_coordinator_state::refresh() */ - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); const lsn_t last= log_sys.last_checkpoint_lsn, max_age= log_sys.max_checkpoint_age; const lsn_t lsn= log_sys.get_lsn(); @@ -616,7 +616,6 @@ mysql_pfs_key_t trx_i_s_cache_lock_key; mysql_pfs_key_t trx_purge_latch_key; mysql_pfs_key_t trx_rseg_latch_key; mysql_pfs_key_t lock_latch_key; -mysql_pfs_key_t log_latch_key; /* all_innodb_rwlocks array contains rwlocks that are performance schema instrumented if "UNIV_PFS_RWLOCK" @@ -632,7 +631,6 @@ static PSI_rwlock_info all_innodb_rwlocks[] = { &trx_purge_latch_key, "trx_purge_latch", 0 }, { &trx_rseg_latch_key, "trx_rseg_latch", 0 }, { &lock_latch_key, "lock_latch", 0 }, - { &log_latch_key, "log_latch", 0 }, { &index_tree_rw_lock_key, "index_tree_rw_lock", PSI_RWLOCK_FLAG_SX } }; # endif /* UNIV_PFS_RWLOCK */ @@ -4736,7 +4734,7 @@ checkpoint complete when we have flushed the redo log. If we have already flushed all relevant redo log, we notify immediately.*/ static void innodb_log_flush_request(void *cookie) noexcept { - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); lsn_t flush_lsn= log_sys.get_flushed_lsn(); /* Load lsn relaxed after flush_lsn was loaded from the same cache line */ const lsn_t lsn= log_sys.get_lsn(); @@ -18467,7 +18465,7 @@ checkpoint_now_set(THD* thd, st_mysql_sys_var*, void*, const void *save) mysql_mutex_unlock(&LOCK_global_system_variables); while (!thd_kill_level(thd)) { - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); lsn_t cp= log_sys.last_checkpoint_lsn.load(std::memory_order_relaxed), lsn= log_sys.get_lsn(); log_sys.latch.wr_unlock(); @@ -18694,7 +18692,7 @@ static void innodb_log_file_size_update(THD *thd, st_mysql_sys_var*, mysql_mutex_unlock(&buf_pool.flush_list_mutex); if (!resizing || !log_sys.resize_running(thd)) break; - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); while (resizing > log_sys.get_lsn()) { ut_ad(!log_sys.is_mmap()); diff --git a/storage/innobase/include/log0log.h b/storage/innobase/include/log0log.h index 64f0eabb23fce..09b605f748dd8 100644 --- a/storage/innobase/include/log0log.h +++ b/storage/innobase/include/log0log.h @@ -195,14 +195,14 @@ struct log_t /** log file size in bytes, including the header */ lsn_t file_size; -#ifdef LOG_LATCH_DEBUG +#if defined LOG_LATCH_DEBUG && defined UNIV_DEBUG typedef srw_lock_debug log_rwlock; bool latch_have_wr() const { return latch.have_wr(); } bool latch_have_rd() const { return latch.have_rd(); } bool latch_have_any() const { return latch.have_any(); } #else - typedef srw_lock log_rwlock; + typedef srw_lock_low log_rwlock; # ifndef UNIV_DEBUG # elif defined SUX_LOCK_GENERIC bool latch_have_wr() const { return true; } diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i index c9b0bfca1e09a..46a8a9a3fdb17 100644 --- a/storage/innobase/include/univ.i +++ b/storage/innobase/include/univ.i @@ -496,7 +496,6 @@ extern mysql_pfs_key_t index_tree_rw_lock_key; extern mysql_pfs_key_t index_online_log_key; extern mysql_pfs_key_t trx_sys_rw_lock_key; extern mysql_pfs_key_t lock_latch_key; -extern mysql_pfs_key_t log_latch_key; extern mysql_pfs_key_t trx_rseg_latch_key; # endif /* UNIV_PFS_RWLOCK */ #endif /* HAVE_PSI_INTERFACE */ diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc index da6f197d2bee7..fe951c49406f3 100644 --- a/storage/innobase/log/log0log.cc +++ b/storage/innobase/log/log0log.cc @@ -92,7 +92,7 @@ void log_t::create() noexcept ut_ad(this == &log_sys); ut_ad(!is_initialised()); - latch.SRW_LOCK_INIT(log_latch_key); + latch.init(); write_lsn_offset= 0; /* LSN 0 and 1 are reserved; @see buf_page_t::oldest_modification_ */ base_lsn.store(FIRST_LSN, std::memory_order_relaxed); @@ -504,7 +504,7 @@ void log_t::close_file(bool really_close) noexcept /** @return the current log sequence number (may be stale) */ lsn_t log_get_lsn() noexcept { - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); lsn_t lsn= log_sys.get_lsn(); log_sys.latch.wr_unlock(); return lsn; @@ -523,7 +523,7 @@ static void log_resize_acquire() noexcept group_commit_lock::ACQUIRED); } - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); } /** Release the latches that protect the log. */ @@ -924,7 +924,7 @@ void log_t::persist(lsn_t lsn) noexcept ATTRIBUTE_NOINLINE static void log_write_persist(lsn_t lsn) noexcept { - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); log_sys.persist(lsn); log_sys.latch.wr_unlock(); } @@ -1167,7 +1167,7 @@ void log_write_up_to(lsn_t lsn, bool durable, if (write_lock.acquire(lsn, durable ? nullptr : callback) == group_commit_lock::ACQUIRED) { - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); pending_write_lsn= write_lock.release(log_sys.writer()); } @@ -1231,7 +1231,7 @@ void log_t::clear_mmap() noexcept #ifdef HAVE_PMEM if (!is_opened()) { - ut_d(latch.wr_lock(SRW_LOCK_CALL)); + ut_d(latch.wr_lock()); ut_ad(!resize_in_progress()); ut_ad(get_lsn() == get_flushed_lsn(std::memory_order_relaxed)); ut_d(latch.wr_unlock()); @@ -1299,7 +1299,7 @@ ATTRIBUTE_COLD void log_t::checkpoint_margin() noexcept while (check_for_checkpoint()) { - latch.wr_lock(SRW_LOCK_CALL); + latch.wr_lock(); ut_ad(!recv_no_log_write); if (!check_for_checkpoint()) @@ -1509,7 +1509,7 @@ log_print( /*======*/ FILE* file) /*!< in: file where to print */ { - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); const lsn_t lsn= log_sys.get_lsn(); mysql_mutex_lock(&buf_pool.flush_list_mutex); diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index c13f4bb754e14..3d87d274b2844 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -810,7 +810,7 @@ static struct log_sys.latch.wr_unlock(); fil_space_t *space= fil_system.sys_space; buf_block_t *free_block= buf_LRU_get_free_block(false); - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); mysql_mutex_lock(&recv_sys.mutex); for (auto d= defers.begin(); d != defers.end(); ) @@ -3898,7 +3898,7 @@ bool recv_sys_t::apply_batch(uint32_t space_id, fil_space_t *&space, unlock_relock: mysql_mutex_unlock(&mutex); relock: - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); relock_last: mysql_mutex_lock(&mutex); get_last: @@ -4178,7 +4178,7 @@ void recv_sys_t::apply(bool last_batch) recv_sys.mutex. */ free_block= buf_LRU_get_free_block(false); if (!last_batch) - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); mysql_mutex_lock(&mutex); pages_it= pages.begin(); } @@ -4235,7 +4235,7 @@ void recv_sys_t::apply(bool last_batch) { buf_flush_sync_batch(lsn, false); buf_pool_invalidate(); - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); } else if (srv_operation == SRV_OPERATION_RESTORE || srv_operation == SRV_OPERATION_RESTORE_EXPORT) @@ -4835,7 +4835,7 @@ dberr_t recv_recovery_from_checkpoint_start() recv_sys.recovery_on = true; - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); log_sys.set_capacity(); /* Start reading the log from the checkpoint lsn. */ diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc index 26cdcc935bb89..786056587f5b5 100644 --- a/storage/innobase/mtr/mtr0mtr.cc +++ b/storage/innobase/mtr/mtr0mtr.cc @@ -253,7 +253,7 @@ static void insert_imported(buf_block_t *block) { if (block->page.oldest_modification() <= 1) { - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); /* For unlogged mtrs (MTR_LOG_NO_REDO), we use the current system LSN. The mtr that generated the LSN is either already committed or in mtr_t::commit. Shared latch and relaxed atomics should be fine here as it is guaranteed @@ -559,7 +559,7 @@ void mtr_t::commit_shrink(fil_space_t &space, uint32_t size) log_write_and_flush_prepare(); m_latch_ex= true; - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); const lsn_t start_lsn= do_write().first; ut_d(m_log.erase()); @@ -670,7 +670,7 @@ bool mtr_t::commit_file(fil_space_t &space, const char *name) const size_t size{crypt ? 8 + encrypt() : crc32c()}; log_write_and_flush_prepare(); - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); finish_write(size); if (!name && space.max_lsn) @@ -877,7 +877,7 @@ ATTRIBUTE_COLD void log_t::append_prepare_wait(bool late, bool ex) noexcept if (!late) { /* Wait for all threads to back off. */ - latch.wr_lock(SRW_LOCK_CALL); + latch.wr_lock(); goto got_ex; } @@ -929,13 +929,13 @@ ATTRIBUTE_COLD void log_t::append_prepare_wait(bool late, bool ex) noexcept log_write_up_to(lsn, false); if (ex) { - latch.wr_lock(SRW_LOCK_CALL); + latch.wr_lock(); return; } } done: - latch.rd_lock(SRW_LOCK_CALL); + latch.rd_lock(); } /** Reserve space in the log buffer for appending data. @@ -1089,7 +1089,7 @@ std::pair mtr_t::do_write() noexcept const size_t len{log_sys.is_encrypted() ? 8 + encrypt() : crc32c()}; if (!m_latch_ex) - log_sys.latch.rd_lock(SRW_LOCK_CALL); + log_sys.latch.rd_lock(); if (UNIV_UNLIKELY(m_user_space && !m_user_space->max_lsn && !srv_is_undo_tablespace((m_user_space->id)))) @@ -1098,7 +1098,7 @@ std::pair mtr_t::do_write() noexcept { m_latch_ex= true; log_sys.latch.rd_unlock(); - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); if (UNIV_UNLIKELY(m_user_space->max_lsn != 0)) goto func_exit; } diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index 60217441fde8a..71d4d5ad250de 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -75,7 +75,7 @@ static void row_mysql_delay_if_needed() noexcept if (UNIV_UNLIKELY(delay != 0)) { /* Adjust for purge_coordinator_state::refresh() */ - log_sys.latch.rd_lock(SRW_LOCK_CALL); + log_sys.latch.rd_lock(); const lsn_t last= log_sys.last_checkpoint_lsn, max_age= log_sys.max_checkpoint_age; const lsn_t lsn= log_sys.get_flushed_lsn(); diff --git a/storage/innobase/srv/srv0mon.cc b/storage/innobase/srv/srv0mon.cc index 7f185a87776e0..8ea3f4a044e8c 100644 --- a/storage/innobase/srv/srv0mon.cc +++ b/storage/innobase/srv/srv0mon.cc @@ -1608,7 +1608,7 @@ srv_mon_process_existing_counter( break; case MONITOR_LSN_CHECKPOINT_AGE: - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); value = static_cast(log_sys.get_lsn() - log_sys.last_checkpoint_lsn); log_sys.latch.wr_unlock(); diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index f02f872312c2f..6e5c7e2f9dfe2 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -987,7 +987,7 @@ srv_export_innodb_status(void) mysql_mutex_unlock(&srv_innodb_monitor_mutex); - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); export_vars.innodb_lsn_current = log_sys.get_lsn(); export_vars.innodb_lsn_flushed = log_sys.get_flushed_lsn(); export_vars.innodb_lsn_last_checkpoint = log_sys.last_checkpoint_lsn; diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index 479ce5eb421e6..308ea8a3d057d 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -1061,7 +1061,7 @@ static ATTRIBUTE_COLD lsn_t srv_prepare_to_delete_redo_log_file() noexcept DBUG_EXECUTE_IF("innodb_log_abort_1", DBUG_RETURN(0);); DBUG_PRINT("ib_log", ("After innodb_log_abort_1")); - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); const bool latest_format{log_sys.is_latest()}; lsn_t flushed_lsn{log_sys.get_flushed_lsn(std::memory_order_relaxed)}; @@ -1106,7 +1106,7 @@ static tpool::task rollback_all_recovered_task(trx_rollback_all_recovered, inline lsn_t log_t::init_lsn() noexcept { - latch.wr_lock(SRW_LOCK_CALL); + latch.wr_lock(); ut_ad(!write_lsn_offset); write_lsn_offset= 0; const lsn_t lsn{base_lsn.load(std::memory_order_relaxed)}; @@ -1296,7 +1296,7 @@ dberr_t srv_start(bool create_new_db) sql_print_information("InnoDB: innodb_force_recovery=6" " skips redo log apply"); } else { - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); err = recv_sys.find_checkpoint(); log_sys.latch.wr_unlock(); if (err != DB_SUCCESS) { @@ -1334,7 +1334,7 @@ dberr_t srv_start(bool create_new_db) if (create_new_db) { lsn_t flushed_lsn = log_sys.init_lsn(); - log_sys.latch.wr_lock(SRW_LOCK_CALL); + log_sys.latch.wr_lock(); mysql_mutex_lock(&buf_pool.flush_list_mutex); err = create_log_file(true, flushed_lsn);