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 --- a/storage/innobase/os/os0file.c
11 +++ b/storage/innobase/os/os0file.c
16 + } else if (ret == -1 && errno == EINTR) {
17 + /* Handle signal interruptions correctly */
24 #if defined(HAVE_PREAD) && !defined(HAVE_BROKEN_PREAD)
27 #endif /* HAVE_PREAD && !HAVE_BROKEN_PREAD */
30 @@ -2263,7 +2267,18 @@
32 os_mutex_exit(os_file_count_mutex);
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);
41 + } else if (n_read == -1 && errno == EINTR) {
48 os_mutex_enter(os_file_count_mutex);
49 os_file_n_pending_preads--;
55 #ifndef UNIV_HOTBACKUP
57 #endif /* !UNIV_HOTBACKUP */
58 @@ -2302,7 +2318,17 @@
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);
68 + } else if (n_read == -1 && errno == EINTR) {
76 #ifndef UNIV_HOTBACKUP
84 ut_a((offset & 0xFFFFFFFFUL) == offset);
85 @@ -2368,7 +2395,18 @@
86 os_n_pending_writes++;
87 os_mutex_exit(os_file_count_mutex);
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) {
96 + } else if (n_written == -1 && errno == EINTR) {
103 os_mutex_enter(os_file_count_mutex);
104 os_file_n_pending_pwrites--;
105 @@ -2415,7 +2453,17 @@
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) {
115 + } else if (n_written == -1 && errno == EINTR) {
122 # ifdef UNIV_DO_FLUSH
123 if (srv_unix_file_flush_method != SRV_UNIX_LITTLESYNC