]> git.pld-linux.org Git - packages/mysql.git/blob - innodb_bug60788.patch
d1e2cc44a918c8b94019bf7642c717867ec9d719
[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 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
13 @@ -2083,6 +2083,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 @@ -2212,6 +2215,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 @@ -2252,7 +2256,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 @@ -2271,6 +2286,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 @@ -2291,7 +2307,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 @@ -2330,6 +2356,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 @@ -2357,7 +2384,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 @@ -2404,7 +2442,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
This page took 0.024666 seconds and 2 git commands to generate.