diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2018-03-22 18:02:40 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2018-03-22 18:02:40 +0200 |
commit | e80a842000cf42095b1bde4fb1449e709ed51b84 (patch) | |
tree | d6742633326e04a1ac7a36a1bab3693fd6e112c6 | |
parent | 2fb31821deb98d4324b1555ff5ede21feba77f6c (diff) | |
parent | 0cba2c1ccb28bd9ef65926f3c91d5f6cc9f08cf9 (diff) | |
download | mariadb-git-e80a842000cf42095b1bde4fb1449e709ed51b84.tar.gz |
Merge 10.1 into 10.2
-rw-r--r-- | extra/mariabackup/common.h | 4 | ||||
-rw-r--r-- | extra/mariabackup/xtrabackup.cc | 83 | ||||
-rw-r--r-- | mysql-test/suite/mariabackup/undo_space_id.opt | 2 | ||||
-rw-r--r-- | mysql-test/suite/mariabackup/undo_space_id.result | 13 | ||||
-rw-r--r-- | mysql-test/suite/mariabackup/undo_space_id.test | 25 | ||||
-rw-r--r-- | sql/item_cmpfunc.h | 5 | ||||
-rw-r--r-- | storage/innobase/include/trx0rseg.ic | 6 | ||||
-rw-r--r-- | storage/innobase/srv/srv0start.cc | 11 | ||||
-rw-r--r-- | storage/xtradb/srv/srv0start.cc | 6 |
9 files changed, 142 insertions, 13 deletions
diff --git a/extra/mariabackup/common.h b/extra/mariabackup/common.h index 4d73742af49..fae466adc97 100644 --- a/extra/mariabackup/common.h +++ b/extra/mariabackup/common.h @@ -28,7 +28,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA #include <my_sys.h> -# define fil_is_user_tablespace_id(i) ((i) > srv_undo_tablespaces_open) +/** Determine if (i) is a user tablespace id or not. */ +# define fil_is_user_tablespace_id(i) (i != 0 \ + && !srv_is_undo_tablespace(i)) #ifdef _MSC_VER #define stat _stati64 diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 78c0ae7d944..8318485fa2f 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -2939,6 +2939,83 @@ next_datadir_item: return(err); } +/** Assign srv_undo_space_id_start variable if there are undo tablespace present. +Read the TRX_SYS page from ibdata1 file and get the minimum space id from +the first slot rollback segments of TRX_SYS_PAGE_NO. +@retval DB_ERROR if file open or page read failed. +@retval DB_SUCCESS if srv_undo_space_id assigned successfully. */ +static dberr_t xb_assign_undo_space_start() +{ + ulint dirnamelen; + char name[1000]; + pfs_os_file_t file; + byte* buf; + byte* page; + bool ret; + dberr_t error = DB_SUCCESS; + ulint space, page_no; + + if (srv_undo_tablespaces == 0) { + return error; + } + + os_normalize_path(srv_data_home); + dirnamelen = strlen(srv_data_home); + memcpy(name, srv_data_home, dirnamelen); + + if (dirnamelen && name[dirnamelen - 1] != OS_PATH_SEPARATOR) { + name[dirnamelen++] = OS_PATH_SEPARATOR; + } + + snprintf(name + dirnamelen, strlen(name) + strlen("ibdata1"), + "%s", "ibdata1"); + + file = os_file_create(0, name, OS_FILE_OPEN, + OS_FILE_NORMAL, OS_DATA_FILE, true, &ret); + + if (!ret) { + msg("mariabackup: Error in opening %s\n", name); + return DB_ERROR; + } + + buf = static_cast<byte*>(ut_malloc_nokey(2 * UNIV_PAGE_SIZE)); + page = static_cast<byte*>(ut_align(buf, UNIV_PAGE_SIZE)); + +retry: + if (!os_file_read(IORequestRead, file, page, TRX_SYS_PAGE_NO * UNIV_PAGE_SIZE, + UNIV_PAGE_SIZE)) { + msg("mariabackup: Reading TRX_SYS page failed.\n"); + error = DB_ERROR; + goto func_exit; + } + + /* TRX_SYS page can't be compressed or encrypted. */ + if (buf_page_is_corrupted(false, page, univ_page_size)) { + goto retry; + } + + /* 0th slot always points to system tablespace. + 1st slot should point to first undotablespace which is minimum. */ + + page_no = mach_read_ulint(TRX_SYS + TRX_SYS_RSEGS + + TRX_SYS_RSEG_SLOT_SIZE + + TRX_SYS_RSEG_PAGE_NO + page, MLOG_4BYTES); + ut_ad(page_no != FIL_NULL); + + space = mach_read_ulint(TRX_SYS + TRX_SYS_RSEGS + + TRX_SYS_RSEG_SLOT_SIZE + + TRX_SYS_RSEG_SPACE + page, MLOG_4BYTES); + + srv_undo_space_id_start = space; + +func_exit: + ut_free(buf); + ret = os_file_close(file); + ut_a(ret); + + return error; +} + /**************************************************************************** Populates the tablespace memory cache by scanning for and opening data files. @returns DB_SUCCESS or error code.*/ @@ -2973,6 +3050,12 @@ xb_load_tablespaces() /* Add separate undo tablespaces to fil_system */ + err = xb_assign_undo_space_start(); + + if (err != DB_SUCCESS) { + return err; + } + err = srv_undo_tablespaces_init(false); if (err != DB_SUCCESS) { diff --git a/mysql-test/suite/mariabackup/undo_space_id.opt b/mysql-test/suite/mariabackup/undo_space_id.opt new file mode 100644 index 00000000000..01b1d91e820 --- /dev/null +++ b/mysql-test/suite/mariabackup/undo_space_id.opt @@ -0,0 +1,2 @@ +--debug=d,innodb_undo_upgrade +--innodb_undo_tablespaces=2 diff --git a/mysql-test/suite/mariabackup/undo_space_id.result b/mysql-test/suite/mariabackup/undo_space_id.result new file mode 100644 index 00000000000..96d3e2a58f4 --- /dev/null +++ b/mysql-test/suite/mariabackup/undo_space_id.result @@ -0,0 +1,13 @@ +# Create 2 UNDO TABLESPACE(UNDO003, UNDO004) +CREATE TABLE t1(a varchar(60)) ENGINE INNODB; +start transaction; +INSERT INTO t1 VALUES(1); +# xtrabackup backup +# Display undo log files from target directory +undo003 +undo004 +# xtrabackup prepare +# Display undo log files from targer directory +undo003 +undo004 +DROP TABLE t1; diff --git a/mysql-test/suite/mariabackup/undo_space_id.test b/mysql-test/suite/mariabackup/undo_space_id.test new file mode 100644 index 00000000000..8adeb18e5a7 --- /dev/null +++ b/mysql-test/suite/mariabackup/undo_space_id.test @@ -0,0 +1,25 @@ +--source include/have_innodb.inc +--source include/have_debug.inc + +--echo # Create 2 UNDO TABLESPACE(UNDO003, UNDO004) + +let $basedir=$MYSQLTEST_VARDIR/tmp/backup; + +CREATE TABLE t1(a varchar(60)) ENGINE INNODB; +start transaction; +INSERT INTO t1 VALUES(1); + +--echo # xtrabackup backup +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +--enable_result_log +--echo # Display undo log files from target directory +list_files $basedir undo*; + +--echo # xtrabackup prepare +exec $XTRABACKUP --prepare --apply-log-only --target-dir=$basedir; +--echo # Display undo log files from targer directory +list_files $basedir undo*; + +DROP TABLE t1; +rmdir $basedir; diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 5f3bd1e4ca7..5f0d2423969 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -2384,6 +2384,11 @@ public: void sort(Item_field_cmpfunc compare, void *arg); void fix_length_and_dec(); bool fix_fields(THD *thd, Item **ref); + void cleanup() + { + delete eval_item; + eval_item= NULL; + } void update_used_tables(); COND *build_equal_items(THD *thd, COND_EQUAL *inherited, bool link_item_fields, diff --git a/storage/innobase/include/trx0rseg.ic b/storage/innobase/include/trx0rseg.ic index 45ee3ef8d66..dac7dadfb68 100644 --- a/storage/innobase/include/trx0rseg.ic +++ b/storage/innobase/include/trx0rseg.ic @@ -42,9 +42,11 @@ trx_rsegf_get( buf_block_t* block; trx_rsegf_t* header; - ut_ad(space <= srv_undo_tablespaces_active || space == SRV_TMP_SPACE_ID + ut_ad(space <= srv_undo_space_id_start + srv_undo_tablespaces_active + || space == SRV_TMP_SPACE_ID || !srv_was_started); - ut_ad(space <= TRX_SYS_MAX_UNDO_SPACES || space == SRV_TMP_SPACE_ID); + ut_ad(space <= srv_undo_space_id_start + TRX_SYS_MAX_UNDO_SPACES + || space == SRV_TMP_SPACE_ID); block = buf_page_get( page_id_t(space, page_no), univ_page_size, RW_X_LATCH, mtr); diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index 424b45e8def..77fd93c6f56 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -898,12 +898,11 @@ srv_undo_tablespaces_init(bool create_new_db) switch (srv_operation) { case SRV_OPERATION_RESTORE_DELTA: case SRV_OPERATION_BACKUP: - /* MDEV-13561 FIXME: Determine srv_undo_space_id_start - from the undo001 file. */ - srv_undo_space_id_start = 1; for (i = 0; i < n_undo_tablespaces; i++) { undo_tablespace_ids[i] = i + srv_undo_space_id_start; } + + prev_space_id = srv_undo_space_id_start - 1; break; case SRV_OPERATION_NORMAL: if (create_new_db) { @@ -964,7 +963,7 @@ srv_undo_tablespaces_init(bool create_new_db) undo_tablespace_ids[i]); /* Should be no gaps in undo tablespace ids. */ - ut_a(prev_space_id + 1 == undo_tablespace_ids[i]); + ut_a(!i || prev_space_id + 1 == undo_tablespace_ids[i]); /* The system space id should not be in this array. */ ut_a(undo_tablespace_ids[i] != 0); @@ -992,14 +991,14 @@ srv_undo_tablespaces_init(bool create_new_db) not in use and therefore not required by recovery. We only check that there are no gaps. */ - for (i = prev_space_id + 1; i < TRX_SYS_N_RSEGS; ++i) { + for (i = prev_space_id + 1; + i < srv_undo_space_id_start + TRX_SYS_N_RSEGS; ++i) { char name[OS_FILE_MAX_PATH]; snprintf( name, sizeof(name), "%s%cundo%03zu", srv_undo_dir, OS_PATH_SEPARATOR, i); - /* Undo space ids start from 1. */ err = srv_undo_tablespace_open(name, i); if (err != DB_SUCCESS) { diff --git a/storage/xtradb/srv/srv0start.cc b/storage/xtradb/srv/srv0start.cc index a3c5a03a1d9..5bef0dffa8e 100644 --- a/storage/xtradb/srv/srv0start.cc +++ b/storage/xtradb/srv/srv0start.cc @@ -1505,14 +1505,12 @@ srv_undo_tablespaces_init( if (backup_mode) { ut_ad(!create_new_db); - /* MDEV-13561 FIXME: Determine srv_undo_space_id_start - from the undo001 file. */ - srv_undo_space_id_start = 1; - for (i = 0; i < n_undo_tablespaces; i++) { undo_tablespace_ids[i] = i + srv_undo_space_id_start; } + + prev_space_id = srv_undo_space_id_start - 1; } } |