]>
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 | # | |
10 | diff -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 |