diff options
Diffstat (limited to 'innobase/btr/btr0btr.c')
-rw-r--r-- | innobase/btr/btr0btr.c | 258 |
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); |