| Bug #82886 | Server may crash due to a glibc bug in handling short-lived detached threads | ||
|---|---|---|---|
| Submitted: | 7 Sep 2016 10:44 | Modified: | 4 Oct 2016 16:31 |
| Reporter: | Laurynas Biveinis (OCA) | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: InnoDB storage engine | Severity: | S1 (Critical) |
| Version: | 5.6 | OS: | Linux |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | glibc, pthreads | ||
[7 Sep 2016 10:44]
Laurynas Biveinis
[7 Sep 2016 10:46]
Laurynas Biveinis
A standalone C program to show the bug:
#include <pthread.h>
#include <stdio.h>
void *thread_routine(void *arg __attribute__((unused)))
{
pthread_exit(0);
return NULL;
}
int main(void)
{
for (int i = 0; i < 32000; i++) {
pthread_t thread_handle;
pthread_attr_t thread_attr;
int err = pthread_attr_init(&thread_attr);
if (err != 0) {
perror("pthread_attr_init");
return 1;
}
err = pthread_attr_setdetachstate(&thread_attr,
PTHREAD_CREATE_DETACHED);
if (err != 0) {
perror("pthread_attr_setdetachstate");
return 4;
}
err = pthread_create(&thread_handle, &thread_attr, &thread_routine,
NULL);
if (err != 0) {
perror("pthread_create");
return 2;
}
err = pthread_attr_destroy(&thread_attr);
if (err != 0) {
perror("pthread_attr_destroy");
return 3;
}
}
return 0;
}
On my VM (Ubuntu 16.04 x86_64), running two copies in parallel crash about every third time. It differs from server source in the use of thread attributes instead of pthread_detach, but this does not appear to be a relevant difference.
[7 Sep 2016 13:35]
MySQL Verification Team
Hello Laurynas, Thank you for the report and test case. Observed the issue using provided 'C' test case on Ubuntu 16.04. Thanks, Umesh
[8 Sep 2016 13:25]
Laurynas Biveinis
Bug 82886 fix for 5.6 (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: bug82886-5.6.patch (application/octet-stream, text), 3.35 KiB.
[8 Sep 2016 13:26]
Laurynas Biveinis
Bug 82886 5.7 patch (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: bug82886-5.7.patch (application/octet-stream, text), 0 bytes.
[8 Sep 2016 13:28]
Laurynas Biveinis
The contributed fixes: - make no attempt to support Windows threads; - strive to be minimal. If they needed not to, then I'd also look into removing FTS_CHILD_EXITING and its associated code, which now looks mostly duplicated by joining.
[8 Sep 2016 13:32]
Laurynas Biveinis
Bug 82886 fix for 5.7, non-empty file this time (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: bug82886-5.7.patch (application/octet-stream, text), 3.94 KiB.
[12 Sep 2016 8:11]
Vasil Dimov
Laurynas, Thank you very much! The patches have been reviewed and pushed to mysql-5.6 (1a08bd0, 5.6.34) and mysql-5.7 (f8fe0bf, 5.7.16). mysql-trunk does not exhibit this problem.
[4 Oct 2016 16:31]
Daniel Price
Posted by developer: Fixed as of the upcoming 5.6.34, 5.7.16, 8.0.1 release, and here's the changelog entry: Due to a glibc bug, short-lived detached threads could exit before the caller has returned from pthread_create(), causing a server exit. Thanks to Laurynas Biveinis for the patch.
[4 Oct 2016 17:41]
Daniel Price
Posted by developer: The fix is in 5.6.35, 5.7.17, and 8.0.1. The changelog entry was updated accordingly.
