@@ -341,8 +341,17 @@ ulint buf_read_ahead_random(const page_id_t page_id, ulint zip_size)
341
341
342
342
/* Read all the suitable blocks within the area */
343
343
buf_block_t *block= nullptr ;
344
- if (!zip_size && !(block= buf_read_acquire ()))
345
- goto no_read_ahead;
344
+ if (UNIV_LIKELY (!zip_size))
345
+ {
346
+ allocate_block:
347
+ if (UNIV_UNLIKELY (!(block= buf_read_acquire ())))
348
+ goto no_read_ahead;
349
+ }
350
+ else if (recv_recovery_is_on ())
351
+ {
352
+ zip_size|= 1 ;
353
+ goto allocate_block;
354
+ }
346
355
347
356
for (page_id_t i= low; i < high; ++i)
348
357
{
@@ -354,7 +363,8 @@ ulint buf_read_ahead_random(const page_id_t page_id, ulint zip_size)
354
363
{
355
364
count++;
356
365
ut_ad (!block);
357
- if (!zip_size && !(block= buf_read_acquire ()))
366
+ if ((UNIV_LIKELY (!zip_size) || (zip_size & 1 )) &&
367
+ UNIV_UNLIKELY (!(block= buf_read_acquire ())))
358
368
break ;
359
369
}
360
370
}
@@ -406,11 +416,17 @@ dberr_t buf_read_page(const page_id_t page_id, ulint zip_size,
406
416
buf_block_t *block= nullptr ;
407
417
if (UNIV_LIKELY (!zip_size))
408
418
{
419
+ allocate_block:
409
420
mysql_mutex_lock (&buf_pool.mutex );
410
421
buf_LRU_stat_inc_io ();
411
422
block= buf_LRU_get_free_block (have_mutex);
412
423
mysql_mutex_unlock (&buf_pool.mutex );
413
424
}
425
+ else if (recv_recovery_is_on ())
426
+ {
427
+ zip_size|= 1 ;
428
+ goto allocate_block;
429
+ }
414
430
415
431
dberr_t err= buf_read_page_low (page_id, zip_size, chain, space, block, true );
416
432
buf_read_release (block);
@@ -436,8 +452,17 @@ void buf_read_page_background(fil_space_t *space, const page_id_t page_id,
436
452
}
437
453
438
454
buf_block_t *block= nullptr ;
439
- if (!zip_size && !(block= buf_read_acquire ()))
440
- goto skip;
455
+ if (UNIV_LIKELY (!zip_size))
456
+ {
457
+ allocate_block:
458
+ if (UNIV_UNLIKELY (!(block= buf_read_acquire ())))
459
+ goto skip;
460
+ }
461
+ else if (recv_recovery_is_on ())
462
+ {
463
+ zip_size|= 1 ;
464
+ goto allocate_block;
465
+ }
441
466
442
467
if (buf_read_page_low (page_id, zip_size, chain, space, block) ==
443
468
DB_SUCCESS)
@@ -584,8 +609,17 @@ ulint buf_read_ahead_linear(const page_id_t page_id, ulint zip_size)
584
609
585
610
/* If we got this far, read-ahead can be sensible: do it */
586
611
buf_block_t *block= nullptr ;
587
- if (!zip_size && !(block= buf_read_acquire ()))
588
- goto fail;
612
+ if (UNIV_LIKELY (!zip_size))
613
+ {
614
+ allocate_block:
615
+ if (UNIV_UNLIKELY (!(block= buf_read_acquire ())))
616
+ goto fail;
617
+ }
618
+ else if (recv_recovery_is_on ())
619
+ {
620
+ zip_size|= 1 ;
621
+ goto allocate_block;
622
+ }
589
623
590
624
count= 0 ;
591
625
for (; new_low != new_high_1; ++new_low)
@@ -599,7 +633,8 @@ ulint buf_read_ahead_linear(const page_id_t page_id, ulint zip_size)
599
633
{
600
634
count++;
601
635
ut_ad (!block);
602
- if (!zip_size && !(block= buf_read_acquire ()))
636
+ if ((UNIV_LIKELY (!zip_size) || (zip_size & 1 )) &&
637
+ UNIV_UNLIKELY (!(block= buf_read_acquire ())))
603
638
break ;
604
639
}
605
640
}
0 commit comments