summaryrefslogtreecommitdiff
path: root/storage/innobase/buf/buf0flu.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/buf/buf0flu.cc')
-rw-r--r--storage/innobase/buf/buf0flu.cc392
1 files changed, 186 insertions, 206 deletions
diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc
index d377ddf3fbf..d53e5cda650 100644
--- a/storage/innobase/buf/buf0flu.cc
+++ b/storage/innobase/buf/buf0flu.cc
@@ -195,7 +195,7 @@ void buf_pool_t::insert_into_flush_list(buf_block_t *block, lsn_t lsn)
block->page.set_oldest_modification(lsn);
MEM_CHECK_DEFINED(block->page.zip.data
- ? block->page.zip.data : block->frame,
+ ? block->page.zip.data : block->page.frame,
block->physical_size());
UT_LIST_ADD_FIRST(flush_list, &block->page);
ut_d(buf_flush_validate_skip());
@@ -236,15 +236,15 @@ void buf_flush_remove_pages(uint32_t id)
for (buf_page_t *bpage= UT_LIST_GET_LAST(buf_pool.flush_list); bpage; )
{
- ut_d(const auto s= bpage->state());
- ut_ad(s == BUF_BLOCK_ZIP_PAGE || s == BUF_BLOCK_FILE_PAGE ||
- s == BUF_BLOCK_REMOVE_HASH);
+ const auto s= bpage->state();
+ ut_ad(s >= buf_page_t::REMOVE_HASH);
+ ut_ad(s < buf_page_t::READ_FIX || s >= buf_page_t::WRITE_FIX);
buf_page_t *prev= UT_LIST_GET_PREV(list, bpage);
const page_id_t bpage_id(bpage->id());
if (bpage_id < first || bpage_id >= end);
- else if (bpage->io_fix() != BUF_IO_NONE)
+ else if (s >= buf_page_t::WRITE_FIX)
deferred= true;
else
buf_pool.delete_from_flush_list(bpage);
@@ -322,42 +322,59 @@ buf_flush_relocate_on_flush_list(
ut_d(buf_flush_validate_low());
}
+/** Note that a block is no longer dirty, while not removing
+it from buf_pool.flush_list */
+inline void buf_page_t::write_complete(bool temporary)
+{
+ ut_ad(temporary == fsp_is_system_temporary(id().space()));
+ if (temporary)
+ {
+ ut_ad(oldest_modification() == 2);
+ oldest_modification_= 0;
+ }
+ else
+ {
+ /* We use release memory order to guarantee that callers of
+ oldest_modification_acquire() will observe the block as
+ being detached from buf_pool.flush_list, after reading the value 0. */
+ ut_ad(oldest_modification() > 2);
+ oldest_modification_.store(1, std::memory_order_release);
+ }
+ const auto s= state();
+ ut_ad(s >= WRITE_FIX);
+ zip.fix.fetch_sub((s >= WRITE_FIX_REINIT)
+ ? (WRITE_FIX_REINIT - UNFIXED)
+ : (WRITE_FIX - UNFIXED));
+ lock.u_unlock(true);
+}
+
/** Complete write of a file page from buf_pool.
@param request write request */
void buf_page_write_complete(const IORequest &request)
{
ut_ad(request.is_write());
- ut_ad(!srv_read_only_mode/* ||
- request.node->space->purpose == FIL_TYPE_TEMPORARY*/);
+ ut_ad(!srv_read_only_mode);
buf_page_t *bpage= request.bpage;
ut_ad(bpage);
- ut_ad(bpage->in_file());
- /* bpage->io_fix() can only be changed by buf_page_write_complete()
- and buf_page_read_complete() from BUF_IO_READ or BUF_IO_WRITE */
- ut_ad(bpage->io_fix() == BUF_IO_WRITE);
+ const auto state= bpage->state();
+ /* io-fix can only be cleared by buf_page_t::write_complete()
+ and buf_page_t::read_complete() */
+ ut_ad(state >= buf_page_t::WRITE_FIX);
ut_ad(!buf_dblwr.is_inside(bpage->id()));
ut_ad(request.node->space->id == bpage->id().space());
- if (bpage->status == buf_page_t::INIT_ON_FLUSH)
- bpage->status= buf_page_t::NORMAL;
- else
+ if (state < buf_page_t::WRITE_FIX_REINIT &&
+ request.node->space->use_doublewrite())
{
- ut_ad(bpage->status == buf_page_t::NORMAL);
- if (request.node->space->use_doublewrite())
- {
- ut_ad(request.node->space != fil_system.temp_space);
- buf_dblwr.write_completed();
- }
+ ut_ad(request.node->space != fil_system.temp_space);
+ buf_dblwr.write_completed();
}
- if (bpage->slot)
- {
- bpage->slot->release();
- bpage->slot= nullptr;
- }
+ if (request.slot)
+ request.slot->release();
if (UNIV_UNLIKELY(MONITOR_IS_ON(MONITOR_MODULE_BUF_PAGE)))
- buf_page_monitor(bpage, BUF_IO_WRITE);
+ buf_page_monitor(*bpage, false);
DBUG_PRINT("ib_buf", ("write page %u:%u",
bpage->id().space(), bpage->id().page_no()));
const bool temp= fsp_is_system_temporary(bpage->id().space());
@@ -365,16 +382,7 @@ void buf_page_write_complete(const IORequest &request)
mysql_mutex_lock(&buf_pool.mutex);
mysql_mutex_assert_not_owner(&buf_pool.flush_list_mutex);
buf_pool.stat.n_pages_written++;
- /* While we do not need any mutex for clearing oldest_modification
- here, we hope that it will be in the same cache line with io_fix,
- whose changes must be protected by buf_pool.mutex. */
- ut_ad(temp || bpage->oldest_modification() > 2);
- bpage->clear_oldest_modification(temp);
- ut_ad(bpage->io_fix() == BUF_IO_WRITE);
- bpage->set_io_fix(BUF_IO_NONE);
-
- if (bpage->state() == BUF_BLOCK_FILE_PAGE)
- reinterpret_cast<buf_block_t*>(bpage)->lock.u_unlock(true);
+ bpage->write_complete(temp);
if (request.is_LRU())
{
@@ -437,16 +445,14 @@ buf_flush_init_for_writing(
void* page_zip_,
bool use_full_checksum)
{
- if (block != NULL && block->frame != page) {
+ if (block && block->page.frame != page) {
/* If page is encrypted in full crc32 format then
checksum stored already as a part of fil_encrypt_buf() */
ut_ad(use_full_checksum);
return;
}
- ut_ad(block == NULL || block->frame == page);
- ut_ad(block == NULL || page_zip_ == NULL
- || &block->page.zip == page_zip_);
+ ut_ad(!block || block->page.frame == page);
ut_ad(page);
if (page_zip_) {
@@ -454,6 +460,7 @@ buf_flush_init_for_writing(
ulint size;
page_zip = static_cast<page_zip_des_t*>(page_zip_);
+ ut_ad(!block || &block->page.zip == page_zip);
size = page_zip_get_size(page_zip);
ut_ad(size);
@@ -618,10 +625,11 @@ a page is written to disk.
@return page frame to be written to file
(may be src_frame or an encrypted/compressed copy of it) */
static byte *buf_page_encrypt(fil_space_t* space, buf_page_t* bpage, byte* s,
- size_t *size)
+ buf_tmp_buffer_t **slot, size_t *size)
{
- ut_ad(bpage->status != buf_page_t::FREED);
+ ut_ad(!bpage->is_freed());
ut_ad(space->id == bpage->id().space());
+ ut_ad(!*slot);
ut_d(fil_page_type_validate(space, s));
const uint32_t page_no= bpage->id().page_no();
@@ -677,31 +685,25 @@ static byte *buf_page_encrypt(fil_space_t* space, buf_page_t* bpage, byte* s,
ut_ad(!bpage->zip_size() || !page_compressed);
/* Find free slot from temporary memory array */
- buf_tmp_buffer_t *slot= buf_pool.io_buf_reserve();
- ut_a(slot);
- slot->allocate();
- slot->out_buf= NULL;
- bpage->slot= slot;
+ *slot= buf_pool.io_buf_reserve();
+ ut_a(*slot);
+ (*slot)->allocate();
- byte *d= slot->crypt_buf;
+ byte *d= (*slot)->crypt_buf;
if (!page_compressed)
{
not_compressed:
- byte *tmp= space->purpose == FIL_TYPE_TEMPORARY
+ d= space->purpose == FIL_TYPE_TEMPORARY
? buf_tmp_page_encrypt(page_no, s, d)
: fil_space_encrypt(space, page_no, s, d);
-
- slot->out_buf= d= tmp;
-
- ut_d(fil_page_type_validate(space, tmp));
}
else
{
ut_ad(space->purpose != FIL_TYPE_TEMPORARY);
/* First we compress the page content */
- buf_tmp_reserve_compression_buf(slot);
- byte *tmp= slot->comp_buf;
+ buf_tmp_reserve_compression_buf(*slot);
+ byte *tmp= (*slot)->comp_buf;
ulint len= fil_page_compress(s, tmp, space->flags,
fil_space_get_block_size(space, page_no),
encrypted);
@@ -729,7 +731,7 @@ not_compressed:
ut_d(fil_page_type_validate(space, tmp));
if (encrypted)
- tmp = fil_space_encrypt(space, page_no, tmp, d);
+ tmp= fil_space_encrypt(space, page_no, tmp, d);
if (full_crc32)
{
@@ -738,26 +740,23 @@ not_compressed:
ut_ad(!buf_page_is_corrupted(true, tmp, space->flags));
}
- slot->out_buf= d= tmp;
+ d= tmp;
}
ut_d(fil_page_type_validate(space, d));
+ (*slot)->out_buf= d;
return d;
}
/** Free a page whose underlying file page has been freed. */
inline void buf_pool_t::release_freed_page(buf_page_t *bpage)
{
- ut_ad(bpage->in_file());
- const bool uncompressed= bpage->state() == BUF_BLOCK_FILE_PAGE;
- mysql_mutex_lock(&mutex);
- bpage->set_io_fix(BUF_IO_NONE);
- bpage->status= buf_page_t::NORMAL;
+ mysql_mutex_assert_owner(&mutex);
mysql_mutex_lock(&flush_list_mutex);
ut_d(const lsn_t oldest_modification= bpage->oldest_modification();)
if (fsp_is_system_temporary(bpage->id().space()))
{
- ut_ad(uncompressed);
+ ut_ad(bpage->frame);
ut_ad(oldest_modification == 2);
}
else
@@ -767,166 +766,152 @@ inline void buf_pool_t::release_freed_page(buf_page_t *bpage)
}
bpage->clear_oldest_modification();
mysql_mutex_unlock(&flush_list_mutex);
-
- if (uncompressed)
- reinterpret_cast<buf_block_t*>(bpage)->lock.u_unlock(true);
+ bpage->lock.u_unlock(true);
buf_LRU_free_page(bpage, true);
- mysql_mutex_unlock(&mutex);
}
-/** Write a flushable page from buf_pool to a file.
-buf_pool.mutex must be held.
-@param bpage buffer control block
+/** Write a flushable page to a file. buf_pool.mutex must be held.
@param lru true=buf_pool.LRU; false=buf_pool.flush_list
@param space tablespace
@return whether the page was flushed and buf_pool.mutex was released */
-static bool buf_flush_page(buf_page_t *bpage, bool lru, fil_space_t *space)
+inline bool buf_page_t::flush(bool lru, fil_space_t *space)
{
- ut_ad(bpage->in_file());
- ut_ad(bpage->ready_for_flush());
+ ut_ad(in_file());
+ ut_ad(in_LRU_list);
ut_ad((space->purpose == FIL_TYPE_TEMPORARY) ==
(space == fil_system.temp_space));
ut_ad(space->referenced());
ut_ad(lru || space != fil_system.temp_space);
- block_lock *rw_lock;
+ if (!lock.u_lock_try(true))
+ return false;
- if (bpage->state() != BUF_BLOCK_FILE_PAGE)
- rw_lock= nullptr;
- else
+ const auto s= state();
+ ut_a(s >= FREED);
+
+ if (s < UNFIXED)
{
- rw_lock= &reinterpret_cast<buf_block_t*>(bpage)->lock;
- if (!rw_lock->u_lock_try(true))
- return false;
+ buf_pool.release_freed_page(this);
+ mysql_mutex_unlock(&buf_pool.mutex);
+ return true;
}
- bpage->set_io_fix(BUF_IO_WRITE);
- /* Because bpage->status can only be changed while buf_block_t
- exists, it cannot be modified for ROW_FORMAT=COMPRESSED pages
- without first allocating the uncompressed page frame. Such
- allocation cannot be completed due to our io_fix. So, bpage->status
- is protected even if !rw_lock. */
- const auto status= bpage->status;
-
- if (status != buf_page_t::FREED)
+ if (s >= READ_FIX || oldest_modification() < 2)
{
- if (lru)
- buf_pool.n_flush_LRU_++;
- else
- buf_pool.n_flush_list_++;
- buf_flush_page_count++;
+ lock.u_unlock(true);
+ return false;
}
mysql_mutex_assert_not_owner(&buf_pool.flush_list_mutex);
- /* We are holding rw_lock = buf_block_t::lock in SX mode except if
- this is a ROW_FORMAT=COMPRESSED page whose uncompressed page frame
- has been evicted from the buffer pool.
-
- Apart from possible rw_lock protection, bpage is also protected by
- io_fix and oldest_modification()!=0. Thus, it cannot be relocated in
- the buffer pool or removed from flush_list or LRU_list. */
+ /* Apart from the U-lock, this block will also be protected by
+ is_write_fixed() and oldest_modification()>1.
+ Thus, it cannot be relocated or removed. */
DBUG_PRINT("ib_buf", ("%s %u page %u:%u",
lru ? "LRU" : "flush_list",
- bpage->id().space(), bpage->id().page_no()));
- ut_ad(bpage->io_fix() == BUF_IO_WRITE);
- ut_d(const lsn_t oldest_modification= bpage->oldest_modification());
+ id().space(), id().page_no()));
+ ut_d(const auto f=) zip.fix.fetch_add(WRITE_FIX - UNFIXED);
+ ut_ad(f >= UNFIXED);
+ ut_ad(f < READ_FIX);
ut_ad(space == fil_system.temp_space
- ? oldest_modification == 2
- : oldest_modification > 2);
- ut_ad(bpage->state() ==
- (rw_lock ? BUF_BLOCK_FILE_PAGE : BUF_BLOCK_ZIP_PAGE));
- ut_ad(ULINT_UNDEFINED >
- (lru ? buf_pool.n_flush_LRU_ : buf_pool.n_flush_list_));
+ ? oldest_modification() == 2
+ : oldest_modification() > 2);
+ if (lru)
+ {
+ ut_ad(buf_pool.n_flush_LRU_ < ULINT_UNDEFINED);
+ buf_pool.n_flush_LRU_++;
+ }
+ else
+ {
+ ut_ad(buf_pool.n_flush_list_ < ULINT_UNDEFINED);
+ buf_pool.n_flush_list_++;
+ }
+ buf_flush_page_count++;
+
mysql_mutex_unlock(&buf_pool.mutex);
- buf_block_t *block= reinterpret_cast<buf_block_t*>(bpage);
- page_t *frame= bpage->zip.data;
+ buf_block_t *block= reinterpret_cast<buf_block_t*>(this);
+ page_t *write_frame= zip.data;
- if (status == buf_page_t::FREED)
- buf_pool.release_freed_page(&block->page);
+ space->reacquire();
+ size_t size;
+#if defined HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE || defined _WIN32
+ size_t orig_size;
+#endif
+ IORequest::Type type= lru ? IORequest::WRITE_LRU : IORequest::WRITE_ASYNC;
+ buf_tmp_buffer_t *slot= nullptr;
+
+ if (UNIV_UNLIKELY(!frame)) /* ROW_FORMAT=COMPRESSED */
+ {
+ ut_ad(!space->full_crc32());
+ ut_ad(!space->is_compressed()); /* not page_compressed */
+ size= zip_size();
+#if defined HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE || defined _WIN32
+ orig_size= size;
+#endif
+ buf_flush_update_zip_checksum(write_frame, size);
+ write_frame= buf_page_encrypt(space, this, write_frame, &slot, &size);
+ ut_ad(size == zip_size());
+ }
else
{
- space->reacquire();
- ut_ad(status == buf_page_t::NORMAL || status == buf_page_t::INIT_ON_FLUSH);
- size_t size;
+ byte *page= frame;
+ size= block->physical_size();
#if defined HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE || defined _WIN32
- size_t orig_size;
+ orig_size= size;
#endif
- IORequest::Type type= lru ? IORequest::WRITE_LRU : IORequest::WRITE_ASYNC;
- if (UNIV_UNLIKELY(!rw_lock)) /* ROW_FORMAT=COMPRESSED */
+ if (space->full_crc32())
{
- ut_ad(!space->full_crc32());
- ut_ad(!space->is_compressed()); /* not page_compressed */
- size= bpage->zip_size();
-#if defined HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE || defined _WIN32
- orig_size= size;
-#endif
- buf_flush_update_zip_checksum(frame, size);
- frame= buf_page_encrypt(space, bpage, frame, &size);
- ut_ad(size == bpage->zip_size());
+ /* innodb_checksum_algorithm=full_crc32 is not implemented for
+ ROW_FORMAT=COMPRESSED pages. */
+ ut_ad(!write_frame);
+ page= buf_page_encrypt(space, this, page, &slot, &size);
+ buf_flush_init_for_writing(block, page, nullptr, true);
}
else
{
- byte *page= block->frame;
- size= block->physical_size();
-#if defined HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE || defined _WIN32
- orig_size= size;
-#endif
-
- if (space->full_crc32())
- {
- /* innodb_checksum_algorithm=full_crc32 is not implemented for
- ROW_FORMAT=COMPRESSED pages. */
- ut_ad(!frame);
- page= buf_page_encrypt(space, bpage, page, &size);
- buf_flush_init_for_writing(block, page, nullptr, true);
- }
- else
- {
- buf_flush_init_for_writing(block, page, frame ? &bpage->zip : nullptr,
- false);
- page= buf_page_encrypt(space, bpage, frame ? frame : page, &size);
- }
+ buf_flush_init_for_writing(block, page, write_frame ? &zip : nullptr,
+ false);
+ page= buf_page_encrypt(space, this, write_frame ? write_frame : page,
+ &slot, &size);
+ }
#if defined HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE || defined _WIN32
- if (size != orig_size)
- {
- switch (space->chain.start->punch_hole) {
- case 1:
- type= lru ? IORequest::PUNCH_LRU : IORequest::PUNCH;
- break;
- case 2:
- size= orig_size;
- }
+ if (size != orig_size)
+ {
+ switch (space->chain.start->punch_hole) {
+ case 1:
+ type= lru ? IORequest::PUNCH_LRU : IORequest::PUNCH;
+ break;
+ case 2:
+ size= orig_size;
}
-#endif
- frame=page;
}
+#endif
+ write_frame= page;
+ }
- ut_ad(status == bpage->status);
- ut_ad(oldest_modification == bpage->oldest_modification());
-
- if (status != buf_page_t::NORMAL || !space->use_doublewrite())
+ if ((s & LRU_MASK) == REINIT || !space->use_doublewrite())
+ {
+ if (UNIV_LIKELY(space->purpose == FIL_TYPE_TABLESPACE))
{
- if (UNIV_LIKELY(space->purpose == FIL_TYPE_TABLESPACE))
- {
- const lsn_t lsn= mach_read_from_8(my_assume_aligned<8>
- (FIL_PAGE_LSN + (frame ? frame
- : block->frame)));
- ut_ad(lsn >= oldest_modification);
- if (lsn > log_sys.get_flushed_lsn())
- log_write_up_to(lsn, true);
- }
- space->io(IORequest(type, bpage),
- bpage->physical_offset(), size, frame, bpage);
+ const lsn_t lsn=
+ mach_read_from_8(my_assume_aligned<8>(FIL_PAGE_LSN +
+ (write_frame ? write_frame
+ : frame)));
+ ut_ad(lsn >= oldest_modification());
+ if (lsn > log_sys.get_flushed_lsn())
+ log_write_up_to(lsn, true);
}
- else
- buf_dblwr.add_to_batch(IORequest(bpage, space->chain.start, type), size);
+ space->io(IORequest{type, this, slot}, physical_offset(), size,
+ write_frame, this);
}
+ else
+ buf_dblwr.add_to_batch(IORequest{this, slot, space->chain.start, type},
+ size);
/* Increment the I/O operation count used for selecting LRU policy. */
buf_LRU_stat_inc_io();
@@ -968,7 +953,9 @@ static page_id_t buf_flush_check_neighbors(const fil_space_t &space,
page_id_t &id, bool contiguous,
bool lru)
{
- ut_ad(id.page_no() < space.size);
+ ut_ad(id.page_no() < space.size +
+ (space.physical_size() == 2048 ? 1
+ : space.physical_size() == 1024 ? 3 : 0));
/* When flushed, dirty blocks are searched in neighborhoods of this
size, and flushed along with the original page. */
const ulint s= buf_pool.curr_size / 16;
@@ -1116,8 +1103,8 @@ static ulint buf_flush_try_neighbors(fil_space_t *space,
if (!lru || id == page_id || bpage->is_old())
{
if (!buf_pool.watch_is_sentinel(*bpage) &&
- bpage->oldest_modification() > 1 &&
- bpage->ready_for_flush() && buf_flush_page(bpage, lru, space))
+ bpage->oldest_modification() > 1 && bpage->ready_for_flush() &&
+ bpage->flush(lru, space))
{
++count;
continue;
@@ -1216,24 +1203,17 @@ static void buf_flush_discard_page(buf_page_t *bpage)
ut_ad(bpage->in_file());
ut_ad(bpage->oldest_modification());
- block_lock *rw_lock;
-
- if (bpage->state() != BUF_BLOCK_FILE_PAGE)
- rw_lock= nullptr;
- else
- {
- rw_lock= &reinterpret_cast<buf_block_t*>(bpage)->lock;
- if (!rw_lock->u_lock_try(false))
- return;
- }
+ if (!bpage->lock.u_lock_try(false))
+ return;
- bpage->status= buf_page_t::NORMAL;
mysql_mutex_lock(&buf_pool.flush_list_mutex);
buf_pool.delete_from_flush_list(bpage);
mysql_mutex_unlock(&buf_pool.flush_list_mutex);
- if (rw_lock)
- rw_lock->u_unlock();
+ ut_d(const auto state= bpage->state());
+ ut_ad(state == buf_page_t::FREED || state == buf_page_t::UNFIXED ||
+ state == buf_page_t::IBUF_EXIST || state == buf_page_t::REINIT);
+ bpage->lock.u_unlock();
buf_LRU_free_page(bpage, true);
}
@@ -1265,15 +1245,19 @@ static void buf_flush_LRU_list_batch(ulint max, flush_counters_t *n)
buf_page_t *prev= UT_LIST_GET_PREV(LRU, bpage);
const lsn_t oldest_modification= bpage->oldest_modification();
buf_pool.lru_hp.set(prev);
+ const auto state= bpage->state();
+ ut_ad(state >= buf_page_t::FREED);
+ ut_ad(bpage->in_LRU_list);
- if (oldest_modification <= 1 && bpage->can_relocate())
+ if (oldest_modification <= 1)
{
- /* block is ready for eviction i.e., it is clean and is not
- IO-fixed or buffer fixed. */
+ if (state != buf_page_t::FREED &&
+ (state >= buf_page_t::READ_FIX || (~buf_page_t::LRU_MASK & state)))
+ goto must_skip;
if (buf_LRU_free_page(bpage, true))
++n->evicted;
}
- else if (oldest_modification > 1 && bpage->ready_for_flush())
+ else if (state < buf_page_t::READ_FIX)
{
/* Block is ready for flush. Dispatch an IO request. The IO
helper thread will put it on free list in IO completion routine. */
@@ -1307,13 +1291,14 @@ static void buf_flush_LRU_list_batch(ulint max, flush_counters_t *n)
reacquire_mutex:
mysql_mutex_lock(&buf_pool.mutex);
}
- else if (buf_flush_page(bpage, true, space))
+ else if (bpage->flush(true, space))
{
++n->flushed;
goto reacquire_mutex;
}
}
else
+ must_skip:
/* Can't evict or dispatch this block. Go to previous. */
ut_ad(buf_pool.lru_hp.is_hp(prev));
bpage= buf_pool.lru_hp.get();
@@ -1398,7 +1383,6 @@ static ulint buf_do_flush_list_batch(ulint max_n, lsn_t lsn)
}
ut_ad(oldest_modification > 2);
- ut_ad(bpage->in_file());
if (!bpage->ready_for_flush())
goto skip;
@@ -1445,7 +1429,7 @@ static ulint buf_do_flush_list_batch(ulint max_n, lsn_t lsn)
reacquire_mutex:
mysql_mutex_lock(&buf_pool.mutex);
}
- else if (buf_flush_page(bpage, false, space))
+ else if (bpage->flush(false, space))
{
++count;
goto reacquire_mutex;
@@ -1556,9 +1540,6 @@ bool buf_flush_list_space(fil_space_t *space, ulint *n_flushed)
for (buf_page_t *bpage= UT_LIST_GET_LAST(buf_pool.flush_list); bpage; )
{
- ut_d(const auto s= bpage->state());
- ut_ad(s == BUF_BLOCK_ZIP_PAGE || s == BUF_BLOCK_FILE_PAGE ||
- s == BUF_BLOCK_REMOVE_HASH);
ut_ad(bpage->oldest_modification());
ut_ad(bpage->in_file());
@@ -1594,7 +1575,7 @@ bool buf_flush_list_space(fil_space_t *space, ulint *n_flushed)
acquired= false;
goto was_freed;
}
- if (!buf_flush_page(bpage, false, space))
+ if (!bpage->flush(false, space))
{
may_have_skipped= true;
mysql_mutex_lock(&buf_pool.flush_list_mutex);
@@ -2482,8 +2463,7 @@ static void buf_flush_validate_low()
in the flush list waiting to acquire the
buf_pool.flush_list_mutex to complete the relocation. */
ut_d(const auto s= bpage->state());
- ut_ad(s == BUF_BLOCK_ZIP_PAGE || s == BUF_BLOCK_FILE_PAGE
- || s == BUF_BLOCK_REMOVE_HASH);
+ ut_ad(s >= buf_page_t::REMOVE_HASH);
ut_ad(om == 1 || om > 2);
bpage = UT_LIST_GET_NEXT(list, bpage);