]> git.pld-linux.org Git - packages/mysql.git/blobdiff - innodb_pass_corrupt_table.patch
- rel 2; patches updated
[packages/mysql.git] / innodb_pass_corrupt_table.patch
index 2eb782857e4996c0bf112ba88c71db6ed02d02a4..63b1c657585242136a287549965e350780df46f3 100644 (file)
@@ -7,20 +7,20 @@
 # should be done or reviewed by the maintainer!
 --- a/storage/innobase/btr/btr0btr.c
 +++ b/storage/innobase/btr/btr0btr.c
-@@ -691,6 +691,12 @@
-       root_page_no = dict_index_get_page(index);
+@@ -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);
@@ -60,9 +60,9 @@
  #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;
        header = buf_block_get_frame(block) + PAGE_HEADER + PAGE_BTR_SEG_TOP;
 --- a/storage/innobase/btr/btr0cur.c
 +++ b/storage/innobase/btr/btr0cur.c
-@@ -250,6 +250,11 @@
-       case BTR_MODIFY_LEAF:
+@@ -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);
-@@ -2988,6 +3066,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);
-@@ -3701,6 +3784,11 @@
+@@ -3635,6 +3718,11 @@
  
                page = btr_cur_get_page(&cursor);
  
  /**************************************************************//**
  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) {
 -
 +#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);
  
  
  /* 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);
-@@ -2006,6 +2012,13 @@
+@@ -1946,6 +1952,13 @@
                return(NULL);
        }
  
        block_mutex = buf_page_get_mutex_enter(bpage);
  
        rw_lock_s_unlock(&buf_pool->page_hash_latch);
-@@ -2583,6 +2596,13 @@
+@@ -2525,6 +2538,13 @@
                return(NULL);
        }
  
        switch (buf_block_get_state(block)) {
                buf_page_t*     bpage;
                ibool           success;
-@@ -3257,6 +3277,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 */
-@@ -3841,6 +3862,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 */
  
-@@ -3882,6 +3904,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",
-@@ -3889,6 +3928,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. */
-@@ -3898,8 +3938,11 @@
+@@ -3903,8 +3943,11 @@
  
                if (uncompressed && !recv_no_ibuf_operations) {
                        ibuf_merge_or_delete_for_page(
        }
 --- a/storage/innobase/buf/buf0rea.c
 +++ b/storage/innobase/buf/buf0rea.c
-@@ -193,7 +193,14 @@
+@@ -195,7 +195,14 @@
                              ((buf_block_t*) bpage)->frame, bpage, trx);
        }
        thd_wait_end(NULL);
                /* The i/o is already completed when we arrive from
 --- a/storage/innobase/dict/dict0dict.c
 +++ b/storage/innobase/dict/dict0dict.c
-@@ -54,6 +54,7 @@
- #include "row0merge.h"
+@@ -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;
-@@ -4366,6 +4367,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;
-@@ -4513,6 +4520,12 @@
+@@ -4524,6 +4531,12 @@
        heap = mem_heap_create(1000);
  
        while (index) {
  /*===========================================*/
  {
        dict_table_t*   sys_stats;
-@@ -4705,6 +4718,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;
-@@ -5501,4 +5521,42 @@
-               rw_lock_free(&dict_table_stats_latches[i]);
-       }
+@@ -5695,4 +5715,42 @@
+       index->type |= DICT_CORRUPT;
  }
 +
 +/*************************************************************************
        UT_LIST_ADD_LAST(space_list, fil_system->space_list, space);
  
        mutex_exit(&fil_system->mutex);
-@@ -5268,6 +5271,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) {
-@@ -5282,6 +5313,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) {
-@@ -5782,3 +5815,46 @@
+@@ -5799,3 +5832,46 @@
                 return 0;
         }
  }
 +
 --- a/storage/innobase/fsp/fsp0fsp.c
 +++ b/storage/innobase/fsp/fsp0fsp.c
-@@ -369,6 +369,12 @@
+@@ -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);
  
        if (descr != NULL) {
 --- a/storage/innobase/handler/ha_innodb.cc
 +++ b/storage/innobase/handler/ha_innodb.cc
-@@ -3979,6 +3979,12 @@
+@@ -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
-@@ -4006,6 +4012,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;
-@@ -5174,6 +5193,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();
  
-@@ -5391,6 +5414,10 @@
+@@ -5479,6 +5500,10 @@
  func_exit:
        innobase_active_small();
  
        DBUG_RETURN(error_result);
  }
  
-@@ -5567,6 +5594,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();
  
-@@ -5656,6 +5687,10 @@
+@@ -5760,6 +5789,10 @@
  
        innobase_active_small();
  
        DBUG_RETURN(error);
  }
  
-@@ -5677,6 +5712,10 @@
+@@ -5781,6 +5814,10 @@
  
        ha_statistic_increment(&SSV::ha_delete_count);
  
        if (!prebuilt->upd_node) {
                row_get_prebuilt_update_vector(prebuilt);
        }
-@@ -5703,6 +5742,10 @@
+@@ -5807,6 +5844,10 @@
  
        innobase_active_small();
  
        DBUG_RETURN(error);
  }
  
-@@ -5942,6 +5985,10 @@
+@@ -6046,6 +6087,10 @@
  
        ha_statistic_increment(&SSV::ha_read_key_count);
  
 +
        index = prebuilt->index;
  
-       if (UNIV_UNLIKELY(index == NULL)) {
-@@ -6007,6 +6054,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;
-@@ -6122,6 +6173,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));
  
-@@ -6212,6 +6267,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);
-@@ -6221,6 +6280,10 @@
+@@ -6349,6 +6406,10 @@
  
        innodb_srv_conc_exit_innodb(prebuilt->trx);
  
        switch (ret) {
        case DB_SUCCESS:
                error = 0;
-@@ -7487,10 +7550,18 @@
+@@ -7615,10 +7676,18 @@
  
        update_thd(ha_thd());
  
        error = convert_error_code_to_mysql(error, prebuilt->table->flags,
                                            NULL);
  
-@@ -7991,6 +8062,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
-@@ -8168,7 +8249,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 */
  
