Merge lp:~percona-dev/percona-server/bug746395 into lp:~percona-dev/percona-server/5.1.56

Proposed by Alexey Kopytov
Status: Merged
Merged at revision: 223
Proposed branch: lp:~percona-dev/percona-server/bug746395
Merge into: lp:~percona-dev/percona-server/5.1.56
Diff against target: 137 lines (+125/-0)
2 files modified
innodb_bug60788.patch (+124/-0)
series (+1/-0)
To merge this branch: bzr merge lp:~percona-dev/percona-server/bug746395
Reviewer Review Type Date Requested Status
Yasufumi Kinoshita (community) Approve
Review via email: mp+58130@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Yasufumi Kinoshita (yasufumi-kinoshita) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'innodb_bug60788.patch'
2--- innodb_bug60788.patch 1970-01-01 00:00:00 +0000
3+++ innodb_bug60788.patch 2011-04-20 07:15:50 +0000
4@@ -0,0 +1,124 @@
5+# name : innodb_bug60788.patch
6+# maintainer : Alexey
7+#
8+# Fix for MySQL bug #60788: InnoDB crashes with an assertion failure when
9+# receiving a signal on pwrite()
10+#
11+# Changes InnoDB IO code so that fsync(), pread() and pwrite() are restarted
12+# when interrupted by a signal.
13+#
14+diff -ruN a/storage/innodb_plugin/os/os0file.c b/storage/innodb_plugin/os/os0file.c
15+--- a/storage/innodb_plugin/os/os0file.c 2011-04-18 13:21:07.000000000 +0400
16++++ b/storage/innodb_plugin/os/os0file.c 2011-04-18 17:38:21.000000000 +0400
17+@@ -1978,6 +1978,9 @@
18+ failures++;
19+
20+ retry = TRUE;
21++ } else if (ret == -1 && errno == EINTR) {
22++ /* Handle signal interruptions correctly */
23++ retry = TRUE;
24+ } else {
25+
26+ retry = FALSE;
27+@@ -2109,6 +2112,7 @@
28+ off_t offs;
29+ #if defined(HAVE_PREAD) && !defined(HAVE_BROKEN_PREAD)
30+ ssize_t n_bytes;
31++ ssize_t n_read;
32+ #endif /* HAVE_PREAD && !HAVE_BROKEN_PREAD */
33+ ulint sec;
34+ ulint ms;
35+@@ -2149,7 +2153,18 @@
36+ os_n_pending_reads++;
37+ os_mutex_exit(os_file_count_mutex);
38+
39+- n_bytes = pread(file, buf, (ssize_t)n, offs);
40++ /* Handle signal interruptions correctly */
41++ for (n_bytes = 0; n_bytes < (ssize_t) n; ) {
42++ n_read = pread(file, buf, (ssize_t)n, offs);
43++ if (n_read > 0) {
44++ n_bytes += n_read;
45++ offs += n_read;
46++ } else if (n_read == -1 && errno == EINTR) {
47++ continue;
48++ } else {
49++ break;
50++ }
51++ }
52+
53+ os_mutex_enter(os_file_count_mutex);
54+ os_file_n_pending_preads--;
55+@@ -2168,6 +2183,7 @@
56+ {
57+ off_t ret_offset;
58+ ssize_t ret;
59++ ssize_t n_read;
60+ #ifndef UNIV_HOTBACKUP
61+ ulint i;
62+ #endif /* !UNIV_HOTBACKUP */
63+@@ -2188,7 +2204,17 @@
64+ if (ret_offset < 0) {
65+ ret = -1;
66+ } else {
67+- ret = read(file, buf, (ssize_t)n);
68++ /* Handle signal interruptions correctly */
69++ for (ret = 0; ret < (ssize_t) n; ) {
70++ n_read = read(file, buf, (ssize_t)n);
71++ if (n_read > 0) {
72++ ret += n_read;
73++ } else if (n_read == -1 && errno == EINTR) {
74++ continue;
75++ } else {
76++ break;
77++ }
78++ }
79+ }
80+
81+ #ifndef UNIV_HOTBACKUP
82+@@ -2227,6 +2253,7 @@
83+ offset */
84+ {
85+ ssize_t ret;
86++ ssize_t n_written;
87+ off_t offs;
88+
89+ ut_a((offset & 0xFFFFFFFFUL) == offset);
90+@@ -2254,7 +2281,18 @@
91+ os_n_pending_writes++;
92+ os_mutex_exit(os_file_count_mutex);
93+
94+- ret = pwrite(file, buf, (ssize_t)n, offs);
95++ /* Handle signal interruptions correctly */
96++ for (ret = 0; ret < (ssize_t) n; ) {
97++ n_written = pwrite(file, buf, (ssize_t)n, offs);
98++ if (n_written > 0) {
99++ ret += n_written;
100++ offs += n_written;
101++ } else if (n_written == -1 && errno == EINTR) {
102++ continue;
103++ } else {
104++ break;
105++ }
106++ }
107+
108+ os_mutex_enter(os_file_count_mutex);
109+ os_file_n_pending_pwrites--;
110+@@ -2301,7 +2339,17 @@
111+ goto func_exit;
112+ }
113+
114+- ret = write(file, buf, (ssize_t)n);
115++ /* Handle signal interruptions correctly */
116++ for (ret = 0; ret < (ssize_t) n; ) {
117++ n_written = write(file, buf, (ssize_t)n);
118++ if (n_written > 0) {
119++ ret += n_written;
120++ } else if (n_written == -1 && errno == EINTR) {
121++ continue;
122++ } else {
123++ break;
124++ }
125++ }
126+
127+ # ifdef UNIV_DO_FLUSH
128+ if (srv_unix_file_flush_method != SRV_UNIX_LITTLESYNC
129
130=== modified file 'series'
131--- series 2011-03-31 11:16:54 +0000
132+++ series 2011-04-20 07:15:50 +0000
133@@ -54,4 +54,5 @@
134 fix-bug671764.patch
135 mysql_remove_eol_carret.patch
136 innodb_expand_fast_index_creation.patch
137+innodb_bug60788.patch
138

Subscribers

People subscribed via source and target branches