diff options
Diffstat (limited to 'storage/innobase/mtr/mtr0log.cc')
-rw-r--r-- | storage/innobase/mtr/mtr0log.cc | 124 |
1 files changed, 79 insertions, 45 deletions
diff --git a/storage/innobase/mtr/mtr0log.cc b/storage/innobase/mtr/mtr0log.cc index 9cc9b77d6a8..6baf1f06bf9 100644 --- a/storage/innobase/mtr/mtr0log.cc +++ b/storage/innobase/mtr/mtr0log.cc @@ -148,7 +148,7 @@ mlog_parse_nbytes( offset = mach_read_from_2(ptr); ptr += 2; - if (offset >= UNIV_PAGE_SIZE) { + if (offset >= srv_page_size) { recv_sys->found_corrupt_log = TRUE; return(NULL); @@ -316,7 +316,7 @@ mlog_write_string( mtr_t* mtr) /*!< in: mini-transaction handle */ { ut_ad(ptr && mtr); - ut_a(len < UNIV_PAGE_SIZE); + ut_a(len < srv_page_size); memcpy(ptr, str, len); @@ -336,7 +336,7 @@ mlog_log_string( byte* log_ptr; ut_ad(ptr && mtr); - ut_ad(len <= UNIV_PAGE_SIZE); + ut_ad(len <= srv_page_size); log_ptr = mlog_open(mtr, 30); @@ -387,7 +387,7 @@ mlog_parse_string( len = mach_read_from_2(ptr); ptr += 2; - if (offset >= UNIV_PAGE_SIZE || len + offset > UNIV_PAGE_SIZE) { + if (offset >= srv_page_size || len + offset > srv_page_size) { recv_sys->found_corrupt_log = TRUE; return(NULL); @@ -430,23 +430,30 @@ mlog_open_and_write_index( ut_ad(!!page_rec_is_comp(rec) == dict_table_is_comp(index->table)); + mtr->set_modified(); + switch (mtr->get_log_mode()) { + case MTR_LOG_NONE: + case MTR_LOG_NO_REDO: + return NULL; + case MTR_LOG_SHORT_INSERTS: + ut_ad(0); + /* fall through */ + case MTR_LOG_ALL: + break; + } + if (!page_rec_is_comp(rec)) { - log_start = log_ptr = mlog_open(mtr, 11 + size); - if (!log_ptr) { - return(NULL); /* logging is disabled */ - } + log_start = log_ptr = mtr->get_log()->open(11 + size); log_ptr = mlog_write_initial_log_record_fast(rec, type, log_ptr, mtr); log_end = log_ptr + 11 + size; } else { ulint i; + bool is_instant = index->is_instant(); ulint n = dict_index_get_n_fields(index); - ulint total = 11 + size + (n + 2) * 2; - ulint alloc = total; - - if (alloc > mtr_buf_t::MAX_DATA_SIZE) { - alloc = mtr_buf_t::MAX_DATA_SIZE; - } + ulint total = 11 + (is_instant ? 2 : 0) + size + (n + 2) * 2; + ulint alloc = std::min(total, + ulint(mtr_buf_t::MAX_DATA_SIZE)); const bool is_leaf = page_is_leaf(page_align(rec)); @@ -456,30 +463,30 @@ mlog_open_and_write_index( n = DICT_INDEX_SPATIAL_NODEPTR_SIZE; } - log_start = log_ptr = mlog_open(mtr, alloc); - - if (!log_ptr) { - return(NULL); /* logging is disabled */ - } - + log_start = log_ptr = mtr->get_log()->open(alloc); log_end = log_ptr + alloc; log_ptr = mlog_write_initial_log_record_fast( rec, type, log_ptr, mtr); - mach_write_to_2(log_ptr, n); - log_ptr += 2; + if (is_instant) { + // marked as instant index + mach_write_to_2(log_ptr, n | 0x8000); + + log_ptr += 2; - if (is_leaf) { - mach_write_to_2( - log_ptr, dict_index_get_n_unique_in_tree(index)); + // record the n_core_fields + mach_write_to_2(log_ptr, index->n_core_fields); } else { - mach_write_to_2( - log_ptr, - dict_index_get_n_unique_in_tree_nonleaf(index)); + mach_write_to_2(log_ptr, n); } log_ptr += 2; + mach_write_to_2( + log_ptr, is_leaf + ? dict_index_get_n_unique_in_tree(index) + : dict_index_get_n_unique_in_tree_nonleaf(index)); + log_ptr += 2; for (i = 0; i < n; i++) { dict_field_t* field; @@ -501,19 +508,14 @@ mlog_open_and_write_index( } if (log_ptr + 2 > log_end) { mlog_close(mtr, log_ptr); - ut_a(total > (ulint) (log_ptr - log_start)); - total -= log_ptr - log_start; - alloc = total; - - if (alloc > mtr_buf_t::MAX_DATA_SIZE) { - alloc = mtr_buf_t::MAX_DATA_SIZE; - } - - log_start = log_ptr = mlog_open(mtr, alloc); - - if (!log_ptr) { - return(NULL); /* logging is disabled */ - } + ut_a(total > ulint(log_ptr - log_start)); + total -= ulint(log_ptr - log_start); + alloc = std::min( + total, + ulint(mtr_buf_t::MAX_DATA_SIZE)); + + log_start = log_ptr = mtr->get_log()->open( + alloc); log_end = log_ptr + alloc; } mach_write_to_2(log_ptr, len); @@ -544,6 +546,7 @@ mlog_parse_index( ulint i, n, n_uniq; dict_table_t* table; dict_index_t* ind; + ulint n_core_fields = 0; ut_ad(comp == FALSE || comp == TRUE); @@ -553,6 +556,23 @@ mlog_parse_index( } n = mach_read_from_2(ptr); ptr += 2; + if (n & 0x8000) { /* record after instant ADD COLUMN */ + n &= 0x7FFF; + + n_core_fields = mach_read_from_2(ptr); + + if (!n_core_fields || n_core_fields > n) { + recv_sys->found_corrupt_log = TRUE; + return(NULL); + } + + ptr += 2; + + if (end_ptr < ptr + 2) { + return(NULL); + } + } + n_uniq = mach_read_from_2(ptr); ptr += 2; ut_ad(n_uniq <= n); @@ -562,11 +582,9 @@ mlog_parse_index( } else { n = n_uniq = 1; } - table = dict_mem_table_create("LOG_DUMMY", DICT_HDR_SPACE, n, 0, + table = dict_mem_table_create("LOG_DUMMY", NULL, n, 0, comp ? DICT_TF_COMPACT : 0, 0); - ind = dict_mem_index_create("LOG_DUMMY", "LOG_DUMMY", - DICT_HDR_SPACE, 0, n); - ind->table = table; + ind = dict_mem_index_create(table, "LOG_DUMMY", 0, n); ind->n_uniq = (unsigned int) n_uniq; if (n_uniq != n) { ut_a(n_uniq + DATA_ROLL_PTR <= n); @@ -604,6 +622,22 @@ mlog_parse_index( ind->fields[DATA_ROLL_PTR - 1 + n_uniq].col = &table->cols[n + DATA_ROLL_PTR]; } + + ut_ad(table->n_cols == table->n_def); + + if (n_core_fields) { + for (i = n_core_fields; i < n; i++) { + ind->fields[i].col->def_val.len + = UNIV_SQL_NULL; + } + ind->n_core_fields = n_core_fields; + ind->n_core_null_bytes = UT_BITS_IN_BYTES( + ind->get_n_nullable(n_core_fields)); + } else { + ind->n_core_null_bytes = UT_BITS_IN_BYTES( + unsigned(ind->n_nullable)); + ind->n_core_fields = ind->n_fields; + } } /* avoid ut_ad(index->cached) in dict_index_get_n_unique_in_tree */ ind->cached = TRUE; |