]> git.pld-linux.org Git - packages/mysql.git/blame - innodb_bug60788.patch
- disable response-time-distribution patch on arch which has no atomic builtins even...
[packages/mysql.git] / innodb_bug60788.patch
CommitLineData
11822e22
AM
1# name : innodb_bug60788.patch
2# maintainer : Alexey
3#
4# Fix for MySQL bug #60788: InnoDB crashes with an assertion failure when
5# receiving a signal on pwrite()
6#
7# Changes InnoDB IO code so that fsync(), pread() and pwrite() are restarted
8# when interrupted by a signal.
9#
10diff -ruN a/storage/innobase/os/os0file.c b/storage/innobase/os/os0file.c
11--- a/storage/innobase/os/os0file.c 2011-04-20 12:09:57.000000000 +0400
12+++ b/storage/innobase/os/os0file.c 2011-04-20 12:10:04.000000000 +0400
13@@ -2083,6 +2083,9 @@
14 failures++;
15
16 retry = TRUE;
17+ } else if (ret == -1 && errno == EINTR) {
18+ /* Handle signal interruptions correctly */
19+ retry = TRUE;
20 } else {
21
22 retry = FALSE;
23@@ -2212,6 +2215,7 @@
24 off_t offs;
25 #if defined(HAVE_PREAD) && !defined(HAVE_BROKEN_PREAD)
26 ssize_t n_bytes;
27+ ssize_t n_read;
28 #endif /* HAVE_PREAD && !HAVE_BROKEN_PREAD */
29 ulint sec;
30 ulint ms;
31@@ -2252,7 +2256,18 @@
32 os_n_pending_reads++;
33 os_mutex_exit(os_file_count_mutex);
34
35- n_bytes = pread(file, buf, (ssize_t)n, offs);
36+ /* Handle signal interruptions correctly */
37+ for (n_bytes = 0; n_bytes < (ssize_t) n; ) {
38+ n_read = pread(file, buf, (ssize_t)n, offs);
39+ if (n_read > 0) {
40+ n_bytes += n_read;
41+ offs += n_read;
42+ } else if (n_read == -1 && errno == EINTR) {
43+ continue;
44+ } else {
45+ break;
46+ }
47+ }
48
49 os_mutex_enter(os_file_count_mutex);
50 os_file_n_pending_preads--;
51@@ -2271,6 +2286,7 @@
52 {
53 off_t ret_offset;
54 ssize_t ret;
55+ ssize_t n_read;
56 #ifndef UNIV_HOTBACKUP
57 ulint i;
58 #endif /* !UNIV_HOTBACKUP */
59@@ -2291,7 +2307,17 @@
60 if (ret_offset < 0) {
61 ret = -1;
62 } else {
63- ret = read(file, buf, (ssize_t)n);
64+ /* Handle signal interruptions correctly */
65+ for (ret = 0; ret < (ssize_t) n; ) {
66+ n_read = read(file, buf, (ssize_t)n);
67+ if (n_read > 0) {
68+ ret += n_read;
69+ } else if (n_read == -1 && errno == EINTR) {
70+ continue;
71+ } else {
72+ break;
73+ }
74+ }
75 }
76
77 #ifndef UNIV_HOTBACKUP
78@@ -2330,6 +2356,7 @@
79 offset */
80 {
81 ssize_t ret;
82+ ssize_t n_written;
83 off_t offs;
84
85 ut_a((offset & 0xFFFFFFFFUL) == offset);
86@@ -2357,7 +2384,18 @@
87 os_n_pending_writes++;
88 os_mutex_exit(os_file_count_mutex);
89
90- ret = pwrite(file, buf, (ssize_t)n, offs);
91+ /* Handle signal interruptions correctly */
92+ for (ret = 0; ret < (ssize_t) n; ) {
93+ n_written = pwrite(file, buf, (ssize_t)n, offs);
94+ if (n_written > 0) {
95+ ret += n_written;
96+ offs += n_written;
97+ } else if (n_written == -1 && errno == EINTR) {
98+ continue;
99+ } else {
100+ break;
101+ }
102+ }
103
104 os_mutex_enter(os_file_count_mutex);
105 os_file_n_pending_pwrites--;
106@@ -2404,7 +2442,17 @@
107 goto func_exit;
108 }
109
110- ret = write(file, buf, (ssize_t)n);
111+ /* Handle signal interruptions correctly */
112+ for (ret = 0; ret < (ssize_t) n; ) {
113+ n_written = write(file, buf, (ssize_t)n);
114+ if (n_written > 0) {
115+ ret += n_written;
116+ } else if (n_written == -1 && errno == EINTR) {
117+ continue;
118+ } else {
119+ break;
120+ }
121+ }
122
123 # ifdef UNIV_DO_FLUSH
124 if (srv_unix_file_flush_method != SRV_UNIX_LITTLESYNC
This page took 0.053381 seconds and 4 git commands to generate.