@@ -123,7 +123,12 @@ buf_read_page_low(
123123use to stop dangling page reads from a tablespace
124124which we have DISCARDed + IMPORTed back */
125125ulint offset,/* !< in: page number */
126- trx_t * trx)
126+ trx_t * trx,
127+ bool should_buffer)/* !< in: whether to buffer an aio request.
128+ AIO read ahead uses this. If you plan to
129+ use this parameter, make sure you remember
130+ to call os_aio_dispatch_read_array_submit()
131+ when you're ready to commit all your requests.*/
127132{
128133buf_page_t * bpage;
129134ulint wake_later;
@@ -229,14 +234,15 @@ buf_read_page_low(
229234*err = _fil_io (OS_FILE_READ | wake_later
230235 | ignore_nonexistent_pages,
231236 sync, space, zip_size, offset, 0 , zip_size,
232- bpage->zip .data , bpage, trx);
237+ bpage->zip .data , bpage, trx, should_buffer );
233238} else {
234239ut_a (buf_page_get_state (bpage) == BUF_BLOCK_FILE_PAGE);
235240
236241*err = _fil_io (OS_FILE_READ | wake_later
237242 | ignore_nonexistent_pages,
238243 sync, space, 0 , offset, 0 , UNIV_PAGE_SIZE,
239- ((buf_block_t *) bpage)->frame , bpage, trx);
244+ ((buf_block_t *) bpage)->frame , bpage, trx,
245+ should_buffer);
240246}
241247
242248if (sync) {
@@ -395,7 +401,7 @@ buf_read_ahead_random(
395401&err, false ,
396402ibuf_mode | OS_AIO_SIMULATED_WAKE_LATER,
397403space, zip_size, FALSE ,
398- tablespace_version, i, trx);
404+ tablespace_version, i, trx, false );
399405if (err == DB_TABLESPACE_DELETED) {
400406ut_print_timestamp (stderr);
401407fprintf (stderr,
@@ -459,7 +465,7 @@ buf_read_page(
459465
460466count = buf_read_page_low (&err, true , BUF_READ_ANY_PAGE, space,
461467 zip_size, FALSE ,
462- tablespace_version, offset, trx);
468+ tablespace_version, offset, trx, false );
463469srv_stats.buf_pool_reads .add (count);
464470if (err == DB_TABLESPACE_DELETED) {
465471ut_print_timestamp (stderr);
@@ -507,7 +513,7 @@ buf_read_page_async(
507513 | OS_AIO_SIMULATED_WAKE_LATER
508514 | BUF_READ_IGNORE_NONEXISTENT_PAGES,
509515 space, zip_size, FALSE ,
510- tablespace_version, offset, NULL );
516+ tablespace_version, offset, NULL , false );
511517srv_stats.buf_pool_reads .add (count);
512518
513519/* We do not increment number of I/O operations used for LRU policy
@@ -775,7 +781,8 @@ buf_read_ahead_linear(
775781count += buf_read_page_low (
776782&err, false ,
777783ibuf_mode,
778- space, zip_size, FALSE , tablespace_version, i, trx);
784+ space, zip_size, FALSE , tablespace_version,
785+ i, trx, true );
779786if (err == DB_TABLESPACE_DELETED) {
780787ut_print_timestamp (stderr);
781788fprintf (stderr,
@@ -788,6 +795,7 @@ buf_read_ahead_linear(
788795}
789796}
790797}
798+ os_aio_dispatch_read_array_submit ();
791799
792800/* In simulated aio we wake the aio handler threads only after
793801queuing all aio requests, in native aio the following call does
@@ -865,7 +873,7 @@ buf_read_ibuf_merge_pages(
865873buf_read_page_low (&err, sync && (i + 1 == n_stored),
866874 BUF_READ_ANY_PAGE, space_ids[i],
867875 zip_size, TRUE , space_versions[i],
868- page_nos[i], NULL );
876+ page_nos[i], NULL , false );
869877
870878if (UNIV_UNLIKELY (err == DB_TABLESPACE_DELETED)) {
871879tablespace_deleted:
@@ -1001,12 +1009,13 @@ buf_read_recv_pages(
10011009if ((i + 1 == n_stored) && sync) {
10021010buf_read_page_low (&err, true , BUF_READ_ANY_PAGE, space,
10031011 zip_size, TRUE , tablespace_version,
1004- page_nos[i], NULL );
1012+ page_nos[i], NULL , false );
10051013} else {
10061014buf_read_page_low (&err, false , BUF_READ_ANY_PAGE
10071015 | OS_AIO_SIMULATED_WAKE_LATER,
10081016 space, zip_size, TRUE ,
1009- tablespace_version, page_nos[i], NULL );
1017+ tablespace_version, page_nos[i],
1018+ NULL , false );
10101019}
10111020}
10121021
0 commit comments