-@@ -8461,10 +8542,18 @@
+@@ -8601,10 +8680,18 @@
        THD*            thd,            /*!< in: connection thread handle */
        HA_CHECK_OPT*   check_opt)      /*!< in: currently ignored */
  {
        return(0);
  }
  
-@@ -8646,6 +8735,10 @@
+@@ -8840,6 +8927,10 @@
                my_error(ER_QUERY_INTERRUPTED, MYF(0));
        }
  
        DBUG_RETURN(is_ok ? HA_ADMIN_OK : HA_ADMIN_CORRUPT);
  }
  
-@@ -9416,6 +9509,10 @@
+@@ -9610,6 +9701,10 @@
  
        update_thd(thd);
  
        if (prebuilt->table->ibd_file_missing && !thd_tablespace_op(thd)) {
                ut_print_timestamp(stderr);
                fprintf(stderr,
-@@ -11823,6 +11920,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),
-@@ -11910,6 +12027,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
  };
  } 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);
  #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);
-       }
+               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
-@@ -1025,7 +1025,7 @@
+@@ -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.
-@@ -1472,6 +1472,7 @@
+@@ -1470,6 +1470,7 @@
                                        0 if the block was never accessed
                                        in the buffer pool */
        /* @} */
  /*********************************************************************//**
  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 */
  {
        switch (buf_block_get_state(block)) {
 --- a/storage/innobase/include/dict0dict.h
 +++ b/storage/innobase/include/dict0dict.h
-@@ -1258,6 +1258,15 @@
- dict_close(void);
/*============*/
+@@ -1326,6 +1326,15 @@
+ /*========================*/
      ulint           space_id);      /*!< in: space ID */
  
 +/*************************************************************************
 +set is_corrupt flag by space_id*/
  #endif
 --- a/storage/innobase/include/dict0mem.h
 +++ b/storage/innobase/include/dict0mem.h
-@@ -666,6 +666,7 @@
+@@ -670,6 +670,7 @@
                                the AUTOINC lock on this table. */
                                /* @} */
        /*----------------------*/
  #ifdef UNIV_DEBUG
 --- a/storage/innobase/include/fil0fil.h
 +++ b/storage/innobase/include/fil0fil.h
-@@ -750,6 +750,19 @@
+@@ -759,6 +759,19 @@
  fil_system_hash_nodes(void);
  /*========================*/
  
        buf_block_dbg_add_level(block, SYNC_NO_ORDER_CHECK);
 --- a/storage/innobase/include/page0page.h
 +++ b/storage/innobase/include/page0page.h
-@@ -527,7 +527,7 @@
+@@ -497,7 +497,7 @@
  page_is_leaf(
  /*=========*/
        const page_t*   page)   /*!< in: page */
  Decompress a page.  This function should tolerate errors on the compressed
 --- a/storage/innobase/include/srv0srv.h
 +++ b/storage/innobase/include/srv0srv.h
-@@ -240,6 +240,7 @@
+@@ -245,6 +245,7 @@
  extern ulint  srv_adaptive_flushing_method;
  
  extern ulint  srv_expand_import;
        ut_ad(page_simple_validate_new((page_t*) page));
 --- a/storage/innobase/row/row0ins.c
 +++ b/storage/innobase/row/row0ins.c
-@@ -1335,6 +1335,12 @@
+@@ -1341,6 +1341,12 @@
                const rec_t*            rec = btr_pcur_get_rec(&pcur);
                const buf_block_t*      block = btr_pcur_get_block(&pcur);
  
  
 --- a/storage/innobase/row/row0sel.c
 +++ b/storage/innobase/row/row0sel.c
-@@ -3854,6 +3854,13 @@
+@@ -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
        /*
-@@ -3931,7 +3938,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,
-@@ -3982,7 +3995,8 @@
+@@ -4047,7 +4060,8 @@
  
        offsets = rec_get_offsets(rec, index, offsets, ULINT_UNDEFINED, &heap);
  
                        fprintf(stderr,
 --- a/storage/innobase/srv/srv0srv.c
 +++ b/storage/innobase/srv/srv0srv.c
-@@ -430,6 +430,7 @@
+@@ -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 */
  /*-------------------------------------------*/
 --- a/storage/innobase/srv/srv0start.c
 +++ b/storage/innobase/srv/srv0start.c
-@@ -2149,6 +2149,13 @@
+@@ -2175,6 +2175,13 @@
  
        os_fast_mutex_free(&srv_os_test_mutex);
  
This page took 0.07132 seconds and 4 git commands to generate.