| Bug #55629 | 5.5.x goes into infinite loop and high cpu after error flushing io cache | ||
|---|---|---|---|
| Submitted: | 29 Jul 2010 16:34 | Modified: | 1 Dec 2010 17:45 |
| Reporter: | Shane Bester (Platinum Quality Contributor) | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Windows | Severity: | S1 (Critical) |
| Version: | 5.5.5 | OS: | Windows (xp) |
| Assigned to: | Vladislav Vaintroub | CPU Architecture: | Any |
| Tags: | regression | ||
[5 Oct 2010 10:10]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/119969 3092 Vladislav Vaintroub 2010-10-05 Bug#55629 5.5.x goes into infinite loop and high cpu after error flushing io cache The reason for the error was incorrect return code from my_win_write() in case of error on 64 bit Windows. Error should be indicated by return code (size_t)-1 == 2^64 -1, but due to cast it was (DWORD)-1 = 2^32 -1 The caller of this function would fail to recognize the error and continue looping. Fix is to return correct error code (size_t)-1 in case of error as expected by caller. Also minimal cleanup is done : my_win_write() now uses the same parameter checks as related functions (0 and overflow handling for count parameterr).
[5 Oct 2010 12:18]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/119988 3092 Vladislav Vaintroub 2010-10-05 Bug#55629 5.5.x goes into infinite loop and high cpu after error flushing io cache The reason for the error was incorrect return code from my_win_write() in case of error on 64 bit Windows. Error should be indicated by return code (size_t)-1 == 2^64 -1, but due to cast it was (DWORD)-1 = 2^32 -1 The caller of this function would fail to recognize the error and continue looping. Fix is to return correct error code (size_t)-1 in case of error as expected by caller. Also minimal cleanup is done : my_win_write() now uses the same parameter checks as related functions (0 and overflow handling for count parameter).
[6 Oct 2010 11:40]
Vladislav Vaintroub
queued to 5.5-bugteam, trunk-merge
[9 Nov 2010 19:43]
Bugs System
Pushed into mysql-5.5 5.5.7-rc (revid:sunanda.menon@sun.com-20101109182959-otkxq8vo2dcd13la) (version source revid:sunanda.menon@sun.com-20101109182959-otkxq8vo2dcd13la) (merge vers: 5.5.7-rc) (pib:21)
[13 Nov 2010 16:10]
Bugs System
Pushed into mysql-trunk 5.6.99-m5 (revid:alexander.nozdrin@oracle.com-20101113155825-czmva9kg4n31anmu) (version source revid:alexander.nozdrin@oracle.com-20101113152450-2zzcm50e7i4j35v7) (merge vers: 5.6.1-m4) (pib:21)
[13 Nov 2010 16:29]
Bugs System
Pushed into mysql-next-mr (revid:alexander.nozdrin@oracle.com-20101113160336-atmtmfb3mzm4pz4i) (version source revid:vasil.dimov@oracle.com-20100629074804-359l9m9gniauxr94) (pib:21)
[1 Dec 2010 17:45]
Tony Bedford
An entry has been added to the 5.5.7 changelog:
The server entered an infinite loop with high CPU utilization
after an error occurred during flushing of the IO cache.

Description: This case of an error is a huge read_buffer_size, and OS gives a failure. So, this query spins/hangs when it should return an error and quit: ---------+------+-----------+----------------------------------------------------- Command | Time | State | Info ---------+------+-----------+----------------------------------------------------- Query | 282 | executing | select repeat('a',@@global.read_buffer_size) into ou Query | 0 | NULL | show processlist ---------+------+-----------+----------------------------------------------------- For this specific failure, filemon shows us: 18:27:09.453 mysqld.exe:3588 IRP_MJ_WRITE \\xp64\h$\outddd.txt INSUFFICIENT RESOURCES Offset: 0 Length: 134219775 18:27:09.453 mysqld.exe:3588 FASTIO_WRITE H:\outddd.txt FAILURE Offset: 0 Length: 134219775 5.1.49 gave an error and didn't hang, which is friendly: ERROR 3 (HY000): Error writing file '\\xp64\h$\outddds.txt' (Errcode: 22) How to repeat: start server like this: mysqld.exe --no-defaults --console --skip-gr --skip-na --max-allowed-packet=1G --read-buffer-size=128M make sure there exists some usable windows share, and run a query to save a file into it: select repeat('a',@@global.read_buffer_size) into outfile '\\\\xp64\\h$\\outddd.txt'