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
=== added file 'innodb_bug60788.patch'
--- innodb_bug60788.patch 1970-01-01 00:00:00 +0000
+++ innodb_bug60788.patch 2011-04-20 07:15:50 +0000
@@ -0,0 +1,124 @@
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/innodb_plugin/os/os0file.c b/storage/innodb_plugin/os/os0file.c
11--- a/storage/innodb_plugin/os/os0file.c 2011-04-18 13:21:07.000000000 +0400
12+++ b/storage/innodb_plugin/os/os0file.c 2011-04-18 17:38:21.000000000 +0400
13@@ -1978,6 +1978,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@@ -2109,6 +2112,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@@ -2149,7 +2153,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@@ -2168,6 +2183,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@@ -2188,7 +2204,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@@ -2227,6 +2253,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@@ -2254,7 +2281,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@@ -2301,7 +2339,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
0125
=== modified file 'series'
--- series 2011-03-31 11:16:54 +0000
+++ series 2011-04-20 07:15:50 +0000
@@ -54,4 +54,5 @@
54fix-bug671764.patch54fix-bug671764.patch
55mysql_remove_eol_carret.patch55mysql_remove_eol_carret.patch
56innodb_expand_fast_index_creation.patch56innodb_expand_fast_index_creation.patch
57innodb_bug60788.patch
5758

Subscribers

People subscribed via source and target branches