#!!! notice !!!
# Any small change to this file in the main branch
# should be done or reviewed by the maintainer!
-diff -ruN a/storage/innobase/btr/btr0btr.c b/storage/innobase/btr/btr0btr.c
---- a/storage/innobase/btr/btr0btr.c 2010-11-03 07:01:13.000000000 +0900
-+++ b/storage/innobase/btr/btr0btr.c 2010-12-04 15:38:18.110513593 +0900
-@@ -691,6 +691,12 @@
- root_page_no = dict_index_get_page(index);
+--- a/storage/innobase/btr/btr0btr.c
++++ b/storage/innobase/btr/btr0btr.c
+@@ -713,6 +713,12 @@
- block = btr_block_get(space, zip_size, root_page_no, RW_X_LATCH, mtr);
+ block = btr_block_get(space, zip_size, root_page_no, RW_X_LATCH,
+ index, mtr);
+
+ if (srv_pass_corrupt_table && !block) {
+ return(0);
+ }
+ ut_a(block);
+
- ut_a((ibool)!!page_is_comp(buf_block_get_frame(block))
- == dict_table_is_comp(index->table));
+ btr_assert_not_corrupted(block, index);
#ifdef UNIV_BTR_DEBUG
-@@ -977,6 +983,12 @@
+ if (!dict_index_is_ibuf(index)) {
+@@ -998,6 +1004,12 @@
root = btr_root_get(index, &mtr);
if (flag == BTR_N_LEAF_PAGES) {
seg_header = root + PAGE_HEADER + PAGE_BTR_SEG_LEAF;
-@@ -1433,6 +1445,13 @@
- mtr_start(&mtr);
+@@ -1457,6 +1469,13 @@
- root = btr_page_get(space, zip_size, root_page_no, RW_X_LATCH, &mtr);
+ root = btr_page_get(space, zip_size, root_page_no, RW_X_LATCH,
+ NULL, &mtr);
+
+ if (srv_pass_corrupt_table && !root) {
+ mtr_commit(&mtr);
+ return;
+ }
+ ut_a(root);
-+
++
#ifdef UNIV_BTR_DEBUG
ut_a(btr_root_fseg_validate(FIL_PAGE_DATA + PAGE_BTR_SEG_LEAF
+ root, space));
-@@ -1455,6 +1474,12 @@
- mtr_start(&mtr);
+@@ -1480,6 +1499,12 @@
- root = btr_page_get(space, zip_size, root_page_no, RW_X_LATCH, &mtr);
+ root = btr_page_get(space, zip_size, root_page_no, RW_X_LATCH,
+ NULL, &mtr);
+
+ if (srv_pass_corrupt_table && !root) {
+ mtr_commit(&mtr);
#ifdef UNIV_BTR_DEBUG
ut_a(btr_root_fseg_validate(FIL_PAGE_DATA + PAGE_BTR_SEG_TOP
+ root, space));
-@@ -1488,6 +1513,11 @@
-
- block = btr_block_get(space, zip_size, root_page_no, RW_X_LATCH, mtr);
+@@ -1513,6 +1538,11 @@
+ block = btr_block_get(space, zip_size, root_page_no, RW_X_LATCH,
+ NULL, mtr);
+ if (srv_pass_corrupt_table && !block) {
+ return;
btr_search_drop_page_hash_index(block);
header = buf_block_get_frame(block) + PAGE_HEADER + PAGE_BTR_SEG_TOP;
-diff -ruN a/storage/innobase/btr/btr0cur.c b/storage/innobase/btr/btr0cur.c
---- a/storage/innobase/btr/btr0cur.c 2010-12-03 17:30:16.239038936 +0900
-+++ b/storage/innobase/btr/btr0cur.c 2010-12-04 15:38:18.114551906 +0900
-@@ -250,6 +250,11 @@
- case BTR_MODIFY_LEAF:
+--- a/storage/innobase/btr/btr0cur.c
++++ b/storage/innobase/btr/btr0cur.c
+@@ -251,6 +251,11 @@
mode = latch_mode == BTR_SEARCH_LEAF ? RW_S_LATCH : RW_X_LATCH;
- get_block = btr_block_get(space, zip_size, page_no, mode, mtr);
+ get_block = btr_block_get(
+ space, zip_size, page_no, mode, cursor->index, mtr);
+
+ if (srv_pass_corrupt_table && !get_block) {
+ return;
#ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(get_block->frame) == page_is_comp(page));
#endif /* UNIV_BTR_DEBUG */
-@@ -263,6 +268,11 @@
- get_block = btr_block_get(space, zip_size,
- left_page_no,
- RW_X_LATCH, mtr);
+@@ -264,6 +269,11 @@
+ get_block = btr_block_get(
+ space, zip_size, left_page_no,
+ RW_X_LATCH, cursor->index, mtr);
+
+ if (srv_pass_corrupt_table && !get_block) {
+ return;
#ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(get_block->frame)
== page_is_comp(page));
-@@ -274,6 +284,11 @@
-
- get_block = btr_block_get(space, zip_size, page_no,
- RW_X_LATCH, mtr);
+@@ -276,6 +286,11 @@
+ get_block = btr_block_get(
+ space, zip_size, page_no,
+ RW_X_LATCH, cursor->index, mtr);
+
+ if (srv_pass_corrupt_table && !get_block) {
+ return;
#ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(get_block->frame) == page_is_comp(page));
#endif /* UNIV_BTR_DEBUG */
-@@ -285,6 +300,11 @@
- get_block = btr_block_get(space, zip_size,
- right_page_no,
- RW_X_LATCH, mtr);
+@@ -287,6 +302,11 @@
+ get_block = btr_block_get(
+ space, zip_size, right_page_no,
+ RW_X_LATCH, cursor->index, mtr);
+
+ if (srv_pass_corrupt_table && !get_block) {
+ return;
#ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(get_block->frame)
== page_is_comp(page));
-@@ -306,6 +326,11 @@
- get_block = btr_block_get(space, zip_size,
- left_page_no, mode, mtr);
+@@ -309,6 +329,11 @@
+ space, zip_size,
+ left_page_no, mode, cursor->index, mtr);
cursor->left_block = get_block;
+
+ if (srv_pass_corrupt_table && !get_block) {
#ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(get_block->frame)
== page_is_comp(page));
-@@ -316,6 +341,11 @@
- }
+@@ -320,6 +345,11 @@
- get_block = btr_block_get(space, zip_size, page_no, mode, mtr);
+ get_block = btr_block_get(
+ space, zip_size, page_no, mode, cursor->index, mtr);
+
+ if (srv_pass_corrupt_table && !get_block) {
+ return;
#ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(get_block->frame) == page_is_comp(page));
#endif /* UNIV_BTR_DEBUG */
-@@ -588,6 +618,19 @@
+@@ -595,6 +625,19 @@
file, line, mtr);
if (block == NULL) {
/* This must be a search to perform an insert/delete
mark/ delete; try using the insert/delete buffer */
-@@ -662,6 +705,16 @@
+@@ -669,6 +712,16 @@
block->check_index_page_at_flush = TRUE;
page = buf_block_get_frame(block);
if (rw_latch != RW_NO_LATCH) {
#ifdef UNIV_ZIP_DEBUG
const page_zip_des_t* page_zip
-@@ -866,6 +919,17 @@
+@@ -862,6 +915,17 @@
RW_NO_LATCH, NULL, BUF_GET,
file, line, mtr);
page = buf_block_get_frame(block);
ut_ad(index->id == btr_page_get_index_id(page));
block->check_index_page_at_flush = TRUE;
-@@ -986,6 +1050,14 @@
+@@ -982,6 +1046,14 @@
RW_NO_LATCH, NULL, BUF_GET,
file, line, mtr);
page = buf_block_get_frame(block);
ut_ad(index->id == btr_page_get_index_id(page));
if (height == ULINT_UNDEFINED) {
-@@ -1199,6 +1271,12 @@
+@@ -1195,6 +1267,12 @@
*big_rec = NULL;
block = btr_cur_get_block(cursor);
page = buf_block_get_frame(block);
index = cursor->index;
zip_size = buf_block_get_zip_size(block);
-@@ -2925,6 +3003,11 @@
+@@ -2927,6 +3005,11 @@
block = btr_cur_get_block(cursor);
ut_ad(page_is_leaf(buf_block_get_frame(block)));
rec = btr_cur_get_rec(cursor);
-@@ -3628,6 +3711,11 @@
+@@ -3635,6 +3718,11 @@
page = btr_cur_get_page(&cursor);
rec = page_rec_get_next(page_get_infimum_rec(page));
if (!page_rec_is_supremum(rec)) {
-diff -ruN a/storage/innobase/btr/btr0pcur.c b/storage/innobase/btr/btr0pcur.c
---- a/storage/innobase/btr/btr0pcur.c 2010-11-03 07:01:13.000000000 +0900
-+++ b/storage/innobase/btr/btr0pcur.c 2010-12-04 15:38:18.116563877 +0900
+--- a/storage/innobase/btr/btr0pcur.c
++++ b/storage/innobase/btr/btr0pcur.c
@@ -32,7 +32,7 @@
#include "ut0byte.h"
#include "rem0cmp.h"
/**************************************************************//**
Allocates memory for a persistent cursor object and initializes the cursor.
@return own: persistent cursor */
-@@ -102,6 +102,12 @@
+@@ -114,6 +114,12 @@
ut_ad(cursor->latch_mode != BTR_NO_LATCHES);
block = btr_pcur_get_block(cursor);
index = btr_cur_get_index(btr_pcur_get_btr_cur(cursor));
page_cursor = btr_pcur_get_page_cur(cursor);
-@@ -419,6 +425,15 @@
- next_block = btr_block_get(space, zip_size, next_page_no,
- cursor->latch_mode, mtr);
+@@ -409,6 +415,15 @@
+ cursor->latch_mode,
+ btr_pcur_get_btr_cur(cursor)->index, mtr);
next_page = buf_block_get_frame(next_block);
+
+ if (srv_pass_corrupt_table && !next_page) {
#ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(next_page) == page_is_comp(page));
ut_a(btr_page_get_prev(next_page, mtr)
-diff -ruN a/storage/innobase/btr/btr0sea.c b/storage/innobase/btr/btr0sea.c
---- a/storage/innobase/btr/btr0sea.c 2010-12-03 15:49:59.166193407 +0900
-+++ b/storage/innobase/btr/btr0sea.c 2010-12-04 15:38:18.118548961 +0900
+--- a/storage/innobase/btr/btr0sea.c
++++ b/storage/innobase/btr/btr0sea.c
@@ -42,7 +42,7 @@
#include "btr0pcur.h"
#include "btr0btr.h"
-
+#include "srv0srv.h"
/** Flag: has the search system been enabled?
- Protected by btr_search_latch and btr_search_enabled_mutex. */
+ Protected by btr_search_latch. */
UNIV_INTERN char btr_search_enabled = TRUE;
-@@ -607,6 +607,11 @@
+@@ -609,6 +609,11 @@
block = btr_cur_get_block(cursor);
/* NOTE that the following two function calls do NOT protect
info or block->n_fields etc. with any semaphore, to save CPU time!
We cannot assume the fields are consistent when we return from
-diff -ruN a/storage/innobase/buf/buf0buf.c b/storage/innobase/buf/buf0buf.c
---- a/storage/innobase/buf/buf0buf.c 2010-12-04 15:37:50.554565654 +0900
-+++ b/storage/innobase/buf/buf0buf.c 2010-12-04 15:38:18.119548922 +0900
+--- a/storage/innobase/buf/buf0buf.c
++++ b/storage/innobase/buf/buf0buf.c
@@ -52,6 +52,7 @@
#include "log0recv.h"
#include "page0zip.h"
/* prototypes for new functions added to ha_innodb.cc */
trx_t* innobase_get_trx();
-@@ -1135,6 +1136,11 @@
+@@ -1150,6 +1151,11 @@
ready = buf_flush_ready_for_replace(&block->page);
mutex_exit(&block->mutex);
if (!ready) {
return(block);
-@@ -2479,6 +2485,13 @@
+@@ -1946,6 +1952,13 @@
return(NULL);
}
block_mutex = buf_page_get_mutex_enter(bpage);
rw_lock_s_unlock(&buf_pool->page_hash_latch);
-@@ -3059,6 +3072,13 @@
+@@ -2525,6 +2538,13 @@
return(NULL);
}
switch (buf_block_get_state(block)) {
buf_page_t* bpage;
ibool success;
-@@ -3733,6 +3753,7 @@
+@@ -3199,6 +3219,7 @@
bpage->newest_modification = 0;
bpage->oldest_modification = 0;
HASH_INVALIDATE(bpage, hash);
#if defined UNIV_DEBUG_FILE_ACCESSES || defined UNIV_DEBUG
bpage->file_page_was_freed = FALSE;
#endif /* UNIV_DEBUG_FILE_ACCESSES || UNIV_DEBUG */
-@@ -4322,6 +4343,7 @@
+@@ -3837,6 +3858,7 @@
(ulong) bpage->offset);
}
/* From version 3.23.38 up we store the page checksum
to the 4 first bytes of the page end lsn field */
-@@ -4363,6 +4385,23 @@
+@@ -3878,6 +3900,23 @@
REFMAN "forcing-innodb-recovery.html\n"
"InnoDB: about forcing recovery.\n", stderr);
+ bpage->is_corrupt = TRUE;
+ } else
if (srv_force_recovery < SRV_FORCE_IGNORE_CORRUPT) {
- fputs("InnoDB: Ending processing because of"
- " a corrupt database page.\n",
-@@ -4370,6 +4409,7 @@
- exit(1);
+ /* If page space id is larger than TRX_SYS_SPACE
+ (0), we will attempt to mark the corresponding
+@@ -3894,6 +3933,7 @@
+ }
}
}
+ } /**/
if (recv_recovery_is_on()) {
/* Pages must be uncompressed for crash recovery. */
-@@ -4379,8 +4419,11 @@
+@@ -3903,8 +3943,11 @@
if (uncompressed && !recv_no_ibuf_operations) {
ibuf_merge_or_delete_for_page(
TRUE);
}
}
-diff -ruN a/storage/innobase/buf/buf0rea.c b/storage/innobase/buf/buf0rea.c
---- a/storage/innobase/buf/buf0rea.c 2010-12-04 15:37:50.557553380 +0900
-+++ b/storage/innobase/buf/buf0rea.c 2010-12-04 15:41:09.784467585 +0900
-@@ -193,7 +193,14 @@
+--- a/storage/innobase/buf/buf0rea.c
++++ b/storage/innobase/buf/buf0rea.c
+@@ -195,7 +195,14 @@
((buf_block_t*) bpage)->frame, bpage, trx);
}
thd_wait_end(NULL);
if (sync) {
/* The i/o is already completed when we arrive from
-diff -ruN a/storage/innobase/dict/dict0dict.c b/storage/innobase/dict/dict0dict.c
---- a/storage/innobase/dict/dict0dict.c 2010-12-03 17:30:16.248987063 +0900
-+++ b/storage/innobase/dict/dict0dict.c 2010-12-04 15:45:23.808513973 +0900
-@@ -54,6 +54,7 @@
- #include "row0merge.h"
+--- a/storage/innobase/dict/dict0dict.c
++++ b/storage/innobase/dict/dict0dict.c
+@@ -55,6 +55,7 @@
#include "m_ctype.h" /* my_isspace() */
#include "ha_prototypes.h" /* innobase_strcasecmp(), innobase_casedn_str()*/
+ #include "row0upd.h"
+#include "srv0start.h" /* SRV_LOG_SPACE_FIRST_ID */
#include <ctype.h>
/* If table->ibd_file_missing == TRUE, this will
print an error message and return without doing
anything. */
-@@ -1293,7 +1294,7 @@
+@@ -1298,7 +1299,7 @@
+ dict_sys->size) > srv_dict_size_limit ) {
prev_table = UT_LIST_GET_PREV(table_LRU, table);
goto next_loop;
cached_foreign_tables = 0;
-@@ -4332,6 +4333,12 @@
+@@ -4377,6 +4378,12 @@
heap = mem_heap_create(1000);
while (index) {
size = btr_get_size(index, BTR_TOTAL_SIZE);
index->stat_index_size = size;
-@@ -4479,6 +4486,12 @@
+@@ -4524,6 +4531,12 @@
heap = mem_heap_create(1000);
while (index) {
/*===========================================*/
{
dict_table_t* sys_stats;
-@@ -4671,6 +4684,13 @@
+@@ -4716,6 +4729,13 @@
|| (srv_force_recovery < SRV_FORCE_NO_LOG_REDO
&& dict_index_is_clust(index)))) {
ulint size;
size = btr_get_size(index, BTR_TOTAL_SIZE);
index->stat_index_size = size;
-@@ -5467,4 +5487,42 @@
- rw_lock_free(&dict_table_stats_latches[i]);
- }
+@@ -5695,4 +5715,42 @@
+
+ index->type |= DICT_CORRUPT;
}
+
+/*************************************************************************
+ }
+}
#endif /* !UNIV_HOTBACKUP */
-diff -ruN a/storage/innobase/dict/dict0mem.c b/storage/innobase/dict/dict0mem.c
---- a/storage/innobase/dict/dict0mem.c 2010-11-03 07:01:13.000000000 +0900
-+++ b/storage/innobase/dict/dict0mem.c 2010-12-04 15:38:18.126549463 +0900
+--- a/storage/innobase/dict/dict0mem.c
++++ b/storage/innobase/dict/dict0mem.c
@@ -96,6 +96,8 @@
/* The number of transactions that are either waiting on the
AUTOINC lock or have been granted the lock. */
#endif /* !UNIV_HOTBACKUP */
ut_d(table->magic_n = DICT_TABLE_MAGIC_N);
-diff -ruN a/storage/innobase/fil/fil0fil.c b/storage/innobase/fil/fil0fil.c
---- a/storage/innobase/fil/fil0fil.c 2010-12-04 15:37:50.564551587 +0900
-+++ b/storage/innobase/fil/fil0fil.c 2010-12-04 15:38:18.128549252 +0900
+--- a/storage/innobase/fil/fil0fil.c
++++ b/storage/innobase/fil/fil0fil.c
@@ -235,6 +235,7 @@
file we have written to */
ibool is_in_unflushed_spaces; /*!< TRUE if this space is
UT_LIST_NODE_T(fil_space_t) space_list;
/*!< list of all spaces */
ulint magic_n;/*!< FIL_SPACE_MAGIC_N */
-@@ -1293,6 +1294,8 @@
+@@ -1294,6 +1295,8 @@
ut_fold_string(name), space);
space->is_in_unflushed_spaces = FALSE;
UT_LIST_ADD_LAST(space_list, fil_system->space_list, space);
mutex_exit(&fil_system->mutex);
-@@ -5267,6 +5270,34 @@
+@@ -5285,6 +5288,34 @@
ut_a(byte_offset % OS_FILE_LOG_BLOCK_SIZE == 0);
ut_a((len % OS_FILE_LOG_BLOCK_SIZE) == 0);
#ifdef UNIV_HOTBACKUP
/* In ibbackup do normal i/o, not aio */
if (type == OS_FILE_READ) {
-@@ -5281,6 +5312,8 @@
+@@ -5299,6 +5330,8 @@
ret = os_aio(type, mode | wake_later, node->name, node->handle, buf,
offset_low, offset_high, len, node, message, trx);
#endif
ut_a(ret);
if (mode == OS_AIO_SYNC) {
-@@ -5780,3 +5813,46 @@
+@@ -5799,3 +5832,46 @@
return 0;
}
}
+ mutex_exit(&fil_system->mutex);
+}
+
-diff -ruN a/storage/innobase/fsp/fsp0fsp.c b/storage/innobase/fsp/fsp0fsp.c
---- a/storage/innobase/fsp/fsp0fsp.c 2010-12-04 15:37:50.569480615 +0900
-+++ b/storage/innobase/fsp/fsp0fsp.c 2010-12-04 15:38:18.131550103 +0900
-@@ -369,6 +369,12 @@
+--- a/storage/innobase/fsp/fsp0fsp.c
++++ b/storage/innobase/fsp/fsp0fsp.c
+@@ -308,6 +308,12 @@
ut_ad(id || !zip_size);
block = buf_page_get(id, zip_size, 0, RW_X_LATCH, mtr);
header = FSP_HEADER_OFFSET + buf_block_get_frame(block);
buf_block_dbg_add_level(block, SYNC_FSP_PAGE);
-@@ -787,6 +793,12 @@
+@@ -726,6 +732,12 @@
fsp_header_t* sp_header;
block = buf_page_get(space, zip_size, 0, RW_X_LATCH, mtr);
buf_block_dbg_add_level(block, SYNC_FSP_PAGE);
sp_header = FSP_HEADER_OFFSET + buf_block_get_frame(block);
-@@ -1866,6 +1878,11 @@
+@@ -1805,6 +1817,11 @@
{
fseg_inode_t* inode;
for (; i < FSP_SEG_INODES_PER_PAGE(zip_size); i++) {
inode = fsp_seg_inode_page_get_nth_inode(
-@@ -1979,6 +1996,11 @@
+@@ -1918,6 +1935,11 @@
page = buf_block_get_frame(block);
n = fsp_seg_inode_page_find_free(page, 0, zip_size, mtr);
ut_a(n != ULINT_UNDEFINED);
-@@ -2072,6 +2094,11 @@
+@@ -2011,6 +2033,11 @@
inode = fut_get_ptr(space, zip_size, inode_addr, RW_X_LATCH, mtr);
if (UNIV_UNLIKELY(!mach_read_from_8(inode + FSEG_ID))) {
inode = NULL;
-@@ -2098,7 +2125,7 @@
+@@ -2037,7 +2064,7 @@
{
fseg_inode_t* inode
= fseg_inode_try_get(header, space, zip_size, mtr);
return(inode);
}
-@@ -3304,6 +3331,11 @@
+@@ -3243,6 +3270,11 @@
descr = xdes_get_descriptor(space, zip_size, page, mtr);
ut_a(descr);
if (xdes_get_bit(descr, XDES_FREE_BIT, page % FSP_EXTENT_SIZE, mtr)) {
fputs("InnoDB: Dump of the tablespace extent descriptor: ",
-@@ -3551,6 +3583,11 @@
+@@ -3490,6 +3522,11 @@
descr = xdes_get_descriptor(space, zip_size, header_page, mtr);
/* Check that the header resides on a page which has not been
freed yet */
-@@ -3635,6 +3672,12 @@
+@@ -3574,6 +3611,12 @@
inode = fseg_inode_get(header, space, zip_size, mtr);
descr = fseg_get_first_extent(inode, space, zip_size, mtr);
if (descr != NULL) {
-diff -ruN a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
---- a/storage/innobase/handler/ha_innodb.cc 2010-12-04 15:37:50.578486593 +0900
-+++ b/storage/innobase/handler/ha_innodb.cc 2010-12-04 15:38:18.137549396 +0900
-@@ -3972,6 +3972,12 @@
+--- a/storage/innobase/handler/ha_innodb.cc
++++ b/storage/innobase/handler/ha_innodb.cc
+@@ -4024,6 +4024,12 @@
DBUG_RETURN(1);
}
+ DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
+ }
+
- /* Create buffers for packing the fields of a record. Why
- table->reclength did not work here? Obviously, because char
- fields when packed actually became 1 byte longer, when we also
-@@ -3999,6 +4005,19 @@
+ /* Will be allocated if it is needed in ::update_row() */
+ upd_buf = NULL;
+ upd_buf_size = 0;
+@@ -4043,6 +4049,17 @@
/* Get pointer to a table object in InnoDB dictionary cache */
ib_table = dict_table_get(norm_name, TRUE);
-
+
+ if (srv_pass_corrupt_table <= 1 && ib_table && ib_table->is_corrupt) {
+ free_share(share);
-+ my_free(upd_buff);
++ my_free(upd_buf);
++ upd_buf = NULL;
++ upd_buf_size = 0;
+
+ DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
+ }
+
-+ if (share->ib_table) {
-+ ut_a(share->ib_table == ib_table);
-+ } else {
-+ share->ib_table = ib_table;
-+ }
++ share->ib_table = ib_table;
+
if (NULL == ib_table) {
if (is_part && retries < 10) {
- ++retries;
-@@ -5163,6 +5182,10 @@
+ /* MySQL partition engine hard codes the file name
+@@ -5263,6 +5280,10 @@
ha_statistic_increment(&SSV::ha_write_count);
if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_INSERT)
table->timestamp_field->set_time();
-@@ -5380,6 +5403,10 @@
+@@ -5479,6 +5500,10 @@
func_exit:
innobase_active_small();
DBUG_RETURN(error_result);
}
-@@ -5556,6 +5583,10 @@
+@@ -5673,6 +5698,10 @@
ha_statistic_increment(&SSV::ha_update_count);
if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE)
table->timestamp_field->set_time();
-@@ -5645,6 +5676,10 @@
+@@ -5760,6 +5789,10 @@
innobase_active_small();
DBUG_RETURN(error);
}
-@@ -5666,6 +5701,10 @@
+@@ -5781,6 +5814,10 @@
ha_statistic_increment(&SSV::ha_delete_count);
if (!prebuilt->upd_node) {
row_get_prebuilt_update_vector(prebuilt);
}
-@@ -5692,6 +5731,10 @@
+@@ -5807,6 +5844,10 @@
innobase_active_small();
DBUG_RETURN(error);
}
-@@ -5931,6 +5974,10 @@
+@@ -6046,6 +6087,10 @@
ha_statistic_increment(&SSV::ha_read_key_count);
+
index = prebuilt->index;
- if (UNIV_UNLIKELY(index == NULL)) {
-@@ -5996,6 +6043,10 @@
+ if (UNIV_UNLIKELY(index == NULL) || dict_index_is_corrupted(index)) {
+@@ -6113,6 +6158,10 @@
ret = DB_UNSUPPORTED;
}
switch (ret) {
case DB_SUCCESS:
error = 0;
-@@ -6111,6 +6162,10 @@
+@@ -6227,6 +6276,10 @@
{
DBUG_ENTER("change_active_index");
ut_ad(user_thd == ha_thd());
ut_a(prebuilt->trx == thd_to_trx(user_thd));
-@@ -6201,6 +6256,10 @@
+@@ -6340,6 +6393,10 @@
DBUG_ENTER("general_fetch");
ut_a(prebuilt->trx == thd_to_trx(user_thd));
innodb_srv_conc_enter_innodb(prebuilt->trx);
-@@ -6210,6 +6269,10 @@
+@@ -6349,6 +6406,10 @@
innodb_srv_conc_exit_innodb(prebuilt->trx);
switch (ret) {
case DB_SUCCESS:
error = 0;
-@@ -7476,10 +7539,18 @@
+@@ -7615,10 +7676,18 @@
update_thd(ha_thd());
error = convert_error_code_to_mysql(error, prebuilt->table->flags,
NULL);
-@@ -7980,6 +8051,16 @@
+@@ -8124,6 +8193,16 @@
return(ranges + (double) rows / (double) total_rows * time_for_scan);
}
/*********************************************************************//**
Calculates the key number used inside MySQL for an Innobase index. We will
first check the "index translation table" for a match of the index to get
-@@ -8157,7 +8238,7 @@
+@@ -8301,7 +8380,7 @@
ib_table = prebuilt->table;
if (flag & HA_STATUS_TIME) {
/* In sql_show we call with this flag: update
then statistics so that they are up-to-date */
-@@ -8450,10 +8531,18 @@
+@@ -8601,10 +8680,18 @@
THD* thd, /*!< in: connection thread handle */
HA_CHECK_OPT* check_opt) /*!< in: currently ignored */
{
return(0);
}
-@@ -8635,6 +8724,10 @@
+@@ -8840,6 +8927,10 @@
my_error(ER_QUERY_INTERRUPTED, MYF(0));
}
DBUG_RETURN(is_ok ? HA_ADMIN_OK : HA_ADMIN_CORRUPT);
}
-@@ -9405,6 +9498,10 @@
+@@ -9610,6 +9701,10 @@
update_thd(thd);
if (prebuilt->table->ibd_file_missing && !thd_tablespace_op(thd)) {
ut_print_timestamp(stderr);
fprintf(stderr,
-@@ -11807,6 +11904,26 @@
- "0 (the default) disables automatic dumps.",
- NULL, NULL, 0, 0, UINT_MAX32, 0);
+@@ -12073,6 +12168,26 @@
+ "dump file (if present). Disabled by default.",
+ NULL, NULL, FALSE);
+const char *corrupt_table_action_names[]=
+{
static struct st_mysql_sys_var* innobase_system_variables[]= {
MYSQL_SYSVAR(additional_mem_pool_size),
MYSQL_SYSVAR(autoextend_increment),
-@@ -11893,6 +12010,7 @@
- MYSQL_SYSVAR(purge_threads),
- MYSQL_SYSVAR(purge_batch_size),
- MYSQL_SYSVAR(rollback_segments),
+@@ -12166,6 +12281,7 @@
+ #ifdef UNIV_DEBUG
+ MYSQL_SYSVAR(trx_rseg_n_slots_debug),
+ #endif /* UNIV_DEBUG */
+ MYSQL_SYSVAR(corrupt_table_action),
NULL
};
-diff -ruN a/storage/innobase/handler/ha_innodb.h b/storage/innobase/handler/ha_innodb.h
---- a/storage/innobase/handler/ha_innodb.h 2010-11-03 07:01:13.000000000 +0900
-+++ b/storage/innobase/handler/ha_innodb.h 2010-12-04 15:38:18.159588579 +0900
+--- a/storage/innobase/handler/ha_innodb.h
++++ b/storage/innobase/handler/ha_innodb.h
@@ -52,6 +52,7 @@
innodb_idx_translate_t idx_trans_tbl; /*!< index translation
table between MySQL and
} INNOBASE_SHARE;
-@@ -135,6 +136,7 @@
+@@ -136,6 +137,7 @@
int close(void);
double scan_time();
double read_time(uint index, uint ranges, ha_rows rows);
int write_row(uchar * buf);
int update_row(const uchar * old_data, uchar * new_data);
-diff -ruN a/storage/innobase/include/btr0btr.ic b/storage/innobase/include/btr0btr.ic
---- a/storage/innobase/include/btr0btr.ic 2010-11-03 07:01:13.000000000 +0900
-+++ b/storage/innobase/include/btr0btr.ic 2010-12-04 15:38:18.162515035 +0900
+--- a/storage/innobase/include/btr0btr.ic
++++ b/storage/innobase/include/btr0btr.ic
@@ -28,7 +28,7 @@
#include "mtr0mtr.h"
#include "mtr0log.h"
#define BTR_MAX_NODE_LEVEL 50 /*!< Maximum B-tree page level
(not really a hard limit).
Used in debug assertions
-@@ -55,7 +55,9 @@
+@@ -59,7 +59,9 @@
block = buf_page_get_gen(space, zip_size, page_no, mode,
NULL, BUF_GET, file, line, mtr);
+
+ if (block && mode != RW_NO_LATCH) {
- buf_block_dbg_add_level(block, SYNC_TREE_NODE);
- }
-diff -ruN a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h
---- a/storage/innobase/include/buf0buf.h 2010-12-03 15:49:59.218956083 +0900
-+++ b/storage/innobase/include/buf0buf.h 2010-12-04 15:38:18.164513667 +0900
-@@ -986,7 +986,7 @@
+ buf_block_dbg_add_level(
+ block, index != NULL && dict_index_is_ibuf(index)
+--- a/storage/innobase/include/buf0buf.h
++++ b/storage/innobase/include/buf0buf.h
+@@ -1023,7 +1023,7 @@
const buf_block_t* block) /*!< in: pointer to the control block */
__attribute__((pure));
#else /* UNIV_DEBUG */
#endif /* UNIV_DEBUG */
/*********************************************************************//**
Gets the space id of a block.
-@@ -1433,6 +1433,7 @@
+@@ -1470,6 +1470,7 @@
0 if the block was never accessed
in the buffer pool */
/* @} */
# if defined UNIV_DEBUG_FILE_ACCESSES || defined UNIV_DEBUG
ibool file_page_was_freed;
/*!< this is set to TRUE when fsp
-diff -ruN a/storage/innobase/include/buf0buf.ic b/storage/innobase/include/buf0buf.ic
---- a/storage/innobase/include/buf0buf.ic 2010-12-03 15:49:59.221956024 +0900
-+++ b/storage/innobase/include/buf0buf.ic 2010-12-04 15:38:18.167513925 +0900
+--- a/storage/innobase/include/buf0buf.ic
++++ b/storage/innobase/include/buf0buf.ic
@@ -34,7 +34,7 @@
#include "buf0flu.h"
#include "buf0lru.h"
/*********************************************************************//**
Gets the current size of buffer buf_pool in bytes.
@return size in bytes */
-@@ -619,6 +619,12 @@
+@@ -681,6 +681,12 @@
/*================*/
const buf_block_t* block) /*!< in: pointer to the control block */
{
ut_ad(block);
switch (buf_block_get_state(block)) {
-diff -ruN a/storage/innobase/include/dict0dict.h b/storage/innobase/include/dict0dict.h
---- a/storage/innobase/include/dict0dict.h 2010-12-03 17:30:16.306955940 +0900
-+++ b/storage/innobase/include/dict0dict.h 2010-12-04 15:38:18.169513750 +0900
-@@ -1245,6 +1245,15 @@
- dict_close(void);
- /*============*/
+--- a/storage/innobase/include/dict0dict.h
++++ b/storage/innobase/include/dict0dict.h
+@@ -1326,6 +1326,15 @@
+ /*========================*/
+ ulint space_id); /*!< in: space ID */
+/*************************************************************************
+set is_corrupt flag by space_id*/
#ifndef UNIV_NONINL
#include "dict0dict.ic"
#endif
-diff -ruN a/storage/innobase/include/dict0mem.h b/storage/innobase/include/dict0mem.h
---- a/storage/innobase/include/dict0mem.h 2010-11-03 07:01:13.000000000 +0900
-+++ b/storage/innobase/include/dict0mem.h 2010-12-04 15:38:18.171513956 +0900
-@@ -640,6 +640,7 @@
+--- a/storage/innobase/include/dict0mem.h
++++ b/storage/innobase/include/dict0mem.h
+@@ -670,6 +670,7 @@
the AUTOINC lock on this table. */
/* @} */
/*----------------------*/
#endif /* !UNIV_HOTBACKUP */
#ifdef UNIV_DEBUG
-diff -ruN a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h
---- a/storage/innobase/include/fil0fil.h 2010-12-04 15:35:29.175520016 +0900
-+++ b/storage/innobase/include/fil0fil.h 2010-12-04 15:38:18.172483391 +0900
-@@ -749,6 +749,19 @@
+--- a/storage/innobase/include/fil0fil.h
++++ b/storage/innobase/include/fil0fil.h
+@@ -759,6 +759,19 @@
fil_system_hash_nodes(void);
/*========================*/
typedef struct fil_space_struct fil_space_t;
#endif
-diff -ruN a/storage/innobase/include/fut0fut.ic b/storage/innobase/include/fut0fut.ic
---- a/storage/innobase/include/fut0fut.ic 2010-11-03 07:01:13.000000000 +0900
-+++ b/storage/innobase/include/fut0fut.ic 2010-12-04 15:38:18.174481728 +0900
+--- a/storage/innobase/include/fut0fut.ic
++++ b/storage/innobase/include/fut0fut.ic
@@ -23,6 +23,7 @@
Created 12/13/1995 Heikki Tuuri
***********************************************************************/
ptr = buf_block_get_frame(block) + addr.boffset;
buf_block_dbg_add_level(block, SYNC_NO_ORDER_CHECK);
-diff -ruN a/storage/innobase/include/page0page.h b/storage/innobase/include/page0page.h
---- a/storage/innobase/include/page0page.h 2010-11-03 07:01:13.000000000 +0900
-+++ b/storage/innobase/include/page0page.h 2010-12-04 15:38:18.175514037 +0900
-@@ -500,7 +500,7 @@
+--- a/storage/innobase/include/page0page.h
++++ b/storage/innobase/include/page0page.h
+@@ -497,7 +497,7 @@
page_is_leaf(
/*=========*/
const page_t* page) /*!< in: page */
/************************************************************//**
Gets the pointer to the next record on the page.
@return pointer to next record */
-diff -ruN a/storage/innobase/include/page0page.ic b/storage/innobase/include/page0page.ic
---- a/storage/innobase/include/page0page.ic 2010-11-03 07:01:13.000000000 +0900
-+++ b/storage/innobase/include/page0page.ic 2010-12-04 15:38:18.177482672 +0900
+--- a/storage/innobase/include/page0page.ic
++++ b/storage/innobase/include/page0page.ic
@@ -274,6 +274,9 @@
/*=========*/
const page_t* page) /*!< in: page */
return(!*(const uint16*) (page + (PAGE_HEADER + PAGE_LEVEL)));
}
-diff -ruN a/storage/innobase/include/page0zip.h b/storage/innobase/include/page0zip.h
---- a/storage/innobase/include/page0zip.h 2010-11-03 07:01:13.000000000 +0900
-+++ b/storage/innobase/include/page0zip.h 2010-12-04 15:38:18.179513974 +0900
+--- a/storage/innobase/include/page0zip.h
++++ b/storage/innobase/include/page0zip.h
@@ -114,7 +114,7 @@
const page_t* page, /*!< in: uncompressed page */
dict_index_t* index, /*!< in: index of the B-tree node */
/**********************************************************************//**
Decompress a page. This function should tolerate errors on the compressed
-diff -ruN a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h
---- a/storage/innobase/include/srv0srv.h 2010-12-04 15:37:50.591516341 +0900
-+++ b/storage/innobase/include/srv0srv.h 2010-12-04 15:38:18.180563749 +0900
-@@ -240,6 +240,7 @@
+--- a/storage/innobase/include/srv0srv.h
++++ b/storage/innobase/include/srv0srv.h
+@@ -245,6 +245,7 @@
extern ulint srv_adaptive_flushing_method;
extern ulint srv_expand_import;
extern ulint srv_dict_size_limit;
/*-------------------------------------------*/
-diff -ruN a/storage/innobase/page/page0zip.c b/storage/innobase/page/page0zip.c
---- a/storage/innobase/page/page0zip.c 2010-11-03 07:01:13.000000000 +0900
-+++ b/storage/innobase/page/page0zip.c 2010-12-04 15:38:18.195515935 +0900
-@@ -1153,6 +1153,10 @@
+--- a/storage/innobase/page/page0zip.c
++++ b/storage/innobase/page/page0zip.c
+@@ -1195,6 +1195,10 @@
FILE* logfile = NULL;
#endif
ut_a(page_is_comp(page));
ut_a(fil_page_get_type(page) == FIL_PAGE_INDEX);
ut_ad(page_simple_validate_new((page_t*) page));
-diff -ruN a/storage/innobase/row/row0ins.c b/storage/innobase/row/row0ins.c
---- a/storage/innobase/row/row0ins.c 2010-11-03 07:01:13.000000000 +0900
-+++ b/storage/innobase/row/row0ins.c 2010-12-04 15:38:18.198514028 +0900
-@@ -1335,6 +1335,12 @@
+--- a/storage/innobase/row/row0ins.c
++++ b/storage/innobase/row/row0ins.c
+@@ -1341,6 +1341,12 @@
const rec_t* rec = btr_pcur_get_rec(&pcur);
const buf_block_t* block = btr_pcur_get_block(&pcur);
if (page_rec_is_infimum(rec)) {
continue;
-diff -ruN a/storage/innobase/row/row0merge.c b/storage/innobase/row/row0merge.c
---- a/storage/innobase/row/row0merge.c 2010-12-03 17:30:16.330986655 +0900
-+++ b/storage/innobase/row/row0merge.c 2010-12-04 15:38:18.201513966 +0900
+--- a/storage/innobase/row/row0merge.c
++++ b/storage/innobase/row/row0merge.c
@@ -1245,6 +1245,13 @@
if (UNIV_LIKELY(has_next)) {
offsets = rec_get_offsets(rec, clust_index, NULL,
ULINT_UNDEFINED, &row_heap);
-diff -ruN a/storage/innobase/row/row0sel.c b/storage/innobase/row/row0sel.c
---- a/storage/innobase/row/row0sel.c 2010-11-03 07:01:13.000000000 +0900
-+++ b/storage/innobase/row/row0sel.c 2010-12-04 15:38:18.205551115 +0900
-@@ -3853,6 +3853,13 @@
+--- a/storage/innobase/row/row0sel.c
++++ b/storage/innobase/row/row0sel.c
+@@ -3919,6 +3919,13 @@
/* PHASE 4: Look for matching records in a loop */
rec = btr_pcur_get_rec(pcur);
ut_ad(!!page_rec_is_comp(rec) == comp);
#ifdef UNIV_SEARCH_DEBUG
/*
-@@ -3930,7 +3937,13 @@
+@@ -3996,7 +4003,13 @@
if (UNIV_UNLIKELY(next_offs >= UNIV_PAGE_SIZE - PAGE_DIR)) {
wrong_offs:
ut_print_timestamp(stderr);
buf_page_print(page_align(rec), 0);
fprintf(stderr,
-@@ -3981,7 +3994,8 @@
+@@ -4047,7 +4060,8 @@
offsets = rec_get_offsets(rec, index, offsets, ULINT_UNDEFINED, &heap);
if (!rec_validate(rec, offsets)
|| !btr_index_rec_validate(rec, index, FALSE)) {
fprintf(stderr,
-diff -ruN a/storage/innobase/srv/srv0srv.c b/storage/innobase/srv/srv0srv.c
---- a/storage/innobase/srv/srv0srv.c 2010-12-04 15:37:50.602481253 +0900
-+++ b/storage/innobase/srv/srv0srv.c 2010-12-04 15:38:18.209513823 +0900
-@@ -430,6 +430,7 @@
+--- a/storage/innobase/srv/srv0srv.c
++++ b/storage/innobase/srv/srv0srv.c
+@@ -435,6 +435,7 @@
UNIV_INTERN ulint srv_adaptive_flushing_method = 0; /* 0: native 1: estimate 2: keep_average */
UNIV_INTERN ulint srv_expand_import = 0; /* 0:disable 1:enable */
UNIV_INTERN ulint srv_dict_size_limit = 0;
/*-------------------------------------------*/
-diff -ruN a/storage/innobase/srv/srv0start.c b/storage/innobase/srv/srv0start.c
---- a/storage/innobase/srv/srv0start.c 2010-12-04 15:37:50.605491300 +0900
-+++ b/storage/innobase/srv/srv0start.c 2010-12-04 15:38:18.212513722 +0900
-@@ -2149,6 +2149,13 @@
+--- a/storage/innobase/srv/srv0start.c
++++ b/storage/innobase/srv/srv0start.c
+@@ -2175,6 +2175,13 @@
os_fast_mutex_free(&srv_os_test_mutex);