summaryrefslogtreecommitdiff
path: root/storage/innobase/mtr/mtr0log.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/mtr/mtr0log.cc')
-rw-r--r--storage/innobase/mtr/mtr0log.cc124
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;