summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2018-01-23 09:12:25 +0000
committerVladislav Vaintroub <wlad@mariadb.com>2018-01-23 09:13:12 +0000
commit87db5eb8130a58bd7556bda8a5637dfef982d51a (patch)
tree3fd03534bbfb03616fd97cd557c45aaddcc12554
parent29eeb527fd4496eeb852f4aec80a43e60a1bc10c (diff)
downloadmariadb-git-87db5eb8130a58bd7556bda8a5637dfef982d51a.tar.gz
MDEV-13825 mariabackup --lock-ddl-per-table does not properly lock
FULLTEXT auxiliary tables Change the logic to take mdl lock on all tables before tablespaces are copied, rather than lock every single tablespace just before it is copied.
-rw-r--r--extra/mariabackup/xtrabackup.cc28
1 files changed, 21 insertions, 7 deletions
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc
index 375d8845a2a..7eee64bd6ef 100644
--- a/extra/mariabackup/xtrabackup.cc
+++ b/extra/mariabackup/xtrabackup.cc
@@ -433,6 +433,22 @@ datafiles_iter_free(datafiles_iter_t *it)
free(it);
}
+void mdl_lock_all()
+{
+ mdl_lock_init();
+ datafiles_iter_t *it = datafiles_iter_new(fil_system);
+ if (!it)
+ return;
+
+ while (fil_node_t *node = datafiles_iter_next(it)){
+ if (fil_is_user_tablespace_id(node->space->id)
+ && check_if_skip_table(node->space->name))
+ continue;
+
+ mdl_lock_table(node->space->id);
+ }
+ datafiles_iter_free(it);
+}
/* ======== Date copying thread context ======== */
typedef struct {
@@ -2199,10 +2215,6 @@ xtrabackup_copy_datafile(fil_node_t* node, uint thread_n)
return(FALSE);
}
- if (opt_lock_ddl_per_table) {
- mdl_lock_table(node->space->id);
- }
-
if (!changed_page_bitmap) {
read_filter = &rf_pass_through;
}
@@ -3562,9 +3574,7 @@ xtrabackup_backup_func()
"or RENAME TABLE during the backup, inconsistent backup will be "
"produced.\n");
- if (opt_lock_ddl_per_table) {
- mdl_lock_init();
- }
+
/* initialize components */
if(innodb_init_param()) {
@@ -3879,6 +3889,10 @@ reread_log_header:
"files transfer\n", xtrabackup_parallel);
}
+ if (opt_lock_ddl_per_table) {
+ mdl_lock_all();
+ }
+
it = datafiles_iter_new(fil_system);
if (it == NULL) {
msg("mariabackup: Error: datafiles_iter_new() failed.\n");