From 84dd2437c507ed194da03fe04fea14e261e47bc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Thu, 8 May 2025 11:18:16 +0300 Subject: [PATCH] MDEV-36760 log_t::append_prepare_wait(): Bogus assertion on write_lsn log_t::append_prepare_wait(): Do not attempt to read log_sys.write_lsn because it is not protected by log_sys.latch but by write_lock, which we cannot hold here. The assertion could fail if log_t::write_buf() is executing concurrently, and it has not yet executed log_write_buf() or updated log_sys.write_lsn. Fixes up commit acd071f599f416ddb4821dec485c4d912844213f (MDEV-21923) --- storage/innobase/mtr/mtr0mtr.cc | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc index 716dac624d5a8..3c984da3d5d44 100644 --- a/storage/innobase/mtr/mtr0mtr.cc +++ b/storage/innobase/mtr/mtr0mtr.cc @@ -916,17 +916,16 @@ ATTRIBUTE_COLD void log_t::append_prepare_wait(bool late, bool ex) noexcept { got_ex: const uint64_t l= write_lsn_offset.load(std::memory_order_relaxed); - const lsn_t lsn{base_lsn.load(std::memory_order_relaxed)}; - ut_d(lsn_t ll= lsn + (l & (WRITE_BACKOFF - 1))); - ut_ad(is_mmap() - ? ll - get_flushed_lsn(std::memory_order_relaxed) < capacity() - : ll - write_lsn - ((write_size - 1) & (write_lsn - first_lsn)) < - buf_size); + const lsn_t lsn= base_lsn.load(std::memory_order_relaxed) + + (l & (WRITE_BACKOFF - 1)); waits++; #ifdef HAVE_PMEM const bool is_pmem{is_mmap()}; if (is_pmem) - persist(lsn + (l & (WRITE_BACKOFF - 1))); + { + ut_ad(lsn - get_flushed_lsn(std::memory_order_relaxed) < capacity()); + persist(lsn); + } #endif latch.wr_unlock(); /* write_buf() or persist() will clear the WRITE_BACKOFF flag, @@ -934,7 +933,7 @@ ATTRIBUTE_COLD void log_t::append_prepare_wait(bool late, bool ex) noexcept #ifdef HAVE_PMEM if (!is_pmem) #endif - log_write_up_to(lsn + (l & (WRITE_BACKOFF - 1)), false); + log_write_up_to(lsn, false); if (ex) { latch.wr_lock(SRW_LOCK_CALL);