]>
Commit | Line | Data |
---|---|---|
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 | # | |
db82db79 AM |
10 | --- a/storage/innobase/os/os0file.c |
11 | +++ b/storage/innobase/os/os0file.c | |
12 | @@ -2093,6 +2093,9 @@ | |
11822e22 AM |
13 | failures++; |
14 | ||
15 | retry = TRUE; | |
16 | + } else if (ret == -1 && errno == EINTR) { | |
17 | + /* Handle signal interruptions correctly */ | |
18 | + retry = TRUE; | |
19 | } else { | |
20 | ||
21 | retry = FALSE; | |
db82db79 | 22 | @@ -2223,6 +2226,7 @@ |
11822e22 AM |
23 | off_t offs; |
24 | #if defined(HAVE_PREAD) && !defined(HAVE_BROKEN_PREAD) | |
25 | ssize_t n_bytes; | |
26 | + ssize_t n_read; | |
27 | #endif /* HAVE_PREAD && !HAVE_BROKEN_PREAD */ | |
28 | ulint sec; | |
29 | ulint ms; | |
db82db79 | 30 | @@ -2263,7 +2267,18 @@ |
11822e22 AM |
31 | os_n_pending_reads++; |
32 | os_mutex_exit(os_file_count_mutex); | |
33 | ||
34 | - n_bytes = pread(file, buf, (ssize_t)n, offs); | |
35 | + /* Handle signal interruptions correctly */ | |
36 | + for (n_bytes = 0; n_bytes < (ssize_t) n; ) { | |
37 | + n_read = pread(file, buf, (ssize_t)n, offs); | |
38 | + if (n_read > 0) { | |
39 | + n_bytes += n_read; | |
40 | + offs += n_read; | |
41 | + } else if (n_read == -1 && errno == EINTR) { | |
42 | + continue; | |
43 | + } else { | |
44 | + break; | |
45 | + } | |
46 | + } | |
47 | ||
48 | os_mutex_enter(os_file_count_mutex); | |
49 | os_file_n_pending_preads--; | |
db82db79 | 50 | @@ -2282,6 +2297,7 @@ |
11822e22 AM |
51 | { |
52 | off_t ret_offset; | |
53 | ssize_t ret; | |
54 | + ssize_t n_read; | |
55 | #ifndef UNIV_HOTBACKUP | |
56 | ulint i; | |
57 | #endif /* !UNIV_HOTBACKUP */ | |
db82db79 | 58 | @@ -2302,7 +2318,17 @@ |
11822e22 AM |
59 | if (ret_offset < 0) { |
60 | ret = -1; | |
61 | } else { | |
62 | - ret = read(file, buf, (ssize_t)n); | |
63 | + /* Handle signal interruptions correctly */ | |
64 | + for (ret = 0; ret < (ssize_t) n; ) { | |
65 | + n_read = read(file, buf, (ssize_t)n); | |
66 | + if (n_read > 0) { | |
67 | + ret += n_read; | |
68 | + } else if (n_read == -1 && errno == EINTR) { | |
69 | + continue; | |
70 | + } else { | |
71 | + break; | |
72 | + } | |
73 | + } | |
74 | } | |
75 | ||
76 | #ifndef UNIV_HOTBACKUP | |
db82db79 | 77 | @@ -2341,6 +2367,7 @@ |
11822e22 AM |
78 | offset */ |
79 | { | |
80 | ssize_t ret; | |
81 | + ssize_t n_written; | |
82 | off_t offs; | |
83 | ||
84 | ut_a((offset & 0xFFFFFFFFUL) == offset); | |
db82db79 | 85 | @@ -2368,7 +2395,18 @@ |
11822e22 AM |
86 | os_n_pending_writes++; |
87 | os_mutex_exit(os_file_count_mutex); | |
88 | ||
89 | - ret = pwrite(file, buf, (ssize_t)n, offs); | |
90 | + /* Handle signal interruptions correctly */ | |
91 | + for (ret = 0; ret < (ssize_t) n; ) { | |
92 | + n_written = pwrite(file, buf, (ssize_t)n, offs); | |
93 | + if (n_written > 0) { | |
94 | + ret += n_written; | |
95 | + offs += n_written; | |
96 | + } else if (n_written == -1 && errno == EINTR) { | |
97 | + continue; | |
98 | + } else { | |
99 | + break; | |
100 | + } | |
101 | + } | |
102 | ||
103 | os_mutex_enter(os_file_count_mutex); | |
104 | os_file_n_pending_pwrites--; | |
db82db79 | 105 | @@ -2415,7 +2453,17 @@ |
11822e22 AM |
106 | goto func_exit; |
107 | } | |
108 | ||
109 | - ret = write(file, buf, (ssize_t)n); | |
110 | + /* Handle signal interruptions correctly */ | |
111 | + for (ret = 0; ret < (ssize_t) n; ) { | |
112 | + n_written = write(file, buf, (ssize_t)n); | |
113 | + if (n_written > 0) { | |
114 | + ret += n_written; | |
115 | + } else if (n_written == -1 && errno == EINTR) { | |
116 | + continue; | |
117 | + } else { | |
118 | + break; | |
119 | + } | |
120 | + } | |
121 | ||
122 | # ifdef UNIV_DO_FLUSH | |
123 | if (srv_unix_file_flush_method != SRV_UNIX_LITTLESYNC |