]> git.pld-linux.org Git - packages/mysql.git/blob - innodb_bug60788.patch
- rel. 2
[packages/mysql.git] / innodb_bug60788.patch
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 --- a/storage/innobase/os/os0file.c
11 +++ b/storage/innobase/os/os0file.c
12 @@ -2093,6 +2093,9 @@
13                         failures++;
14  
15                         retry = TRUE;
16 +               } else if (ret == -1 && errno == EINTR) {
17 +                       /* Handle signal interruptions correctly */
18 +                       retry = TRUE;
19                 } else {
20  
21                         retry = FALSE;
22 @@ -2223,6 +2226,7 @@
23         off_t   offs;
24  #if defined(HAVE_PREAD) && !defined(HAVE_BROKEN_PREAD)
25         ssize_t n_bytes;
26 +       ssize_t n_read;
27  #endif /* HAVE_PREAD && !HAVE_BROKEN_PREAD */
28         ulint           sec;
29         ulint           ms;
30 @@ -2263,7 +2267,18 @@
31         os_n_pending_reads++;
32         os_mutex_exit(os_file_count_mutex);
33  
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);
38 +               if (n_read > 0) {
39 +                       n_bytes += n_read;
40 +                       offs += n_read;
41 +               } else if (n_read == -1 && errno == EINTR) {
42 +                       continue;
43 +               } else {
44 +                       break;
45 +               }
46 +       }
47  
48         os_mutex_enter(os_file_count_mutex);
49         os_file_n_pending_preads--;
50 @@ -2282,6 +2297,7 @@
51         {
52                 off_t   ret_offset;
53                 ssize_t ret;
54 +               ssize_t n_read;
55  #ifndef UNIV_HOTBACKUP
56                 ulint   i;
57  #endif /* !UNIV_HOTBACKUP */
58 @@ -2302,7 +2318,17 @@
59                 if (ret_offset < 0) {
60                         ret = -1;
61                 } else {
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);
66 +                               if (n_read > 0) {
67 +                                       ret += n_read;
68 +                               } else if (n_read == -1 && errno == EINTR) {
69 +                                       continue;
70 +                               } else {
71 +                                       break;
72 +                               }
73 +                       }
74                 }
75  
76  #ifndef UNIV_HOTBACKUP
77 @@ -2341,6 +2367,7 @@
78                                 offset */
79  {
80         ssize_t ret;
81 +       ssize_t n_written;
82         off_t   offs;
83  
84         ut_a((offset & 0xFFFFFFFFUL) == offset);
85 @@ -2368,7 +2395,18 @@
86         os_n_pending_writes++;
87         os_mutex_exit(os_file_count_mutex);
88  
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) {
94 +                       ret += n_written;
95 +                       offs += n_written;
96 +               } else if (n_written == -1 && errno == EINTR) {
97 +                       continue;
98 +               } else {
99 +                       break;
100 +               }
101 +       }
102  
103         os_mutex_enter(os_file_count_mutex);
104         os_file_n_pending_pwrites--;
105 @@ -2415,7 +2453,17 @@
106                         goto func_exit;
107                 }
108  
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) {
114 +                               ret += n_written;
115 +                       } else if (n_written == -1 && errno == EINTR) {
116 +                               continue;
117 +                       } else {
118 +                               break;
119 +                       }
120 +               }
121  
122  # ifdef UNIV_DO_FLUSH
123                 if (srv_unix_file_flush_method != SRV_UNIX_LITTLESYNC
This page took 0.069001 seconds and 3 git commands to generate.