Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
10.2(EOL), 10.3(EOL), 10.4(EOL), 10.5
-
Linux libaio
Description
In the asynchronous I/O interface, InnoDB is invoking io_getevents() with a timeout value of half a second, and requesting exactly 1 event at a time.
Apparently, the reason to have such a short timeout is to facilitate shutdown.
We can do better: Use an infinite timeout, wait for a larger maximum number of events. For shutdown, submit a dummy request that informs the io_getevents() caller thread to terminate.
Attachments
Issue Links
- relates to
-
MDEV-24278 InnoDB page cleaner keeps waking up on idle server
-
- Closed
-
-
MDEV-16264 Implement a common work queue for InnoDB background tasks
-
- Closed
-
I ended up implementing my own wrapper of the io_getevents system call, because the one in libaio includes some code that would attempt to elide the system call, causing it to return 0 immediately without blocking. That would not only cause 100% CPU usage in our use case, but also cause SIGSEGV on shutdown, because every now and then, that extra user-mode code would be dereferencing what io_destroy() is destroying in another thread.
Based on buildbot.askmonty.org (running various Linux kernel versions in virtual machines), executing io_destroy() while io_getevents is blocking in another thread appears to be safe, causing an EINVAL result.