diff --git a/storage/innobase/buf/buf0flu.c b/storage/innobase/buf/buf0flu.c index 3737627301f..4131d863e6a 100644 --- a/storage/innobase/buf/buf0flu.c +++ b/storage/innobase/buf/buf0flu.c @@ -1248,8 +1248,12 @@ buf_flush_try_neighbors( /*====================*/ ulint space, /*!< in: space id */ ulint offset, /*!< in: page offset */ - enum buf_flush flush_type) /*!< in: BUF_FLUSH_LRU or + enum buf_flush flush_type, /*!< in: BUF_FLUSH_LRU or BUF_FLUSH_LIST */ + ulint n_flushed, /*!< in: number of pages + flushed so far in this batch */ + ulint n_to_flush) /*!< in: maximum number of pages + we are allowed to flush */ { ulint i; ulint low; @@ -1290,6 +1294,21 @@ buf_flush_try_neighbors( buf_page_t* bpage; + if ((count + n_flushed) >= n_to_flush) { + + /* We have already flushed enough pages and + should call it a day. There is, however, one + exception. If the page whose neighbors we + are flushing has not been flushed yet then + we'll try to flush the victim that we + selected originally. */ + if (i <= offset) { + i = offset; + } else { + break; + } + } + buf_pool = buf_pool_get(space, i); buf_pool_mutex_enter(buf_pool); @@ -1357,6 +1376,8 @@ buf_flush_page_and_try_neighbors( buf_page_in_file(bpage) */ enum buf_flush flush_type, /*!< in: BUF_FLUSH_LRU or BUF_FLUSH_LIST */ + ulint n_to_flush, /*!< in: number of pages to + flush */ ulint* count) /*!< in/out: number of pages flushed */ { @@ -1390,7 +1411,11 @@ buf_flush_page_and_try_neighbors( mutex_exit(block_mutex); /* Try to flush also all the neighbors */ - *count += buf_flush_try_neighbors(space, offset, flush_type); + *count += buf_flush_try_neighbors(space, + offset, + flush_type, + *count, + n_to_flush); buf_pool_mutex_enter(buf_pool); flushed = TRUE; @@ -1430,7 +1455,7 @@ buf_flush_LRU_list_batch( a page that isn't ready for flushing. */ while (bpage != NULL && !buf_flush_page_and_try_neighbors( - bpage, BUF_FLUSH_LRU, &count)) { + bpage, BUF_FLUSH_LRU, max, &count)) { bpage = UT_LIST_GET_PREV(LRU, bpage); } @@ -1511,7 +1536,7 @@ buf_flush_flush_list_batch( while (bpage != NULL && len > 0 && !buf_flush_page_and_try_neighbors( - bpage, BUF_FLUSH_LIST, &count)) { + bpage, BUF_FLUSH_LIST, min_n, &count)) { buf_flush_list_mutex_enter(buf_pool);