| Bug #89822 | InnoDB retries open on EINTR error only if innodb_use_native_aio is enabled | ||
|---|---|---|---|
| Submitted: | 27 Feb 2018 7:46 | Modified: | 27 Feb 2018 10:42 |
| Reporter: | Laurynas Biveinis (OCA) | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: InnoDB storage engine | Severity: | S3 (Non-critical) |
| Version: | 5.7,8.0 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | Contribution | ||
[27 Feb 2018 8:37]
Laurynas Biveinis
Bug 89822 fix for 8.0.4 (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: bug89822-8.0.4.patch (application/octet-stream, text), 841 bytes.
[27 Feb 2018 10:42]
MySQL Verification Team
Hello Laurynas, Thank you for the report and contribution. Thanks, Umesh
[13 Jun 2018 12:51]
Laurynas Biveinis
Bug 89822 fix for 8.0.11 (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: bug89822-8.0.11.patch (application/octet-stream, text), 922 bytes.
[14 Jun 2018 5:03]
MySQL Verification Team
Thank you for the contributions! Regards, Umesh

Description: EINTR is a possible error on a failed open call. How it will be handled in InnoDB depends on innodb_use_native_aio value, which should not have any connection to open returning EINTR. How to repeat: Code analysis. os_file_create_simple_func open call returning EINTR will call os_file_handle_error, which will call os_file_handle_error_cond_exit. If innodb_use_native_aio is ON, it will return OS_FILE_AIO_INTERRUPTED (it is also not correct name as EINTR may be returned by non-AIO I/O, such as open here), and if OFF, it will return OS_FILE_ERROR_MAX + EINTR. os_file_handle_error will return true for os_file_create_simple_func retry variable, and false otherwise. os_file_create_simple_func( ... do { file.m_file = ::open(name, create_flag, os_innodb_umask); if (file.m_file == -1) { *success = false; retry = os_file_handle_error( name, create_mode == OS_FILE_OPEN ? "open" : "create"); } else { *success = true; retry = false; } } while (retry); ... os_file_handle_error( ... /* Exit in case of unknown error */ return(os_file_handle_error_cond_exit(name, operation, true, false)); switch (err) { ... case OS_FILE_AIO_INTERRUPTED: return(true); ... default: // diagnose, abort, etc } os_file_handle_error_cond_exit( ... err = os_file_get_last_error_low(false, on_error_silent); os_file_get_last_error_low( ... int err = errno; ... switch (err) { ... case EINTR: if (srv_use_native_aio) { return(OS_FILE_AIO_INTERRUPTED); } break; ... return(OS_FILE_ERROR_MAX + err); Suggested fix: While a mount where open may return EINTR is probably not the best system for running InnoDB, this is still inconsistency and EINTR should be retried regardless of native AIO setting.