summaryrefslogtreecommitdiff
path: root/innobase/btr/btr0btr.c
diff options
context:
space:
mode:
Diffstat (limited to 'innobase/btr/btr0btr.c')
-rw-r--r--innobase/btr/btr0btr.c258
1 files changed, 141 insertions, 117 deletions
diff --git a/innobase/btr/btr0btr.c b/innobase/btr/btr0btr.c
index 1d22d107b12..2e9de9b39bf 100644
--- a/innobase/btr/btr0btr.c
+++ b/innobase/btr/btr0btr.c
@@ -588,28 +588,29 @@ btr_page_get_father_for_rec(
if (btr_node_ptr_get_child_page_no(node_ptr) !=
buf_frame_get_page_no(page)) {
- fprintf(stderr,
-"InnoDB: Dump of the child page:\n");
+ fputs("InnoDB: Dump of the child page:\n", stderr);
buf_page_print(buf_frame_align(page));
- fprintf(stderr,
-"InnoDB: Dump of the parent page:\n");
+ fputs("InnoDB: Dump of the parent page:\n", stderr);
buf_page_print(buf_frame_align(node_ptr));
- fprintf(stderr,
-"InnoDB: Corruption of an index tree: table %s, index %s,\n"
+ fputs("InnoDB: Corruption of an index tree: table ", stderr);
+ ut_print_name(stderr,
+ UT_LIST_GET_FIRST(tree->tree_indexes)->table_name);
+ fputs(", index ", stderr);
+ ut_print_name(stderr,
+ UT_LIST_GET_FIRST(tree->tree_indexes)->name);
+ fprintf(stderr, ",\n"
"InnoDB: father ptr page no %lu, child page no %lu\n",
- (UT_LIST_GET_FIRST(tree->tree_indexes))->table_name,
- (UT_LIST_GET_FIRST(tree->tree_indexes))->name,
- btr_node_ptr_get_child_page_no(node_ptr),
- buf_frame_get_page_no(page));
+ btr_node_ptr_get_child_page_no(node_ptr),
+ buf_frame_get_page_no(page));
page_rec_print(page_rec_get_next(page_get_infimum_rec(page)));
page_rec_print(node_ptr);
- fprintf(stderr,
+ fputs(
"InnoDB: You should dump + drop + reimport the table to fix the\n"
"InnoDB: corruption. If the crash happens at the database startup, see\n"
-"InnoDB: section 6.1 of http://www.innodb.com/ibman.html about forcing\n"
-"InnoDB: recovery. Then dump + drop + reimport.\n");
+"InnoDB: section 6.1 of http://www.innodb.com/ibman.php about forcing\n"
+"InnoDB: recovery. Then dump + drop + reimport.\n", stderr);
}
ut_a(btr_node_ptr_get_child_page_no(node_ptr) ==
@@ -1050,7 +1051,7 @@ btr_root_raise_and_insert(
/* We play safe and reset the free bits for the new page */
-/* printf("Root raise new page no %lu\n",
+/* fprintf(stderr, "Root raise new page no %lu\n",
buf_frame_get_page_no(new_page)); */
ibuf_reset_free_bits(UT_LIST_GET_FIRST(tree->tree_indexes),
@@ -1599,7 +1600,7 @@ func_start:
/* 5. Move then the records to the new page */
if (direction == FSP_DOWN) {
-/* printf("Split left\n"); */
+/* fputs("Split left\n", stderr); */
page_move_rec_list_start(new_page, page, move_limit, mtr);
left_page = new_page;
@@ -1607,7 +1608,7 @@ func_start:
lock_update_split_left(right_page, left_page);
} else {
-/* printf("Split right\n"); */
+/* fputs("Split right\n", stderr); */
page_move_rec_list_end(new_page, page, move_limit, mtr);
left_page = page;
@@ -1643,7 +1644,7 @@ func_start:
ibuf_update_free_bits_for_two_pages_low(cursor->index,
left_page,
right_page, mtr);
- /* printf("Split and insert done %lu %lu\n",
+ /* fprintf(stderr, "Split and insert done %lu %lu\n",
buf_frame_get_page_no(left_page),
buf_frame_get_page_no(right_page)); */
return(rec);
@@ -1663,7 +1664,7 @@ func_start:
/* We play safe and reset the free bits for new_page */
ibuf_reset_free_bits(cursor->index, new_page);
- /* printf("Split second round %lu\n",
+ /* fprintf(stderr, "Split second round %lu\n",
buf_frame_get_page_no(page)); */
n_iterations++;
ut_ad(n_iterations < 2);
@@ -1677,7 +1678,7 @@ func_start:
ibuf_update_free_bits_for_two_pages_low(cursor->index, left_page,
right_page, mtr);
- /* printf("Split and insert done %lu %lu\n",
+ /* fprintf(stderr, "Split and insert done %lu %lu\n",
buf_frame_get_page_no(left_page),
buf_frame_get_page_no(right_page)); */
@@ -1924,7 +1925,7 @@ btr_compress(
left_page_no = btr_page_get_prev(page, mtr);
right_page_no = btr_page_get_next(page, mtr);
-/* printf("Merge left page %lu right %lu \n", left_page_no,
+/* fprintf(stderr, "Merge left page %lu right %lu \n", left_page_no,
right_page_no); */
node_ptr = btr_page_get_father_node_ptr(tree, page, mtr);
@@ -2174,8 +2175,9 @@ btr_print_size(
mtr_t mtr;
if (tree->type & DICT_IBUF) {
- printf(
- "Sorry, cannot print info of an ibuf tree: use ibuf functions\n");
+ fputs(
+ "Sorry, cannot print info of an ibuf tree: use ibuf functions\n",
+ stderr);
return;
}
@@ -2186,14 +2188,14 @@ btr_print_size(
seg = root + PAGE_HEADER + PAGE_BTR_SEG_TOP;
- printf("INFO OF THE NON-LEAF PAGE SEGMENT\n");
+ fputs("INFO OF THE NON-LEAF PAGE SEGMENT\n", stderr);
fseg_print(seg, &mtr);
if (!(tree->type & DICT_UNIVERSAL)) {
seg = root + PAGE_HEADER + PAGE_BTR_SEG_LEAF;
- printf("INFO OF THE LEAF PAGE SEGMENT\n");
+ fputs("INFO OF THE LEAF PAGE SEGMENT\n", stderr);
fseg_print(seg, &mtr);
}
@@ -2221,7 +2223,7 @@ btr_print_recursive(
ut_ad(mtr_memo_contains(mtr, buf_block_align(page),
MTR_MEMO_PAGE_X_FIX));
- printf("NODE ON LEVEL %lu page number %lu\n",
+ fprintf(stderr, "NODE ON LEVEL %lu page number %lu\n",
btr_page_get_level(page, mtr), buf_frame_get_page_no(page));
page_print(page, width, width);
@@ -2267,8 +2269,8 @@ btr_print_tree(
mtr_t mtr;
page_t* root;
- printf("--------------------------\n");
- printf("INDEX TREE PRINT\n");
+ fputs("--------------------------\n"
+ "INDEX TREE PRINT\n", stderr);
mtr_start(&mtr);
@@ -2325,6 +2327,22 @@ btr_check_node_ptr(
}
/****************************************************************
+Display identification information for a record. */
+static
+void
+btr_index_rec_validate_report(
+/*==========================*/
+ page_t* page, /* in: index page */
+ rec_t* rec, /* in: index record */
+ dict_index_t* index) /* in: index */
+{
+ fputs("InnoDB: Record in ", stderr);
+ dict_index_name_print(stderr, index);
+ fprintf(stderr, ", page %lu, at offset %lu\n",
+ buf_frame_get_page_no(page), (ulint)(rec - page));
+}
+
+/****************************************************************
Checks the size and number of fields in a record based on the definition of
the index. */
@@ -2338,13 +2356,10 @@ btr_index_rec_validate(
should print hex dump of record
and page on error */
{
- dtype_t* type;
- byte* data;
ulint len;
ulint n;
ulint i;
page_t* page;
- char err_buf[1000];
page = buf_frame_align(rec);
@@ -2359,11 +2374,8 @@ btr_index_rec_validate(
n = dict_index_get_n_fields(index);
if (rec_get_n_fields(rec) != n) {
- fprintf(stderr,
-"InnoDB: Record in index %s in table %s, page %lu, at offset %lu\n"
-"InnoDB: has %lu fields, should have %lu\n",
- index->name, index->table_name,
- buf_frame_get_page_no(page), (ulint)(rec - page),
+ btr_index_rec_validate_report(page, rec, index);
+ fprintf(stderr, "InnoDB: has %lu fields, should have %lu\n",
rec_get_n_fields(rec), n);
if (!dump_on_error) {
@@ -2373,16 +2385,17 @@ btr_index_rec_validate(
buf_page_print(page);
- rec_sprintf(err_buf, 900, rec);
- fprintf(stderr, "InnoDB: corrupt record %s\n", err_buf);
+ fputs("InnoDB: corrupt record ", stderr);
+ rec_print(stderr, rec);
+ putc('\n', stderr);
return(FALSE);
}
for (i = 0; i < n; i++) {
- data = rec_get_nth_field(rec, i, &len);
+ dtype_t* type = dict_index_get_nth_type(index, i);
- type = dict_index_get_nth_type(index, i);
+ rec_get_nth_field(rec, i, &len);
if ((dict_index_get_nth_field(index, i)->prefix_len == 0
&& len != UNIV_SQL_NULL && dtype_is_fixed_size(type)
@@ -2393,12 +2406,9 @@ btr_index_rec_validate(
&& len !=
dict_index_get_nth_field(index, i)->prefix_len)) {
+ btr_index_rec_validate_report(page, rec, index);
fprintf(stderr,
-"InnoDB: Record in index %s in table %s, page %lu, at offset %lu\n"
"InnoDB: field %lu len is %lu, should be %lu\n",
- index->name, index->table_name,
- buf_frame_get_page_no(page),
- (ulint)(rec - page),
i, len, dtype_get_fixed_size(type));
if (!dump_on_error) {
@@ -2408,9 +2418,9 @@ btr_index_rec_validate(
buf_page_print(page);
- rec_sprintf(err_buf, 900, rec);
- fprintf(stderr,
- "InnoDB: corrupt record %s\n", err_buf);
+ fputs("InnoDB: corrupt record ", stderr);
+ rec_print(stderr, rec);
+ putc('\n', stderr);
return(FALSE);
}
@@ -2430,7 +2440,6 @@ btr_index_page_validate(
page_t* page, /* in: index page */
dict_index_t* index) /* in: index */
{
- rec_t* rec;
page_cur_t cur;
ibool ret = TRUE;
@@ -2438,14 +2447,12 @@ btr_index_page_validate(
page_cur_move_to_next(&cur);
for (;;) {
- rec = (&cur)->rec;
-
if (page_cur_is_after_last(&cur)) {
break;
}
- if (!btr_index_rec_validate(rec, index, TRUE)) {
+ if (!btr_index_rec_validate(cur.rec, index, TRUE)) {
return(FALSE);
}
@@ -2457,6 +2464,46 @@ btr_index_page_validate(
}
/****************************************************************
+Report an error on one page of an index tree. */
+static
+void
+btr_validate_report1(
+ /* out: TRUE if ok */
+ dict_index_t* index, /* in: index */
+ ulint level, /* in: B-tree level */
+ page_t* page) /* in: index page */
+{
+ fprintf(stderr, "InnoDB: Error in page %lu of ",
+ buf_frame_get_page_no(page));
+ dict_index_name_print(stderr, index);
+ if (level) {
+ fprintf(stderr, ", index tree level %lu", level);
+ }
+ putc('\n', stderr);
+}
+
+/****************************************************************
+Report an error on two pages of an index tree. */
+static
+void
+btr_validate_report2(
+ /* out: TRUE if ok */
+ dict_index_t* index, /* in: index */
+ ulint level, /* in: B-tree level */
+ page_t* page1, /* in: first index page */
+ page_t* page2) /* in: second index page */
+{
+ fprintf(stderr, "InnoDB: Error in pages %lu and %lu of ",
+ buf_frame_get_page_no(page1),
+ buf_frame_get_page_no(page2));
+ dict_index_name_print(stderr, index);
+ if (level) {
+ fprintf(stderr, ", index tree level %lu", level);
+ }
+ putc('\n', stderr);
+}
+
+/****************************************************************
Validates index tree level. */
static
ibool
@@ -2481,7 +2528,6 @@ btr_validate_level(
ibool ret = TRUE;
dict_index_t* index;
mtr_t mtr;
- char err_buf[1000];
mtr_start(&mtr);
@@ -2512,10 +2558,7 @@ loop:
/* Check ordering etc. of records */
if (!page_validate(page, index)) {
- fprintf(stderr,
-"InnoDB: Error in page %lu in index %s table %s, index tree level %lu\n",
- buf_frame_get_page_no(page), index->name,
- index->table_name, level);
+ btr_validate_report1(index, level, page);
ret = FALSE;
} else if (level == 0) {
@@ -2545,25 +2588,22 @@ loop:
page_rec_get_next(page_get_infimum_rec(right_page)),
UT_LIST_GET_FIRST(tree->tree_indexes)) >= 0) {
- fprintf(stderr,
- "InnoDB: Error on pages %lu and %lu in index %s table %s\n",
- buf_frame_get_page_no(page),
- right_page_no,
- index->name, index->table_name);
+ btr_validate_report2(index, level, page, right_page);
- fprintf(stderr,
- "InnoDB: records in wrong order on adjacent pages\n");
+ fputs("InnoDB: records in wrong order"
+ " on adjacent pages\n", stderr);
buf_page_print(page);
buf_page_print(right_page);
- rec_sprintf(err_buf, 900,
- page_rec_get_prev(page_get_supremum_rec(page)));
- fprintf(stderr, "InnoDB: record %s\n", err_buf);
-
- rec_sprintf(err_buf, 900,
- page_rec_get_next(page_get_infimum_rec(right_page)));
- fprintf(stderr, "InnoDB: record %s\n", err_buf);
+ fputs("InnoDB: record ", stderr);
+ rec_print(stderr, page_rec_get_prev(
+ page_get_supremum_rec(page)));
+ putc('\n', stderr);
+ fputs("InnoDB: record ", stderr);
+ rec_print(stderr, page_rec_get_next(
+ page_get_infimum_rec(right_page)));
+ putc('\n', stderr);
ret = FALSE;
}
@@ -2586,32 +2626,27 @@ loop:
|| node_ptr != btr_page_get_father_for_rec(tree, page,
page_rec_get_prev(page_get_supremum_rec(page)),
&mtr)) {
- fprintf(stderr,
- "InnoDB: Error on page %lu in index %s table %s\n",
- buf_frame_get_page_no(page),
- index->name, index->table_name);
+ btr_validate_report1(index, level, page);
- fprintf(stderr,
- "InnoDB: node pointer to the page is wrong\n");
+ fputs("InnoDB: node pointer to the page is wrong\n",
+ stderr);
buf_page_print(father_page);
buf_page_print(page);
- rec_sprintf(err_buf, 900, node_ptr);
-
- fprintf(stderr, "InnoDB: node ptr %s\n", err_buf);
+ fputs("InnoDB: node ptr ", stderr);
+ rec_print(stderr, node_ptr);
- fprintf(stderr,
+ fprintf(stderr, "\n"
"InnoDB: node ptr child page n:o %lu\n",
btr_node_ptr_get_child_page_no(node_ptr));
- rec_sprintf(err_buf, 900,
+ fputs("InnoDB: record on page ", stderr);
+ rec_print(stderr,
btr_page_get_father_for_rec(tree, page,
page_rec_get_prev(page_get_supremum_rec(page)),
&mtr));
-
- fprintf(stderr, "InnoDB: record on page %s\n",
- err_buf);
+ putc('\n', stderr);
ret = FALSE;
goto node_ptr_fails;
@@ -2629,27 +2664,19 @@ loop:
if (cmp_dtuple_rec(node_ptr_tuple, node_ptr) != 0) {
- fprintf(stderr,
- "InnoDB: Error on page %lu in index %s table %s\n",
- buf_frame_get_page_no(page),
- index->name, index->table_name);
+ btr_validate_report1(index, level, page);
buf_page_print(father_page);
buf_page_print(page);
- fprintf(stderr,
- "InnoDB: Error: node ptrs differ on levels > 0\n");
-
- rec_sprintf(err_buf, 900, node_ptr);
-
- fprintf(stderr, "InnoDB: node ptr %s\n",
- err_buf);
- rec_sprintf(err_buf, 900,
- page_rec_get_next(
+ fputs("InnoDB: Error: node ptrs differ"
+ " on levels > 0\n"
+ "InnoDB: node ptr ", stderr);
+ rec_print(stderr, node_ptr);
+ fputs("InnoDB: first rec ", stderr);
+ rec_print(stderr, page_rec_get_next(
page_get_infimum_rec(page)));
-
- fprintf(stderr, "InnoDB: first rec %s\n",
- err_buf);
+ putc('\n', stderr);
ret = FALSE;
mem_heap_free(heap);
@@ -2681,13 +2708,12 @@ loop:
if (right_node_ptr !=
page_rec_get_next(node_ptr)) {
ret = FALSE;
- fprintf(stderr,
- "InnoDB: node pointer to the right page is wrong\n");
+ fputs(
+ "InnoDB: node pointer to the right page is wrong\n",
+ stderr);
- fprintf(stderr,
- "InnoDB: Error on page %lu in index %s table %s\n",
- buf_frame_get_page_no(page),
- index->name, index->table_name);
+ btr_validate_report1(index, level,
+ page);
buf_page_print(father_page);
buf_page_print(page);
@@ -2701,13 +2727,12 @@ loop:
page_get_infimum_rec(
right_father_page))) {
ret = FALSE;
- fprintf(stderr,
- "InnoDB: node pointer 2 to the right page is wrong\n");
+ fputs(
+ "InnoDB: node pointer 2 to the right page is wrong\n",
+ stderr);
- fprintf(stderr,
- "InnoDB: Error on page %lu in index %s table %s\n",
- buf_frame_get_page_no(page),
- index->name, index->table_name);
+ btr_validate_report1(index, level,
+ page);
buf_page_print(father_page);
buf_page_print(right_father_page);
@@ -2719,13 +2744,12 @@ loop:
!= btr_page_get_next(father_page, &mtr)) {
ret = FALSE;
- fprintf(stderr,
- "InnoDB: node pointer 3 to the right page is wrong\n");
+ fputs(
+ "InnoDB: node pointer 3 to the right page is wrong\n",
+ stderr);
- fprintf(stderr,
- "InnoDB: Error on page %lu in index %s table %s\n",
- buf_frame_get_page_no(page),
- index->name, index->table_name);
+ btr_validate_report1(index, level,
+ page);
buf_page_print(father_page);
buf_page_print(right_father_page);