@ -2,7 +2,7 @@
Copyright ( c ) 1995 , 2016 , Oracle and / or its affiliates . All Rights Reserved .
Copyright ( c ) 2009 , Percona Inc .
Copyright ( c ) 2012 , 2017 , MariaDB Corporation . All Rights Reserved .
Copyright ( c ) 2013 , 2017 , MariaDB Corporation .
Portions of this file contain modifications contributed and copyrighted
by Percona Inc . . Those modifications are
@ -284,21 +284,6 @@ UNIV_INTERN time_t os_last_printout;
UNIV_INTERN ibool os_has_said_disk_full = FALSE ;
# if !defined(UNIV_HOTBACKUP) \
& & ( ! defined ( HAVE_ATOMIC_BUILTINS ) | | UNIV_WORD_SIZE < 8 )
/** The mutex protecting the following counts of pending I/O operations */
static os_ib_mutex_t os_file_count_mutex ;
# endif /* !UNIV_HOTBACKUP && (!HAVE_ATOMIC_BUILTINS || UNIV_WORD_SIZE < 8) */
/** Number of pending os_file_pread() operations */
UNIV_INTERN ulint os_file_n_pending_preads = 0 ;
/** Number of pending os_file_pwrite() operations */
UNIV_INTERN ulint os_file_n_pending_pwrites = 0 ;
/** Number of pending write operations */
UNIV_INTERN ulint os_n_pending_writes = 0 ;
/** Number of pending read operations */
UNIV_INTERN ulint os_n_pending_reads = 0 ;
# ifdef UNIV_DEBUG
# ifndef UNIV_HOTBACKUP
/**********************************************************************/ /**
@ -752,10 +737,6 @@ void
os_io_init_simple ( void )
/*===================*/
{
# if !defined(HAVE_ATOMIC_BUILTINS) || UNIV_WORD_SIZE < 8
os_file_count_mutex = os_mutex_create ( ) ;
# endif /* !HAVE_ATOMIC_BUILTINS || UNIV_WORD_SIZE < 8 */
for ( ulint i = 0 ; i < OS_FILE_N_SEEK_MUTEXES ; i + + ) {
os_file_seek_mutexes [ i ] = os_mutex_create ( ) ;
}
@ -2364,9 +2345,6 @@ os_file_pread(
os_offset_t offset ) /*!< in: file offset from where to read */
{
off_t offs ;
# if defined(HAVE_PREAD) && !defined(HAVE_BROKEN_PREAD)
ssize_t n_bytes ;
# endif /* HAVE_PREAD && !HAVE_BROKEN_PREAD */
ut_ad ( n ) ;
@ -2383,33 +2361,12 @@ os_file_pread(
os_n_file_reads + + ;
# if defined(HAVE_PREAD) && !defined(HAVE_BROKEN_PREAD)
# if defined(HAVE_ATOMIC_BUILTINS) && UNIV_WORD_SIZE == 8
( void ) os_atomic_increment_ulint ( & os_n_pending_reads , 1 ) ;
( void ) os_atomic_increment_ulint ( & os_file_n_pending_preads , 1 ) ;
MONITOR_ATOMIC_INC ( MONITOR_OS_PENDING_READS ) ;
# else
os_mutex_enter ( os_file_count_mutex ) ;
os_file_n_pending_preads + + ;
os_n_pending_reads + + ;
MONITOR_INC ( MONITOR_OS_PENDING_READS ) ;
os_mutex_exit ( os_file_count_mutex ) ;
# endif /* HAVE_ATOMIC_BUILTINS && UNIV_WORD == 8 */
n_bytes = pread ( file , buf , n , offs ) ;
# if defined(HAVE_ATOMIC_BUILTINS) && UNIV_WORD_SIZE == 8
( void ) os_atomic_decrement_ulint ( & os_n_pending_reads , 1 ) ;
( void ) os_atomic_decrement_ulint ( & os_file_n_pending_preads , 1 ) ;
MONITOR_ATOMIC_DEC ( MONITOR_OS_PENDING_READS ) ;
# else
os_mutex_enter ( os_file_count_mutex ) ;
os_file_n_pending_preads - - ;
os_n_pending_reads - - ;
MONITOR_DEC ( MONITOR_OS_PENDING_READS ) ;
os_mutex_exit ( os_file_count_mutex ) ;
# endif /* !HAVE_ATOMIC_BUILTINS || UNIV_WORD == 8 */
const bool monitor = MONITOR_IS_ON ( MONITOR_OS_PENDING_READS ) ;
# ifdef HAVE_PREAD
MONITOR_ATOMIC_INC_LOW ( MONITOR_OS_PENDING_READS , monitor ) ;
ssize_t n_bytes = pread ( file , buf , n , offs ) ;
MONITOR_ATOMIC_DEC_LOW ( MONITOR_OS_PENDING_READS , monitor ) ;
return ( n_bytes ) ;
# else
{
@ -2419,15 +2376,7 @@ os_file_pread(
ulint i ;
# endif /* !UNIV_HOTBACKUP */
# if defined(HAVE_ATOMIC_BUILTINS) && UNIV_WORD_SIZE == 8
( void ) os_atomic_increment_ulint ( & os_n_pending_reads , 1 ) ;
MONITOR_ATOMIC_INC ( MONITOR_OS_PENDING_READS ) ;
# else
os_mutex_enter ( os_file_count_mutex ) ;
os_n_pending_reads + + ;
MONITOR_INC ( MONITOR_OS_PENDING_READS ) ;
os_mutex_exit ( os_file_count_mutex ) ;
# endif /* HAVE_ATOMIC_BUILTINS && UNIV_WORD == 8 */
MONITOR_ATOMIC_INC_LOW ( MONITOR_OS_PENDING_READS , monitor ) ;
# ifndef UNIV_HOTBACKUP
/* Protect the seek / read operation with a mutex */
i = ( ( ulint ) file ) % OS_FILE_N_SEEK_MUTEXES ;
@ -2447,16 +2396,7 @@ os_file_pread(
os_mutex_exit ( os_file_seek_mutexes [ i ] ) ;
# endif /* !UNIV_HOTBACKUP */
# if defined(HAVE_ATOMIC_BUILTINS) && UNIV_WORD_SIZE == 8
( void ) os_atomic_decrement_ulint ( & os_n_pending_reads , 1 ) ;
MONITOR_ATOIC_DEC ( MONITOR_OS_PENDING_READS ) ;
# else
os_mutex_enter ( os_file_count_mutex ) ;
os_n_pending_reads - - ;
MONITOR_DEC ( MONITOR_OS_PENDING_READS ) ;
os_mutex_exit ( os_file_count_mutex ) ;
# endif /* HAVE_ATOMIC_BUILTINS && UNIV_WORD_SIZE == 8 */
MONITOR_ATOMIC_DEC_LOW ( MONITOR_OS_PENDING_READS , monitor ) ;
return ( ret ) ;
}
# endif
@ -2493,32 +2433,11 @@ os_file_pwrite(
os_n_file_writes + + ;
# if defined(HAVE_PWRITE) && !defined(HAVE_BROKEN_PREAD)
# if !defined(HAVE_ATOMIC_BUILTINS) || UNIV_WORD_SIZE < 8
os_mutex_enter ( os_file_count_mutex ) ;
os_file_n_pending_pwrites + + ;
os_n_pending_writes + + ;
MONITOR_INC ( MONITOR_OS_PENDING_WRITES ) ;
os_mutex_exit ( os_file_count_mutex ) ;
# else
( void ) os_atomic_increment_ulint ( & os_n_pending_writes , 1 ) ;
( void ) os_atomic_increment_ulint ( & os_file_n_pending_pwrites , 1 ) ;
MONITOR_ATOMIC_INC ( MONITOR_OS_PENDING_WRITES ) ;
# endif /* !HAVE_ATOMIC_BUILTINS || UNIV_WORD < 8 */
const bool monitor = MONITOR_IS_ON ( MONITOR_OS_PENDING_WRITES ) ;
# ifdef HAVE_PWRITE
MONITOR_ATOMIC_INC_LOW ( MONITOR_OS_PENDING_WRITES , monitor ) ;
ret = pwrite ( file , buf , ( ssize_t ) n , offs ) ;
# if !defined(HAVE_ATOMIC_BUILTINS) || UNIV_WORD_SIZE < 8
os_mutex_enter ( os_file_count_mutex ) ;
os_file_n_pending_pwrites - - ;
os_n_pending_writes - - ;
MONITOR_DEC ( MONITOR_OS_PENDING_WRITES ) ;
os_mutex_exit ( os_file_count_mutex ) ;
# else
( void ) os_atomic_decrement_ulint ( & os_n_pending_writes , 1 ) ;
( void ) os_atomic_decrement_ulint ( & os_file_n_pending_pwrites , 1 ) ;
MONITOR_ATOMIC_DEC ( MONITOR_OS_PENDING_WRITES ) ;
# endif /* !HAVE_ATOMIC_BUILTINS || UNIV_WORD < 8 */
MONITOR_ATOMIC_DEC_LOW ( MONITOR_OS_PENDING_WRITES , monitor ) ;
return ( ret ) ;
# else
@ -2528,10 +2447,7 @@ os_file_pwrite(
ulint i ;
# endif /* !UNIV_HOTBACKUP */
os_mutex_enter ( os_file_count_mutex ) ;
os_n_pending_writes + + ;
MONITOR_INC ( MONITOR_OS_PENDING_WRITES ) ;
os_mutex_exit ( os_file_count_mutex ) ;
MONITOR_ATOMIC_INC_LOW ( MONITOR_OS_PENDING_WRITES , monitor ) ;
# ifndef UNIV_HOTBACKUP
/* Protect the seek / write operation with a mutex */
@ -2555,14 +2471,10 @@ func_exit:
os_mutex_exit ( os_file_seek_mutexes [ i ] ) ;
# endif /* !UNIV_HOTBACKUP */
os_mutex_enter ( os_file_count_mutex ) ;
os_n_pending_writes - - ;
MONITOR_DEC ( MONITOR_OS_PENDING_WRITES ) ;
os_mutex_exit ( os_file_count_mutex ) ;
MONITOR_ATOMIC_DEC_LOW ( MONITOR_OS_PENDING_WRITES , monitor ) ;
return ( ret ) ;
}
# endif /* !UNIV_HOTBACKUP */
# endif /* HAVE_PWRITE */
}
# endif
@ -2597,6 +2509,7 @@ os_file_read_func(
os_n_file_reads + + ;
os_bytes_read_since_printout + = n ;
const bool monitor = MONITOR_IS_ON ( MONITOR_OS_PENDING_READS ) ;
try_again :
ut_ad ( buf ) ;
@ -2605,10 +2518,7 @@ try_again:
low = ( DWORD ) offset & 0xFFFFFFFF ;
high = ( DWORD ) ( offset > > 32 ) ;
os_mutex_enter ( os_file_count_mutex ) ;
os_n_pending_reads + + ;
MONITOR_INC ( MONITOR_OS_PENDING_READS ) ;
os_mutex_exit ( os_file_count_mutex ) ;
MONITOR_ATOMIC_INC_LOW ( MONITOR_OS_PENDING_READS , monitor ) ;
# ifndef UNIV_HOTBACKUP
/* Protect the seek / read operation with a mutex */
@ -2626,11 +2536,7 @@ try_again:
os_mutex_exit ( os_file_seek_mutexes [ i ] ) ;
# endif /* !UNIV_HOTBACKUP */
os_mutex_enter ( os_file_count_mutex ) ;
os_n_pending_reads - - ;
MONITOR_DEC ( MONITOR_OS_PENDING_READS ) ;
os_mutex_exit ( os_file_count_mutex ) ;
MONITOR_ATOMIC_DEC_LOW ( MONITOR_OS_PENDING_READS , monitor ) ;
goto error_handling ;
}
@ -2640,10 +2546,7 @@ try_again:
os_mutex_exit ( os_file_seek_mutexes [ i ] ) ;
# endif /* !UNIV_HOTBACKUP */
os_mutex_enter ( os_file_count_mutex ) ;
os_n_pending_reads - - ;
MONITOR_DEC ( MONITOR_OS_PENDING_READS ) ;
os_mutex_exit ( os_file_count_mutex ) ;
MONITOR_ATOMIC_DEC_LOW ( MONITOR_OS_PENDING_READS , monitor ) ;
if ( ret & & len = = n ) {
return ( TRUE ) ;
@ -2728,6 +2631,7 @@ os_file_read_no_error_handling_func(
os_n_file_reads + + ;
os_bytes_read_since_printout + = n ;
const bool monitor = MONITOR_IS_ON ( MONITOR_OS_PENDING_READS ) ;
try_again :
ut_ad ( buf ) ;
@ -2736,10 +2640,7 @@ try_again:
low = ( DWORD ) offset & 0xFFFFFFFF ;
high = ( DWORD ) ( offset > > 32 ) ;
os_mutex_enter ( os_file_count_mutex ) ;
os_n_pending_reads + + ;
MONITOR_INC ( MONITOR_OS_PENDING_READS ) ;
os_mutex_exit ( os_file_count_mutex ) ;
MONITOR_ATOMIC_INC_LOW ( MONITOR_OS_PENDING_READS , monitor ) ;
# ifndef UNIV_HOTBACKUP
/* Protect the seek / read operation with a mutex */
@ -2757,11 +2658,7 @@ try_again:
os_mutex_exit ( os_file_seek_mutexes [ i ] ) ;
# endif /* !UNIV_HOTBACKUP */
os_mutex_enter ( os_file_count_mutex ) ;
os_n_pending_reads - - ;
MONITOR_DEC ( MONITOR_OS_PENDING_READS ) ;
os_mutex_exit ( os_file_count_mutex ) ;
MONITOR_ATOMIC_DEC_LOW ( MONITOR_OS_PENDING_READS , monitor ) ;
goto error_handling ;
}
@ -2771,10 +2668,7 @@ try_again:
os_mutex_exit ( os_file_seek_mutexes [ i ] ) ;
# endif /* !UNIV_HOTBACKUP */
os_mutex_enter ( os_file_count_mutex ) ;
os_n_pending_reads - - ;
MONITOR_DEC ( MONITOR_OS_PENDING_READS ) ;
os_mutex_exit ( os_file_count_mutex ) ;
MONITOR_ATOMIC_DEC_LOW ( MONITOR_OS_PENDING_READS , monitor ) ;
if ( ret & & len = = n ) {
return ( TRUE ) ;
@ -2854,7 +2748,6 @@ os_file_write_func(
ulint n ) /*!< in: number of bytes to write */
{
ut_ad ( ! srv_read_only_mode ) ;
# ifdef __WIN__
BOOL ret ;
DWORD len ;
@ -2876,14 +2769,12 @@ os_file_write_func(
ut_ad ( buf ) ;
ut_ad ( n > 0 ) ;
const bool monitor = MONITOR_IS_ON ( MONITOR_OS_PENDING_WRITES ) ;
retry :
low = ( DWORD ) offset & 0xFFFFFFFF ;
high = ( DWORD ) ( offset > > 32 ) ;
os_mutex_enter ( os_file_count_mutex ) ;
os_n_pending_writes + + ;
MONITOR_INC ( MONITOR_OS_PENDING_WRITES ) ;
os_mutex_exit ( os_file_count_mutex ) ;
MONITOR_ATOMIC_INC_LOW ( MONITOR_OS_PENDING_WRITES , monitor ) ;
# ifndef UNIV_HOTBACKUP
/* Protect the seek / write operation with a mutex */
@ -2901,10 +2792,7 @@ retry:
os_mutex_exit ( os_file_seek_mutexes [ i ] ) ;
# endif /* !UNIV_HOTBACKUP */
os_mutex_enter ( os_file_count_mutex ) ;
os_n_pending_writes - - ;
MONITOR_DEC ( MONITOR_OS_PENDING_WRITES ) ;
os_mutex_exit ( os_file_count_mutex ) ;
MONITOR_ATOMIC_DEC_LOW ( MONITOR_OS_PENDING_WRITES , monitor ) ;
ut_print_timestamp ( stderr ) ;
@ -2928,10 +2816,7 @@ retry:
os_mutex_exit ( os_file_seek_mutexes [ i ] ) ;
# endif /* !UNIV_HOTBACKUP */
os_mutex_enter ( os_file_count_mutex ) ;
os_n_pending_writes - - ;
MONITOR_DEC ( MONITOR_OS_PENDING_WRITES ) ;
os_mutex_exit ( os_file_count_mutex ) ;
MONITOR_ATOMIC_DEC_LOW ( MONITOR_OS_PENDING_WRITES , monitor ) ;
if ( ret & & len = = n ) {
@ -5751,19 +5636,24 @@ os_aio_print(
time_elapsed = 0.001 + difftime ( current_time , os_last_printout ) ;
fprintf ( file ,
" Pending flushes (fsync) log: %lu; buffer pool: %lu \n "
" %lu OS file reads, %lu OS file writes, %lu OS fsyncs \n " ,
( ulong ) fil_n_pending_log_flushes ,
( ulong ) fil_n_pending_tablespace_flushes ,
( ulong ) os_n_file_reads ,
( ulong ) os_n_file_writes ,
( ulong ) os_n_fsyncs ) ;
if ( os_file_n_pending_preads ! = 0 | | os_file_n_pending_pwrites ! = 0 ) {
" Pending flushes (fsync) log: " ULINTPF
" ; buffer pool: " ULINTPF " \n "
ULINTPF " OS file reads, "
ULINTPF " OS file writes, "
ULINTPF " OS fsyncs \n " ,
fil_n_pending_log_flushes ,
fil_n_pending_tablespace_flushes ,
os_n_file_reads ,
os_n_file_writes ,
os_n_fsyncs ) ;
const ulint n_reads = MONITOR_VALUE ( MONITOR_OS_PENDING_READS ) ;
const ulint n_writes = MONITOR_VALUE ( MONITOR_OS_PENDING_WRITES ) ;
if ( n_reads ! = 0 | | n_writes ! = 0 ) {
fprintf ( file ,
" %lu pending preads, %lu pending pwrites \n " ,
( ulong ) os_file_n_pending_preads ,
( ulong ) os_file_n_pending_pwrites ) ;
ULINTPF " pending reads, " ULINTPF " pending writes \n " ,
n_reads , n_writes ) ;
}
if ( os_n_file_reads = = os_n_file_reads_old ) {