1 # name : innodb_bug60788.patch
4 # Fix for MySQL bug #60788: InnoDB crashes with an assertion failure when
5 # receiving a signal on pwrite()
7 # Changes InnoDB IO code so that fsync(), pread() and pwrite() are restarted
8 # when interrupted by a signal.
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
17 + } else if (ret == -1 && errno == EINTR) {
18 + /* Handle signal interruptions correctly */
25 #if defined(HAVE_PREAD) && !defined(HAVE_BROKEN_PREAD)
28 #endif /* HAVE_PREAD && !HAVE_BROKEN_PREAD */
31 @@ -2252,7 +2256,18 @@
33 os_mutex_exit(os_file_count_mutex);
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);
42 + } else if (n_read == -1 && errno == EINTR) {
49 os_mutex_enter(os_file_count_mutex);
50 os_file_n_pending_preads--;
56 #ifndef UNIV_HOTBACKUP
58 #endif /* !UNIV_HOTBACKUP */
59 @@ -2291,7 +2307,17 @@
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);
69 + } else if (n_read == -1 && errno == EINTR) {
77 #ifndef UNIV_HOTBACKUP
85 ut_a((offset & 0xFFFFFFFFUL) == offset);
86 @@ -2357,7 +2384,18 @@
87 os_n_pending_writes++;
88 os_mutex_exit(os_file_count_mutex);
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) {
97 + } else if (n_written == -1 && errno == EINTR) {
104 os_mutex_enter(os_file_count_mutex);
105 os_file_n_pending_pwrites--;
106 @@ -2404,7 +2442,17 @@
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) {
116 + } else if (n_written == -1 && errno == EINTR) {
123 # ifdef UNIV_DO_FLUSH
124 if (srv_unix_file_flush_method != SRV_UNIX_LITTLESYNC