2
by kinoyasu
ported part of Yasufumi patches until innodb_extend_slow.patch |
1 |
# name : innodb_recovery_patches.patch |
2 |
# introduced : 11 or before |
|
3 |
# maintainer : Yasufumi |
|
4 |
# |
|
5 |
#!!! notice !!! |
|
6 |
# Any small change to this file in the main branch |
|
7 |
# should be done or reviewed by the maintainer! |
|
8 |
diff -ruN a/storage/innobase/buf/buf0rea.c b/storage/innobase/buf/buf0rea.c
|
|
9 |
--- a/storage/innobase/buf/buf0rea.c 2010-12-03 15:49:59.187028943 +0900
|
|
10 |
+++ b/storage/innobase/buf/buf0rea.c 2010-12-03 17:30:41.579956150 +0900
|
|
11 |
@@ -122,6 +122,46 @@
|
|
12 |
bpage = buf_page_init_for_read(err, mode, space, zip_size, unzip, |
|
13 |
tablespace_version, offset); |
|
14 |
if (bpage == NULL) { |
|
15 |
+ /* bugfix: http://bugs.mysql.com/bug.php?id=43948 */
|
|
16 |
+ if (recv_recovery_is_on() && *err == DB_TABLESPACE_DELETED) {
|
|
17 |
+ /* hashed log recs must be treated here */
|
|
18 |
+ recv_addr_t* recv_addr;
|
|
19 |
+
|
|
20 |
+ mutex_enter(&(recv_sys->mutex));
|
|
21 |
+
|
|
22 |
+ if (recv_sys->apply_log_recs == FALSE) {
|
|
23 |
+ mutex_exit(&(recv_sys->mutex));
|
|
24 |
+ goto not_to_recover;
|
|
25 |
+ }
|
|
26 |
+
|
|
27 |
+ /* recv_get_fil_addr_struct() */
|
|
28 |
+ recv_addr = HASH_GET_FIRST(recv_sys->addr_hash,
|
|
29 |
+ hash_calc_hash(ut_fold_ulint_pair(space, offset),
|
|
30 |
+ recv_sys->addr_hash));
|
|
31 |
+ while (recv_addr) {
|
|
32 |
+ if ((recv_addr->space == space)
|
|
33 |
+ && (recv_addr->page_no == offset)) {
|
|
34 |
+ break;
|
|
35 |
+ }
|
|
36 |
+ recv_addr = HASH_GET_NEXT(addr_hash, recv_addr);
|
|
37 |
+ }
|
|
38 |
+
|
|
39 |
+ if ((recv_addr == NULL)
|
|
40 |
+ || (recv_addr->state == RECV_BEING_PROCESSED)
|
|
41 |
+ || (recv_addr->state == RECV_PROCESSED)) {
|
|
42 |
+ mutex_exit(&(recv_sys->mutex));
|
|
43 |
+ goto not_to_recover;
|
|
44 |
+ }
|
|
45 |
+
|
|
46 |
+ fprintf(stderr, " (cannot find space: %lu)", space);
|
|
47 |
+ recv_addr->state = RECV_PROCESSED;
|
|
48 |
+
|
|
49 |
+ ut_a(recv_sys->n_addrs);
|
|
50 |
+ recv_sys->n_addrs--;
|
|
51 |
+
|
|
52 |
+ mutex_exit(&(recv_sys->mutex));
|
|
53 |
+ }
|
|
54 |
+not_to_recover:
|
|
55 |
||
56 |
return(0); |
|
57 |
} |
|
109
by kinoyasu
port Yasufumi patches to 5.5.12 |
58 |
@@ -610,6 +650,50 @@
|
2
by kinoyasu
ported part of Yasufumi patches until innodb_extend_slow.patch |
59 |
/* It is a single table tablespace and the .ibd file is |
60 |
missing: do nothing */ |
|
61 |
||
62 |
+ /* the log records should be treated here same reason
|
|
63 |
+ for http://bugs.mysql.com/bug.php?id=43948 */
|
|
64 |
+
|
|
65 |
+ if (recv_recovery_is_on()) {
|
|
66 |
+ recv_addr_t* recv_addr;
|
|
67 |
+
|
|
68 |
+ mutex_enter(&(recv_sys->mutex));
|
|
69 |
+
|
|
70 |
+ if (recv_sys->apply_log_recs == FALSE) {
|
|
71 |
+ mutex_exit(&(recv_sys->mutex));
|
|
72 |
+ goto not_to_recover;
|
|
73 |
+ }
|
|
74 |
+
|
|
75 |
+ for (i = 0; i < n_stored; i++) {
|
|
76 |
+ /* recv_get_fil_addr_struct() */
|
|
77 |
+ recv_addr = HASH_GET_FIRST(recv_sys->addr_hash,
|
|
78 |
+ hash_calc_hash(ut_fold_ulint_pair(space, page_nos[i]),
|
|
79 |
+ recv_sys->addr_hash));
|
|
80 |
+ while (recv_addr) {
|
|
81 |
+ if ((recv_addr->space == space)
|
|
82 |
+ && (recv_addr->page_no == page_nos[i])) {
|
|
83 |
+ break;
|
|
84 |
+ }
|
|
85 |
+ recv_addr = HASH_GET_NEXT(addr_hash, recv_addr);
|
|
86 |
+ }
|
|
87 |
+
|
|
88 |
+ if ((recv_addr == NULL)
|
|
89 |
+ || (recv_addr->state == RECV_BEING_PROCESSED)
|
|
90 |
+ || (recv_addr->state == RECV_PROCESSED)) {
|
|
91 |
+ continue;
|
|
92 |
+ }
|
|
93 |
+
|
|
94 |
+ recv_addr->state = RECV_PROCESSED;
|
|
95 |
+
|
|
96 |
+ ut_a(recv_sys->n_addrs);
|
|
97 |
+ recv_sys->n_addrs--;
|
|
98 |
+ }
|
|
99 |
+
|
|
100 |
+ mutex_exit(&(recv_sys->mutex));
|
|
101 |
+
|
|
102 |
+ fprintf(stderr, " (cannot find space: %lu)", space);
|
|
103 |
+ }
|
|
104 |
+not_to_recover:
|
|
105 |
+
|
|
106 |
return; |
|
107 |
} |
|
108 |
||
109 |
diff -ruN a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
|
|
110 |
--- a/storage/innobase/handler/ha_innodb.cc 2010-12-03 17:30:16.261955714 +0900
|
|
111 |
+++ b/storage/innobase/handler/ha_innodb.cc 2010-12-03 17:30:41.584971130 +0900
|
|
24
by Yasufumi Kinoshita
port Yasufumi's patches to 5.5.8 |
112 |
@@ -182,6 +182,7 @@
|
2
by kinoyasu
ported part of Yasufumi patches until innodb_extend_slow.patch |
113 |
#endif /* UNIV_LOG_ARCHIVE */ |
114 |
static my_bool innobase_use_doublewrite = TRUE; |
|
115 |
static my_bool innobase_use_checksums = TRUE; |
|
116 |
+static my_bool innobase_recovery_stats = TRUE;
|
|
117 |
static my_bool innobase_locks_unsafe_for_binlog = FALSE; |
|
118 |
static my_bool innobase_overwrite_relay_log_info = FALSE; |
|
119 |
static my_bool innobase_rollback_on_timeout = FALSE; |
|
118
by kinoyasu
port Yasufumi patches to 5.5.13 |
120 |
@@ -2576,6 +2577,8 @@
|
2
by kinoyasu
ported part of Yasufumi patches until innodb_extend_slow.patch |
121 |
|
122 |
srv_force_recovery = (ulint) innobase_force_recovery; |
|
123 |
||
124 |
+ srv_recovery_stats = (ibool) innobase_recovery_stats;
|
|
125 |
+
|
|
126 |
srv_use_doublewrite_buf = (ibool) innobase_use_doublewrite; |
|
127 |
srv_use_checksums = (ibool) innobase_use_checksums; |
|
128 |
||
118
by kinoyasu
port Yasufumi patches to 5.5.13 |
129 |
@@ -11274,6 +11277,11 @@
|
2
by kinoyasu
ported part of Yasufumi patches until innodb_extend_slow.patch |
130 |
"The common part for InnoDB table spaces.", |
131 |
NULL, NULL, NULL); |
|
132 |
||
133 |
+static MYSQL_SYSVAR_BOOL(recovery_stats, innobase_recovery_stats,
|
|
134 |
+ PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY,
|
|
135 |
+ "Output statistics of recovery process after it.",
|
|
136 |
+ NULL, NULL, FALSE);
|
|
137 |
+
|
|
88
by Yasufumi Kinoshita
fix bug721611 (rename variables) |
138 |
static MYSQL_SYSVAR_BOOL(recovery_update_relay_log, innobase_overwrite_relay_log_info, |
2
by kinoyasu
ported part of Yasufumi patches until innodb_extend_slow.patch |
139 |
PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY, |
140 |
"During InnoDB crash recovery on slave overwrite relay-log.info " |
|
118
by kinoyasu
port Yasufumi patches to 5.5.13 |
141 |
@@ -11747,6 +11755,7 @@
|
2
by kinoyasu
ported part of Yasufumi patches until innodb_extend_slow.patch |
142 |
MYSQL_SYSVAR(data_file_path), |
143 |
MYSQL_SYSVAR(data_home_dir), |
|
144 |
MYSQL_SYSVAR(doublewrite), |
|
145 |
+ MYSQL_SYSVAR(recovery_stats),
|
|
146 |
MYSQL_SYSVAR(fast_shutdown), |
|
147 |
MYSQL_SYSVAR(file_io_threads), |
|
148 |
MYSQL_SYSVAR(read_io_threads), |
|
149 |
diff -ruN a/storage/innobase/include/log0recv.h b/storage/innobase/include/log0recv.h
|
|
150 |
--- a/storage/innobase/include/log0recv.h 2010-11-03 07:01:13.000000000 +0900
|
|
151 |
+++ b/storage/innobase/include/log0recv.h 2010-12-03 17:30:41.592958318 +0900
|
|
152 |
@@ -438,6 +438,39 @@
|
|
153 |
hash_table_t* addr_hash;/*!< hash table of file addresses of pages */ |
|
154 |
ulint n_addrs;/*!< number of not processed hashed file |
|
155 |
addresses in the hash table */ |
|
156 |
+
|
|
157 |
+/* If you modified the following defines at original file,
|
|
158 |
+ You should also modify them. */
|
|
159 |
+/* defined in os0file.c */
|
|
160 |
+#define OS_AIO_MERGE_N_CONSECUTIVE 64
|
|
161 |
+/* defined in log0recv.c */
|
|
162 |
+#define RECV_READ_AHEAD_AREA 32
|
|
163 |
+ time_t stats_recv_start_time;
|
|
164 |
+ ulint stats_recv_turns;
|
|
165 |
+
|
|
166 |
+ ulint stats_read_requested_pages;
|
|
167 |
+ ulint stats_read_in_area[RECV_READ_AHEAD_AREA];
|
|
168 |
+
|
|
169 |
+ ulint stats_read_io_pages;
|
|
170 |
+ ulint stats_read_io_consecutive[OS_AIO_MERGE_N_CONSECUTIVE];
|
|
171 |
+ ulint stats_write_io_pages;
|
|
172 |
+ ulint stats_write_io_consecutive[OS_AIO_MERGE_N_CONSECUTIVE];
|
|
173 |
+
|
|
174 |
+ ulint stats_doublewrite_check_pages;
|
|
175 |
+ ulint stats_doublewrite_overwrite_pages;
|
|
176 |
+
|
|
177 |
+ ulint stats_recover_pages_with_read;
|
|
178 |
+ ulint stats_recover_pages_without_read;
|
|
179 |
+
|
|
180 |
+ ulint stats_log_recs;
|
|
181 |
+ ulint stats_log_len_sum;
|
|
182 |
+
|
|
183 |
+ ulint stats_applied_log_recs;
|
|
184 |
+ ulint stats_applied_log_len_sum;
|
|
185 |
+ ulint stats_pages_already_new;
|
|
186 |
+
|
|
187 |
+ ib_uint64_t stats_oldest_modified_lsn;
|
|
188 |
+ ib_uint64_t stats_newest_modified_lsn;
|
|
189 |
}; |
|
190 |
||
191 |
/** The recovery system */ |
|
192 |
diff -ruN a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h
|
|
193 |
--- a/storage/innobase/include/srv0srv.h 2010-12-03 17:30:16.321953515 +0900
|
|
194 |
+++ b/storage/innobase/include/srv0srv.h 2010-12-03 17:30:41.593985184 +0900
|
|
118
by kinoyasu
port Yasufumi patches to 5.5.13 |
195 |
@@ -126,6 +126,8 @@
|
2
by kinoyasu
ported part of Yasufumi patches until innodb_extend_slow.patch |
196 |
extern ulint* srv_data_file_sizes; |
197 |
extern ulint* srv_data_file_is_raw_partition; |
|
198 |
||
199 |
+extern ibool srv_recovery_stats;
|
|
200 |
+
|
|
201 |
extern ibool srv_auto_extend_last_data_file; |
|
202 |
extern ulint srv_last_file_size_max; |
|
203 |
extern char** srv_log_group_home_dirs; |
|
204 |
diff -ruN a/storage/innobase/log/log0recv.c b/storage/innobase/log/log0recv.c
|
|
205 |
--- a/storage/innobase/log/log0recv.c 2010-12-03 15:18:48.903987466 +0900
|
|
206 |
+++ b/storage/innobase/log/log0recv.c 2010-12-03 17:30:41.598022536 +0900
|
|
207 |
@@ -187,6 +187,9 @@
|
|
208 |
||
209 |
recv_sys->heap = NULL; |
|
210 |
recv_sys->addr_hash = NULL; |
|
211 |
+
|
|
212 |
+ recv_sys->stats_recv_start_time = time(NULL);
|
|
213 |
+ recv_sys->stats_oldest_modified_lsn = IB_ULONGLONG_MAX;
|
|
214 |
} |
|
215 |
||
216 |
/********************************************************//** |
|
217 |
@@ -327,6 +330,11 @@
|
|
218 |
recv_n_pool_free_frames = 512; |
|
219 |
} |
|
220 |
||
221 |
+ if (buf_pool_get_curr_size() >= (32 * 1024 * 1024)) {
|
|
222 |
+ /* Buffer pool of size greater than 32 MB. */
|
|
223 |
+ recv_n_pool_free_frames = 1024;
|
|
224 |
+ }
|
|
225 |
+
|
|
226 |
recv_sys->buf = ut_malloc(RECV_PARSING_BUF_SIZE); |
|
227 |
recv_sys->len = 0; |
|
228 |
recv_sys->recovered_offset = 0; |
|
229 |
@@ -1363,6 +1371,11 @@
|
|
230 |
||
231 |
len = rec_end - body; |
|
232 |
||
233 |
+ if (srv_recovery_stats) {
|
|
234 |
+ recv_sys->stats_log_recs++;
|
|
235 |
+ recv_sys->stats_log_len_sum += len;
|
|
236 |
+ }
|
|
237 |
+
|
|
238 |
recv = mem_heap_alloc(recv_sys->heap, sizeof(recv_t)); |
|
239 |
recv->type = type; |
|
240 |
recv->len = rec_end - body; |
|
241 |
@@ -1474,6 +1487,7 @@
|
|
242 |
ib_uint64_t start_lsn; |
|
243 |
ib_uint64_t end_lsn; |
|
244 |
ib_uint64_t page_lsn; |
|
245 |
+ ib_uint64_t page_lsn_orig;
|
|
246 |
ib_uint64_t page_newest_lsn; |
|
247 |
ibool modification_to_page; |
|
248 |
#ifndef UNIV_HOTBACKUP |
|
249 |
@@ -1496,6 +1510,8 @@
|
|
250 |
buf_block_get_page_no(block)); |
|
251 |
||
252 |
if ((recv_addr == NULL) |
|
253 |
+ /* bugfix: http://bugs.mysql.com/bug.php?id=44140 */
|
|
254 |
+ || (recv_addr->state == RECV_BEING_READ && !just_read_in)
|
|
255 |
|| (recv_addr->state == RECV_BEING_PROCESSED) |
|
256 |
|| (recv_addr->state == RECV_PROCESSED)) { |
|
257 |
||
258 |
@@ -1511,6 +1527,14 @@
|
|
259 |
||
260 |
recv_addr->state = RECV_BEING_PROCESSED; |
|
261 |
||
262 |
+ if (srv_recovery_stats) {
|
|
263 |
+ if (just_read_in) {
|
|
264 |
+ recv_sys->stats_recover_pages_with_read++;
|
|
265 |
+ } else {
|
|
266 |
+ recv_sys->stats_recover_pages_without_read++;
|
|
267 |
+ }
|
|
268 |
+ }
|
|
269 |
+
|
|
270 |
mutex_exit(&(recv_sys->mutex)); |
|
271 |
||
272 |
mtr_start(&mtr); |
|
273 |
@@ -1540,6 +1564,7 @@
|
|
274 |
||
275 |
/* Read the newest modification lsn from the page */ |
|
276 |
page_lsn = mach_read_from_8(page + FIL_PAGE_LSN); |
|
277 |
+ page_lsn_orig = page_lsn;
|
|
278 |
||
279 |
#ifndef UNIV_HOTBACKUP |
|
280 |
/* It may be that the page has been modified in the buffer |
|
281 |
@@ -1559,6 +1584,21 @@
|
|
282 |
modification_to_page = FALSE; |
|
283 |
start_lsn = end_lsn = 0; |
|
284 |
||
285 |
+ if (srv_recovery_stats) {
|
|
286 |
+ mutex_enter(&(recv_sys->mutex));
|
|
287 |
+ if (page_lsn_orig && recv_sys->stats_oldest_modified_lsn > page_lsn_orig) {
|
|
288 |
+ recv_sys->stats_oldest_modified_lsn = page_lsn_orig;
|
|
289 |
+ }
|
|
290 |
+ if (page_lsn_orig && recv_sys->stats_newest_modified_lsn < page_lsn_orig) {
|
|
291 |
+ recv_sys->stats_newest_modified_lsn = page_lsn_orig;
|
|
292 |
+ }
|
|
293 |
+ if (UT_LIST_GET_LAST(recv_addr->rec_list)->start_lsn
|
|
294 |
+ < page_lsn_orig) {
|
|
295 |
+ recv_sys->stats_pages_already_new++;
|
|
296 |
+ }
|
|
297 |
+ mutex_exit(&(recv_sys->mutex));
|
|
298 |
+ }
|
|
299 |
+
|
|
300 |
recv = UT_LIST_GET_FIRST(recv_addr->rec_list); |
|
301 |
||
302 |
while (recv) { |
|
303 |
@@ -1613,6 +1653,13 @@
|
|
304 |
buf + recv->len, |
|
305 |
block, &mtr); |
|
306 |
||
307 |
+ if (srv_recovery_stats) {
|
|
308 |
+ mutex_enter(&(recv_sys->mutex));
|
|
309 |
+ recv_sys->stats_applied_log_recs++;
|
|
310 |
+ recv_sys->stats_applied_log_len_sum += recv->len;
|
|
311 |
+ mutex_exit(&(recv_sys->mutex));
|
|
312 |
+ }
|
|
313 |
+
|
|
314 |
end_lsn = recv->start_lsn + recv->len; |
|
315 |
mach_write_to_8(FIL_PAGE_LSN + page, end_lsn); |
|
316 |
mach_write_to_8(UNIV_PAGE_SIZE |
|
317 |
@@ -1715,6 +1762,13 @@
|
|
318 |
} |
|
319 |
} |
|
320 |
||
321 |
+ if (srv_recovery_stats && n) {
|
|
322 |
+ mutex_enter(&(recv_sys->mutex));
|
|
323 |
+ recv_sys->stats_read_requested_pages += n;
|
|
324 |
+ recv_sys->stats_read_in_area[n - 1]++;
|
|
325 |
+ mutex_exit(&(recv_sys->mutex));
|
|
326 |
+ }
|
|
327 |
+
|
|
328 |
buf_read_recv_pages(FALSE, space, zip_size, page_nos, n); |
|
329 |
/* |
|
330 |
fprintf(stderr, "Recv pages at %lu n %lu\n", page_nos[0], n); |
|
331 |
@@ -1867,6 +1921,10 @@
|
|
332 |
||
333 |
if (has_printed) { |
|
334 |
fprintf(stderr, "InnoDB: Apply batch completed\n"); |
|
335 |
+
|
|
336 |
+ if (srv_recovery_stats) {
|
|
337 |
+ recv_sys->stats_recv_turns++;
|
|
338 |
+ }
|
|
339 |
} |
|
340 |
||
341 |
mutex_exit(&(recv_sys->mutex)); |
|
342 |
@@ -3270,6 +3328,90 @@
|
|
343 |
} |
|
344 |
#endif /* UNIV_DEBUG */ |
|
345 |
||
346 |
+ if (recv_needed_recovery && srv_recovery_stats) {
|
|
347 |
+ ulint flush_list_len = 0;
|
|
348 |
+ ulint i;
|
|
349 |
+
|
|
350 |
+ fprintf(stderr,
|
|
58.1.1
by Fred Linhoss
Reworded text strings in patch file print statements. |
351 |
+ "InnoDB: Log records have been applied. The statistics that were gathered follow.\n");
|
2
by kinoyasu
ported part of Yasufumi patches until innodb_extend_slow.patch |
352 |
+
|
353 |
+ fprintf(stderr,
|
|
354 |
+ "============================================================\n"
|
|
355 |
+ "-------------------\n"
|
|
356 |
+ "RECOVERY STATISTICS\n"
|
|
357 |
+ "-------------------\n");
|
|
358 |
+ fprintf(stderr,
|
|
359 |
+ "Recovery time: %g sec. (%lu turns)\n",
|
|
360 |
+ difftime(time(NULL), recv_sys->stats_recv_start_time),
|
|
361 |
+ recv_sys->stats_recv_turns);
|
|
362 |
+
|
|
363 |
+ for (i = 0; i < srv_buf_pool_instances; i++) {
|
|
364 |
+ buf_pool_t* buf_pool;
|
|
365 |
+
|
|
366 |
+ buf_pool = buf_pool_from_array(i);
|
|
367 |
+ flush_list_len += UT_LIST_GET_LEN(buf_pool->flush_list);
|
|
368 |
+ }
|
|
369 |
+ fprintf(stderr,
|
|
370 |
+ "\n"
|
|
371 |
+ "Data page IO statistics\n"
|
|
372 |
+ " Requested pages: %lu\n"
|
|
373 |
+ " Read pages: %lu\n"
|
|
374 |
+ " Written pages: %lu\n"
|
|
375 |
+ " (Dirty blocks): %lu\n",
|
|
376 |
+ recv_sys->stats_read_requested_pages,
|
|
377 |
+ recv_sys->stats_read_io_pages,
|
|
378 |
+ recv_sys->stats_write_io_pages,
|
|
379 |
+ flush_list_len);
|
|
380 |
+
|
|
381 |
+ fprintf(stderr,
|
|
382 |
+ " Grouping IO [times]:\n"
|
|
383 |
+ "\tnumber of pages,\n"
|
|
384 |
+ "\t\tread request neighbors (in %d pages chunk),\n"
|
|
385 |
+ "\t\t\tcombined read IO,\n"
|
|
386 |
+ "\t\t\t\tcombined write IO\n",
|
|
387 |
+ RECV_READ_AHEAD_AREA);
|
|
388 |
+ for (i = 0; i < ut_max(RECV_READ_AHEAD_AREA,
|
|
389 |
+ OS_AIO_MERGE_N_CONSECUTIVE); i++) {
|
|
390 |
+ fprintf(stderr,
|
|
391 |
+ "\t%3lu,\t%lu,\t%lu,\t%lu\n", i + 1,
|
|
392 |
+ (i < RECV_READ_AHEAD_AREA) ?
|
|
393 |
+ recv_sys->stats_read_in_area[i] : 0,
|
|
394 |
+ (i < OS_AIO_MERGE_N_CONSECUTIVE) ?
|
|
395 |
+ recv_sys->stats_read_io_consecutive[i] : 0,
|
|
396 |
+ (i < OS_AIO_MERGE_N_CONSECUTIVE) ?
|
|
397 |
+ recv_sys->stats_write_io_consecutive[i] : 0);
|
|
398 |
+ }
|
|
399 |
+
|
|
400 |
+ fprintf(stderr,
|
|
401 |
+ "\n"
|
|
402 |
+ "Recovery process statistics\n"
|
|
403 |
+ " Checked pages by doublewrite buffer: %lu\n"
|
|
404 |
+ " Overwritten pages from doublewrite: %lu\n"
|
|
405 |
+ " Recovered pages by io_thread: %lu\n"
|
|
406 |
+ " Recovered pages by main thread: %lu\n"
|
|
407 |
+ " Parsed log records to apply: %lu\n"
|
|
408 |
+ " Sum of the length: %lu\n"
|
|
409 |
+ " Applied log records: %lu\n"
|
|
410 |
+ " Sum of the length: %lu\n"
|
|
411 |
+ " Pages which are already new enough: %lu (It may not be accurate, if turns > 1)\n"
|
|
412 |
+ " Oldest page's LSN: %llu\n"
|
|
413 |
+ " Newest page's LSN: %llu\n",
|
|
414 |
+ recv_sys->stats_doublewrite_check_pages,
|
|
415 |
+ recv_sys->stats_doublewrite_overwrite_pages,
|
|
416 |
+ recv_sys->stats_recover_pages_with_read,
|
|
417 |
+ recv_sys->stats_recover_pages_without_read,
|
|
418 |
+ recv_sys->stats_log_recs,
|
|
419 |
+ recv_sys->stats_log_len_sum,
|
|
420 |
+ recv_sys->stats_applied_log_recs,
|
|
421 |
+ recv_sys->stats_applied_log_len_sum,
|
|
422 |
+ recv_sys->stats_pages_already_new,
|
|
423 |
+ recv_sys->stats_oldest_modified_lsn,
|
|
424 |
+ recv_sys->stats_newest_modified_lsn);
|
|
425 |
+
|
|
426 |
+ fprintf(stderr,
|
|
427 |
+ "============================================================\n");
|
|
428 |
+ }
|
|
429 |
+
|
|
430 |
if (recv_needed_recovery) { |
|
431 |
trx_sys_print_mysql_master_log_pos(); |
|
432 |
trx_sys_print_mysql_binlog_offset(); |
|
433 |
diff -ruN a/storage/innobase/os/os0file.c b/storage/innobase/os/os0file.c
|
|
434 |
--- a/storage/innobase/os/os0file.c 2010-12-03 15:18:48.908955759 +0900
|
|
435 |
+++ b/storage/innobase/os/os0file.c 2010-12-03 17:30:41.602022989 +0900
|
|
436 |
@@ -43,6 +43,7 @@
|
|
437 |
#include "srv0start.h" |
|
438 |
#include "fil0fil.h" |
|
439 |
#include "buf0buf.h" |
|
440 |
+#include "log0recv.h"
|
|
441 |
#ifndef UNIV_HOTBACKUP |
|
442 |
# include "os0sync.h" |
|
443 |
# include "os0thread.h" |
|
118
by kinoyasu
port Yasufumi patches to 5.5.13 |
444 |
@@ -4260,6 +4261,18 @@
|
445 |
INFINITE); |
|
2
by kinoyasu
ported part of Yasufumi patches until innodb_extend_slow.patch |
446 |
} |
447 |
||
448 |
+ if (srv_recovery_stats && recv_recovery_is_on() && n_consecutive) {
|
|
449 |
+ mutex_enter(&(recv_sys->mutex));
|
|
450 |
+ if (slot->type == OS_FILE_READ) {
|
|
451 |
+ recv_sys->stats_read_io_pages += n_consecutive;
|
|
452 |
+ recv_sys->stats_read_io_consecutive[n_consecutive - 1]++;
|
|
453 |
+ } else if (slot->type == OS_FILE_WRITE) {
|
|
454 |
+ recv_sys->stats_write_io_pages += n_consecutive;
|
|
455 |
+ recv_sys->stats_write_io_consecutive[n_consecutive - 1]++;
|
|
456 |
+ }
|
|
457 |
+ mutex_exit(&(recv_sys->mutex));
|
|
458 |
+ }
|
|
459 |
+
|
|
460 |
os_mutex_enter(array->mutex); |
|
461 |
||
118
by kinoyasu
port Yasufumi patches to 5.5.13 |
462 |
if (srv_shutdown_state == SRV_SHUTDOWN_EXIT_THREADS |
2
by kinoyasu
ported part of Yasufumi patches until innodb_extend_slow.patch |
463 |
diff -ruN a/storage/innobase/srv/srv0srv.c b/storage/innobase/srv/srv0srv.c
|
464 |
--- a/storage/innobase/srv/srv0srv.c 2010-12-03 17:30:16.339955597 +0900
|
|
465 |
+++ b/storage/innobase/srv/srv0srv.c 2010-12-03 17:30:41.604958138 +0900
|
|
118
by kinoyasu
port Yasufumi patches to 5.5.13 |
466 |
@@ -160,6 +160,8 @@
|
2
by kinoyasu
ported part of Yasufumi patches until innodb_extend_slow.patch |
467 |
/* size in database pages */ |
468 |
UNIV_INTERN ulint* srv_data_file_sizes = NULL; |
|
469 |
||
470 |
+UNIV_INTERN ibool srv_recovery_stats = FALSE;
|
|
471 |
+
|
|
472 |
/* if TRUE, then we auto-extend the last data file */ |
|
473 |
UNIV_INTERN ibool srv_auto_extend_last_data_file = FALSE; |
|
474 |
/* if != 0, this tells the max size auto-extending may increase the |
|
475 |
diff -ruN a/storage/innobase/trx/trx0sys.c b/storage/innobase/trx/trx0sys.c
|
|
476 |
--- a/storage/innobase/trx/trx0sys.c 2010-12-03 15:41:52.051986524 +0900
|
|
477 |
+++ b/storage/innobase/trx/trx0sys.c 2010-12-03 17:30:41.607026818 +0900
|
|
118
by kinoyasu
port Yasufumi patches to 5.5.13 |
478 |
@@ -567,6 +567,12 @@
|
2
by kinoyasu
ported part of Yasufumi patches until innodb_extend_slow.patch |
479 |
zip_size ? zip_size : UNIV_PAGE_SIZE, |
480 |
read_buf, NULL); |
|
481 |
||
482 |
+ if (srv_recovery_stats && recv_recovery_is_on()) {
|
|
483 |
+ mutex_enter(&(recv_sys->mutex));
|
|
484 |
+ recv_sys->stats_doublewrite_check_pages++;
|
|
485 |
+ mutex_exit(&(recv_sys->mutex));
|
|
486 |
+ }
|
|
487 |
+
|
|
488 |
/* Check if the page is corrupt */ |
|
489 |
||
490 |
if (UNIV_UNLIKELY |
|
118
by kinoyasu
port Yasufumi patches to 5.5.13 |
491 |
@@ -614,6 +620,13 @@
|
2
by kinoyasu
ported part of Yasufumi patches until innodb_extend_slow.patch |
492 |
zip_size, page_no, 0, |
493 |
zip_size ? zip_size : UNIV_PAGE_SIZE, |
|
494 |
page, NULL); |
|
495 |
+
|
|
496 |
+ if (srv_recovery_stats && recv_recovery_is_on()) {
|
|
497 |
+ mutex_enter(&(recv_sys->mutex));
|
|
498 |
+ recv_sys->stats_doublewrite_overwrite_pages++;
|
|
499 |
+ mutex_exit(&(recv_sys->mutex));
|
|
500 |
+ }
|
|
501 |
+
|
|
502 |
fprintf(stderr, |
|
503 |
"InnoDB: Recovered the page from" |
|
504 |
" the doublewrite buffer.\n"); |