@ -200,17 +200,10 @@ os_file_handle_error_cond_exit(
bool on_error_silent ) ;
/** Does error handling when a file operation fails.
@ param [ in ] name name of a file or NULL
@ param [ in ] operation operation name that failed
@ return true if we should retry the operation */
static
bool
os_file_handle_error (
const char * name ,
const char * operation )
@ param operation name of operation that failed */
static void os_file_handle_error ( const char * operation )
{
/* Exit in case of unknown error */
return ( os_file_handle_error_cond_exit ( name , operation , true , false ) ) ;
os_file_handle_error_cond_exit ( nullptr , operation , true , false ) ;
}
/** Does error handling when a file operation fails.
@ -942,7 +935,7 @@ os_file_flush_func(
ib : : error ( ) < < " The OS said file flush did not succeed " ;
os_file_handle_error ( NULL , " flush " ) ;
os_file_handle_error ( " flush " ) ;
/* It is a fatal error if a file flush does not succeed, because then
the database can get corrupt on disk */
@ -965,7 +958,7 @@ A simple function to open or create a file.
pfs_os_file_t
os_file_create_simple_func (
const char * name ,
ulint create_mode ,
os_file_create_t create_mode ,
ulint access_type ,
bool read_only ,
bool * success )
@ -976,23 +969,14 @@ os_file_create_simple_func(
int create_flag = O_RDONLY | O_CLOEXEC ;
ut_a ( ! ( create_mode & OS_FILE_ON_ERROR_SILENT ) ) ;
ut_a ( ! ( create_mode & OS_FILE_ON_ERROR_NO_EXIT ) ) ;
if ( read_only ) {
} else if ( create_mode = = OS_FILE_OPEN ) {
if ( access_type ! = OS_FILE_READ_ONLY ) {
create_flag = O_RDWR | O_CLOEXEC ;
}
} else if ( create_mode = = OS_FILE_CREATE ) {
create_flag = O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC ;
} else {
ib : : error ( )
< < " Unknown file create mode ( "
< < create_mode
< < " for file ' " < < name < < " ' " ;
return ( OS_FILE_CLOSED ) ;
ut_ad ( create_mode = = OS_FILE_OPEN ) ;
if ( access_type ! = OS_FILE_READ_ONLY ) {
create_flag = O_RDWR | O_CLOEXEC ;
}
}
bool retry ;
@ -1025,10 +1009,10 @@ os_file_create_simple_func(
}
# endif
* success = false ;
retry = os_file_handle_error (
retry = os_file_handle_error_no_exit (
name ,
create_mode = = OS_FILE_OPEN
? " open " : " create " ) ;
create_mode = = OS_FILE_CREATE
? " create " : " open " , false ) ;
} else {
* success = true ;
retry = false ;
@ -1154,48 +1138,34 @@ Opens an existing file or creates a new.
pfs_os_file_t
os_file_create_func (
const char * name ,
ulint create_mode ,
os_file_create_t create_mode ,
ulint purpose ,
ulint type ,
bool read_only ,
bool * success )
{
bool on_error_no_exit ;
bool on_error_silent ;
* success = false ;
DBUG_EXECUTE_IF (
" ib_create_table_fail_disk_full " ,
* success = false ;
errno = ENOSPC ;
return ( OS_FILE_CLOSED ) ;
) ;
int create_flag ;
on_error_no_exit = create_mode & OS_FILE_ON_ERROR_NO_EXIT
? true : false ;
on_error_silent = create_mode & OS_FILE_ON_ERROR_SILENT
? true : false ;
create_mode & = ulint ( ~ ( OS_FILE_ON_ERROR_NO_EXIT
| OS_FILE_ON_ERROR_SILENT ) ) ;
if ( read_only ) {
create_flag = O_RDONLY | O_CLOEXEC ;
} else if ( create_mode = = OS_FILE_OPEN
| | create_mode = = OS_FILE_OPEN_RAW
| | create_mode = = OS_FILE_OPEN_RETRY ) {
create_flag = O_RDWR | O_CLOEXEC ;
} else if ( create_mode = = OS_FILE_CREATE ) {
} else if ( create_mode = = OS_FILE_CREATE
| | create_mode = = OS_FILE_CREATE_SILENT ) {
create_flag = O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC ;
} else {
ib : : error ( )
< < " Unknown file create mode ( " < < create_mode < < " ) "
< < " for file ' " < < name < < " ' " ;
return ( OS_FILE_CLOSED ) ;
ut_ad ( create_mode = = OS_FILE_OPEN
| | create_mode = = OS_FILE_OPEN_SILENT
| | create_mode = = OS_FILE_OPEN_RETRY
| | create_mode = = OS_FILE_OPEN_RETRY_SILENT
| | create_mode = = OS_FILE_OPEN_RAW ) ;
create_flag = O_RDWR | O_CLOEXEC ;
}
# ifdef O_DIRECT
@ -1219,10 +1189,14 @@ os_file_create_func(
} else if ( log_sys . log_buffered ) {
skip_o_direct :
os_file_log_buffered ( ) ;
} else if ( create_mode ! = OS_FILE_CREATE & & ! log_sys . is_opened ( ) ) {
} else if ( create_mode ! = OS_FILE_CREATE
& & create_mode ! = OS_FILE_CREATE_SILENT
& & ! log_sys . is_opened ( ) ) {
if ( stat ( name , & st ) ) {
if ( errno = = ENOENT ) {
if ( on_error_silent ) goto not_found ;
if ( create_mode & OS_FILE_ON_ERROR_SILENT ) {
goto not_found ;
}
sql_print_error (
" InnoDB: File %s was not found " , name ) ;
goto not_found ;
@ -1256,9 +1230,8 @@ os_file_create_func(
}
os_file_t file ;
bool retry ;
do {
for ( ; ; ) {
file = open ( name , create_flag | direct_flag , os_innodb_umask ) ;
if ( file = = - 1 ) {
@ -1270,34 +1243,26 @@ os_file_create_func(
os_file_log_buffered ( ) ;
}
# endif
if ( create_mode = = OS_FILE_CREATE ) {
if ( create_mode = = OS_FILE_CREATE
| | create_mode = = OS_FILE_CREATE_SILENT ) {
/* Linux may create the file
before rejecting the O_DIRECT . */
unlink ( name ) ;
}
retry = true ;
continue ;
}
# endif
const char * operation ;
operation = ( create_mode = = OS_FILE_CREATE
& & ! read_only ) ? " create " : " open " ;
* success = false ;
if ( on_error_no_exit ) {
retry = os_file_handle_error_no_exit (
name , operation , on_error_silent ) ;
} else {
retry = os_file_handle_error ( name , operation ) ;
if ( ! os_file_handle_error_no_exit (
name , ( create_flag & O_CREAT )
? " create " : " open " ,
create_mode & OS_FILE_ON_ERROR_SILENT ) ) {
break ;
}
} else {
* success = true ;
retry = false ;
break ;
}
} while ( retry ) ;
}
if ( ! * success ) {
# ifdef __linux__
@ -1307,8 +1272,7 @@ not_found:
}
# ifdef __linux__
if ( ! read_only & & create_mode = = OS_FILE_CREATE
& & type = = OS_LOG_FILE ) {
if ( ( create_flag & O_CREAT ) & & type = = OS_LOG_FILE ) {
if ( fstat ( file , & st ) | | ! os_file_log_maybe_unbuffered ( st ) ) {
os_file_log_buffered ( ) ;
} else {
@ -1324,7 +1288,8 @@ not_found:
& & ! my_disable_locking
& & os_file_lock ( file , name ) ) {
if ( create_mode = = OS_FILE_OPEN_RETRY ) {
if ( create_mode = = OS_FILE_OPEN_RETRY
| | create_mode = = OS_FILE_OPEN_RETRY_SILENT ) {
ib : : info ( )
< < " Retrying to lock the first data file " ;
@ -1355,7 +1320,7 @@ os_file_create_simple_no_error_handling(), not directly this function!
A simple function to open or create a file .
@ param [ in ] name name of the file or path as a null - terminated
string
@ param [ in ] create_mode create mode
@ param [ in ] create_mode OS_FILE_CREATE or OS_FILE_OPEN
@ param [ in ] access_type OS_FILE_READ_ONLY , OS_FILE_READ_WRITE , or
OS_FILE_READ_ALLOW_DELETE ; the last option
is used by a backup program reading the file
@ -1366,7 +1331,7 @@ A simple function to open or create a file.
pfs_os_file_t
os_file_create_simple_no_error_handling_func (
const char * name ,
ulint create_mode ,
os_file_create_t create_mode ,
ulint access_type ,
bool read_only ,
bool * success )
@ -1374,30 +1339,19 @@ os_file_create_simple_no_error_handling_func(
os_file_t file ;
int create_flag = O_RDONLY | O_CLOEXEC ;
ut_a ( ! ( create_mode & OS_FILE_ON_ERROR_SILENT ) ) ;
ut_a ( ! ( create_mode & OS_FILE_ON_ERROR_NO_EXIT ) ) ;
* success = false ;
if ( read_only ) {
} else if ( create_mode = = OS_FILE_OPEN ) {
} else if ( create_mode = = OS_FILE_CREATE ) {
create_flag = O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC ;
} else {
ut_ad ( create_mode = = OS_FILE_OPEN ) ;
if ( access_type ! = OS_FILE_READ_ONLY ) {
ut_a ( access_type = = OS_FILE_READ_WRITE
| | access_type = = OS_FILE_READ_ALLOW_DELETE ) ;
create_flag = O_RDWR ;
}
} else if ( create_mode = = OS_FILE_CREATE ) {
create_flag = O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC ;
} else {
ib : : error ( )
< < " Unknown file create mode "
< < create_mode < < " for file ' " < < name < < " ' " ;
return ( OS_FILE_CLOSED ) ;
}
file = open ( name , create_flag , os_innodb_umask ) ;
@ -1520,7 +1474,7 @@ bool os_file_close_func(os_file_t file)
if ( ! ret )
return true ;
os_file_handle_error ( NULL , " close " ) ;
os_file_handle_error ( " close " ) ;
return false ;
}
@ -1793,7 +1747,7 @@ bool os_file_flush_func(os_file_t file)
if ( srv_start_raw_disk_in_use & & GetLastError ( ) = = ERROR_INVALID_FUNCTION )
return true ;
os_file_handle_error ( nullptr , " flush " ) ;
os_file_handle_error ( " flush " ) ;
/* It is a fatal error if a file flush does not succeed, because then
the database can get corrupt on disk */
@ -1907,7 +1861,7 @@ A simple function to open or create a file.
pfs_os_file_t
os_file_create_simple_func (
const char * name ,
ulint create_mode ,
os_file_create_t create_mode ,
ulint access_type ,
bool read_only ,
bool * success )
@ -1916,65 +1870,31 @@ os_file_create_simple_func(
* success = false ;
DWORD access ;
DWORD access = GENERIC_READ ;
DWORD create_flag ;
DWORD attributes = 0 ;
ut_a ( ! ( create_mode & OS_FILE_ON_ERROR_SILENT ) ) ;
ut_a ( ! ( create_mode & OS_FILE_ON_ERROR_NO_EXIT ) ) ;
ut_ad ( srv_operation = = SRV_OPERATION_NORMAL ) ;
if ( create_mode = = OS_FILE_OPEN ) {
if ( read_only | | create_mode = = OS_FILE_OPEN ) {
create_flag = OPEN_EXISTING ;
} else if ( read_only ) {
create_flag = OPEN_EXISTING ;
} else if ( create_mode = = OS_FILE_CREATE ) {
create_flag = CREATE_NEW ;
} else {
ib : : error ( )
< < " Unknown file create mode ( "
< < create_mode < < " ) for file ' "
< < name < < " ' " ;
return ( OS_FILE_CLOSED ) ;
ut_ad ( create_mode = = OS_FILE_CREATE ) ;
create_flag = CREATE_NEW ;
}
if ( access_type = = OS_FILE_READ_ONLY ) {
access = GENERIC_READ ;
} else if ( read_only ) {
ib : : info ( )
< < " Read only mode set. Unable to "
" open file ' " < < name < < " ' in RW mode, "
< < " trying RO mode " ;
access = GENERIC_READ ;
} else if ( access_type = = OS_FILE_READ_WRITE ) {
access = GENERIC_READ | GENERIC_WRITE ;
} else {
ib : : error ( )
< < " Unknown file access type ( " < < access_type < < " ) "
" for file ' " < < name < < " ' " ;
return ( OS_FILE_CLOSED ) ;
ut_ad ( access_type = = OS_FILE_READ_WRITE ) ;
access = GENERIC_READ | GENERIC_WRITE ;
}
bool retry ;
do {
for ( ; ; ) {
/* Use default security attributes and no template file. */
file = CreateFile (
@ -1982,22 +1902,18 @@ os_file_create_simple_func(
FILE_SHARE_READ | FILE_SHARE_DELETE ,
my_win_file_secattr ( ) , create_flag , attributes , NULL ) ;
if ( file = = INVALID_HANDLE_VALUE ) {
* success = false ;
retry = os_file_handle_error (
name , create_mode = = OS_FILE_OPEN ?
" open " : " create " ) ;
} else {
retry = false ;
if ( file ! = INVALID_HANDLE_VALUE ) {
* success = true ;
break ;
}
} while ( retry ) ;
if ( ! os_file_handle_error_no_exit ( name ,
create_flag = = CREATE_NEW
? " create " : " open " ,
false ) ) {
break ;
}
}
return ( file ) ;
}
@ -2066,16 +1982,13 @@ Opens an existing file or creates a new.
pfs_os_file_t
os_file_create_func (
const char * name ,
ulint create_mode ,
os_file_create_t create_mode ,
ulint purpose ,
ulint type ,
bool read_only ,
bool * success )
{
os_file_t file ;
bool retry ;
bool on_error_no_exit ;
bool on_error_silent ;
* success = false ;
@ -2086,50 +1999,30 @@ os_file_create_func(
return ( OS_FILE_CLOSED ) ;
) ;
DWORD create_flag ;
DWORD create_flag = OPEN_EXISTING ;
DWORD share_mode = read_only
? FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
: FILE_SHARE_READ | FILE_SHARE_DELETE ;
on_error_no_exit = create_mode & OS_FILE_ON_ERROR_NO_EXIT
? true : false ;
on_error_silent = create_mode & OS_FILE_ON_ERROR_SILENT
? true : false ;
create_mode & = ~ ( OS_FILE_ON_ERROR_NO_EXIT | OS_FILE_ON_ERROR_SILENT ) ;
if ( create_mode = = OS_FILE_OPEN_RAW ) {
switch ( create_mode ) {
case OS_FILE_OPEN_RAW :
ut_a ( ! read_only ) ;
/* On Windows Physical devices require admin privileges and
have to have the write - share mode set . See the remarks
section for the CreateFile ( ) function documentation in MSDN . */
share_mode | = FILE_SHARE_WRITE ;
create_flag = OPEN_EXISTING ;
} else if ( create_mode = = OS_FILE_OPEN
| | create_mode = = OS_FILE_OPEN_RETRY ) {
create_flag = OPEN_EXISTING ;
} else if ( read_only ) {
create_flag = OPEN_EXISTING ;
} else if ( create_mode = = OS_FILE_CREATE ) {
break ;
case OS_FILE_CREATE_SILENT :
case OS_FILE_CREATE :
create_flag = CREATE_NEW ;
} else {
ib : : error ( )
< < " Unknown file create mode ( " < < create_mode < < " ) "
< < " for file ' " < < name < < " ' " ;
return ( OS_FILE_CLOSED ) ;
break ;
default :
ut_ad ( create_mode = = OS_FILE_OPEN
| | create_mode = = OS_FILE_OPEN_SILENT
| | create_mode = = OS_FILE_OPEN_RETRY_SILENT
| | create_mode = = OS_FILE_OPEN_RETRY ) ;
break ;
}
DWORD attributes = ( purpose = = OS_FILE_AIO & & srv_use_native_aio )
@ -2187,18 +2080,11 @@ os_file_create_func(
break ;
}
operation = ( create_mode = = OS_FILE_CREATE & & ! read_only ) ?
" create " : " open " ;
operation = create_flag = = CREATE_NEW ? " create " : " open " ;
if ( on_error_no_exit ) {
retry = os_file_handle_error_no_exit (
name , operation , on_error_silent ) ;
}
else {
retry = os_file_handle_error ( name , operation ) ;
}
if ( ! retry ) {
if ( ! os_file_handle_error_no_exit ( name , operation ,
create_mode
& OS_FILE_ON_ERROR_SILENT ) ) {
break ;
}
}
@ -2225,79 +2111,42 @@ A simple function to open or create a file.
pfs_os_file_t
os_file_create_simple_no_error_handling_func (
const char * name ,
ulint create_mode ,
os_file_create_t create_mode ,
ulint access_type ,
bool read_only ,
bool * success )
{
os_file_t file ;
* success = false ;
DWORD access ;
DWORD create_flag ;
DWORD access = GENERIC_READ ;
DWORD create_flag = OPEN_EXISTING ;
DWORD attributes = 0 ;
DWORD share_mode = read_only
? FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
: FILE_SHARE_READ | FILE_SHARE_DELETE ;
DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_DELETE ;
ut_a ( name ) ;
ut_a ( ! ( create_mode & OS_FILE_ON_ERROR_SILENT ) ) ;
ut_a ( ! ( create_mode & OS_FILE_ON_ERROR_NO_EXIT ) ) ;
if ( create_mode = = OS_FILE_OPEN ) {
create_flag = OPEN_EXISTING ;
} else if ( read_only ) {
create_flag = OPEN_EXISTING ;
} else if ( create_mode = = OS_FILE_CREATE ) {
create_flag = CREATE_NEW ;
} else {
ib : : error ( )
< < " Unknown file create mode ( " < < create_mode < < " ) "
< < " for file ' " < < name < < " ' " ;
return ( OS_FILE_CLOSED ) ;
}
if ( access_type = = OS_FILE_READ_ONLY ) {
access = GENERIC_READ ;
} else if ( read_only ) {
access = GENERIC_READ ;
} else if ( access_type = = OS_FILE_READ_WRITE ) {
access = GENERIC_READ | GENERIC_WRITE ;
} else if ( access_type = = OS_FILE_READ_ALLOW_DELETE ) {
ut_a ( ! read_only ) ;
access = GENERIC_READ ;
/*!< A backup program has to give mysqld the maximum
freedom to do what it likes with the file */
share_mode | = FILE_SHARE_DELETE | FILE_SHARE_WRITE
| FILE_SHARE_READ ;
if ( read_only ) {
share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE
| FILE_SHARE_DELETE ;
} else {
if ( create_mode = = OS_FILE_CREATE ) {
create_flag = CREATE_NEW ;
} else {
ut_ad ( create_mode = = OS_FILE_OPEN ) ;
}
ib : : error ( )
< < " Unknown file access type ( " < < access_type < < " ) "
< < " for file ' " < < name < < " ' " ;
return ( OS_FILE_CLOSED ) ;
switch ( access_type ) {
case OS_FILE_READ_ONLY : break ;
case OS_FILE_READ_WRITE :
access = GENERIC_READ | GENERIC_WRITE ;
break ;
default :
ut_ad ( access_type = = OS_FILE_READ_ALLOW_DELETE ) ;
/* A backup program has to give mariadbd the maximum
freedom to do what it likes with the file */
share_mode | = FILE_SHARE_DELETE | FILE_SHARE_WRITE
| FILE_SHARE_READ ;
}
}
file = CreateFile ( ( LPCTSTR ) name ,
@ -2465,7 +2314,7 @@ bool os_file_close_func(os_file_t file)
ut_ad ( file ) ;
if ( ! CloseHandle ( file ) )
{
os_file_handle_error ( NULL , " close " ) ;
os_file_handle_error ( " close " ) ;
return false ;
}
@ -2903,8 +2752,8 @@ os_file_read_func(
if ( ulint ( n_bytes ) = = n | | err ! = DB_SUCCESS )
return err ;
os_file_handle_error_cond _exit ( type . node ? type . node - > name : nullptr , " read " ,
false , false ) ;
os_file_handle_error_no _exit ( type . node ? type . node - > name : nullptr , " read " ,
false ) ;
sql_print_error ( " InnoDB: Tried to read %zu bytes at offset %llu "
" of file %s, but was only able to read %zd " ,
n , offset , type . node ? type . node - > name : " (unknown) " ,
@ -3791,8 +3640,9 @@ func_exit:
if ( srv_thread_pool - > submit_io ( cb ) ) {
slots - > release ( cb ) ;
os_file_handle_error ( type . node - > name , type . is_read ( )
? " aio read " : " aio write " ) ;
os_file_handle_error_no_exit ( type . node - > name , type . is_read ( )
? " aio read " : " aio write " ,
false ) ;
err = DB_IO_ERROR ;
type . node - > space - > release ( ) ;
}