Merge 10.2 into 10.3
This commit is contained in:
commit
77cbaa96ad
@ -61,19 +61,19 @@ MYSQL_ADD_EXECUTABLE(mariabackup
|
|||||||
xtrabackup.cc
|
xtrabackup.cc
|
||||||
innobackupex.cc
|
innobackupex.cc
|
||||||
changed_page_bitmap.cc
|
changed_page_bitmap.cc
|
||||||
datasink.c
|
datasink.cc
|
||||||
ds_buffer.c
|
ds_buffer.cc
|
||||||
ds_compress.c
|
ds_compress.cc
|
||||||
ds_local.cc
|
ds_local.cc
|
||||||
ds_stdout.c
|
ds_stdout.cc
|
||||||
ds_tmpfile.c
|
ds_tmpfile.cc
|
||||||
ds_xbstream.c
|
ds_xbstream.cc
|
||||||
fil_cur.cc
|
fil_cur.cc
|
||||||
quicklz/quicklz.c
|
quicklz/quicklz.c
|
||||||
read_filt.cc
|
read_filt.cc
|
||||||
write_filt.cc
|
write_filt.cc
|
||||||
wsrep.cc
|
wsrep.cc
|
||||||
xbstream_write.c
|
xbstream_write.cc
|
||||||
backup_mysql.cc
|
backup_mysql.cc
|
||||||
backup_copy.cc
|
backup_copy.cc
|
||||||
encryption_plugin.cc
|
encryption_plugin.cc
|
||||||
@ -100,13 +100,13 @@ ENDIF()
|
|||||||
# xbstream binary
|
# xbstream binary
|
||||||
########################################################################
|
########################################################################
|
||||||
MYSQL_ADD_EXECUTABLE(mbstream
|
MYSQL_ADD_EXECUTABLE(mbstream
|
||||||
ds_buffer.c
|
ds_buffer.cc
|
||||||
ds_local.cc
|
ds_local.cc
|
||||||
ds_stdout.c
|
ds_stdout.cc
|
||||||
datasink.c
|
datasink.cc
|
||||||
xbstream.c
|
xbstream.cc
|
||||||
xbstream_read.c
|
xbstream_read.cc
|
||||||
xbstream_write.c
|
xbstream_write.cc
|
||||||
COMPONENT backup
|
COMPONENT backup
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -236,7 +236,7 @@ datadir_iter_next_database(datadir_iter_t *it)
|
|||||||
if (os_file_closedir(it->dbdir) != 0) {
|
if (os_file_closedir(it->dbdir) != 0) {
|
||||||
|
|
||||||
msg("Warning: could not"
|
msg("Warning: could not"
|
||||||
" close database directory %s\n", it->dbpath);
|
" close database directory %s", it->dbpath);
|
||||||
|
|
||||||
it->err = DB_ERROR;
|
it->err = DB_ERROR;
|
||||||
|
|
||||||
@ -277,7 +277,7 @@ datadir_iter_next_database(datadir_iter_t *it)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (check_if_skip_database_by_path(it->dbpath)) {
|
if (check_if_skip_database_by_path(it->dbpath)) {
|
||||||
msg("Skipping db: %s\n", it->dbpath);
|
msg("Skipping db: %s", it->dbpath);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -521,19 +521,15 @@ datafile_open(const char *file, datafile_cur_t *cursor, uint thread_n)
|
|||||||
/* The following call prints an error message */
|
/* The following call prints an error message */
|
||||||
os_file_get_last_error(TRUE);
|
os_file_get_last_error(TRUE);
|
||||||
|
|
||||||
msg("[%02u] error: cannot open "
|
msg(thread_n,"error: cannot open "
|
||||||
"file %s\n",
|
"file %s", cursor->abs_path);
|
||||||
thread_n, cursor->abs_path);
|
|
||||||
|
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!my_stat(cursor->abs_path, &cursor->statinfo, 0)) {
|
if (!my_stat(cursor->abs_path, &cursor->statinfo, 0)) {
|
||||||
msg("[%02u] error: cannot stat %s\n",
|
msg(thread_n, "error: cannot stat %s", cursor->abs_path);
|
||||||
thread_n, cursor->abs_path);
|
|
||||||
|
|
||||||
datafile_close(cursor);
|
datafile_close(cursor);
|
||||||
|
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -724,9 +720,8 @@ directory_exists(const char *dir, bool create)
|
|||||||
|
|
||||||
if (mkdirp(dir, 0777, MYF(0)) < 0) {
|
if (mkdirp(dir, 0777, MYF(0)) < 0) {
|
||||||
my_strerror(errbuf, sizeof(errbuf), my_errno);
|
my_strerror(errbuf, sizeof(errbuf), my_errno);
|
||||||
msg("Can not create directory %s: %s\n", dir, errbuf);
|
msg("Can not create directory %s: %s", dir, errbuf);
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -735,7 +730,7 @@ directory_exists(const char *dir, bool create)
|
|||||||
|
|
||||||
if (os_dir == NULL) {
|
if (os_dir == NULL) {
|
||||||
my_strerror(errbuf, sizeof(errbuf), my_errno);
|
my_strerror(errbuf, sizeof(errbuf), my_errno);
|
||||||
msg("Can not open directory %s: %s\n", dir,
|
msg("Can not open directory %s: %s", dir,
|
||||||
errbuf);
|
errbuf);
|
||||||
|
|
||||||
return(false);
|
return(false);
|
||||||
@ -764,7 +759,7 @@ directory_exists_and_empty(const char *dir, const char *comment)
|
|||||||
os_dir = os_file_opendir(dir, FALSE);
|
os_dir = os_file_opendir(dir, FALSE);
|
||||||
|
|
||||||
if (os_dir == NULL) {
|
if (os_dir == NULL) {
|
||||||
msg("%s can not open directory %s\n", comment, dir);
|
msg("%s can not open directory %s", comment, dir);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -773,7 +768,7 @@ directory_exists_and_empty(const char *dir, const char *comment)
|
|||||||
os_file_closedir(os_dir);
|
os_file_closedir(os_dir);
|
||||||
|
|
||||||
if (!empty) {
|
if (!empty) {
|
||||||
msg("%s directory %s is not empty!\n", comment, dir);
|
msg("%s directory %s is not empty!", comment, dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(empty);
|
return(empty);
|
||||||
@ -822,7 +817,7 @@ datafile_copy_backup(const char *filepath, uint thread_n)
|
|||||||
of the filters value. */
|
of the filters value. */
|
||||||
|
|
||||||
if (check_if_skip_table(filepath)) {
|
if (check_if_skip_table(filepath)) {
|
||||||
msg_ts("[%02u] Skipping %s.\n", thread_n, filepath);
|
msg(thread_n,"Skipping %s.", filepath);
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -888,14 +883,13 @@ backup_file_vprintf(const char *filename, const char *fmt, va_list ap)
|
|||||||
|
|
||||||
dstfile = ds_open(ds_data, filename, &stat);
|
dstfile = ds_open(ds_data, filename, &stat);
|
||||||
if (dstfile == NULL) {
|
if (dstfile == NULL) {
|
||||||
msg("[%02u] error: "
|
msg("error: Can't open the destination stream for %s",
|
||||||
"cannot open the destination stream for %s\n",
|
filename);
|
||||||
0, filename);
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
action = xb_get_copy_action("Writing");
|
action = xb_get_copy_action("Writing");
|
||||||
msg_ts("[%02u] %s %s\n", 0, action, filename);
|
msg("%s %s", action, filename);
|
||||||
|
|
||||||
if (buf_len == -1) {
|
if (buf_len == -1) {
|
||||||
goto error;
|
goto error;
|
||||||
@ -906,7 +900,7 @@ backup_file_vprintf(const char *filename, const char *fmt, va_list ap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* close */
|
/* close */
|
||||||
msg_ts("[%02u] ...done\n", 0);
|
msg(" ...done");
|
||||||
free(buf);
|
free(buf);
|
||||||
|
|
||||||
if (ds_close(dstfile)) {
|
if (ds_close(dstfile)) {
|
||||||
@ -922,7 +916,7 @@ error:
|
|||||||
}
|
}
|
||||||
|
|
||||||
error_close:
|
error_close:
|
||||||
msg("[%02u] Error: backup file failed.\n", 0);
|
msg("Error: backup file failed.");
|
||||||
return(false); /*ERROR*/
|
return(false); /*ERROR*/
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -982,7 +976,7 @@ run_data_threads(datadir_iter_t *it, os_thread_func_t func, uint n)
|
|||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
ret = data_threads[i].ret && ret;
|
ret = data_threads[i].ret && ret;
|
||||||
if (!data_threads[i].ret) {
|
if (!data_threads[i].ret) {
|
||||||
msg("Error: thread %u failed.\n", i);
|
msg("Error: thread %u failed.", i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1017,14 +1011,12 @@ copy_file(ds_ctxt_t *datasink,
|
|||||||
|
|
||||||
dstfile = ds_open(datasink, dst_path, &cursor.statinfo);
|
dstfile = ds_open(datasink, dst_path, &cursor.statinfo);
|
||||||
if (dstfile == NULL) {
|
if (dstfile == NULL) {
|
||||||
msg("[%02u] error: "
|
msg(thread_n,"error: "
|
||||||
"cannot open the destination stream for %s\n",
|
"cannot open the destination stream for %s", dst_name);
|
||||||
thread_n, dst_name);
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_ts("[%02u] %s %s to %s\n",
|
msg(thread_n, "%s %s to %s", xb_get_copy_action(), src_file_path, dstfile->path);
|
||||||
thread_n, xb_get_copy_action(), src_file_path, dstfile->path);
|
|
||||||
|
|
||||||
/* The main copy loop */
|
/* The main copy loop */
|
||||||
while ((res = datafile_read(&cursor)) == XB_FIL_CUR_SUCCESS) {
|
while ((res = datafile_read(&cursor)) == XB_FIL_CUR_SUCCESS) {
|
||||||
@ -1039,7 +1031,7 @@ copy_file(ds_ctxt_t *datasink,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* close */
|
/* close */
|
||||||
msg_ts("[%02u] ...done\n", thread_n);
|
msg(thread_n," ...done");
|
||||||
datafile_close(&cursor);
|
datafile_close(&cursor);
|
||||||
if (ds_close(dstfile)) {
|
if (ds_close(dstfile)) {
|
||||||
goto error_close;
|
goto error_close;
|
||||||
@ -1053,7 +1045,7 @@ error:
|
|||||||
}
|
}
|
||||||
|
|
||||||
error_close:
|
error_close:
|
||||||
msg("[%02u] Error: copy_file() failed.\n", thread_n);
|
msg(thread_n,"Error: copy_file() failed.");
|
||||||
return(false); /*ERROR*/
|
return(false); /*ERROR*/
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1085,36 +1077,34 @@ move_file(ds_ctxt_t *datasink,
|
|||||||
|
|
||||||
if (file_exists(dst_file_path_abs)) {
|
if (file_exists(dst_file_path_abs)) {
|
||||||
msg("Error: Move file %s to %s failed: Destination "
|
msg("Error: Move file %s to %s failed: Destination "
|
||||||
"file exists\n",
|
"file exists", src_file_path, dst_file_path_abs);
|
||||||
src_file_path, dst_file_path_abs);
|
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_ts("[%02u] Moving %s to %s\n",
|
msg(thread_n,"Moving %s to %s", src_file_path, dst_file_path_abs);
|
||||||
thread_n, src_file_path, dst_file_path_abs);
|
|
||||||
|
|
||||||
if (my_rename(src_file_path, dst_file_path_abs, MYF(0)) != 0) {
|
if (my_rename(src_file_path, dst_file_path_abs, MYF(0)) != 0) {
|
||||||
if (my_errno == EXDEV) {
|
if (my_errno == EXDEV) {
|
||||||
bool ret;
|
bool ret;
|
||||||
ret = copy_file(datasink, src_file_path,
|
ret = copy_file(datasink, src_file_path,
|
||||||
dst_file_path, thread_n);
|
dst_file_path, thread_n);
|
||||||
msg_ts("[%02u] Removing %s\n", thread_n, src_file_path);
|
msg(thread_n,"Removing %s", src_file_path);
|
||||||
if (unlink(src_file_path) != 0) {
|
if (unlink(src_file_path) != 0) {
|
||||||
my_strerror(errbuf, sizeof(errbuf), errno);
|
my_strerror(errbuf, sizeof(errbuf), errno);
|
||||||
msg("Error: unlink %s failed: %s\n",
|
msg("Error: unlink %s failed: %s",
|
||||||
src_file_path,
|
src_file_path,
|
||||||
errbuf);
|
errbuf);
|
||||||
}
|
}
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
my_strerror(errbuf, sizeof(errbuf), my_errno);
|
my_strerror(errbuf, sizeof(errbuf), my_errno);
|
||||||
msg("Can not move file %s to %s: %s\n",
|
msg("Can not move file %s to %s: %s",
|
||||||
src_file_path, dst_file_path_abs,
|
src_file_path, dst_file_path_abs,
|
||||||
errbuf);
|
errbuf);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_ts("[%02u] ...done\n", thread_n);
|
msg(thread_n," ...done");
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
@ -1266,13 +1256,13 @@ backup_files(const char *from, bool prep_mode)
|
|||||||
prep_mode ? 1 : 2);
|
prep_mode ? 1 : 2);
|
||||||
rsync_tmpfile = fopen(rsync_tmpfile_name, "w");
|
rsync_tmpfile = fopen(rsync_tmpfile_name, "w");
|
||||||
if (rsync_tmpfile == NULL) {
|
if (rsync_tmpfile == NULL) {
|
||||||
msg("Error: can't create file %s\n",
|
msg("Error: can't create file %s",
|
||||||
rsync_tmpfile_name);
|
rsync_tmpfile_name);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_ts("Starting %s non-InnoDB tables and files\n",
|
msg("Starting %s non-InnoDB tables and files",
|
||||||
prep_mode ? "prep copy of" : "to backup");
|
prep_mode ? "prep copy of" : "to backup");
|
||||||
|
|
||||||
datadir_node_init(&node);
|
datadir_node_init(&node);
|
||||||
@ -1288,7 +1278,7 @@ backup_files(const char *from, bool prep_mode)
|
|||||||
ret = datafile_copy_backup(node.filepath, 1);
|
ret = datafile_copy_backup(node.filepath, 1);
|
||||||
}
|
}
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
msg("Failed to copy file %s\n", node.filepath);
|
msg("Failed to copy file %s", node.filepath);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
} else if (!prep_mode) {
|
} else if (!prep_mode) {
|
||||||
@ -1298,7 +1288,7 @@ backup_files(const char *from, bool prep_mode)
|
|||||||
"%s/db.opt", node.filepath);
|
"%s/db.opt", node.filepath);
|
||||||
if (!(ret = backup_file_printf(
|
if (!(ret = backup_file_printf(
|
||||||
trim_dotslash(path), "%s", ""))) {
|
trim_dotslash(path), "%s", ""))) {
|
||||||
msg("Failed to create file %s\n", path);
|
msg("Failed to create file %s", path);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1323,13 +1313,13 @@ backup_files(const char *from, bool prep_mode)
|
|||||||
cmd << "rsync -t . --files-from=" << rsync_tmpfile_name
|
cmd << "rsync -t . --files-from=" << rsync_tmpfile_name
|
||||||
<< " " << xtrabackup_target_dir;
|
<< " " << xtrabackup_target_dir;
|
||||||
|
|
||||||
msg_ts("Starting rsync as: %s\n", cmd.str().c_str());
|
msg("Starting rsync as: %s", cmd.str().c_str());
|
||||||
if ((err = system(cmd.str().c_str()) && !prep_mode) != 0) {
|
if ((err = system(cmd.str().c_str()) && !prep_mode) != 0) {
|
||||||
msg_ts("Error: rsync failed with error code %d\n", err);
|
msg("Error: rsync failed with error code %d", err);
|
||||||
ret = false;
|
ret = false;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
msg_ts("rsync finished successfully.\n");
|
msg("rsync finished successfully.");
|
||||||
|
|
||||||
if (!prep_mode && !opt_no_lock) {
|
if (!prep_mode && !opt_no_lock) {
|
||||||
char path[FN_REFLEN];
|
char path[FN_REFLEN];
|
||||||
@ -1345,7 +1335,7 @@ backup_files(const char *from, bool prep_mode)
|
|||||||
|
|
||||||
rsync_tmpfile = fopen(rsync_tmpfile_name, "r");
|
rsync_tmpfile = fopen(rsync_tmpfile_name, "r");
|
||||||
if (rsync_tmpfile == NULL) {
|
if (rsync_tmpfile == NULL) {
|
||||||
msg("Error: can't open file %s\n",
|
msg("Error: can't open file %s",
|
||||||
rsync_tmpfile_name);
|
rsync_tmpfile_name);
|
||||||
ret = false;
|
ret = false;
|
||||||
goto out;
|
goto out;
|
||||||
@ -1361,7 +1351,7 @@ backup_files(const char *from, bool prep_mode)
|
|||||||
snprintf(dst_path, sizeof(dst_path),
|
snprintf(dst_path, sizeof(dst_path),
|
||||||
"%s/%s", xtrabackup_target_dir,
|
"%s/%s", xtrabackup_target_dir,
|
||||||
path);
|
path);
|
||||||
msg_ts("Removing %s\n", dst_path);
|
msg("Removing %s", dst_path);
|
||||||
unlink(dst_path);
|
unlink(dst_path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1371,7 +1361,7 @@ backup_files(const char *from, bool prep_mode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_ts("Finished %s non-InnoDB tables and files\n",
|
msg("Finished %s non-InnoDB tables and files",
|
||||||
prep_mode ? "a prep copy of" : "backing up");
|
prep_mode ? "a prep copy of" : "backing up");
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@ -1443,7 +1433,7 @@ bool backup_start()
|
|||||||
rocksdb_create_checkpoint();
|
rocksdb_create_checkpoint();
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_ts("Waiting for log copy thread to read lsn %llu\n", (ulonglong)server_lsn_after_lock);
|
msg("Waiting for log copy thread to read lsn %llu", (ulonglong)server_lsn_after_lock);
|
||||||
backup_wait_for_lsn(server_lsn_after_lock);
|
backup_wait_for_lsn(server_lsn_after_lock);
|
||||||
backup_fix_ddl();
|
backup_fix_ddl();
|
||||||
|
|
||||||
@ -1486,7 +1476,7 @@ bool backup_start()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (have_flush_engine_logs && !opt_no_lock) {
|
if (have_flush_engine_logs && !opt_no_lock) {
|
||||||
msg_ts("Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...\n");
|
msg("Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...");
|
||||||
xb_mysql_query(mysql_connection,
|
xb_mysql_query(mysql_connection,
|
||||||
"FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS", false);
|
"FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS", false);
|
||||||
}
|
}
|
||||||
@ -1510,7 +1500,7 @@ void backup_release()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (opt_safe_slave_backup && sql_thread_started) {
|
if (opt_safe_slave_backup && sql_thread_started) {
|
||||||
msg("Starting slave SQL thread\n");
|
msg("Starting slave SQL thread");
|
||||||
xb_mysql_query(mysql_connection,
|
xb_mysql_query(mysql_connection,
|
||||||
"START SLAVE SQL_THREAD", false);
|
"START SLAVE SQL_THREAD", false);
|
||||||
}
|
}
|
||||||
@ -1536,12 +1526,12 @@ bool backup_finish()
|
|||||||
rocksdb_backup_checkpoint();
|
rocksdb_backup_checkpoint();
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_ts("Backup created in directory '%s'\n", xtrabackup_target_dir);
|
msg("Backup created in directory '%s'", xtrabackup_target_dir);
|
||||||
if (mysql_binlog_position != NULL) {
|
if (mysql_binlog_position != NULL) {
|
||||||
msg("MySQL binlog position: %s\n", mysql_binlog_position);
|
msg("MySQL binlog position: %s", mysql_binlog_position);
|
||||||
}
|
}
|
||||||
if (mysql_slave_position && opt_slave_info) {
|
if (mysql_slave_position && opt_slave_info) {
|
||||||
msg("MySQL slave binlog position: %s\n",
|
msg("MySQL slave binlog position: %s",
|
||||||
mysql_slave_position);
|
mysql_slave_position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1601,7 +1591,7 @@ ibx_copy_incremental_over_full()
|
|||||||
|
|
||||||
if (!(ret = copy_file(ds_data, node.filepath,
|
if (!(ret = copy_file(ds_data, node.filepath,
|
||||||
node.filepath_rel, 1))) {
|
node.filepath_rel, 1))) {
|
||||||
msg("Failed to copy file %s\n",
|
msg("Failed to copy file %s",
|
||||||
node.filepath);
|
node.filepath);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -1741,7 +1731,7 @@ copy_back()
|
|||||||
/* cd to backup directory */
|
/* cd to backup directory */
|
||||||
if (my_setwd(xtrabackup_target_dir, MYF(MY_WME)))
|
if (my_setwd(xtrabackup_target_dir, MYF(MY_WME)))
|
||||||
{
|
{
|
||||||
msg("cannot my_setwd %s\n", xtrabackup_target_dir);
|
msg("Can't my_setwd %s", xtrabackup_target_dir);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1754,7 +1744,7 @@ copy_back()
|
|||||||
srv_sys_space.set_path(".");
|
srv_sys_space.set_path(".");
|
||||||
|
|
||||||
if (!srv_sys_space.parse_params(innobase_data_file_path, true)) {
|
if (!srv_sys_space.parse_params(innobase_data_file_path, true)) {
|
||||||
msg("syntax error in innodb_data_file_path\n");
|
msg("syntax error in innodb_data_file_path");
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1868,12 +1858,12 @@ copy_back()
|
|||||||
snprintf(path, sizeof(path), "%s/%s",
|
snprintf(path, sizeof(path), "%s/%s",
|
||||||
mysql_data_home, node.filepath_rel);
|
mysql_data_home, node.filepath_rel);
|
||||||
|
|
||||||
msg_ts("[%02u] Creating directory %s\n", 1, path);
|
msg("Creating directory %s", path);
|
||||||
|
|
||||||
if (mkdirp(path, 0777, MYF(0)) < 0) {
|
if (mkdirp(path, 0777, MYF(0)) < 0) {
|
||||||
char errbuf[MYSYS_STRERROR_SIZE];
|
char errbuf[MYSYS_STRERROR_SIZE];
|
||||||
my_strerror(errbuf, sizeof(errbuf), my_errno);
|
my_strerror(errbuf, sizeof(errbuf), my_errno);
|
||||||
msg("Can not create directory %s: %s\n",
|
msg("Can not create directory %s: %s",
|
||||||
path, errbuf);
|
path, errbuf);
|
||||||
ret = false;
|
ret = false;
|
||||||
|
|
||||||
@ -1881,7 +1871,7 @@ copy_back()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_ts("[%02u] ...done.", 1);
|
msg(" ...done.");
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1991,14 +1981,14 @@ decrypt_decompress_file(const char *filepath, uint thread_n)
|
|||||||
|
|
||||||
if (needs_action) {
|
if (needs_action) {
|
||||||
|
|
||||||
msg_ts("[%02u] %s\n", thread_n, message.str().c_str());
|
msg(thread_n,"%s\n", message.str().c_str());
|
||||||
|
|
||||||
if (system(cmd.str().c_str()) != 0) {
|
if (system(cmd.str().c_str()) != 0) {
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt_remove_original) {
|
if (opt_remove_original) {
|
||||||
msg_ts("[%02u] removing %s\n", thread_n, filepath);
|
msg(thread_n, "Removing %s", filepath);
|
||||||
if (my_delete(filepath, MYF(MY_WME)) != 0) {
|
if (my_delete(filepath, MYF(MY_WME)) != 0) {
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
@ -2061,7 +2051,7 @@ decrypt_decompress()
|
|||||||
/* cd to backup directory */
|
/* cd to backup directory */
|
||||||
if (my_setwd(xtrabackup_target_dir, MYF(MY_WME)))
|
if (my_setwd(xtrabackup_target_dir, MYF(MY_WME)))
|
||||||
{
|
{
|
||||||
msg("cannot my_setwd %s\n", xtrabackup_target_dir);
|
msg("Can't my_setwd %s", xtrabackup_target_dir);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2211,8 +2201,7 @@ static void copy_or_move_dir(const char *from, const char *to, bool do_copy, boo
|
|||||||
rc = make_hardlink(from_path, to_path);
|
rc = make_hardlink(from_path, to_path);
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
msg_ts("[%02u] Creating hardlink from %s to %s\n",
|
msg("Creating hardlink from %s to %s",from_path, to_path);
|
||||||
1, from_path, to_path);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2228,7 +2217,7 @@ static void copy_or_move_dir(const char *from, const char *to, bool do_copy, boo
|
|||||||
to, 1));
|
to, 1));
|
||||||
}
|
}
|
||||||
if (!rc)
|
if (!rc)
|
||||||
exit(EXIT_FAILURE);
|
die("copy or move file failed");
|
||||||
}
|
}
|
||||||
datadir_iter_free(it);
|
datadir_iter_free(it);
|
||||||
datadir_node_free(&node);
|
datadir_node_free(&node);
|
||||||
@ -2246,14 +2235,14 @@ static void copy_or_move_dir(const char *from, const char *to, bool do_copy, boo
|
|||||||
*/
|
*/
|
||||||
static void rocksdb_lock_checkpoint()
|
static void rocksdb_lock_checkpoint()
|
||||||
{
|
{
|
||||||
msg_ts("Obtaining rocksdb checkpoint lock.\n");
|
msg("Obtaining rocksdb checkpoint lock.");
|
||||||
MYSQL_RES *res =
|
MYSQL_RES *res =
|
||||||
xb_mysql_query(mysql_connection, "SELECT GET_LOCK('mariabackup_rocksdb_checkpoint',3600)", true, true);
|
xb_mysql_query(mysql_connection, "SELECT GET_LOCK('mariabackup_rocksdb_checkpoint',3600)", true, true);
|
||||||
|
|
||||||
MYSQL_ROW r = mysql_fetch_row(res);
|
MYSQL_ROW r = mysql_fetch_row(res);
|
||||||
if (r && r[0] && strcmp(r[0], "1"))
|
if (r && r[0] && strcmp(r[0], "1"))
|
||||||
{
|
{
|
||||||
msg_ts("Could not obtain rocksdb checkpont lock\n");
|
msg("Could not obtain rocksdb checkpont lock.");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
mysql_free_result(res);
|
mysql_free_result(res);
|
||||||
@ -2307,7 +2296,7 @@ static void rocksdb_create_checkpoint()
|
|||||||
|
|
||||||
if (!access(rocksdb_checkpoint_dir, 0))
|
if (!access(rocksdb_checkpoint_dir, 0))
|
||||||
{
|
{
|
||||||
msg_ts("Removing rocksdb checkpoint from previous backup attempt.\n");
|
msg("Removing rocksdb checkpoint from previous backup attempt.");
|
||||||
rocksdb_remove_checkpoint_directory();
|
rocksdb_remove_checkpoint_directory();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2323,15 +2312,14 @@ static void rocksdb_create_checkpoint()
|
|||||||
*/
|
*/
|
||||||
static void rocksdb_backup_checkpoint()
|
static void rocksdb_backup_checkpoint()
|
||||||
{
|
{
|
||||||
msg_ts("Backing up rocksdb files.\n");
|
msg("Backing up rocksdb files.");
|
||||||
char rocksdb_backup_dir[FN_REFLEN];
|
char rocksdb_backup_dir[FN_REFLEN];
|
||||||
snprintf(rocksdb_backup_dir, sizeof(rocksdb_backup_dir), "%s/" ROCKSDB_BACKUP_DIR , xtrabackup_target_dir);
|
snprintf(rocksdb_backup_dir, sizeof(rocksdb_backup_dir), "%s/" ROCKSDB_BACKUP_DIR , xtrabackup_target_dir);
|
||||||
bool backup_to_directory = xtrabackup_backup && xtrabackup_stream_fmt == XB_STREAM_FMT_NONE;
|
bool backup_to_directory = xtrabackup_backup && xtrabackup_stream_fmt == XB_STREAM_FMT_NONE;
|
||||||
if (backup_to_directory)
|
if (backup_to_directory)
|
||||||
{
|
{
|
||||||
if (my_mkdir(rocksdb_backup_dir, 0777, MYF(0))){
|
if (my_mkdir(rocksdb_backup_dir, 0777, MYF(0))){
|
||||||
msg_ts("Can't create rocksdb backup directory %s\n", rocksdb_backup_dir);
|
die("Can't create rocksdb backup directory %s", rocksdb_backup_dir);
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
copy_or_move_dir(rocksdb_checkpoint_dir, ROCKSDB_BACKUP_DIR, true, backup_to_directory);
|
copy_or_move_dir(rocksdb_checkpoint_dir, ROCKSDB_BACKUP_DIR, true, backup_to_directory);
|
||||||
|
@ -105,7 +105,7 @@ xb_mysql_connect()
|
|||||||
sprintf(mysql_port_str, "%d", opt_port);
|
sprintf(mysql_port_str, "%d", opt_port);
|
||||||
|
|
||||||
if (connection == NULL) {
|
if (connection == NULL) {
|
||||||
msg("Failed to init MySQL struct: %s.\n",
|
msg("Failed to init MySQL struct: %s.",
|
||||||
mysql_error(connection));
|
mysql_error(connection));
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
@ -121,8 +121,8 @@ xb_mysql_connect()
|
|||||||
mysql_options(connection, MYSQL_OPT_PROTOCOL, &opt_protocol);
|
mysql_options(connection, MYSQL_OPT_PROTOCOL, &opt_protocol);
|
||||||
mysql_options(connection,MYSQL_SET_CHARSET_NAME, "utf8");
|
mysql_options(connection,MYSQL_SET_CHARSET_NAME, "utf8");
|
||||||
|
|
||||||
msg_ts("Connecting to MySQL server host: %s, user: %s, password: %s, "
|
msg("Connecting to MySQL server host: %s, user: %s, password: %s, "
|
||||||
"port: %s, socket: %s\n", opt_host ? opt_host : "localhost",
|
"port: %s, socket: %s", opt_host ? opt_host : "localhost",
|
||||||
opt_user ? opt_user : "not set",
|
opt_user ? opt_user : "not set",
|
||||||
opt_password ? "set" : "not set",
|
opt_password ? "set" : "not set",
|
||||||
opt_port != 0 ? mysql_port_str : "not set",
|
opt_port != 0 ? mysql_port_str : "not set",
|
||||||
@ -148,8 +148,7 @@ xb_mysql_connect()
|
|||||||
opt_password,
|
opt_password,
|
||||||
"" /*database*/, opt_port,
|
"" /*database*/, opt_port,
|
||||||
opt_socket, 0)) {
|
opt_socket, 0)) {
|
||||||
msg("Failed to connect to MySQL server: %s.\n",
|
msg("Failed to connect to MySQL server: %s.", mysql_error(connection));
|
||||||
mysql_error(connection));
|
|
||||||
mysql_close(connection);
|
mysql_close(connection);
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
@ -169,10 +168,10 @@ xb_mysql_query(MYSQL *connection, const char *query, bool use_result,
|
|||||||
MYSQL_RES *mysql_result = NULL;
|
MYSQL_RES *mysql_result = NULL;
|
||||||
|
|
||||||
if (mysql_query(connection, query)) {
|
if (mysql_query(connection, query)) {
|
||||||
msg("Error: failed to execute query %s: %s\n", query,
|
|
||||||
mysql_error(connection));
|
|
||||||
if (die_on_error) {
|
if (die_on_error) {
|
||||||
exit(EXIT_FAILURE);
|
die("failed to execute query %s: %s", query, mysql_error(connection));
|
||||||
|
} else {
|
||||||
|
msg("Error: failed to execute query %s: %s", query, mysql_error(connection));
|
||||||
}
|
}
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
@ -180,9 +179,8 @@ xb_mysql_query(MYSQL *connection, const char *query, bool use_result,
|
|||||||
/* store result set on client if there is a result */
|
/* store result set on client if there is a result */
|
||||||
if (mysql_field_count(connection) > 0) {
|
if (mysql_field_count(connection) > 0) {
|
||||||
if ((mysql_result = mysql_store_result(connection)) == NULL) {
|
if ((mysql_result = mysql_store_result(connection)) == NULL) {
|
||||||
msg("Error: failed to fetch query result %s: %s\n",
|
die("failed to fetch query result %s: %s",
|
||||||
query, mysql_error(connection));
|
query, mysql_error(connection));
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!use_result) {
|
if (!use_result) {
|
||||||
@ -317,11 +315,11 @@ check_server_version(unsigned long version_number,
|
|||||||
msg("Error: Built-in InnoDB in MySQL 5.1 is not "
|
msg("Error: Built-in InnoDB in MySQL 5.1 is not "
|
||||||
"supported in this release. You can either use "
|
"supported in this release. You can either use "
|
||||||
"Percona XtraBackup 2.0, or upgrade to InnoDB "
|
"Percona XtraBackup 2.0, or upgrade to InnoDB "
|
||||||
"plugin.\n");
|
"plugin.");
|
||||||
} else if (!version_supported) {
|
} else if (!version_supported) {
|
||||||
msg("Error: Unsupported server version: '%s'. Please "
|
msg("Error: Unsupported server version: '%s'. Please "
|
||||||
"report a bug at "
|
"report a bug at "
|
||||||
"https://bugs.launchpad.net/percona-xtrabackup\n",
|
"https://bugs.launchpad.net/percona-xtrabackup",
|
||||||
version_string);
|
version_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -408,7 +406,7 @@ get_mysql_vars(MYSQL *connection)
|
|||||||
opt_binlog_info == BINLOG_INFO_LOCKLESS) {
|
opt_binlog_info == BINLOG_INFO_LOCKLESS) {
|
||||||
|
|
||||||
msg("Error: --binlog-info=LOCKLESS is not supported by the "
|
msg("Error: --binlog-info=LOCKLESS is not supported by the "
|
||||||
"server\n");
|
"server");
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -446,7 +444,7 @@ get_mysql_vars(MYSQL *connection)
|
|||||||
have_gtid_slave = true;
|
have_gtid_slave = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg("Using server version %s\n", version_var);
|
msg("Using server version %s", version_var);
|
||||||
|
|
||||||
if (!(ret = detect_mysql_capabilities_for_backup())) {
|
if (!(ret = detect_mysql_capabilities_for_backup())) {
|
||||||
goto out;
|
goto out;
|
||||||
@ -456,17 +454,17 @@ get_mysql_vars(MYSQL *connection)
|
|||||||
if (check_if_param_set("datadir")) {
|
if (check_if_param_set("datadir")) {
|
||||||
if (!directory_exists(mysql_data_home, false)) {
|
if (!directory_exists(mysql_data_home, false)) {
|
||||||
msg("Warning: option 'datadir' points to "
|
msg("Warning: option 'datadir' points to "
|
||||||
"nonexistent directory '%s'\n", mysql_data_home);
|
"nonexistent directory '%s'", mysql_data_home);
|
||||||
}
|
}
|
||||||
if (!directory_exists(datadir_var, false)) {
|
if (!directory_exists(datadir_var, false)) {
|
||||||
msg("Warning: MySQL variable 'datadir' points to "
|
msg("Warning: MySQL variable 'datadir' points to "
|
||||||
"nonexistent directory '%s'\n", datadir_var);
|
"nonexistent directory '%s'", datadir_var);
|
||||||
}
|
}
|
||||||
if (!equal_paths(mysql_data_home, datadir_var)) {
|
if (!equal_paths(mysql_data_home, datadir_var)) {
|
||||||
msg("Warning: option 'datadir' has different "
|
msg("Warning: option 'datadir' has different "
|
||||||
"values:\n"
|
"values:\n"
|
||||||
" '%s' in defaults file\n"
|
" '%s' in defaults file\n"
|
||||||
" '%s' in SHOW VARIABLES\n",
|
" '%s' in SHOW VARIABLES",
|
||||||
mysql_data_home, datadir_var);
|
mysql_data_home, datadir_var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -565,14 +563,14 @@ detect_mysql_capabilities_for_backup()
|
|||||||
if (opt_galera_info && !have_galera_enabled) {
|
if (opt_galera_info && !have_galera_enabled) {
|
||||||
msg("--galera-info is specified on the command "
|
msg("--galera-info is specified on the command "
|
||||||
"line, but the server does not support Galera "
|
"line, but the server does not support Galera "
|
||||||
"replication. Ignoring the option.\n");
|
"replication. Ignoring the option.");
|
||||||
opt_galera_info = false;
|
opt_galera_info = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt_slave_info && have_multi_threaded_slave &&
|
if (opt_slave_info && have_multi_threaded_slave &&
|
||||||
!have_gtid_slave) {
|
!have_gtid_slave) {
|
||||||
msg("The --slave-info option requires GTID enabled for a "
|
msg("The --slave-info option requires GTID enabled for a "
|
||||||
"multi-threaded slave.\n");
|
"multi-threaded slave.");
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -619,7 +617,7 @@ select_incremental_lsn_from_history(lsn_t *incremental_lsn)
|
|||||||
const MYSQL_ROW row = mysql_fetch_row(mysql_result);
|
const MYSQL_ROW row = mysql_fetch_row(mysql_result);
|
||||||
if (row) {
|
if (row) {
|
||||||
*incremental_lsn = strtoull(row[0], NULL, 10);
|
*incremental_lsn = strtoull(row[0], NULL, 10);
|
||||||
msg("Found and using lsn: " LSN_PF " for %s %s\n",
|
msg("Found and using lsn: " LSN_PF " for %s %s",
|
||||||
*incremental_lsn,
|
*incremental_lsn,
|
||||||
opt_incremental_history_uuid ? "uuid" : "name",
|
opt_incremental_history_uuid ? "uuid" : "name",
|
||||||
opt_incremental_history_uuid ?
|
opt_incremental_history_uuid ?
|
||||||
@ -627,7 +625,7 @@ select_incremental_lsn_from_history(lsn_t *incremental_lsn)
|
|||||||
opt_incremental_history_name);
|
opt_incremental_history_name);
|
||||||
} else {
|
} else {
|
||||||
msg("Error while attempting to find history record "
|
msg("Error while attempting to find history record "
|
||||||
"for %s %s\n",
|
"for %s %s",
|
||||||
opt_incremental_history_uuid ? "uuid" : "name",
|
opt_incremental_history_uuid ? "uuid" : "name",
|
||||||
opt_incremental_history_uuid ?
|
opt_incremental_history_uuid ?
|
||||||
opt_incremental_history_uuid :
|
opt_incremental_history_uuid :
|
||||||
@ -737,7 +735,7 @@ have_queries_to_wait_for(MYSQL *connection, uint threshold)
|
|||||||
&& duration >= (int)threshold
|
&& duration >= (int)threshold
|
||||||
&& ((all_queries && is_query(info))
|
&& ((all_queries && is_query(info))
|
||||||
|| is_update_query(info))) {
|
|| is_update_query(info))) {
|
||||||
msg_ts("Waiting for query %s (duration %d sec): %s",
|
msg("Waiting for query %s (duration %d sec): %s",
|
||||||
id, duration, info);
|
id, duration, info);
|
||||||
have_to_wait = true;
|
have_to_wait = true;
|
||||||
break;
|
break;
|
||||||
@ -766,7 +764,7 @@ kill_long_queries(MYSQL *connection, time_t timeout)
|
|||||||
(time_t)duration >= timeout &&
|
(time_t)duration >= timeout &&
|
||||||
((all_queries && is_query(info)) ||
|
((all_queries && is_query(info)) ||
|
||||||
is_select_query(info))) {
|
is_select_query(info))) {
|
||||||
msg_ts("Killing query %s (duration %d sec): %s\n",
|
msg("Killing query %s (duration %d sec): %s",
|
||||||
id, (int)duration, info);
|
id, (int)duration, info);
|
||||||
snprintf(kill_stmt, sizeof(kill_stmt),
|
snprintf(kill_stmt, sizeof(kill_stmt),
|
||||||
"KILL %s", id);
|
"KILL %s", id);
|
||||||
@ -785,8 +783,8 @@ wait_for_no_updates(MYSQL *connection, uint timeout, uint threshold)
|
|||||||
|
|
||||||
start_time = time(NULL);
|
start_time = time(NULL);
|
||||||
|
|
||||||
msg_ts("Waiting %u seconds for queries running longer than %u seconds "
|
msg("Waiting %u seconds for queries running longer than %u seconds "
|
||||||
"to finish\n", timeout, threshold);
|
"to finish", timeout, threshold);
|
||||||
|
|
||||||
while (time(NULL) <= (time_t)(start_time + timeout)) {
|
while (time(NULL) <= (time_t)(start_time + timeout)) {
|
||||||
if (!have_queries_to_wait_for(connection, threshold)) {
|
if (!have_queries_to_wait_for(connection, threshold)) {
|
||||||
@ -795,7 +793,7 @@ wait_for_no_updates(MYSQL *connection, uint timeout, uint threshold)
|
|||||||
os_thread_sleep(1000000);
|
os_thread_sleep(1000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_ts("Unable to obtain lock. Please try again later.");
|
msg("Unable to obtain lock. Please try again later.");
|
||||||
|
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
@ -813,7 +811,7 @@ DECLARE_THREAD(kill_query_thread)(
|
|||||||
|
|
||||||
os_event_set(kill_query_thread_started);
|
os_event_set(kill_query_thread_started);
|
||||||
|
|
||||||
msg_ts("Kill query timeout %d seconds.\n",
|
msg("Kill query timeout %d seconds.",
|
||||||
opt_kill_long_queries_timeout);
|
opt_kill_long_queries_timeout);
|
||||||
|
|
||||||
while (time(NULL) - start_time <
|
while (time(NULL) - start_time <
|
||||||
@ -825,7 +823,7 @@ DECLARE_THREAD(kill_query_thread)(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((mysql = xb_mysql_connect()) == NULL) {
|
if ((mysql = xb_mysql_connect()) == NULL) {
|
||||||
msg("Error: kill query thread failed\n");
|
msg("Error: kill query thread failed");
|
||||||
goto stop_thread;
|
goto stop_thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -840,7 +838,7 @@ DECLARE_THREAD(kill_query_thread)(
|
|||||||
mysql_close(mysql);
|
mysql_close(mysql);
|
||||||
|
|
||||||
stop_thread:
|
stop_thread:
|
||||||
msg_ts("Kill query thread stopped\n");
|
msg("Kill query thread stopped");
|
||||||
|
|
||||||
os_event_set(kill_query_thread_stopped);
|
os_event_set(kill_query_thread_stopped);
|
||||||
|
|
||||||
@ -890,7 +888,7 @@ DECLARE_THREAD(kill_mdl_waiters_thread(void *))
|
|||||||
{
|
{
|
||||||
MYSQL *mysql;
|
MYSQL *mysql;
|
||||||
if ((mysql = xb_mysql_connect()) == NULL) {
|
if ((mysql = xb_mysql_connect()) == NULL) {
|
||||||
msg("Error: kill mdl waiters thread failed to connect\n");
|
msg("Error: kill mdl waiters thread failed to connect");
|
||||||
goto stop_thread;
|
goto stop_thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -909,12 +907,11 @@ DECLARE_THREAD(kill_mdl_waiters_thread(void *))
|
|||||||
if (row[1] && !strcmp(row[1], "Killed"))
|
if (row[1] && !strcmp(row[1], "Killed"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
msg_ts("Killing MDL waiting %s ('%s') on connection %s\n",
|
msg("Killing MDL waiting %s ('%s') on connection %s",
|
||||||
row[1], row[2], row[0]);
|
row[1], row[2], row[0]);
|
||||||
snprintf(query, sizeof(query), "KILL QUERY %s", row[0]);
|
snprintf(query, sizeof(query), "KILL QUERY %s", row[0]);
|
||||||
if (mysql_query(mysql, query) && (mysql_errno(mysql) != ER_NO_SUCH_THREAD)) {
|
if (mysql_query(mysql, query) && (mysql_errno(mysql) != ER_NO_SUCH_THREAD)) {
|
||||||
msg("Error: failed to execute query %s: %s\n", query,mysql_error(mysql));
|
die("failed to execute query %s: %s", query,mysql_error(mysql));
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mysql_free_result(result);
|
mysql_free_result(result);
|
||||||
@ -923,7 +920,7 @@ DECLARE_THREAD(kill_mdl_waiters_thread(void *))
|
|||||||
mysql_close(mysql);
|
mysql_close(mysql);
|
||||||
|
|
||||||
stop_thread:
|
stop_thread:
|
||||||
msg_ts("Kill mdl waiters thread stopped\n");
|
msg("Kill mdl waiters thread stopped");
|
||||||
os_event_set(mdl_killer_finished_event);
|
os_event_set(mdl_killer_finished_event);
|
||||||
os_thread_exit();
|
os_thread_exit();
|
||||||
return os_thread_ret_t(0);
|
return os_thread_ret_t(0);
|
||||||
@ -965,7 +962,7 @@ lock_tables(MYSQL *connection)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (have_backup_locks) {
|
if (have_backup_locks) {
|
||||||
msg_ts("Executing LOCK TABLES FOR BACKUP...\n");
|
msg("Executing LOCK TABLES FOR BACKUP...");
|
||||||
xb_mysql_query(connection, "LOCK TABLES FOR BACKUP", false);
|
xb_mysql_query(connection, "LOCK TABLES FOR BACKUP", false);
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
@ -988,7 +985,7 @@ lock_tables(MYSQL *connection)
|
|||||||
compatible with this trick.
|
compatible with this trick.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
msg_ts("Executing FLUSH NO_WRITE_TO_BINLOG TABLES...\n");
|
msg("Executing FLUSH NO_WRITE_TO_BINLOG TABLES...");
|
||||||
|
|
||||||
xb_mysql_query(connection,
|
xb_mysql_query(connection,
|
||||||
"FLUSH NO_WRITE_TO_BINLOG TABLES", false);
|
"FLUSH NO_WRITE_TO_BINLOG TABLES", false);
|
||||||
@ -1001,7 +998,7 @@ lock_tables(MYSQL *connection)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_ts("Executing FLUSH TABLES WITH READ LOCK...\n");
|
msg("Executing FLUSH TABLES WITH READ LOCK...");
|
||||||
|
|
||||||
if (opt_kill_long_queries_timeout) {
|
if (opt_kill_long_queries_timeout) {
|
||||||
start_query_killer();
|
start_query_killer();
|
||||||
@ -1034,7 +1031,7 @@ bool
|
|||||||
lock_binlog_maybe(MYSQL *connection)
|
lock_binlog_maybe(MYSQL *connection)
|
||||||
{
|
{
|
||||||
if (have_backup_locks && !opt_no_lock && !binlog_locked) {
|
if (have_backup_locks && !opt_no_lock && !binlog_locked) {
|
||||||
msg_ts("Executing LOCK BINLOG FOR BACKUP...\n");
|
msg("Executing LOCK BINLOG FOR BACKUP...");
|
||||||
xb_mysql_query(connection, "LOCK BINLOG FOR BACKUP", false);
|
xb_mysql_query(connection, "LOCK BINLOG FOR BACKUP", false);
|
||||||
binlog_locked = true;
|
binlog_locked = true;
|
||||||
|
|
||||||
@ -1053,20 +1050,20 @@ void
|
|||||||
unlock_all(MYSQL *connection)
|
unlock_all(MYSQL *connection)
|
||||||
{
|
{
|
||||||
if (opt_debug_sleep_before_unlock) {
|
if (opt_debug_sleep_before_unlock) {
|
||||||
msg_ts("Debug sleep for %u seconds\n",
|
msg("Debug sleep for %u seconds",
|
||||||
opt_debug_sleep_before_unlock);
|
opt_debug_sleep_before_unlock);
|
||||||
os_thread_sleep(opt_debug_sleep_before_unlock * 1000);
|
os_thread_sleep(opt_debug_sleep_before_unlock * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (binlog_locked) {
|
if (binlog_locked) {
|
||||||
msg_ts("Executing UNLOCK BINLOG\n");
|
msg("Executing UNLOCK BINLOG");
|
||||||
xb_mysql_query(connection, "UNLOCK BINLOG", false);
|
xb_mysql_query(connection, "UNLOCK BINLOG", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_ts("Executing UNLOCK TABLES\n");
|
msg("Executing UNLOCK TABLES");
|
||||||
xb_mysql_query(connection, "UNLOCK TABLES", false);
|
xb_mysql_query(connection, "UNLOCK TABLES", false);
|
||||||
|
|
||||||
msg_ts("All tables unlocked\n");
|
msg("All tables unlocked");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1117,7 +1114,7 @@ wait_for_safe_slave(MYSQL *connection)
|
|||||||
|
|
||||||
if (!(read_master_log_pos && slave_sql_running)) {
|
if (!(read_master_log_pos && slave_sql_running)) {
|
||||||
msg("Not checking slave open temp tables for "
|
msg("Not checking slave open temp tables for "
|
||||||
"--safe-slave-backup because host is not a slave\n");
|
"--safe-slave-backup because host is not a slave");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1131,36 +1128,36 @@ wait_for_safe_slave(MYSQL *connection)
|
|||||||
}
|
}
|
||||||
|
|
||||||
open_temp_tables = get_open_temp_tables(connection);
|
open_temp_tables = get_open_temp_tables(connection);
|
||||||
msg_ts("Slave open temp tables: %d\n", open_temp_tables);
|
msg("Slave open temp tables: %d", open_temp_tables);
|
||||||
|
|
||||||
while (open_temp_tables && n_attempts--) {
|
while (open_temp_tables && n_attempts--) {
|
||||||
msg_ts("Starting slave SQL thread, waiting %d seconds, then "
|
msg("Starting slave SQL thread, waiting %d seconds, then "
|
||||||
"checking Slave_open_temp_tables again (%d attempts "
|
"checking Slave_open_temp_tables again (%d attempts "
|
||||||
"remaining)...\n", sleep_time, n_attempts);
|
"remaining)...", sleep_time, n_attempts);
|
||||||
|
|
||||||
xb_mysql_query(connection, "START SLAVE SQL_THREAD", false);
|
xb_mysql_query(connection, "START SLAVE SQL_THREAD", false);
|
||||||
os_thread_sleep(sleep_time * 1000000);
|
os_thread_sleep(sleep_time * 1000000);
|
||||||
xb_mysql_query(connection, "STOP SLAVE SQL_THREAD", false);
|
xb_mysql_query(connection, "STOP SLAVE SQL_THREAD", false);
|
||||||
|
|
||||||
open_temp_tables = get_open_temp_tables(connection);
|
open_temp_tables = get_open_temp_tables(connection);
|
||||||
msg_ts("Slave open temp tables: %d\n", open_temp_tables);
|
msg("Slave open temp tables: %d", open_temp_tables);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restart the slave if it was running at start */
|
/* Restart the slave if it was running at start */
|
||||||
if (open_temp_tables == 0) {
|
if (open_temp_tables == 0) {
|
||||||
msg_ts("Slave is safe to backup\n");
|
msg("Slave is safe to backup");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = false;
|
result = false;
|
||||||
|
|
||||||
if (sql_thread_started) {
|
if (sql_thread_started) {
|
||||||
msg_ts("Restarting slave SQL thread.\n");
|
msg("Restarting slave SQL thread.");
|
||||||
xb_mysql_query(connection, "START SLAVE SQL_THREAD", false);
|
xb_mysql_query(connection, "START SLAVE SQL_THREAD", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_ts("Slave_open_temp_tables did not become zero after "
|
msg("Slave_open_temp_tables did not become zero after "
|
||||||
"%d seconds\n", opt_safe_slave_backup_timeout);
|
"%d seconds", opt_safe_slave_backup_timeout);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
free_mysql_variables(status);
|
free_mysql_variables(status);
|
||||||
@ -1202,10 +1199,8 @@ write_slave_info(MYSQL *connection)
|
|||||||
|
|
||||||
if (master == NULL || filename == NULL || position == NULL) {
|
if (master == NULL || filename == NULL || position == NULL) {
|
||||||
msg("Failed to get master binlog coordinates "
|
msg("Failed to get master binlog coordinates "
|
||||||
"from SHOW SLAVE STATUS\n");
|
"from SHOW SLAVE STATUS.This means that the server is not a "
|
||||||
msg("This means that the server is not a "
|
"replication slave. Ignoring the --slave-info option");
|
||||||
"replication slave. Ignoring the --slave-info "
|
|
||||||
"option\n");
|
|
||||||
/* we still want to continue the backup */
|
/* we still want to continue the backup */
|
||||||
result = true;
|
result = true;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -1288,7 +1283,7 @@ write_galera_info(MYSQL *connection)
|
|||||||
|
|
||||||
if ((state_uuid == NULL && state_uuid55 == NULL)
|
if ((state_uuid == NULL && state_uuid55 == NULL)
|
||||||
|| (last_committed == NULL && last_committed55 == NULL)) {
|
|| (last_committed == NULL && last_committed55 == NULL)) {
|
||||||
msg("Failed to get master wsrep state from SHOW STATUS.\n");
|
msg("Failed to get master wsrep state from SHOW STATUS.");
|
||||||
result = false;
|
result = false;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -1801,9 +1796,9 @@ mdl_lock_table(ulint space_id)
|
|||||||
|
|
||||||
std::ostringstream lock_query;
|
std::ostringstream lock_query;
|
||||||
lock_query << "SELECT 1 FROM " << full_table_name << " LIMIT 0";
|
lock_query << "SELECT 1 FROM " << full_table_name << " LIMIT 0";
|
||||||
msg_ts("Locking MDL for %s\n", full_table_name.c_str());
|
msg("Locking MDL for %s", full_table_name.c_str());
|
||||||
if (mysql_query(mdl_con, lock_query.str().c_str())) {
|
if (mysql_query(mdl_con, lock_query.str().c_str())) {
|
||||||
msg_ts("Warning : locking MDL failed for space id %zu, name %s\n", space_id, full_table_name.c_str());
|
msg("Warning : locking MDL failed for space id %zu, name %s", space_id, full_table_name.c_str());
|
||||||
} else {
|
} else {
|
||||||
MYSQL_RES *r = mysql_store_result(mdl_con);
|
MYSQL_RES *r = mysql_store_result(mdl_con);
|
||||||
mysql_free_result(r);
|
mysql_free_result(r);
|
||||||
@ -1813,7 +1808,7 @@ mdl_lock_table(ulint space_id)
|
|||||||
void
|
void
|
||||||
mdl_unlock_all()
|
mdl_unlock_all()
|
||||||
{
|
{
|
||||||
msg_ts("Unlocking MDL for all tables\n");
|
msg("Unlocking MDL for all tables");
|
||||||
xb_mysql_query(mdl_con, "COMMIT", false, true);
|
xb_mysql_query(mdl_con, "COMMIT", false, true);
|
||||||
mysql_close(mdl_con);
|
mysql_close(mdl_con);
|
||||||
spaceid_to_tablename.clear();
|
spaceid_to_tablename.clear();
|
||||||
|
@ -203,7 +203,7 @@ log_online_read_bitmap_page(
|
|||||||
/* The following call prints an error message */
|
/* The following call prints an error message */
|
||||||
os_file_get_last_error(TRUE);
|
os_file_get_last_error(TRUE);
|
||||||
msg("InnoDB: Warning: failed reading changed page bitmap "
|
msg("InnoDB: Warning: failed reading changed page bitmap "
|
||||||
"file \'%s\'\n", bitmap_file->name);
|
"file \'%s\'", bitmap_file->name);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -282,7 +282,7 @@ log_online_setup_bitmap_file_range(
|
|||||||
bitmap_dir = os_file_opendir(srv_data_home, FALSE);
|
bitmap_dir = os_file_opendir(srv_data_home, FALSE);
|
||||||
if (UNIV_UNLIKELY(!bitmap_dir)) {
|
if (UNIV_UNLIKELY(!bitmap_dir)) {
|
||||||
|
|
||||||
msg("InnoDB: Error: failed to open bitmap directory \'%s\'\n",
|
msg("InnoDB: Error: failed to open bitmap directory \'%s\'",
|
||||||
srv_data_home);
|
srv_data_home);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -332,7 +332,7 @@ log_online_setup_bitmap_file_range(
|
|||||||
if (UNIV_UNLIKELY(os_file_closedir(bitmap_dir))) {
|
if (UNIV_UNLIKELY(os_file_closedir(bitmap_dir))) {
|
||||||
|
|
||||||
os_file_get_last_error(TRUE);
|
os_file_get_last_error(TRUE);
|
||||||
msg("InnoDB: Error: cannot close \'%s\'\n",srv_data_home);
|
msg("InnoDB: Error: cannot close \'%s\'",srv_data_home);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,7 +349,7 @@ log_online_setup_bitmap_file_range(
|
|||||||
bitmap_dir = os_file_opendir(srv_data_home, FALSE);
|
bitmap_dir = os_file_opendir(srv_data_home, FALSE);
|
||||||
if (UNIV_UNLIKELY(!bitmap_dir)) {
|
if (UNIV_UNLIKELY(!bitmap_dir)) {
|
||||||
|
|
||||||
msg("InnoDB: Error: failed to open bitmap directory \'%s\'\n",
|
msg("InnoDB: Error: failed to open bitmap directory \'%s\'",
|
||||||
srv_data_home);
|
srv_data_home);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -380,7 +380,7 @@ log_online_setup_bitmap_file_range(
|
|||||||
if (UNIV_UNLIKELY(array_pos >= bitmap_files->count)) {
|
if (UNIV_UNLIKELY(array_pos >= bitmap_files->count)) {
|
||||||
|
|
||||||
msg("InnoDB: Error: inconsistent bitmap file "
|
msg("InnoDB: Error: inconsistent bitmap file "
|
||||||
"directory\n");
|
"directory");
|
||||||
free(bitmap_files->files);
|
free(bitmap_files->files);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -400,7 +400,7 @@ log_online_setup_bitmap_file_range(
|
|||||||
if (UNIV_UNLIKELY(os_file_closedir(bitmap_dir))) {
|
if (UNIV_UNLIKELY(os_file_closedir(bitmap_dir))) {
|
||||||
|
|
||||||
os_file_get_last_error(TRUE);
|
os_file_get_last_error(TRUE);
|
||||||
msg("InnoDB: Error: cannot close \'%s\'\n", srv_data_home);
|
msg("InnoDB: Error: cannot close \'%s\'", srv_data_home);
|
||||||
free(bitmap_files->files);
|
free(bitmap_files->files);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -451,7 +451,7 @@ log_online_open_bitmap_file_read_only(
|
|||||||
/* Here and below assume that bitmap file names do not
|
/* Here and below assume that bitmap file names do not
|
||||||
contain apostrophes, thus no need for ut_print_filename(). */
|
contain apostrophes, thus no need for ut_print_filename(). */
|
||||||
msg("InnoDB: Warning: error opening the changed page "
|
msg("InnoDB: Warning: error opening the changed page "
|
||||||
"bitmap \'%s\'\n", bitmap_file->name);
|
"bitmap \'%s\'", bitmap_file->name);
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -495,7 +495,7 @@ log_online_diagnose_bitmap_eof(
|
|||||||
itself. */
|
itself. */
|
||||||
|
|
||||||
msg("InnoDB: Warning: junk at the end of changed "
|
msg("InnoDB: Warning: junk at the end of changed "
|
||||||
"page bitmap file \'%s\'.\n", bitmap_file->name);
|
"page bitmap file \'%s\'.", bitmap_file->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(!last_page_in_run)) {
|
if (UNIV_UNLIKELY(!last_page_in_run)) {
|
||||||
@ -506,7 +506,7 @@ log_online_diagnose_bitmap_eof(
|
|||||||
for the whole server */
|
for the whole server */
|
||||||
msg("InnoDB: Warning: changed page bitmap "
|
msg("InnoDB: Warning: changed page bitmap "
|
||||||
"file \'%s\' does not contain a complete run "
|
"file \'%s\' does not contain a complete run "
|
||||||
"at the end.\n", bitmap_file->name);
|
"at the end.", bitmap_file->name);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -537,7 +537,7 @@ xb_msg_missing_lsn_data(
|
|||||||
lsn_t missing_interval_end) /*!<in: interval end */
|
lsn_t missing_interval_end) /*!<in: interval end */
|
||||||
{
|
{
|
||||||
msg("mariabackup: warning: changed page data missing for LSNs between "
|
msg("mariabackup: warning: changed page data missing for LSNs between "
|
||||||
LSN_PF " and " LSN_PF "\n", missing_interval_start,
|
LSN_PF " and " LSN_PF, missing_interval_start,
|
||||||
missing_interval_end);
|
missing_interval_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -615,7 +615,7 @@ xb_page_bitmap_init(void)
|
|||||||
|
|
||||||
msg("mariabackup: incremental backup LSN " LSN_PF
|
msg("mariabackup: incremental backup LSN " LSN_PF
|
||||||
" is larger than than the last checkpoint LSN " LSN_PF
|
" is larger than than the last checkpoint LSN " LSN_PF
|
||||||
"\n", bmp_start_lsn, bmp_end_lsn);
|
, bmp_start_lsn, bmp_end_lsn);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -699,7 +699,7 @@ xb_page_bitmap_init(void)
|
|||||||
bmp_start_lsn))) {
|
bmp_start_lsn))) {
|
||||||
|
|
||||||
msg("mariabackup: Warning: changed page bitmap file "
|
msg("mariabackup: Warning: changed page bitmap file "
|
||||||
"\'%s\' corrupted\n", bitmap_file.name);
|
"\'%s\' corrupted", bitmap_file.name);
|
||||||
rbt_free(result);
|
rbt_free(result);
|
||||||
free(bitmap_files.files);
|
free(bitmap_files.files);
|
||||||
os_file_close(bitmap_file.file);
|
os_file_close(bitmap_file.file);
|
||||||
@ -804,7 +804,7 @@ xb_page_bitmap_init(void)
|
|||||||
if (UNIV_UNLIKELY(!last_page_ok)) {
|
if (UNIV_UNLIKELY(!last_page_ok)) {
|
||||||
|
|
||||||
msg("mariabackup: warning: changed page bitmap file "
|
msg("mariabackup: warning: changed page bitmap file "
|
||||||
"\'%s\' corrupted.\n", bitmap_file.name);
|
"\'%s\' corrupted.", bitmap_file.name);
|
||||||
rbt_free(result);
|
rbt_free(result);
|
||||||
free(bitmap_files.files);
|
free(bitmap_files.files);
|
||||||
os_file_close(bitmap_file.file);
|
os_file_close(bitmap_file.file);
|
||||||
|
@ -72,7 +72,7 @@ static inline int asprintf(char **strp, const char *fmt,...)
|
|||||||
#define xb_a(expr) \
|
#define xb_a(expr) \
|
||||||
do { \
|
do { \
|
||||||
if (!(expr)) { \
|
if (!(expr)) { \
|
||||||
msg("Assertion \"%s\" failed at %s:%lu\n", \
|
fprintf(stderr,"Assertion \"%s\" failed at %s:%lu\n", \
|
||||||
#expr, __FILE__, (ulong) __LINE__); \
|
#expr, __FILE__, (ulong) __LINE__); \
|
||||||
abort(); \
|
abort(); \
|
||||||
} \
|
} \
|
||||||
@ -86,42 +86,55 @@ static inline int asprintf(char **strp, const char *fmt,...)
|
|||||||
|
|
||||||
#define XB_DELTA_INFO_SUFFIX ".meta"
|
#define XB_DELTA_INFO_SUFFIX ".meta"
|
||||||
|
|
||||||
static inline int msg(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
|
static inline int msg1(uint thread_num, const char *prefix, const char *fmt, va_list args)
|
||||||
static inline int msg(const char *fmt, ...)
|
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
va_list args;
|
time_t t = time(NULL);
|
||||||
|
char date[100];
|
||||||
va_start(args, fmt);
|
char *line;
|
||||||
result = vfprintf(stderr, fmt, args);
|
strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&t));
|
||||||
va_end(args);
|
result = vasprintf(&line, fmt, args);
|
||||||
|
if (result != -1) {
|
||||||
return result;
|
if (fmt && fmt[strlen(fmt)] != '\n')
|
||||||
|
result = fprintf(stderr, "[%02u] %s%s %s\n", thread_num, prefix, date, line);
|
||||||
|
else
|
||||||
|
result = fprintf(stderr, "[%02u] %s%s %s", thread_num, prefix, date, line);
|
||||||
|
free(line);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int msg_ts(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
|
static inline ATTRIBUTE_FORMAT(printf, 2, 3) int msg(unsigned int thread_num, const char *fmt, ...)
|
||||||
static inline int msg_ts(const char *fmt, ...)
|
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
time_t t = time(NULL);
|
va_list args;
|
||||||
char date[100];
|
va_start(args, fmt);
|
||||||
char *line;
|
result = msg1(thread_num,"", fmt, args);
|
||||||
va_list args;
|
va_end(args);
|
||||||
|
return result;
|
||||||
strftime(date, sizeof(date), "%y%m%d %H:%M:%S", localtime(&t));
|
|
||||||
|
|
||||||
va_start(args, fmt);
|
|
||||||
result = vasprintf(&line, fmt, args);
|
|
||||||
va_end(args);
|
|
||||||
|
|
||||||
if (result != -1) {
|
|
||||||
result = fprintf(stderr, "%s %s", date, line);
|
|
||||||
free(line);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline ATTRIBUTE_FORMAT(printf, 1, 2) int msg(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
va_list args;
|
||||||
|
va_start(args, fmt);
|
||||||
|
result = msg1(0, "", fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline ATTRIBUTE_FORMAT(printf, 1,2) ATTRIBUTE_NORETURN void die(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
va_start(args, fmt);
|
||||||
|
msg1(0, "FATAL ERROR: ", fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
fflush(stderr);
|
||||||
|
_exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Use POSIX_FADV_NORMAL when available */
|
/* Use POSIX_FADV_NORMAL when available */
|
||||||
|
|
||||||
#ifdef POSIX_FADV_NORMAL
|
#ifdef POSIX_FADV_NORMAL
|
||||||
|
@ -49,8 +49,7 @@ ds_create(const char *root, ds_type_t type)
|
|||||||
#ifdef HAVE_LIBARCHIVE
|
#ifdef HAVE_LIBARCHIVE
|
||||||
ds = &datasink_archive;
|
ds = &datasink_archive;
|
||||||
#else
|
#else
|
||||||
msg("Error : mariabackup was built without libarchive support");
|
die("mariabackup was built without libarchive support");
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case DS_TYPE_XBSTREAM:
|
case DS_TYPE_XBSTREAM:
|
||||||
@ -61,8 +60,7 @@ ds_create(const char *root, ds_type_t type)
|
|||||||
break;
|
break;
|
||||||
case DS_TYPE_ENCRYPT:
|
case DS_TYPE_ENCRYPT:
|
||||||
case DS_TYPE_DECRYPT:
|
case DS_TYPE_DECRYPT:
|
||||||
msg("Error : mariabackup does not support encrypted backups.");
|
die("mariabackup does not support encrypted backups.");
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DS_TYPE_TMPFILE:
|
case DS_TYPE_TMPFILE:
|
||||||
@ -72,7 +70,7 @@ ds_create(const char *root, ds_type_t type)
|
|||||||
ds = &datasink_buffer;
|
ds = &datasink_buffer;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
msg("Unknown datasink type: %d\n", type);
|
msg("Unknown datasink type: %d", type);
|
||||||
xb_ad(0);
|
xb_ad(0);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -81,8 +79,7 @@ ds_create(const char *root, ds_type_t type)
|
|||||||
if (ctxt != NULL) {
|
if (ctxt != NULL) {
|
||||||
ctxt->datasink = ds;
|
ctxt->datasink = ds;
|
||||||
} else {
|
} else {
|
||||||
msg("Error: failed to initialize datasink.\n");
|
die("failed to initialize datasink.");
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ctxt;
|
return ctxt;
|
@ -71,7 +71,7 @@ buffer_init(const char *root)
|
|||||||
ds_ctxt_t *ctxt;
|
ds_ctxt_t *ctxt;
|
||||||
ds_buffer_ctxt_t *buffer_ctxt;
|
ds_buffer_ctxt_t *buffer_ctxt;
|
||||||
|
|
||||||
ctxt = my_malloc(sizeof(ds_ctxt_t) + sizeof(ds_buffer_ctxt_t),
|
ctxt = (ds_ctxt_t *)my_malloc(sizeof(ds_ctxt_t) + sizeof(ds_buffer_ctxt_t),
|
||||||
MYF(MY_FAE));
|
MYF(MY_FAE));
|
||||||
buffer_ctxt = (ds_buffer_ctxt_t *) (ctxt + 1);
|
buffer_ctxt = (ds_buffer_ctxt_t *) (ctxt + 1);
|
||||||
buffer_ctxt->buffer_size = DS_DEFAULT_BUFFER_SIZE;
|
buffer_ctxt->buffer_size = DS_DEFAULT_BUFFER_SIZE;
|
||||||
@ -96,7 +96,7 @@ buffer_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat)
|
|||||||
|
|
||||||
dst_file = ds_open(pipe_ctxt, path, mystat);
|
dst_file = ds_open(pipe_ctxt, path, mystat);
|
||||||
if (dst_file == NULL) {
|
if (dst_file == NULL) {
|
||||||
exit(EXIT_FAILURE);
|
die("ds_open(%s) failed", path);
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer_ctxt = (ds_buffer_ctxt_t *) ctxt->ptr;
|
buffer_ctxt = (ds_buffer_ctxt_t *) ctxt->ptr;
|
@ -96,7 +96,7 @@ compress_init(const char *root)
|
|||||||
/* Create and initialize the worker threads */
|
/* Create and initialize the worker threads */
|
||||||
threads = create_worker_threads(xtrabackup_compress_threads);
|
threads = create_worker_threads(xtrabackup_compress_threads);
|
||||||
if (threads == NULL) {
|
if (threads == NULL) {
|
||||||
msg("compress: failed to create worker threads.\n");
|
msg("compress: failed to create worker threads.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,7 +244,7 @@ compress_write(ds_file_t *file, const uchar *buf, size_t len)
|
|||||||
write_uint64_le(dest_file,
|
write_uint64_le(dest_file,
|
||||||
comp_file->bytes_processed)) {
|
comp_file->bytes_processed)) {
|
||||||
msg("compress: write to the destination stream "
|
msg("compress: write to the destination stream "
|
||||||
"failed.\n");
|
"failed.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,7 +254,7 @@ compress_write(ds_file_t *file, const uchar *buf, size_t len)
|
|||||||
ds_write(dest_file, threads[i].to,
|
ds_write(dest_file, threads[i].to,
|
||||||
threads[i].to_len)) {
|
threads[i].to_len)) {
|
||||||
msg("compress: write to the destination stream "
|
msg("compress: write to the destination stream "
|
||||||
"failed.\n");
|
"failed.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -368,7 +368,7 @@ create_worker_threads(uint n)
|
|||||||
if (pthread_create(&thd->id, NULL, compress_worker_thread_func,
|
if (pthread_create(&thd->id, NULL, compress_worker_thread_func,
|
||||||
thd)) {
|
thd)) {
|
||||||
msg("compress: pthread_create() failed: "
|
msg("compress: pthread_create() failed: "
|
||||||
"errno = %d\n", errno);
|
"errno = %d", errno);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -49,7 +49,7 @@ stdout_init(const char *root)
|
|||||||
{
|
{
|
||||||
ds_ctxt_t *ctxt;
|
ds_ctxt_t *ctxt;
|
||||||
|
|
||||||
ctxt = my_malloc(sizeof(ds_ctxt_t), MYF(MY_FAE));
|
ctxt = (ds_ctxt_t *)my_malloc(sizeof(ds_ctxt_t), MYF(MY_FAE));
|
||||||
|
|
||||||
ctxt->root = my_strdup(root, MYF(MY_FAE));
|
ctxt->root = my_strdup(root, MYF(MY_FAE));
|
||||||
|
|
@ -61,7 +61,7 @@ tmpfile_init(const char *root)
|
|||||||
ds_ctxt_t *ctxt;
|
ds_ctxt_t *ctxt;
|
||||||
ds_tmpfile_ctxt_t *tmpfile_ctxt;
|
ds_tmpfile_ctxt_t *tmpfile_ctxt;
|
||||||
|
|
||||||
ctxt = my_malloc(sizeof(ds_ctxt_t) + sizeof(ds_tmpfile_ctxt_t),
|
ctxt = (ds_ctxt_t *)my_malloc(sizeof(ds_ctxt_t) + sizeof(ds_tmpfile_ctxt_t),
|
||||||
MYF(MY_FAE));
|
MYF(MY_FAE));
|
||||||
tmpfile_ctxt = (ds_tmpfile_ctxt_t *) (ctxt + 1);
|
tmpfile_ctxt = (ds_tmpfile_ctxt_t *) (ctxt + 1);
|
||||||
tmpfile_ctxt->file_list = NULL;
|
tmpfile_ctxt->file_list = NULL;
|
||||||
@ -178,12 +178,11 @@ tmpfile_deinit(ds_ctxt_t *ctxt)
|
|||||||
/* Walk the files in the order they have been added */
|
/* Walk the files in the order they have been added */
|
||||||
list = list_reverse(list);
|
list = list_reverse(list);
|
||||||
while (list != NULL) {
|
while (list != NULL) {
|
||||||
tmp_file = list->data;
|
tmp_file = (ds_tmp_file_t *)list->data;
|
||||||
/* Stat the file to replace size and mtime on the original
|
/* Stat the file to replace size and mtime on the original
|
||||||
* mystat struct */
|
* mystat struct */
|
||||||
if (my_fstat(tmp_file->fd, &mystat, MYF(0))) {
|
if (my_fstat(tmp_file->fd, &mystat, MYF(0))) {
|
||||||
msg("error: my_fstat() failed.\n");
|
die("my_fstat() failed.");
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
tmp_file->mystat.st_size = mystat.st_size;
|
tmp_file->mystat.st_size = mystat.st_size;
|
||||||
tmp_file->mystat.st_mtime = mystat.st_mtime;
|
tmp_file->mystat.st_mtime = mystat.st_mtime;
|
||||||
@ -191,32 +190,29 @@ tmpfile_deinit(ds_ctxt_t *ctxt)
|
|||||||
dst_file = ds_open(pipe_ctxt, tmp_file->orig_path,
|
dst_file = ds_open(pipe_ctxt, tmp_file->orig_path,
|
||||||
&tmp_file->mystat);
|
&tmp_file->mystat);
|
||||||
if (dst_file == NULL) {
|
if (dst_file == NULL) {
|
||||||
msg("error: could not stream a temporary file to "
|
die("could not stream a temporary file to "
|
||||||
"'%s'\n", tmp_file->orig_path);
|
"'%s'", tmp_file->orig_path);
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy to the destination datasink */
|
/* copy to the destination datasink */
|
||||||
posix_fadvise(tmp_file->fd, 0, 0, POSIX_FADV_SEQUENTIAL);
|
posix_fadvise(tmp_file->fd, 0, 0, POSIX_FADV_SEQUENTIAL);
|
||||||
if (my_seek(tmp_file->fd, 0, SEEK_SET, MYF(0)) ==
|
if (my_seek(tmp_file->fd, 0, SEEK_SET, MYF(0)) ==
|
||||||
MY_FILEPOS_ERROR) {
|
MY_FILEPOS_ERROR) {
|
||||||
msg("error: my_seek() failed for '%s', errno = %d.\n",
|
die("my_seek() failed for '%s', errno = %d.",
|
||||||
tmp_file->file->path, my_errno);
|
tmp_file->file->path, my_errno);
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
offset = 0;
|
offset = 0;
|
||||||
while ((bytes = my_read(tmp_file->fd, buf, buf_size,
|
while ((bytes = my_read(tmp_file->fd, (unsigned char *)buf, buf_size,
|
||||||
MYF(MY_WME))) > 0) {
|
MYF(MY_WME))) > 0) {
|
||||||
posix_fadvise(tmp_file->fd, offset, buf_size, POSIX_FADV_DONTNEED);
|
posix_fadvise(tmp_file->fd, offset, buf_size, POSIX_FADV_DONTNEED);
|
||||||
offset += buf_size;
|
offset += buf_size;
|
||||||
if (ds_write(dst_file, buf, bytes)) {
|
if (ds_write(dst_file, buf, bytes)) {
|
||||||
msg("error: cannot write to stream for '%s'.\n",
|
die("cannot write to stream for '%s'.",
|
||||||
tmp_file->orig_path);
|
tmp_file->orig_path);
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (bytes == (size_t) -1) {
|
if (bytes == (size_t) -1) {
|
||||||
exit(EXIT_FAILURE);
|
die("my_read failed for %s", tmp_file->orig_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
my_close(tmp_file->fd, MYF(MY_WME));
|
my_close(tmp_file->fd, MYF(MY_WME));
|
@ -79,18 +79,18 @@ xbstream_init(const char *root __attribute__((unused)))
|
|||||||
ds_stream_ctxt_t *stream_ctxt;
|
ds_stream_ctxt_t *stream_ctxt;
|
||||||
xb_wstream_t *xbstream;
|
xb_wstream_t *xbstream;
|
||||||
|
|
||||||
ctxt = my_malloc(sizeof(ds_ctxt_t) + sizeof(ds_stream_ctxt_t),
|
ctxt = (ds_ctxt_t *)my_malloc(sizeof(ds_ctxt_t) + sizeof(ds_stream_ctxt_t),
|
||||||
MYF(MY_FAE));
|
MYF(MY_FAE));
|
||||||
stream_ctxt = (ds_stream_ctxt_t *)(ctxt + 1);
|
stream_ctxt = (ds_stream_ctxt_t *)(ctxt + 1);
|
||||||
|
|
||||||
if (pthread_mutex_init(&stream_ctxt->mutex, NULL)) {
|
if (pthread_mutex_init(&stream_ctxt->mutex, NULL)) {
|
||||||
msg("xbstream_init: pthread_mutex_init() failed.\n");
|
msg("xbstream_init: pthread_mutex_init() failed.");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
xbstream = xb_stream_write_new();
|
xbstream = xb_stream_write_new();
|
||||||
if (xbstream == NULL) {
|
if (xbstream == NULL) {
|
||||||
msg("xb_stream_write_new() failed.\n");
|
msg("xb_stream_write_new() failed.");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
stream_ctxt->xbstream = xbstream;
|
stream_ctxt->xbstream = xbstream;
|
||||||
@ -143,7 +143,7 @@ xbstream_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat)
|
|||||||
my_xbstream_write_callback);
|
my_xbstream_write_callback);
|
||||||
|
|
||||||
if (xbstream_file == NULL) {
|
if (xbstream_file == NULL) {
|
||||||
msg("xb_stream_write_open() failed.\n");
|
msg("xb_stream_write_open() failed.");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,7 +177,7 @@ xbstream_write(ds_file_t *file, const uchar *buf, size_t len)
|
|||||||
xbstream_file = stream_file->xbstream_file;
|
xbstream_file = stream_file->xbstream_file;
|
||||||
|
|
||||||
if (xb_stream_write_data(xbstream_file, buf, len)) {
|
if (xb_stream_write_data(xbstream_file, buf, len)) {
|
||||||
msg("xb_stream_write_data() failed.\n");
|
msg("xb_stream_write_data() failed.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,7 +209,7 @@ xbstream_deinit(ds_ctxt_t *ctxt)
|
|||||||
stream_ctxt = (ds_stream_ctxt_t *) ctxt->ptr;
|
stream_ctxt = (ds_stream_ctxt_t *) ctxt->ptr;
|
||||||
|
|
||||||
if (xb_stream_write_done(stream_ctxt->xbstream)) {
|
if (xb_stream_write_done(stream_ctxt->xbstream)) {
|
||||||
msg("xb_stream_done() failed.\n");
|
msg("xb_stream_done() failed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stream_ctxt->dest_file) {
|
if (stream_ctxt->dest_file) {
|
@ -61,8 +61,7 @@ static std::string get_encryption_plugin_from_cnf()
|
|||||||
FILE *f = fopen("backup-my.cnf", "r");
|
FILE *f = fopen("backup-my.cnf", "r");
|
||||||
if (!f)
|
if (!f)
|
||||||
{
|
{
|
||||||
msg("cannot open backup-my.cnf for reading\n");
|
die("Can't open backup-my.cnf for reading");
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
char line[512];
|
char line[512];
|
||||||
std::string plugin_load;
|
std::string plugin_load;
|
||||||
@ -183,7 +182,7 @@ void encryption_plugin_prepare_init(int argc, char **argv)
|
|||||||
std::string plugin_load= get_encryption_plugin_from_cnf();
|
std::string plugin_load= get_encryption_plugin_from_cnf();
|
||||||
if (plugin_load.size())
|
if (plugin_load.size())
|
||||||
{
|
{
|
||||||
msg("Loading encryption plugin from %s\n", plugin_load.c_str());
|
msg("Loading encryption plugin from %s", plugin_load.c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -210,9 +209,9 @@ static void encryption_plugin_init(int argc, char **argv)
|
|||||||
/* Patch optional and mandatory plugins, we only need to load the one in xb_plugin_load. */
|
/* Patch optional and mandatory plugins, we only need to load the one in xb_plugin_load. */
|
||||||
mysql_optional_plugins[0] = mysql_mandatory_plugins[0] = 0;
|
mysql_optional_plugins[0] = mysql_mandatory_plugins[0] = 0;
|
||||||
plugin_maturity = MariaDB_PLUGIN_MATURITY_UNKNOWN; /* mariabackup accepts all plugins */
|
plugin_maturity = MariaDB_PLUGIN_MATURITY_UNKNOWN; /* mariabackup accepts all plugins */
|
||||||
msg("Loading encryption plugin\n");
|
msg("Loading encryption plugin");
|
||||||
for (int i= 1; i < argc; i++)
|
for (int i= 1; i < argc; i++)
|
||||||
msg("\t Encryption plugin parameter : '%s'\n", argv[i]);
|
msg("\t Encryption plugin parameter : '%s'", argv[i]);
|
||||||
plugin_init(&argc, argv, PLUGIN_INIT_SKIP_PLUGIN_TABLE);
|
plugin_init(&argc, argv, PLUGIN_INIT_SKIP_PLUGIN_TABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,9 +173,8 @@ xb_fil_cur_open(
|
|||||||
/* The following call prints an error message */
|
/* The following call prints an error message */
|
||||||
os_file_get_last_error(TRUE);
|
os_file_get_last_error(TRUE);
|
||||||
|
|
||||||
msg("[%02u] mariabackup: error: cannot open "
|
msg(thread_n, "mariabackup: error: cannot open "
|
||||||
"tablespace %s\n",
|
"tablespace %s", cursor->abs_path);
|
||||||
thread_n, cursor->abs_path);
|
|
||||||
|
|
||||||
return(XB_FIL_CUR_SKIP);
|
return(XB_FIL_CUR_SKIP);
|
||||||
}
|
}
|
||||||
@ -216,8 +215,8 @@ xb_fil_cur_open(
|
|||||||
cursor->statinfo.st_size = (ulonglong)max_file_size;
|
cursor->statinfo.st_size = (ulonglong)max_file_size;
|
||||||
}
|
}
|
||||||
if (err) {
|
if (err) {
|
||||||
msg("[%02u] mariabackup: error: cannot fstat %s\n",
|
msg(thread_n, "mariabackup: error: cannot fstat %s",
|
||||||
thread_n, cursor->abs_path);
|
cursor->abs_path);
|
||||||
|
|
||||||
xb_fil_cur_close(cursor);
|
xb_fil_cur_close(cursor);
|
||||||
|
|
||||||
@ -261,8 +260,6 @@ xb_fil_cur_open(
|
|||||||
mutex_exit(&fil_system.mutex);
|
mutex_exit(&fil_system.mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*msg("crypt: %s,%u\n", node->name, node->space->crypt_data->type);*/
|
|
||||||
|
|
||||||
cursor->space_size = (ulint)(cursor->statinfo.st_size
|
cursor->space_size = (ulint)(cursor->statinfo.st_size
|
||||||
/ page_size.physical());
|
/ page_size.physical());
|
||||||
|
|
||||||
@ -412,14 +409,8 @@ xb_fil_cur_read(
|
|||||||
&& offset + to_read == cursor->statinfo.st_size) {
|
&& offset + to_read == cursor->statinfo.st_size) {
|
||||||
|
|
||||||
if (to_read < (ib_int64_t) page_size) {
|
if (to_read < (ib_int64_t) page_size) {
|
||||||
msg("[%02u] mariabackup: Warning: junk at the end of "
|
msg(cursor->thread_n, "Warning: junk at the end of "
|
||||||
"%s:\n", cursor->thread_n, cursor->abs_path);
|
"%s, offset = %llu, to_read = %llu",cursor->abs_path, (ulonglong) offset, (ulonglong) to_read);
|
||||||
msg("[%02u] mariabackup: Warning: offset = %llu, "
|
|
||||||
"to_read = %llu\n",
|
|
||||||
cursor->thread_n,
|
|
||||||
(unsigned long long) offset,
|
|
||||||
(unsigned long long) to_read);
|
|
||||||
|
|
||||||
return(XB_FIL_CUR_EOF);
|
return(XB_FIL_CUR_EOF);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -463,20 +454,17 @@ read_retry:
|
|||||||
retry_count--;
|
retry_count--;
|
||||||
|
|
||||||
if (retry_count == 0) {
|
if (retry_count == 0) {
|
||||||
msg("[%02u] mariabackup: "
|
msg(cursor->thread_n,
|
||||||
"Error: failed to read page after "
|
"Error: failed to read page after "
|
||||||
"10 retries. File %s seems to be "
|
"10 retries. File %s seems to be "
|
||||||
"corrupted.\n", cursor->thread_n,
|
"corrupted.", cursor->abs_path);
|
||||||
cursor->abs_path);
|
|
||||||
ret = XB_FIL_CUR_ERROR;
|
ret = XB_FIL_CUR_ERROR;
|
||||||
buf_page_print(page, cursor->page_size);
|
buf_page_print(page, cursor->page_size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
msg("[%02u] mariabackup: "
|
msg(cursor->thread_n, "Database page corruption detected at page "
|
||||||
"Database page corruption detected at page "
|
ULINTPF ", retrying...",
|
||||||
ULINTPF ", retrying...\n", cursor->thread_n,
|
|
||||||
page_no);
|
page_no);
|
||||||
|
|
||||||
os_thread_sleep(100000);
|
os_thread_sleep(100000);
|
||||||
goto read_retry;
|
goto read_retry;
|
||||||
}
|
}
|
||||||
|
@ -738,7 +738,7 @@ ibx_get_one_option(int optid,
|
|||||||
exit(0);
|
exit(0);
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
msg("innobackupex version %s %s (%s)\n",
|
printf("innobackupex version %s %s (%s)",
|
||||||
MYSQL_SERVER_VERSION,
|
MYSQL_SERVER_VERSION,
|
||||||
SYSTEM_TYPE, MACHINE_TYPE);
|
SYSTEM_TYPE, MACHINE_TYPE);
|
||||||
exit(0);
|
exit(0);
|
||||||
|
@ -80,9 +80,8 @@ wf_incremental_init(xb_write_filt_ctxt_t *ctxt, char *dst_name,
|
|||||||
cp->delta_buf = (unsigned char *)os_mem_alloc_large(&cp->delta_buf_size);
|
cp->delta_buf = (unsigned char *)os_mem_alloc_large(&cp->delta_buf_size);
|
||||||
|
|
||||||
if (!cp->delta_buf) {
|
if (!cp->delta_buf) {
|
||||||
msg("[%02u] mariabackup: Error: "
|
msg(cursor->thread_n,"Can't allocate %zu bytes",
|
||||||
"cannot allocate %zu bytes\n",
|
(size_t) cp->delta_buf_size);
|
||||||
cursor->thread_n, (size_t) cp->delta_buf_size);
|
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,9 +90,9 @@ wf_incremental_init(xb_write_filt_ctxt_t *ctxt, char *dst_name,
|
|||||||
XB_DELTA_INFO_SUFFIX);
|
XB_DELTA_INFO_SUFFIX);
|
||||||
const xb_delta_info_t info(cursor->page_size, cursor->space_id);
|
const xb_delta_info_t info(cursor->page_size, cursor->space_id);
|
||||||
if (!xb_write_delta_metadata(meta_name, &info)) {
|
if (!xb_write_delta_metadata(meta_name, &info)) {
|
||||||
msg("[%02u] mariabackup: Error: "
|
msg(cursor->thread_n,"Error: "
|
||||||
"failed to write meta info for %s\n",
|
"failed to write meta info for %s",
|
||||||
cursor->thread_n, cursor->rel_path);
|
cursor->rel_path);
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ xb_write_galera_info(bool incremental_prepare)
|
|||||||
fp = fopen(XB_GALERA_INFO_FILENAME, "w");
|
fp = fopen(XB_GALERA_INFO_FILENAME, "w");
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
|
|
||||||
msg("mariabackup: error: "
|
die(
|
||||||
"could not create " XB_GALERA_INFO_FILENAME
|
"could not create " XB_GALERA_INFO_FILENAME
|
||||||
", errno = %d\n",
|
", errno = %d\n",
|
||||||
errno);
|
errno);
|
||||||
@ -106,11 +106,10 @@ xb_write_galera_info(bool incremental_prepare)
|
|||||||
|
|
||||||
if (fprintf(fp, "%s:%lld", uuid_str, (long long) seqno) < 0) {
|
if (fprintf(fp, "%s:%lld", uuid_str, (long long) seqno) < 0) {
|
||||||
|
|
||||||
msg("mariabackup: error: "
|
die(
|
||||||
"could not write to " XB_GALERA_INFO_FILENAME
|
"could not write to " XB_GALERA_INFO_FILENAME
|
||||||
", errno = %d\n",
|
", errno = %d\n",
|
||||||
errno);
|
errno);;
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
@ -45,7 +45,6 @@ datasink_t datasink_archive;
|
|||||||
datasink_t datasink_xbstream;
|
datasink_t datasink_xbstream;
|
||||||
datasink_t datasink_compress;
|
datasink_t datasink_compress;
|
||||||
datasink_t datasink_tmpfile;
|
datasink_t datasink_tmpfile;
|
||||||
datasink_t datasink_buffer;
|
|
||||||
|
|
||||||
static run_mode_t opt_mode;
|
static run_mode_t opt_mode;
|
||||||
static char * opt_directory = NULL;
|
static char * opt_directory = NULL;
|
||||||
@ -106,7 +105,7 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (opt_mode == RUN_MODE_NONE) {
|
if (opt_mode == RUN_MODE_NONE) {
|
||||||
msg("%s: either -c or -x must be specified.\n", my_progname);
|
msg("%s: either -c or -x must be specified.", my_progname);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,7 +183,7 @@ int
|
|||||||
set_run_mode(run_mode_t mode)
|
set_run_mode(run_mode_t mode)
|
||||||
{
|
{
|
||||||
if (opt_mode != RUN_MODE_NONE) {
|
if (opt_mode != RUN_MODE_NONE) {
|
||||||
msg("%s: can't set specify both -c and -x.\n", my_progname);
|
msg("%s: can't set specify both -c and -x.", my_progname);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,7 +232,7 @@ stream_one_file(File file, xb_wstream_file_t *xbfile)
|
|||||||
while ((bytes = (ssize_t)my_read(file, buf, XBSTREAM_BUFFER_SIZE,
|
while ((bytes = (ssize_t)my_read(file, buf, XBSTREAM_BUFFER_SIZE,
|
||||||
MYF(MY_WME))) > 0) {
|
MYF(MY_WME))) > 0) {
|
||||||
if (xb_stream_write_data(xbfile, buf, bytes)) {
|
if (xb_stream_write_data(xbfile, buf, bytes)) {
|
||||||
msg("%s: xb_stream_write_data() failed.\n",
|
msg("%s: xb_stream_write_data() failed.",
|
||||||
my_progname);
|
my_progname);
|
||||||
my_free(buf);
|
my_free(buf);
|
||||||
return 1;
|
return 1;
|
||||||
@ -262,13 +261,13 @@ mode_create(int argc, char **argv)
|
|||||||
xb_wstream_t *stream;
|
xb_wstream_t *stream;
|
||||||
|
|
||||||
if (argc < 1) {
|
if (argc < 1) {
|
||||||
msg("%s: no files are specified.\n", my_progname);
|
msg("%s: no files are specified.", my_progname);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
stream = xb_stream_write_new();
|
stream = xb_stream_write_new();
|
||||||
if (stream == NULL) {
|
if (stream == NULL) {
|
||||||
msg("%s: xb_stream_write_new() failed.\n", my_progname);
|
msg("%s: xb_stream_write_new() failed.", my_progname);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,13 +280,13 @@ mode_create(int argc, char **argv)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (!MY_S_ISREG(mystat.st_mode)) {
|
if (!MY_S_ISREG(mystat.st_mode)) {
|
||||||
msg("%s: %s is not a regular file, exiting.\n",
|
msg("%s: %s is not a regular file, exiting.",
|
||||||
my_progname, filepath);
|
my_progname, filepath);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((src_file = my_open(filepath, O_RDONLY, MYF(MY_WME))) < 0) {
|
if ((src_file = my_open(filepath, O_RDONLY, MYF(MY_WME))) < 0) {
|
||||||
msg("%s: failed to open %s.\n", my_progname, filepath);
|
msg("%s: failed to open %s.", my_progname, filepath);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,7 +296,7 @@ mode_create(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (opt_verbose) {
|
if (opt_verbose) {
|
||||||
msg("%s\n", filepath);
|
msg("%s", filepath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stream_one_file(src_file, file) ||
|
if (stream_one_file(src_file, file) ||
|
||||||
@ -338,12 +337,12 @@ file_entry_new(extract_ctxt_t *ctxt, const char *path, uint pathlen)
|
|||||||
file = ds_open(ctxt->ds_ctxt, path, NULL);
|
file = ds_open(ctxt->ds_ctxt, path, NULL);
|
||||||
|
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
msg("%s: failed to create file.\n", my_progname);
|
msg("%s: failed to create file.", my_progname);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt_verbose) {
|
if (opt_verbose) {
|
||||||
msg("%s\n", entry->path);
|
msg("%s", entry->path);
|
||||||
}
|
}
|
||||||
|
|
||||||
entry->file = file;
|
entry->file = file;
|
||||||
@ -425,7 +424,7 @@ extract_worker_thread_func(void *arg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (my_hash_insert(ctxt->filehash, (uchar *) entry)) {
|
if (my_hash_insert(ctxt->filehash, (uchar *) entry)) {
|
||||||
msg("%s: my_hash_insert() failed.\n",
|
msg("%s: my_hash_insert() failed.",
|
||||||
my_progname);
|
my_progname);
|
||||||
pthread_mutex_unlock(ctxt->mutex);
|
pthread_mutex_unlock(ctxt->mutex);
|
||||||
break;
|
break;
|
||||||
@ -454,7 +453,7 @@ extract_worker_thread_func(void *arg)
|
|||||||
|
|
||||||
if (entry->offset != chunk.offset) {
|
if (entry->offset != chunk.offset) {
|
||||||
msg("%s: out-of-order chunk: real offset = 0x%llx, "
|
msg("%s: out-of-order chunk: real offset = 0x%llx, "
|
||||||
"expected offset = 0x%llx\n", my_progname,
|
"expected offset = 0x%llx", my_progname,
|
||||||
chunk.offset, entry->offset);
|
chunk.offset, entry->offset);
|
||||||
pthread_mutex_unlock(&entry->mutex);
|
pthread_mutex_unlock(&entry->mutex);
|
||||||
res = XB_STREAM_READ_ERROR;
|
res = XB_STREAM_READ_ERROR;
|
||||||
@ -462,7 +461,7 @@ extract_worker_thread_func(void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ds_write(entry->file, chunk.data, chunk.length)) {
|
if (ds_write(entry->file, chunk.data, chunk.length)) {
|
||||||
msg("%s: my_write() failed.\n", my_progname);
|
msg("%s: my_write() failed.", my_progname);
|
||||||
pthread_mutex_unlock(&entry->mutex);
|
pthread_mutex_unlock(&entry->mutex);
|
||||||
res = XB_STREAM_READ_ERROR;
|
res = XB_STREAM_READ_ERROR;
|
||||||
break;
|
break;
|
||||||
@ -500,12 +499,12 @@ mode_extract(int n_threads, int argc __attribute__((unused)),
|
|||||||
if (my_hash_init(&filehash, &my_charset_bin, START_FILE_HASH_SIZE,
|
if (my_hash_init(&filehash, &my_charset_bin, START_FILE_HASH_SIZE,
|
||||||
0, 0, (my_hash_get_key) get_file_entry_key,
|
0, 0, (my_hash_get_key) get_file_entry_key,
|
||||||
(my_hash_free_key) file_entry_free, MYF(0))) {
|
(my_hash_free_key) file_entry_free, MYF(0))) {
|
||||||
msg("%s: failed to initialize file hash.\n", my_progname);
|
msg("%s: failed to initialize file hash.", my_progname);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pthread_mutex_init(&mutex, NULL)) {
|
if (pthread_mutex_init(&mutex, NULL)) {
|
||||||
msg("%s: failed to initialize mutex.\n", my_progname);
|
msg("%s: failed to initialize mutex.", my_progname);
|
||||||
my_hash_free(&filehash);
|
my_hash_free(&filehash);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -520,7 +519,7 @@ mode_extract(int n_threads, int argc __attribute__((unused)),
|
|||||||
|
|
||||||
stream = xb_stream_read_new();
|
stream = xb_stream_read_new();
|
||||||
if (stream == NULL) {
|
if (stream == NULL) {
|
||||||
msg("%s: xb_stream_read_new() failed.\n", my_progname);
|
msg("%s: xb_stream_read_new() failed.", my_progname);
|
||||||
pthread_mutex_destroy(&mutex);
|
pthread_mutex_destroy(&mutex);
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto exit;
|
goto exit;
|
||||||
@ -531,8 +530,8 @@ mode_extract(int n_threads, int argc __attribute__((unused)),
|
|||||||
ctxt.ds_ctxt = ds_ctxt;
|
ctxt.ds_ctxt = ds_ctxt;
|
||||||
ctxt.mutex = &mutex;
|
ctxt.mutex = &mutex;
|
||||||
|
|
||||||
tids = calloc(n_threads, sizeof(pthread_t));
|
tids = (pthread_t *)calloc(n_threads, sizeof(pthread_t));
|
||||||
retvals = calloc(n_threads, sizeof(void*));
|
retvals = (void **)calloc(n_threads, sizeof(void*));
|
||||||
|
|
||||||
for (i = 0; i < n_threads; i++)
|
for (i = 0; i < n_threads; i++)
|
||||||
pthread_create(tids + i, NULL, extract_worker_thread_func,
|
pthread_create(tids + i, NULL, extract_worker_thread_func,
|
@ -101,6 +101,6 @@ xb_rstream_result_t xb_stream_read_chunk(xb_rstream_t *stream,
|
|||||||
|
|
||||||
int xb_stream_read_done(xb_rstream_t *stream);
|
int xb_stream_read_done(xb_rstream_t *stream);
|
||||||
|
|
||||||
int xb_stream_validate_checksum(xb_rstream_chunk_t *chunk);
|
xb_rstream_result_t xb_stream_validate_checksum(xb_rstream_chunk_t *chunk);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -67,15 +67,15 @@ validate_chunk_type(uchar code)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
xb_rstream_result_t
|
||||||
xb_stream_validate_checksum(xb_rstream_chunk_t *chunk)
|
xb_stream_validate_checksum(xb_rstream_chunk_t *chunk)
|
||||||
{
|
{
|
||||||
ulong checksum;
|
ulong checksum;
|
||||||
|
|
||||||
checksum = crc32_iso3309(0, chunk->data, (uint)chunk->length);
|
checksum = crc32_iso3309(0, (unsigned char *)chunk->data, (uint)chunk->length);
|
||||||
if (checksum != chunk->checksum) {
|
if (checksum != chunk->checksum) {
|
||||||
msg("xb_stream_read_chunk(): invalid checksum at offset "
|
msg("xb_stream_read_chunk(): invalid checksum at offset "
|
||||||
"0x%llx: expected 0x%lx, read 0x%lx.\n",
|
"0x%llx: expected 0x%lx, read 0x%lx.",
|
||||||
(ulonglong) chunk->checksum_offset, chunk->checksum,
|
(ulonglong) chunk->checksum_offset, chunk->checksum,
|
||||||
checksum);
|
checksum);
|
||||||
return XB_STREAM_READ_ERROR;
|
return XB_STREAM_READ_ERROR;
|
||||||
@ -86,8 +86,8 @@ xb_stream_validate_checksum(xb_rstream_chunk_t *chunk)
|
|||||||
|
|
||||||
#define F_READ(buf,len) \
|
#define F_READ(buf,len) \
|
||||||
do { \
|
do { \
|
||||||
if (xb_read_full(fd, buf, len) < len) { \
|
if (xb_read_full(fd, (uchar *)buf, len) < len) { \
|
||||||
msg("xb_stream_read_chunk(): my_read() failed.\n"); \
|
msg("xb_stream_read_chunk(): my_read() failed."); \
|
||||||
goto err; \
|
goto err; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
@ -111,7 +111,7 @@ xb_stream_read_chunk(xb_rstream_t *stream, xb_rstream_chunk_t *chunk)
|
|||||||
return XB_STREAM_READ_EOF;
|
return XB_STREAM_READ_EOF;
|
||||||
} else if (tbytes < CHUNK_HEADER_CONSTANT_LEN) {
|
} else if (tbytes < CHUNK_HEADER_CONSTANT_LEN) {
|
||||||
msg("xb_stream_read_chunk(): unexpected end of stream at "
|
msg("xb_stream_read_chunk(): unexpected end of stream at "
|
||||||
"offset 0x%llx.\n", stream->offset);
|
"offset 0x%llx.", stream->offset);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,7 +120,7 @@ xb_stream_read_chunk(xb_rstream_t *stream, xb_rstream_chunk_t *chunk)
|
|||||||
/* Chunk magic value */
|
/* Chunk magic value */
|
||||||
if (memcmp(tmpbuf, XB_STREAM_CHUNK_MAGIC, 8)) {
|
if (memcmp(tmpbuf, XB_STREAM_CHUNK_MAGIC, 8)) {
|
||||||
msg("xb_stream_read_chunk(): wrong chunk magic at offset "
|
msg("xb_stream_read_chunk(): wrong chunk magic at offset "
|
||||||
"0x%llx.\n", (ulonglong) stream->offset);
|
"0x%llx.", (ulonglong) stream->offset);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
ptr += 8;
|
ptr += 8;
|
||||||
@ -135,7 +135,7 @@ xb_stream_read_chunk(xb_rstream_t *stream, xb_rstream_chunk_t *chunk)
|
|||||||
if (chunk->type == XB_CHUNK_TYPE_UNKNOWN &&
|
if (chunk->type == XB_CHUNK_TYPE_UNKNOWN &&
|
||||||
!(chunk->flags & XB_STREAM_FLAG_IGNORABLE)) {
|
!(chunk->flags & XB_STREAM_FLAG_IGNORABLE)) {
|
||||||
msg("xb_stream_read_chunk(): unknown chunk type 0x%lu at "
|
msg("xb_stream_read_chunk(): unknown chunk type 0x%lu at "
|
||||||
"offset 0x%llx.\n", (ulong) *ptr,
|
"offset 0x%llx.", (ulong) *ptr,
|
||||||
(ulonglong) stream->offset);
|
(ulonglong) stream->offset);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -146,7 +146,7 @@ xb_stream_read_chunk(xb_rstream_t *stream, xb_rstream_chunk_t *chunk)
|
|||||||
pathlen = uint4korr(ptr);
|
pathlen = uint4korr(ptr);
|
||||||
if (pathlen >= FN_REFLEN) {
|
if (pathlen >= FN_REFLEN) {
|
||||||
msg("xb_stream_read_chunk(): path length (%lu) is too large at "
|
msg("xb_stream_read_chunk(): path length (%lu) is too large at "
|
||||||
"offset 0x%llx.\n", (ulong) pathlen, stream->offset);
|
"offset 0x%llx.", (ulong) pathlen, stream->offset);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
chunk->pathlen = pathlen;
|
chunk->pathlen = pathlen;
|
||||||
@ -170,7 +170,7 @@ xb_stream_read_chunk(xb_rstream_t *stream, xb_rstream_chunk_t *chunk)
|
|||||||
ullval = uint8korr(tmpbuf);
|
ullval = uint8korr(tmpbuf);
|
||||||
if (ullval > (ulonglong) SIZE_T_MAX) {
|
if (ullval > (ulonglong) SIZE_T_MAX) {
|
||||||
msg("xb_stream_read_chunk(): chunk length is too large at "
|
msg("xb_stream_read_chunk(): chunk length is too large at "
|
||||||
"offset 0x%llx: 0x%llx.\n", (ulonglong) stream->offset,
|
"offset 0x%llx: 0x%llx.", (ulonglong) stream->offset,
|
||||||
ullval);
|
ullval);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -181,7 +181,7 @@ xb_stream_read_chunk(xb_rstream_t *stream, xb_rstream_chunk_t *chunk)
|
|||||||
ullval = uint8korr(tmpbuf + 8);
|
ullval = uint8korr(tmpbuf + 8);
|
||||||
if (ullval > (ulonglong) MY_OFF_T_MAX) {
|
if (ullval > (ulonglong) MY_OFF_T_MAX) {
|
||||||
msg("xb_stream_read_chunk(): chunk offset is too large at "
|
msg("xb_stream_read_chunk(): chunk offset is too large at "
|
||||||
"offset 0x%llx: 0x%llx.\n", (ulonglong) stream->offset,
|
"offset 0x%llx: 0x%llx.", (ulonglong) stream->offset,
|
||||||
ullval);
|
ullval);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -194,7 +194,7 @@ xb_stream_read_chunk(xb_rstream_t *stream, xb_rstream_chunk_t *chunk)
|
|||||||
MYF(MY_WME | MY_ALLOW_ZERO_PTR));
|
MYF(MY_WME | MY_ALLOW_ZERO_PTR));
|
||||||
if (chunk->data == NULL) {
|
if (chunk->data == NULL) {
|
||||||
msg("xb_stream_read_chunk(): failed to increase buffer "
|
msg("xb_stream_read_chunk(): failed to increase buffer "
|
||||||
"to %lu bytes.\n", (ulong) chunk->length);
|
"to %lu bytes.", (ulong) chunk->length);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
chunk->buflen = chunk->length;
|
chunk->buflen = chunk->length;
|
@ -55,7 +55,7 @@ xb_stream_default_write_callback(xb_wstream_file_t *file __attribute__((unused))
|
|||||||
void *userdata __attribute__((unused)),
|
void *userdata __attribute__((unused)),
|
||||||
const void *buf, size_t len)
|
const void *buf, size_t len)
|
||||||
{
|
{
|
||||||
if (my_write(my_fileno(stdout), buf, len, MYF(MY_WME | MY_NABP)))
|
if (my_write(my_fileno(stdout), (const uchar *)buf, len, MYF(MY_WME | MY_NABP)))
|
||||||
return -1;
|
return -1;
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
@ -83,7 +83,7 @@ xb_stream_write_open(xb_wstream_t *stream, const char *path,
|
|||||||
path_len = strlen(path);
|
path_len = strlen(path);
|
||||||
|
|
||||||
if (path_len > FN_REFLEN) {
|
if (path_len > FN_REFLEN) {
|
||||||
msg("xb_stream_write_open(): file path is too long.\n");
|
msg("xb_stream_write_open(): file path is too long.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -216,7 +216,7 @@ xb_stream_write_chunk(xb_wstream_file_t *file, const void *buf, size_t len)
|
|||||||
int8store(ptr, len); /* Payload length */
|
int8store(ptr, len); /* Payload length */
|
||||||
ptr += 8;
|
ptr += 8;
|
||||||
|
|
||||||
checksum = crc32_iso3309(0, buf, (uint)len); /* checksum */
|
checksum = crc32_iso3309(0, (const uchar *)buf, (uint)len); /* checksum */
|
||||||
|
|
||||||
pthread_mutex_lock(&stream->mutex);
|
pthread_mutex_lock(&stream->mutex);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -71,7 +71,7 @@ extern char *xtrabackup_databases_file;
|
|||||||
extern char *xtrabackup_tables_exclude;
|
extern char *xtrabackup_tables_exclude;
|
||||||
extern char *xtrabackup_databases_exclude;
|
extern char *xtrabackup_databases_exclude;
|
||||||
|
|
||||||
extern ibool xtrabackup_compress;
|
extern uint xtrabackup_compress;
|
||||||
|
|
||||||
extern my_bool xtrabackup_backup;
|
extern my_bool xtrabackup_backup;
|
||||||
extern my_bool xtrabackup_prepare;
|
extern my_bool xtrabackup_prepare;
|
||||||
@ -86,14 +86,10 @@ extern int xtrabackup_parallel;
|
|||||||
|
|
||||||
extern my_bool xb_close_files;
|
extern my_bool xb_close_files;
|
||||||
extern const char *xtrabackup_compress_alg;
|
extern const char *xtrabackup_compress_alg;
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"{
|
extern uint xtrabackup_compress_threads;
|
||||||
#endif
|
extern ulonglong xtrabackup_compress_chunk_size;
|
||||||
extern uint xtrabackup_compress_threads;
|
|
||||||
extern ulonglong xtrabackup_compress_chunk_size;
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
extern my_bool xtrabackup_export;
|
extern my_bool xtrabackup_export;
|
||||||
extern char *xtrabackup_extra_lsndir;
|
extern char *xtrabackup_extra_lsndir;
|
||||||
extern ulint xtrabackup_log_copy_interval;
|
extern ulint xtrabackup_log_copy_interval;
|
||||||
|
@ -330,7 +330,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
3 MATERIALIZED t3 ALL NULL NULL NULL NULL 2 100.00 Using where
|
3 MATERIALIZED t3 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1276 Field or reference 'test.t2.b' of SELECT #3 was resolved in SELECT #2
|
Note 1276 Field or reference 'test.t2.b' of SELECT #3 was resolved in SELECT #2
|
||||||
Note 1003 /* select#1 */ select (/* select#2 */ select 1 from dual where !(1 is not null and <in_optimizer>(1,1 in ( <materialize> (/* select#3 */ select `test`.`t3`.`c` from `test`.`t3` where `test`.`t3`.`c` is not null ), <primary_index_lookup>(1 in <temporary table> on distinct_key where 1 = `<subquery3>`.`c`))))) AS `( SELECT b FROM t2 WHERE NOT EXISTS ( SELECT c FROM t3 WHERE c = b ) )` from `test`.`t1`
|
Note 1003 /* select#1 */ select (/* select#2 */ select 1 from dual where !(1 is not null and <in_optimizer>(1,1 in (<primary_index_lookup>(1 in <temporary table> on distinct_key where 1 = `<subquery3>`.`c`))))) AS `( SELECT b FROM t2 WHERE NOT EXISTS ( SELECT c FROM t3 WHERE c = b ) )` from `test`.`t1`
|
||||||
SELECT ( SELECT b FROM t2 WHERE NOT EXISTS ( SELECT c FROM t3 WHERE c = b ) ) FROM t1;
|
SELECT ( SELECT b FROM t2 WHERE NOT EXISTS ( SELECT c FROM t3 WHERE c = b ) ) FROM t1;
|
||||||
( SELECT b FROM t2 WHERE NOT EXISTS ( SELECT c FROM t3 WHERE c = b ) )
|
( SELECT b FROM t2 WHERE NOT EXISTS ( SELECT c FROM t3 WHERE c = b ) )
|
||||||
1
|
1
|
||||||
@ -344,7 +344,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
3 MATERIALIZED t3 ALL NULL NULL NULL NULL 2 100.00 Using where
|
3 MATERIALIZED t3 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1276 Field or reference 'test.t2.b' of SELECT #3 was resolved in SELECT #2
|
Note 1276 Field or reference 'test.t2.b' of SELECT #3 was resolved in SELECT #2
|
||||||
Note 1003 /* select#1 */ select (/* select#2 */ select 1 from dual where !(1 is not null and <in_optimizer>(1,1 in ( <materialize> (/* select#3 */ select `test`.`t3`.`c` from `test`.`t3` where `test`.`t3`.`c` is not null ), <primary_index_lookup>(1 in <temporary table> on distinct_key where 1 = `<subquery3>`.`c`))))) AS `( SELECT b FROM t2 WHERE NOT EXISTS ( SELECT c FROM t3 WHERE c = b ) )` from `test`.`t1`
|
Note 1003 /* select#1 */ select (/* select#2 */ select 1 from dual where !(1 is not null and <in_optimizer>(1,1 in (<primary_index_lookup>(1 in <temporary table> on distinct_key where 1 = `<subquery3>`.`c`))))) AS `( SELECT b FROM t2 WHERE NOT EXISTS ( SELECT c FROM t3 WHERE c = b ) )` from `test`.`t1`
|
||||||
SELECT ( SELECT b FROM t2 WHERE NOT EXISTS ( SELECT c FROM t3 WHERE c = b ) ) FROM t1;
|
SELECT ( SELECT b FROM t2 WHERE NOT EXISTS ( SELECT c FROM t3 WHERE c = b ) ) FROM t1;
|
||||||
( SELECT b FROM t2 WHERE NOT EXISTS ( SELECT c FROM t3 WHERE c = b ) )
|
( SELECT b FROM t2 WHERE NOT EXISTS ( SELECT c FROM t3 WHERE c = b ) )
|
||||||
1
|
1
|
||||||
|
@ -2150,6 +2150,44 @@ select @advertAcctId as a from dual union all select 1.0 from dual;
|
|||||||
a
|
a
|
||||||
1000003.0
|
1000003.0
|
||||||
1.0
|
1.0
|
||||||
|
#
|
||||||
|
# MDEV-13784: query causes seg fault
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (`bug_id` int NOT NULL PRIMARY KEY, `product_id` int NOT NULL);
|
||||||
|
INSERT INTO t1 VALUES (45199,1184);
|
||||||
|
CREATE TABLE t2 (`product_id` int NOT NULL,`userid` int NOT NULL, PRIMARY KEY (`product_id`,`userid`));
|
||||||
|
INSERT INTO t2 VALUES (1184,103),(1184,624),(1184,1577),(1184,1582);
|
||||||
|
CREATE TABLE t3 (`id` int NOT NULL PRIMARY KEY,`name` varchar(64));
|
||||||
|
CREATE TABLE t4 ( `userid` int NOT NULL PRIMARY KEY, `login_name` varchar(255));
|
||||||
|
INSERT INTO t4 VALUES (103,'foo'),(624,'foo'),(1577,'foo'),(1582,'foo');
|
||||||
|
CREATE TABLE t5 (`id` int NOT NULL PRIMARY KEY, `name` varchar(64));
|
||||||
|
explain select
|
||||||
|
(
|
||||||
|
select login_name from t4 where userId = (
|
||||||
|
select userid from t2 where product_id = t1.product_id
|
||||||
|
union
|
||||||
|
select userid from t2 where product_id = (
|
||||||
|
select id from t5 where name = (select name from t3 where id = t1.product_id)) limit 1 )
|
||||||
|
) as x from t1 where (t1.bug_id=45199);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1 system PRIMARY NULL NULL NULL 1
|
||||||
|
2 SUBQUERY t4 eq_ref PRIMARY PRIMARY 4 func 1 Using where
|
||||||
|
3 SUBQUERY t2 ref PRIMARY PRIMARY 4 const 3 Using index
|
||||||
|
4 UNION t2 ref PRIMARY PRIMARY 4 func 1 Using where; Using index
|
||||||
|
5 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
6 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
NULL UNION RESULT <union3,4> ALL NULL NULL NULL NULL NULL
|
||||||
|
select
|
||||||
|
(
|
||||||
|
select login_name from t4 where userId = (
|
||||||
|
select userid from t2 where product_id = t1.product_id
|
||||||
|
union
|
||||||
|
select userid from t2 where product_id = (
|
||||||
|
select id from t5 where name = (select name from t3 where id = t1.product_id)) limit 1 )
|
||||||
|
) as x from t1 where (t1.bug_id=45199);
|
||||||
|
x
|
||||||
|
foo
|
||||||
|
drop table t1, t2, t3, t4, t5;
|
||||||
End of 5.5 tests
|
End of 5.5 tests
|
||||||
#
|
#
|
||||||
# WL#1763 Avoid creating temporary table in UNION ALL
|
# WL#1763 Avoid creating temporary table in UNION ALL
|
||||||
|
@ -1485,6 +1485,41 @@ eval SET NAMES $old_charset;
|
|||||||
SET @advertAcctId = 1000003;
|
SET @advertAcctId = 1000003;
|
||||||
select @advertAcctId as a from dual union all select 1.0 from dual;
|
select @advertAcctId as a from dual union all select 1.0 from dual;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-13784: query causes seg fault
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (`bug_id` int NOT NULL PRIMARY KEY, `product_id` int NOT NULL);
|
||||||
|
INSERT INTO t1 VALUES (45199,1184);
|
||||||
|
|
||||||
|
CREATE TABLE t2 (`product_id` int NOT NULL,`userid` int NOT NULL, PRIMARY KEY (`product_id`,`userid`));
|
||||||
|
INSERT INTO t2 VALUES (1184,103),(1184,624),(1184,1577),(1184,1582);
|
||||||
|
|
||||||
|
CREATE TABLE t3 (`id` int NOT NULL PRIMARY KEY,`name` varchar(64));
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE t4 ( `userid` int NOT NULL PRIMARY KEY, `login_name` varchar(255));
|
||||||
|
INSERT INTO t4 VALUES (103,'foo'),(624,'foo'),(1577,'foo'),(1582,'foo');
|
||||||
|
CREATE TABLE t5 (`id` int NOT NULL PRIMARY KEY, `name` varchar(64));
|
||||||
|
|
||||||
|
explain select
|
||||||
|
(
|
||||||
|
select login_name from t4 where userId = (
|
||||||
|
select userid from t2 where product_id = t1.product_id
|
||||||
|
union
|
||||||
|
select userid from t2 where product_id = (
|
||||||
|
select id from t5 where name = (select name from t3 where id = t1.product_id)) limit 1 )
|
||||||
|
) as x from t1 where (t1.bug_id=45199);
|
||||||
|
select
|
||||||
|
(
|
||||||
|
select login_name from t4 where userId = (
|
||||||
|
select userid from t2 where product_id = t1.product_id
|
||||||
|
union
|
||||||
|
select userid from t2 where product_id = (
|
||||||
|
select id from t5 where name = (select name from t3 where id = t1.product_id)) limit 1 )
|
||||||
|
) as x from t1 where (t1.bug_id=45199);
|
||||||
|
drop table t1, t2, t3, t4, t5;
|
||||||
|
|
||||||
--echo End of 5.5 tests
|
--echo End of 5.5 tests
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -4613,7 +4613,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
2 DEPENDENT SUBQUERY t4 ALL NULL NULL NULL NULL 2 100.00 Using where
|
2 DEPENDENT SUBQUERY t4 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1276 Field or reference 'test.t1.a' of SELECT #2 was resolved in SELECT #1
|
Note 1276 Field or reference 'test.t1.a' of SELECT #2 was resolved in SELECT #1
|
||||||
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,10 AS `a` from `test`.`t1` where !<expr_cache><10,`test`.`t1`.`a`>(<in_optimizer>(10,<exists>(/* select#2 */ select NULL from `test`.`t4` where `test`.`t4`.`a` >= `test`.`t1`.`a` and trigcond(<cache>(10) = NULL or <cache>(NULL is null)) having trigcond(NULL is null))))
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,10 AS `a` from `test`.`t1` where !<expr_cache><10,`test`.`t1`.`a`>(<in_optimizer>(10,<exists>(/* select#2 */ select NULL from `test`.`t4` where `test`.`t4`.`a` >= `test`.`t1`.`a` and trigcond(<cache>(10) = NULL or 1) having trigcond(NULL is null))))
|
||||||
SELECT * FROM t1, t2
|
SELECT * FROM t1, t2
|
||||||
WHERE t2.a NOT IN (SELECT t3.b FROM t3 RIGHT JOIN t4 ON (t4.a = t3.a)
|
WHERE t2.a NOT IN (SELECT t3.b FROM t3 RIGHT JOIN t4 ON (t4.a = t3.a)
|
||||||
WHERE t4.a >= t1.a);
|
WHERE t4.a >= t1.a);
|
||||||
@ -4629,7 +4629,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
2 DEPENDENT SUBQUERY t4 ALL NULL NULL NULL NULL 2 100.00 Using where
|
2 DEPENDENT SUBQUERY t4 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1276 Field or reference 'v1.a' of SELECT #2 was resolved in SELECT #1
|
Note 1276 Field or reference 'v1.a' of SELECT #2 was resolved in SELECT #1
|
||||||
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,10 AS `a` from `test`.`t1` where !<expr_cache><10,`test`.`t1`.`a`>(<in_optimizer>(10,<exists>(/* select#2 */ select NULL from `test`.`t4` where `test`.`t4`.`a` >= `test`.`t1`.`a` and trigcond(<cache>(10) = NULL or <cache>(NULL is null)) having trigcond(NULL is null))))
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,10 AS `a` from `test`.`t1` where !<expr_cache><10,`test`.`t1`.`a`>(<in_optimizer>(10,<exists>(/* select#2 */ select NULL from `test`.`t4` where `test`.`t4`.`a` >= `test`.`t1`.`a` and trigcond(<cache>(10) = NULL or 1) having trigcond(NULL is null))))
|
||||||
SELECT * FROM v1, t2
|
SELECT * FROM v1, t2
|
||||||
WHERE t2.a NOT IN (SELECT t3.b FROM t3 RIGHT JOIN t4 ON (t4.a = t3.a)
|
WHERE t2.a NOT IN (SELECT t3.b FROM t3 RIGHT JOIN t4 ON (t4.a = t3.a)
|
||||||
WHERE t4.a >= v1.a);
|
WHERE t4.a >= v1.a);
|
||||||
|
@ -77,7 +77,6 @@ t2 CREATE TABLE `t2` (
|
|||||||
`a` int(11) NOT NULL,
|
`a` int(11) NOT NULL,
|
||||||
PRIMARY KEY (`a`)
|
PRIMARY KEY (`a`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t2;
|
|
||||||
CREATE TABLE t3 (a int not null primary key) engine=innodb ENCRYPTION_KEY_ID=4;
|
CREATE TABLE t3 (a int not null primary key) engine=innodb ENCRYPTION_KEY_ID=4;
|
||||||
ERROR HY000: Can't create table `test`.`t3` (errno: 140 "Wrong create options")
|
ERROR HY000: Can't create table `test`.`t3` (errno: 140 "Wrong create options")
|
||||||
SHOW WARNINGS;
|
SHOW WARNINGS;
|
||||||
@ -85,3 +84,30 @@ Level Code Message
|
|||||||
Warning 140 InnoDB: innodb_encrypt_tables=OFF only allows ENCRYPTION_KEY_ID=1
|
Warning 140 InnoDB: innodb_encrypt_tables=OFF only allows ENCRYPTION_KEY_ID=1
|
||||||
Error 1005 Can't create table `test`.`t3` (errno: 140 "Wrong create options")
|
Error 1005 Can't create table `test`.`t3` (errno: 140 "Wrong create options")
|
||||||
Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB
|
Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB
|
||||||
|
FLUSH TABLES;
|
||||||
|
create table t1(f1 int not null, f2 int not null)engine=innodb encrypted=yes;
|
||||||
|
insert into t1 values(1, 2), (2, 3), (4, 5), (5, 6), (7, 8);
|
||||||
|
insert into t1 select * from t1;
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO t2 VALUES (1);
|
||||||
|
connect con1, localhost, root;
|
||||||
|
SET DEBUG_SYNC = 'row_log_table_apply2_before SIGNAL done WAIT_FOR ever';
|
||||||
|
alter table t1 force;
|
||||||
|
connection default;
|
||||||
|
SET DEBUG_SYNC = 'now WAIT_FOR done';
|
||||||
|
SET GLOBAL innodb_flush_log_at_trx_commit=1;
|
||||||
|
COMMIT;
|
||||||
|
disconnect con1;
|
||||||
|
select * from t1;
|
||||||
|
f1 f2
|
||||||
|
1 2
|
||||||
|
2 3
|
||||||
|
4 5
|
||||||
|
5 6
|
||||||
|
7 8
|
||||||
|
1 2
|
||||||
|
2 3
|
||||||
|
4 5
|
||||||
|
5 6
|
||||||
|
7 8
|
||||||
|
drop table t1,t2;
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
-- source include/have_innodb.inc
|
-- source include/have_innodb.inc
|
||||||
|
-- source include/have_debug.inc
|
||||||
|
-- source include/have_debug_sync.inc
|
||||||
-- source include/have_file_key_management_plugin.inc
|
-- source include/have_file_key_management_plugin.inc
|
||||||
|
|
||||||
#
|
#
|
||||||
# MDEV-8817: Failing assertion: new_state->key_version != ENCRYPTION_KEY_VERSION_INVALID
|
# MDEV-8817: Failing assertion: new_state->key_version != ENCRYPTION_KEY_VERSION_INVALID
|
||||||
#
|
#
|
||||||
|
|
||||||
let $encrypt_tables = `SELECT @@innodb_encrypt_tables`;
|
|
||||||
let $threads = `SELECT @@innodb_encryption_threads`;
|
|
||||||
|
|
||||||
SET GLOBAL innodb_encrypt_tables = ON;
|
SET GLOBAL innodb_encrypt_tables = ON;
|
||||||
SET GLOBAL innodb_encryption_threads = 4;
|
SET GLOBAL innodb_encryption_threads = 4;
|
||||||
|
|
||||||
@ -99,14 +98,35 @@ ALTER TABLE t2 ENCRYPTION_KEY_ID=4, ALGORITHM=COPY;
|
|||||||
--replace_regex /#sql-[0-9a-f_]*`/#sql-temporary`/
|
--replace_regex /#sql-[0-9a-f_]*`/#sql-temporary`/
|
||||||
SHOW WARNINGS;
|
SHOW WARNINGS;
|
||||||
SHOW CREATE TABLE t2;
|
SHOW CREATE TABLE t2;
|
||||||
DROP TABLE t2;
|
|
||||||
|
|
||||||
--error ER_CANT_CREATE_TABLE
|
--error ER_CANT_CREATE_TABLE
|
||||||
CREATE TABLE t3 (a int not null primary key) engine=innodb ENCRYPTION_KEY_ID=4;
|
CREATE TABLE t3 (a int not null primary key) engine=innodb ENCRYPTION_KEY_ID=4;
|
||||||
SHOW WARNINGS;
|
SHOW WARNINGS;
|
||||||
|
|
||||||
# reset system
|
FLUSH TABLES;
|
||||||
--disable_query_log
|
|
||||||
EVAL SET GLOBAL innodb_encrypt_tables = $encrypt_tables;
|
create table t1(f1 int not null, f2 int not null)engine=innodb encrypted=yes;
|
||||||
EVAL SET GLOBAL innodb_encryption_threads = $threads;
|
insert into t1 values(1, 2), (2, 3), (4, 5), (5, 6), (7, 8);
|
||||||
--enable_query_log
|
insert into t1 select * from t1;
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO t2 VALUES (1);
|
||||||
|
|
||||||
|
connect con1, localhost, root;
|
||||||
|
SET DEBUG_SYNC = 'row_log_table_apply2_before SIGNAL done WAIT_FOR ever';
|
||||||
|
send alter table t1 force;
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
SET DEBUG_SYNC = 'now WAIT_FOR done';
|
||||||
|
SET GLOBAL innodb_flush_log_at_trx_commit=1;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
--let $shutdown_timeout= 0
|
||||||
|
--source include/restart_mysqld.inc
|
||||||
|
disconnect con1;
|
||||||
|
|
||||||
|
select * from t1;
|
||||||
|
drop table t1,t2;
|
||||||
|
|
||||||
|
# Work around missing crash recovery at the SQL layer.
|
||||||
|
let $datadir= `select @@datadir`;
|
||||||
|
--remove_files_wildcard $datadir/test #sql-*.frm
|
||||||
|
@ -0,0 +1,380 @@
|
|||||||
|
CREATE TABLE user(id int primary key, j int) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE user_session(id int primary key, fk1 int, fk2 int) ENGINE=InnoDB;
|
||||||
|
alter table user_session add foreign key (fk1) references user(id);
|
||||||
|
INSERT INTO user values (1,0), (2,0), (3,0), (4,0);
|
||||||
|
INSERT INTO user_session values (1,1,1);
|
||||||
|
connect node_1_u, 127.0.0.1, root, , test, $NODE_MYPORT_1;
|
||||||
|
connect node_1_i, 127.0.0.1, root, , test, $NODE_MYPORT_1;
|
||||||
|
connect node_2_i, 127.0.0.1, root, , test, $NODE_MYPORT_2;
|
||||||
|
"Phase 1: plain SQL statements"
|
||||||
|
connection node_1;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
update user set j = j + 1 WHERE id > 0;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 2);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 3);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
update user set j = j + 1 WHERE id > 0;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 2);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 3);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
update user set j = j + 1 WHERE id > 0;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 2);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 3);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
update user set j = j + 1 WHERE id > 0;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 2);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 3);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
update user set j = j + 1 WHERE id > 0;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 2);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 3);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
update user set j = j + 1 WHERE id > 0;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 2);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 3);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
update user set j = j + 1 WHERE id > 0;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 2);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 3);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
update user set j = j + 1 WHERE id > 0;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 2);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 3);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
update user set j = j + 1 WHERE id > 0;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 2);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 3);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
update user set j = j + 1 WHERE id > 0;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 2);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 3);
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
"Phase 2: prepared statements"
|
||||||
|
connection node_1_u;
|
||||||
|
prepare upd from 'update user set j = j + 1 WHERE id > 0';
|
||||||
|
connection node_1_i;
|
||||||
|
prepare ins1 from 'insert into user_session(id,fk1,fk2) values (2, 2, 2)';
|
||||||
|
connection node_2_i;
|
||||||
|
prepare ins2 from 'insert into user_session(id,fk1,fk2) values (2, 2, 3)';
|
||||||
|
connection node_1;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
execute upd;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
execute ins1;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
execute ins2;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
execute upd;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
execute ins1;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
execute ins2;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
execute upd;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
execute ins1;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
execute ins2;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
execute upd;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
execute ins1;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
execute ins2;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
execute upd;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
execute ins1;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
execute ins2;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
execute upd;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
execute ins1;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
execute ins2;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
execute upd;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
execute ins1;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
execute ins2;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
execute upd;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
execute ins1;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
execute ins2;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
execute upd;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
execute ins1;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
execute ins2;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1_u;
|
||||||
|
begin;
|
||||||
|
execute upd;
|
||||||
|
connection node_1_i;
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
execute ins1;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
connection node_2_i;
|
||||||
|
execute ins2;
|
||||||
|
connection node_1;
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
connection node_1_i;
|
||||||
|
connection node_1_u;
|
||||||
|
commit;
|
||||||
|
connection node_1;
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
connection node_1;
|
||||||
|
drop table user_session,user;
|
@ -150,6 +150,7 @@ connection node_3;
|
|||||||
connection node_2;
|
connection node_2;
|
||||||
STOP SLAVE;
|
STOP SLAVE;
|
||||||
RESET SLAVE ALL;
|
RESET SLAVE ALL;
|
||||||
|
set global gtid_slave_pos="";
|
||||||
reset master;
|
reset master;
|
||||||
#Connection 3
|
#Connection 3
|
||||||
connection node_3;
|
connection node_3;
|
||||||
|
161
mysql-test/suite/galera/t/galera_FK_duplicate_client_insert.test
Normal file
161
mysql-test/suite/galera/t/galera_FK_duplicate_client_insert.test
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_debug.inc
|
||||||
|
--source include/have_debug_sync.inc
|
||||||
|
--source include/galera_cluster.inc
|
||||||
|
#
|
||||||
|
# This test will reproduce regressions of bugs
|
||||||
|
# https://github.com/codership/mysql-wsrep/issues/335
|
||||||
|
# https://github.com/codership/mysql-wsrep/issues/336
|
||||||
|
#
|
||||||
|
# The test will issue duplicate inserts into a table, which has foreign key
|
||||||
|
# constraint for a parent table.
|
||||||
|
# The inserts happen in separate nodes, and the
|
||||||
|
# The test outline is as follows:
|
||||||
|
# 1. in node 1, an update is done for the FK parent row, in a transaction,
|
||||||
|
# which is left open. The purpose of this is just to establish a X lock on
|
||||||
|
# the parent row.
|
||||||
|
# 2. in node 1, an insert for the child table is sent. The insert will have to wait
|
||||||
|
# for the parent row X lock, because it needs S lock on the same row.
|
||||||
|
# However, we have set an DBUG sync point just before the insert will call for
|
||||||
|
# innodb suspend
|
||||||
|
# 3. in node 2, a similar insert is issued. This will replicate to node 1 and try to
|
||||||
|
# abort the conflicting update and blocked insert
|
||||||
|
# 4. the inserts dbug sync point is relased, and insert should continue and abort
|
||||||
|
# gracefully
|
||||||
|
# 5. update is continued to commit, and it should also observe the deadlock
|
||||||
|
#
|
||||||
|
# This test is run in 3 phases:
|
||||||
|
#
|
||||||
|
# 1. with plain SQL statement
|
||||||
|
# 2. as SQL prepared statements
|
||||||
|
# 3. as SQl stored procedures
|
||||||
|
#
|
||||||
|
# The test phase 3 is for reproducing the issue in bug #336 specifically
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# create the test tables and foreign key constraint between them
|
||||||
|
#
|
||||||
|
CREATE TABLE user(id int primary key, j int) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE user_session(id int primary key, fk1 int, fk2 int) ENGINE=InnoDB;
|
||||||
|
alter table user_session add foreign key (fk1) references user(id);
|
||||||
|
|
||||||
|
# populate a few initial rows
|
||||||
|
INSERT INTO user values (1,0), (2,0), (3,0), (4,0);
|
||||||
|
INSERT INTO user_session values (1,1,1);
|
||||||
|
|
||||||
|
#
|
||||||
|
# prepare test connections, for:
|
||||||
|
# update of parent row in node1
|
||||||
|
# insert of child row in node1
|
||||||
|
# insert of child row in node2
|
||||||
|
|
||||||
|
--connect node_1_u, 127.0.0.1, root, , test, $NODE_MYPORT_1
|
||||||
|
--connect node_1_i, 127.0.0.1, root, , test, $NODE_MYPORT_1
|
||||||
|
--connect node_2_i, 127.0.0.1, root, , test, $NODE_MYPORT_2
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# test phase 1: plain SQL statements
|
||||||
|
#
|
||||||
|
--echo "Phase 1: plain SQL statements"
|
||||||
|
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
let $counter=10;
|
||||||
|
let $sleep_period=1;
|
||||||
|
|
||||||
|
while($counter > 0)
|
||||||
|
{
|
||||||
|
--connection node_1_u
|
||||||
|
begin;
|
||||||
|
update user set j = j + 1 WHERE id > 0;
|
||||||
|
|
||||||
|
--connection node_1_i
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
send insert into user_session(id,fk1,fk2) values (2, 2, 2);
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
|
||||||
|
--connection node_2_i
|
||||||
|
insert into user_session(id,fk1,fk2) values (2, 2, 3);
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
|
||||||
|
--connection node_1_i
|
||||||
|
--error 0,ER_LOCK_DEADLOCK,ER_DUP_ENTRY
|
||||||
|
reap;
|
||||||
|
|
||||||
|
--connection node_1_u
|
||||||
|
--error 0,ER_LOCK_DEADLOCK
|
||||||
|
commit;
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
--error 0,ER_LOCK_DEADLOCK
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
|
||||||
|
dec $counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# test phase 2: prepared statements
|
||||||
|
#
|
||||||
|
--echo "Phase 2: prepared statements"
|
||||||
|
|
||||||
|
--connection node_1_u
|
||||||
|
prepare upd from 'update user set j = j + 1 WHERE id > 0';
|
||||||
|
|
||||||
|
--connection node_1_i
|
||||||
|
prepare ins1 from 'insert into user_session(id,fk1,fk2) values (2, 2, 2)';
|
||||||
|
|
||||||
|
--connection node_2_i
|
||||||
|
prepare ins2 from 'insert into user_session(id,fk1,fk2) values (2, 2, 3)';
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
let $counter=10;
|
||||||
|
let $sleep_period=1;
|
||||||
|
|
||||||
|
while($counter > 0)
|
||||||
|
{
|
||||||
|
--connection node_1_u
|
||||||
|
begin;
|
||||||
|
execute upd;
|
||||||
|
#update user set j = j + 1 WHERE id > 0;
|
||||||
|
|
||||||
|
--connection node_1_i
|
||||||
|
set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins';
|
||||||
|
send execute ins1;
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
set debug_sync='now WAIT_FOR ins_waiting';
|
||||||
|
|
||||||
|
--connection node_2_i
|
||||||
|
execute ins2;
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
set debug_sync='now SIGNAL cont_ins';
|
||||||
|
|
||||||
|
--connection node_1_i
|
||||||
|
--error 0,ER_LOCK_DEADLOCK,ER_DUP_ENTRY
|
||||||
|
reap;
|
||||||
|
|
||||||
|
--connection node_1_u
|
||||||
|
--error 0,ER_LOCK_DEADLOCK
|
||||||
|
commit;
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
|
||||||
|
--error 0,ER_LOCK_DEADLOCK
|
||||||
|
truncate user_session;
|
||||||
|
set debug_sync = reset;
|
||||||
|
|
||||||
|
dec $counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
|
||||||
|
drop table user_session,user;
|
@ -196,6 +196,9 @@ DROP TABLE t2,t1;
|
|||||||
--connection node_2
|
--connection node_2
|
||||||
STOP SLAVE;
|
STOP SLAVE;
|
||||||
RESET SLAVE ALL;
|
RESET SLAVE ALL;
|
||||||
|
--disable_warnings
|
||||||
|
set global gtid_slave_pos="";
|
||||||
|
--enable_warnings
|
||||||
reset master;
|
reset master;
|
||||||
|
|
||||||
--echo #Connection 3
|
--echo #Connection 3
|
||||||
|
@ -330,3 +330,16 @@ term uw_id plan wdraw_rsn admit_term
|
|||||||
1035 2 CSM ACAD 1009
|
1035 2 CSM ACAD 1009
|
||||||
drop table grad_degree;
|
drop table grad_degree;
|
||||||
drop table gso_grad_supr;
|
drop table gso_grad_supr;
|
||||||
|
CREATE TABLE t1 (a INT, b CHAR(12), c INT AS (a) VIRTUAL, FULLTEXT KEY(b)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 (a,b) VALUES (1,'foo');
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a b c
|
||||||
|
1 foo 1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a INT, b CHAR(12), c INT AS (a) VIRTUAL) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 (a,b) VALUES (1,'foo');
|
||||||
|
ALTER TABLE t1 ADD FULLTEXT KEY(b);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a b c
|
||||||
|
1 foo 1
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -306,3 +306,14 @@ select * from gso_grad_supr;
|
|||||||
|
|
||||||
drop table grad_degree;
|
drop table grad_degree;
|
||||||
drop table gso_grad_supr;
|
drop table gso_grad_supr;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT, b CHAR(12), c INT AS (a) VIRTUAL, FULLTEXT KEY(b)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 (a,b) VALUES (1,'foo');
|
||||||
|
SELECT * FROM t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT, b CHAR(12), c INT AS (a) VIRTUAL) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 (a,b) VALUES (1,'foo');
|
||||||
|
ALTER TABLE t1 ADD FULLTEXT KEY(b);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -4151,7 +4151,7 @@ VARIABLE_SCOPE GLOBAL
|
|||||||
VARIABLE_TYPE BIGINT UNSIGNED
|
VARIABLE_TYPE BIGINT UNSIGNED
|
||||||
VARIABLE_COMMENT The number of cached table definitions
|
VARIABLE_COMMENT The number of cached table definitions
|
||||||
NUMERIC_MIN_VALUE 400
|
NUMERIC_MIN_VALUE 400
|
||||||
NUMERIC_MAX_VALUE 524288
|
NUMERIC_MAX_VALUE 2097152
|
||||||
NUMERIC_BLOCK_SIZE 1
|
NUMERIC_BLOCK_SIZE 1
|
||||||
ENUM_VALUE_LIST NULL
|
ENUM_VALUE_LIST NULL
|
||||||
READ_ONLY NO
|
READ_ONLY NO
|
||||||
|
@ -5103,7 +5103,7 @@ VARIABLE_SCOPE GLOBAL
|
|||||||
VARIABLE_TYPE BIGINT UNSIGNED
|
VARIABLE_TYPE BIGINT UNSIGNED
|
||||||
VARIABLE_COMMENT The number of cached table definitions
|
VARIABLE_COMMENT The number of cached table definitions
|
||||||
NUMERIC_MIN_VALUE 400
|
NUMERIC_MIN_VALUE 400
|
||||||
NUMERIC_MAX_VALUE 524288
|
NUMERIC_MAX_VALUE 2097152
|
||||||
NUMERIC_BLOCK_SIZE 1
|
NUMERIC_BLOCK_SIZE 1
|
||||||
ENUM_VALUE_LIST NULL
|
ENUM_VALUE_LIST NULL
|
||||||
READ_ONLY NO
|
READ_ONLY NO
|
||||||
|
@ -28,14 +28,14 @@ Warning 1292 Truncated incorrect table_definition_cache value: '2'
|
|||||||
SELECT @@global.table_definition_cache;
|
SELECT @@global.table_definition_cache;
|
||||||
@@global.table_definition_cache
|
@@global.table_definition_cache
|
||||||
400
|
400
|
||||||
SET @@global.table_definition_cache = 524287;
|
SET @@global.table_definition_cache = 2097151;
|
||||||
SELECT @@global.table_definition_cache;
|
SELECT @@global.table_definition_cache;
|
||||||
@@global.table_definition_cache
|
@@global.table_definition_cache
|
||||||
524287
|
2097151
|
||||||
SET @@global.table_definition_cache = 524288;
|
SET @@global.table_definition_cache = 2097152;
|
||||||
SELECT @@global.table_definition_cache;
|
SELECT @@global.table_definition_cache;
|
||||||
@@global.table_definition_cache
|
@@global.table_definition_cache
|
||||||
524288
|
2097152
|
||||||
'#--------------------FN_DYNVARS_019_04-------------------------#'
|
'#--------------------FN_DYNVARS_019_04-------------------------#'
|
||||||
SET @@global.table_definition_cache = 0;
|
SET @@global.table_definition_cache = 0;
|
||||||
Warnings:
|
Warnings:
|
||||||
@ -49,18 +49,18 @@ Warning 1292 Truncated incorrect table_definition_cache value: '-1024'
|
|||||||
SELECT @@global.table_definition_cache;
|
SELECT @@global.table_definition_cache;
|
||||||
@@global.table_definition_cache
|
@@global.table_definition_cache
|
||||||
400
|
400
|
||||||
SET @@global.table_definition_cache = 524289;
|
SET @@global.table_definition_cache = 2097153;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1292 Truncated incorrect table_definition_cache value: '524289'
|
Warning 1292 Truncated incorrect table_definition_cache value: '2097153'
|
||||||
SELECT @@global.table_definition_cache;
|
SELECT @@global.table_definition_cache;
|
||||||
@@global.table_definition_cache
|
@@global.table_definition_cache
|
||||||
524288
|
2097152
|
||||||
SET @@global.table_definition_cache = 42949672950;
|
SET @@global.table_definition_cache = 42949672950;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1292 Truncated incorrect table_definition_cache value: '42949672950'
|
Warning 1292 Truncated incorrect table_definition_cache value: '42949672950'
|
||||||
SELECT @@global.table_definition_cache;
|
SELECT @@global.table_definition_cache;
|
||||||
@@global.table_definition_cache
|
@@global.table_definition_cache
|
||||||
524288
|
2097152
|
||||||
SET @@global.table_definition_cache = 21221204.10;
|
SET @@global.table_definition_cache = 21221204.10;
|
||||||
ERROR 42000: Incorrect argument type to variable 'table_definition_cache'
|
ERROR 42000: Incorrect argument type to variable 'table_definition_cache'
|
||||||
SET @@global.table_definition_cache = ON;
|
SET @@global.table_definition_cache = ON;
|
||||||
|
@ -64,9 +64,9 @@ SET @@global.table_definition_cache = 1;
|
|||||||
SELECT @@global.table_definition_cache;
|
SELECT @@global.table_definition_cache;
|
||||||
SET @@global.table_definition_cache = 2;
|
SET @@global.table_definition_cache = 2;
|
||||||
SELECT @@global.table_definition_cache;
|
SELECT @@global.table_definition_cache;
|
||||||
SET @@global.table_definition_cache = 524287;
|
SET @@global.table_definition_cache = 2097151;
|
||||||
SELECT @@global.table_definition_cache;
|
SELECT @@global.table_definition_cache;
|
||||||
SET @@global.table_definition_cache = 524288;
|
SET @@global.table_definition_cache = 2097152;
|
||||||
SELECT @@global.table_definition_cache;
|
SELECT @@global.table_definition_cache;
|
||||||
|
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ SET @@global.table_definition_cache = 0;
|
|||||||
SELECT @@global.table_definition_cache;
|
SELECT @@global.table_definition_cache;
|
||||||
SET @@global.table_definition_cache = -1024;
|
SET @@global.table_definition_cache = -1024;
|
||||||
SELECT @@global.table_definition_cache;
|
SELECT @@global.table_definition_cache;
|
||||||
SET @@global.table_definition_cache = 524289;
|
SET @@global.table_definition_cache = 2097153;
|
||||||
SELECT @@global.table_definition_cache;
|
SELECT @@global.table_definition_cache;
|
||||||
SET @@global.table_definition_cache = 42949672950;
|
SET @@global.table_definition_cache = 42949672950;
|
||||||
SELECT @@global.table_definition_cache;
|
SELECT @@global.table_definition_cache;
|
||||||
|
@ -285,8 +285,8 @@ static void warn(const char *format,...)
|
|||||||
va_list args;
|
va_list args;
|
||||||
DBUG_PRINT("error", ("%s", format));
|
DBUG_PRINT("error", ("%s", format));
|
||||||
va_start(args,format);
|
va_start(args,format);
|
||||||
fflush(stderr);
|
|
||||||
vfprintf(stderr, format, args);
|
vfprintf(stderr, format, args);
|
||||||
|
fflush(stderr);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
#ifdef HAVE_BACKTRACE
|
#ifdef HAVE_BACKTRACE
|
||||||
|
@ -1513,6 +1513,7 @@ void THD::cleanup(void)
|
|||||||
auto_inc_intervals_in_cur_stmt_for_binlog.empty();
|
auto_inc_intervals_in_cur_stmt_for_binlog.empty();
|
||||||
|
|
||||||
mysql_ull_cleanup(this);
|
mysql_ull_cleanup(this);
|
||||||
|
stmt_map.reset();
|
||||||
/* All metadata locks must have been released by now. */
|
/* All metadata locks must have been released by now. */
|
||||||
DBUG_ASSERT(!mdl_context.has_locks());
|
DBUG_ASSERT(!mdl_context.has_locks());
|
||||||
|
|
||||||
@ -3983,11 +3984,13 @@ void Statement_map::erase(Statement *statement)
|
|||||||
void Statement_map::reset()
|
void Statement_map::reset()
|
||||||
{
|
{
|
||||||
/* Must be first, hash_free will reset st_hash.records */
|
/* Must be first, hash_free will reset st_hash.records */
|
||||||
mysql_mutex_lock(&LOCK_prepared_stmt_count);
|
if (st_hash.records)
|
||||||
DBUG_ASSERT(prepared_stmt_count >= st_hash.records);
|
{
|
||||||
prepared_stmt_count-= st_hash.records;
|
mysql_mutex_lock(&LOCK_prepared_stmt_count);
|
||||||
mysql_mutex_unlock(&LOCK_prepared_stmt_count);
|
DBUG_ASSERT(prepared_stmt_count >= st_hash.records);
|
||||||
|
prepared_stmt_count-= st_hash.records;
|
||||||
|
mysql_mutex_unlock(&LOCK_prepared_stmt_count);
|
||||||
|
}
|
||||||
my_hash_reset(&names_hash);
|
my_hash_reset(&names_hash);
|
||||||
my_hash_reset(&st_hash);
|
my_hash_reset(&st_hash);
|
||||||
last_found_statement= 0;
|
last_found_statement= 0;
|
||||||
@ -3996,12 +3999,8 @@ void Statement_map::reset()
|
|||||||
|
|
||||||
Statement_map::~Statement_map()
|
Statement_map::~Statement_map()
|
||||||
{
|
{
|
||||||
/* Must go first, hash_free will reset st_hash.records */
|
/* Statement_map::reset() should be called prior to destructor. */
|
||||||
mysql_mutex_lock(&LOCK_prepared_stmt_count);
|
DBUG_ASSERT(!st_hash.records);
|
||||||
DBUG_ASSERT(prepared_stmt_count >= st_hash.records);
|
|
||||||
prepared_stmt_count-= st_hash.records;
|
|
||||||
mysql_mutex_unlock(&LOCK_prepared_stmt_count);
|
|
||||||
|
|
||||||
my_hash_free(&names_hash);
|
my_hash_free(&names_hash);
|
||||||
my_hash_free(&st_hash);
|
my_hash_free(&st_hash);
|
||||||
}
|
}
|
||||||
|
@ -4049,6 +4049,7 @@ bool st_select_lex::optimize_unflattened_subqueries(bool const_only)
|
|||||||
inner_join->select_options|= SELECT_DESCRIBE;
|
inner_join->select_options|= SELECT_DESCRIBE;
|
||||||
}
|
}
|
||||||
res= inner_join->optimize();
|
res= inner_join->optimize();
|
||||||
|
sl->update_used_tables();
|
||||||
sl->update_correlated_cache();
|
sl->update_correlated_cache();
|
||||||
is_correlated_unit|= sl->is_correlated;
|
is_correlated_unit|= sl->is_correlated;
|
||||||
inner_join->select_options= save_options;
|
inner_join->select_options= save_options;
|
||||||
|
@ -3483,11 +3483,15 @@ static Sys_var_charptr Sys_system_time_zone(
|
|||||||
CMD_LINE_HELP_ONLY,
|
CMD_LINE_HELP_ONLY,
|
||||||
IN_SYSTEM_CHARSET, DEFAULT(system_time_zone));
|
IN_SYSTEM_CHARSET, DEFAULT(system_time_zone));
|
||||||
|
|
||||||
|
/*
|
||||||
|
If One use views with prepared statements this should be bigger than
|
||||||
|
table_open_cache (now we allow 2 times bigger value)
|
||||||
|
*/
|
||||||
static Sys_var_ulong Sys_table_def_size(
|
static Sys_var_ulong Sys_table_def_size(
|
||||||
"table_definition_cache",
|
"table_definition_cache",
|
||||||
"The number of cached table definitions",
|
"The number of cached table definitions",
|
||||||
GLOBAL_VAR(tdc_size), CMD_LINE(REQUIRED_ARG),
|
GLOBAL_VAR(tdc_size), CMD_LINE(REQUIRED_ARG),
|
||||||
VALID_RANGE(TABLE_DEF_CACHE_MIN, 512*1024),
|
VALID_RANGE(TABLE_DEF_CACHE_MIN, 2*1024*1024),
|
||||||
DEFAULT(TABLE_DEF_CACHE_DEFAULT), BLOCK_SIZE(1));
|
DEFAULT(TABLE_DEF_CACHE_DEFAULT), BLOCK_SIZE(1));
|
||||||
|
|
||||||
|
|
||||||
@ -3499,7 +3503,7 @@ static bool fix_table_open_cache(sys_var *, THD *, enum_var_type)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check the table_definition_cache comment if makes changes */
|
||||||
static Sys_var_ulong Sys_table_cache_size(
|
static Sys_var_ulong Sys_table_cache_size(
|
||||||
"table_open_cache", "The number of cached open tables",
|
"table_open_cache", "The number of cached open tables",
|
||||||
GLOBAL_VAR(tc_size), CMD_LINE(REQUIRED_ARG),
|
GLOBAL_VAR(tc_size), CMD_LINE(REQUIRED_ARG),
|
||||||
|
@ -495,10 +495,12 @@ fil_parse_write_crypt_data(
|
|||||||
uint len = mach_read_from_1(ptr);
|
uint len = mach_read_from_1(ptr);
|
||||||
ptr += 1;
|
ptr += 1;
|
||||||
|
|
||||||
ut_a(type == CRYPT_SCHEME_UNENCRYPTED ||
|
if ((type != CRYPT_SCHEME_1 && type != CRYPT_SCHEME_UNENCRYPTED)
|
||||||
type == CRYPT_SCHEME_1); // only supported
|
|| len != CRYPT_SCHEME_1_IV_LEN) {
|
||||||
|
*err = DB_CORRUPTION;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ut_a(len == CRYPT_SCHEME_1_IV_LEN); // only supported
|
|
||||||
uint min_key_version = mach_read_from_4(ptr);
|
uint min_key_version = mach_read_from_4(ptr);
|
||||||
ptr += 4;
|
ptr += 4;
|
||||||
|
|
||||||
@ -517,6 +519,7 @@ fil_parse_write_crypt_data(
|
|||||||
crypt_data->page0_offset = offset;
|
crypt_data->page0_offset = offset;
|
||||||
crypt_data->min_key_version = min_key_version;
|
crypt_data->min_key_version = min_key_version;
|
||||||
crypt_data->encryption = encryption;
|
crypt_data->encryption = encryption;
|
||||||
|
crypt_data->type = type;
|
||||||
memcpy(crypt_data->iv, ptr, len);
|
memcpy(crypt_data->iv, ptr, len);
|
||||||
ptr += len;
|
ptr += len;
|
||||||
|
|
||||||
@ -2363,7 +2366,7 @@ fil_space_crypt_close_tablespace(
|
|||||||
{
|
{
|
||||||
fil_space_crypt_t* crypt_data = space->crypt_data;
|
fil_space_crypt_t* crypt_data = space->crypt_data;
|
||||||
|
|
||||||
if (!crypt_data) {
|
if (!crypt_data || srv_n_fil_crypt_threads == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1489,6 +1489,9 @@ public:
|
|||||||
|
|
||||||
/** Page id. Protected by buf_pool mutex. */
|
/** Page id. Protected by buf_pool mutex. */
|
||||||
page_id_t id;
|
page_id_t id;
|
||||||
|
buf_page_t* hash; /*!< node used in chaining to
|
||||||
|
buf_pool->page_hash or
|
||||||
|
buf_pool->zip_hash */
|
||||||
|
|
||||||
/** Page size. Protected by buf_pool mutex. */
|
/** Page size. Protected by buf_pool mutex. */
|
||||||
page_size_t size;
|
page_size_t size;
|
||||||
@ -1536,9 +1539,6 @@ public:
|
|||||||
buf_tmp_buffer_t* slot; /*!< Slot for temporary memory
|
buf_tmp_buffer_t* slot; /*!< Slot for temporary memory
|
||||||
used for encryption/compression
|
used for encryption/compression
|
||||||
or NULL */
|
or NULL */
|
||||||
buf_page_t* hash; /*!< node used in chaining to
|
|
||||||
buf_pool->page_hash or
|
|
||||||
buf_pool->zip_hash */
|
|
||||||
#ifdef UNIV_DEBUG
|
#ifdef UNIV_DEBUG
|
||||||
ibool in_page_hash; /*!< TRUE if in buf_pool->page_hash */
|
ibool in_page_hash; /*!< TRUE if in buf_pool->page_hash */
|
||||||
ibool in_zip_hash; /*!< TRUE if in buf_pool->zip_hash */
|
ibool in_zip_hash; /*!< TRUE if in buf_pool->zip_hash */
|
||||||
|
@ -1570,6 +1570,12 @@ struct dict_table_t {
|
|||||||
|
|
||||||
/** Id of the table. */
|
/** Id of the table. */
|
||||||
table_id_t id;
|
table_id_t id;
|
||||||
|
/** Hash chain node. */
|
||||||
|
hash_node_t id_hash;
|
||||||
|
/** Table name. */
|
||||||
|
table_name_t name;
|
||||||
|
/** Hash chain node. */
|
||||||
|
hash_node_t name_hash;
|
||||||
|
|
||||||
/** Memory heap. If you allocate from this heap after the table has
|
/** Memory heap. If you allocate from this heap after the table has
|
||||||
been created then be sure to account the allocation into
|
been created then be sure to account the allocation into
|
||||||
@ -1582,9 +1588,6 @@ struct dict_table_t {
|
|||||||
dict_sys->size += new_size - old_size. */
|
dict_sys->size += new_size - old_size. */
|
||||||
mem_heap_t* heap;
|
mem_heap_t* heap;
|
||||||
|
|
||||||
/** Table name. */
|
|
||||||
table_name_t name;
|
|
||||||
|
|
||||||
/** NULL or the directory path specified by DATA DIRECTORY. */
|
/** NULL or the directory path specified by DATA DIRECTORY. */
|
||||||
char* data_dir_path;
|
char* data_dir_path;
|
||||||
|
|
||||||
@ -1702,12 +1705,6 @@ struct dict_table_t {
|
|||||||
/*!< !DICT_FRM_CONSISTENT==0 if data
|
/*!< !DICT_FRM_CONSISTENT==0 if data
|
||||||
dictionary information and
|
dictionary information and
|
||||||
MySQL FRM information mismatch. */
|
MySQL FRM information mismatch. */
|
||||||
/** Hash chain node. */
|
|
||||||
hash_node_t name_hash;
|
|
||||||
|
|
||||||
/** Hash chain node. */
|
|
||||||
hash_node_t id_hash;
|
|
||||||
|
|
||||||
/** The FTS_DOC_ID_INDEX, or NULL if no fulltext indexes exist */
|
/** The FTS_DOC_ID_INDEX, or NULL if no fulltext indexes exist */
|
||||||
dict_index_t* fts_doc_id_index;
|
dict_index_t* fts_doc_id_index;
|
||||||
|
|
||||||
|
@ -74,8 +74,9 @@ struct fil_node_t;
|
|||||||
|
|
||||||
/** Tablespace or log data space */
|
/** Tablespace or log data space */
|
||||||
struct fil_space_t {
|
struct fil_space_t {
|
||||||
char* name; /*!< Tablespace name */
|
|
||||||
ulint id; /*!< space id */
|
ulint id; /*!< space id */
|
||||||
|
hash_node_t hash; /*!< hash chain node */
|
||||||
|
char* name; /*!< Tablespace name */
|
||||||
lsn_t max_lsn;
|
lsn_t max_lsn;
|
||||||
/*!< LSN of the most recent
|
/*!< LSN of the most recent
|
||||||
fil_names_write_if_was_clean().
|
fil_names_write_if_was_clean().
|
||||||
@ -145,7 +146,6 @@ struct fil_space_t {
|
|||||||
Note that fil_node_t::n_pending tracks actual pending I/O requests.
|
Note that fil_node_t::n_pending tracks actual pending I/O requests.
|
||||||
Protected by fil_system.mutex and my_atomic_loadlint() and friends. */
|
Protected by fil_system.mutex and my_atomic_loadlint() and friends. */
|
||||||
ulint n_pending_ios;
|
ulint n_pending_ios;
|
||||||
hash_node_t hash; /*!< hash chain node */
|
|
||||||
rw_lock_t latch; /*!< latch protecting the file space storage
|
rw_lock_t latch; /*!< latch protecting the file space storage
|
||||||
allocation */
|
allocation */
|
||||||
UT_LIST_NODE_T(fil_space_t) unflushed_spaces;
|
UT_LIST_NODE_T(fil_space_t) unflushed_spaces;
|
||||||
|
@ -590,12 +590,14 @@ typedef void* os_thread_ret_t;
|
|||||||
#include "ut0ut.h"
|
#include "ut0ut.h"
|
||||||
#include "sync0types.h"
|
#include "sync0types.h"
|
||||||
|
|
||||||
|
#include <my_valgrind.h>
|
||||||
|
/* define UNIV macros in terms of my_valgrind.h */
|
||||||
|
#define UNIV_MEM_INVALID(addr, size) MEM_UNDEFINED(addr, size)
|
||||||
|
#define UNIV_MEM_FREE(addr, size) MEM_NOACCESS(addr, size)
|
||||||
|
#define UNIV_MEM_ALLOC(addr, size) UNIV_MEM_INVALID(addr, size)
|
||||||
#ifdef UNIV_DEBUG_VALGRIND
|
#ifdef UNIV_DEBUG_VALGRIND
|
||||||
# include <valgrind/memcheck.h>
|
# include <valgrind/memcheck.h>
|
||||||
# define UNIV_MEM_VALID(addr, size) VALGRIND_MAKE_MEM_DEFINED(addr, size)
|
# define UNIV_MEM_VALID(addr, size) VALGRIND_MAKE_MEM_DEFINED(addr, size)
|
||||||
# define UNIV_MEM_INVALID(addr, size) VALGRIND_MAKE_MEM_UNDEFINED(addr, size)
|
|
||||||
# define UNIV_MEM_FREE(addr, size) VALGRIND_MAKE_MEM_NOACCESS(addr, size)
|
|
||||||
# define UNIV_MEM_ALLOC(addr, size) VALGRIND_MAKE_MEM_UNDEFINED(addr, size)
|
|
||||||
# define UNIV_MEM_DESC(addr, size) VALGRIND_CREATE_BLOCK(addr, size, #addr)
|
# define UNIV_MEM_DESC(addr, size) VALGRIND_CREATE_BLOCK(addr, size, #addr)
|
||||||
# define UNIV_MEM_UNDESC(b) VALGRIND_DISCARD(b)
|
# define UNIV_MEM_UNDESC(b) VALGRIND_DISCARD(b)
|
||||||
# define UNIV_MEM_ASSERT_RW_LOW(addr, size, should_abort) do { \
|
# define UNIV_MEM_ASSERT_RW_LOW(addr, size, should_abort) do { \
|
||||||
@ -630,9 +632,6 @@ typedef void* os_thread_ret_t;
|
|||||||
} while (0)
|
} while (0)
|
||||||
#else
|
#else
|
||||||
# define UNIV_MEM_VALID(addr, size) do {} while(0)
|
# define UNIV_MEM_VALID(addr, size) do {} while(0)
|
||||||
# define UNIV_MEM_INVALID(addr, size) do {} while(0)
|
|
||||||
# define UNIV_MEM_FREE(addr, size) do {} while(0)
|
|
||||||
# define UNIV_MEM_ALLOC(addr, size) do {} while(0)
|
|
||||||
# define UNIV_MEM_DESC(addr, size) do {} while(0)
|
# define UNIV_MEM_DESC(addr, size) do {} while(0)
|
||||||
# define UNIV_MEM_UNDESC(b) do {} while(0)
|
# define UNIV_MEM_UNDESC(b) do {} while(0)
|
||||||
# define UNIV_MEM_ASSERT_RW_LOW(addr, size, should_abort) do {} while(0)
|
# define UNIV_MEM_ASSERT_RW_LOW(addr, size, should_abort) do {} while(0)
|
||||||
|
@ -165,7 +165,6 @@ os_mem_free_large(
|
|||||||
if (os_use_large_pages && os_large_page_size && !shmdt(ptr)) {
|
if (os_use_large_pages && os_large_page_size && !shmdt(ptr)) {
|
||||||
my_atomic_addlint(
|
my_atomic_addlint(
|
||||||
&os_total_large_mem_allocated, -size);
|
&os_total_large_mem_allocated, -size);
|
||||||
UNIV_MEM_FREE(ptr, size);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif /* HAVE_LINUX_LARGE_PAGES && UNIV_LINUX */
|
#endif /* HAVE_LINUX_LARGE_PAGES && UNIV_LINUX */
|
||||||
@ -178,7 +177,6 @@ os_mem_free_large(
|
|||||||
} else {
|
} else {
|
||||||
my_atomic_addlint(
|
my_atomic_addlint(
|
||||||
&os_total_large_mem_allocated, -lint(size));
|
&os_total_large_mem_allocated, -lint(size));
|
||||||
UNIV_MEM_FREE(ptr, size);
|
|
||||||
}
|
}
|
||||||
#elif !defined OS_MAP_ANON
|
#elif !defined OS_MAP_ANON
|
||||||
ut_free(ptr);
|
ut_free(ptr);
|
||||||
@ -193,7 +191,6 @@ os_mem_free_large(
|
|||||||
} else {
|
} else {
|
||||||
my_atomic_addlint(
|
my_atomic_addlint(
|
||||||
&os_total_large_mem_allocated, -size);
|
&os_total_large_mem_allocated, -size);
|
||||||
UNIV_MEM_FREE(ptr, size);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 2010, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 2010, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2015, 2018, MariaDB Corporation.
|
Copyright (c) 2015, 2019, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
This program is free software; you can redistribute it and/or modify it under
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@ -905,7 +905,7 @@ loop:
|
|||||||
goto func_exit;
|
goto func_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
UNIV_MEM_INVALID(block[t_ctx.buf_used][0], srv_sort_buf_size);
|
UNIV_MEM_INVALID(block[t_ctx.buf_used], srv_sort_buf_size);
|
||||||
buf[t_ctx.buf_used] = row_merge_buf_empty(buf[t_ctx.buf_used]);
|
buf[t_ctx.buf_used] = row_merge_buf_empty(buf[t_ctx.buf_used]);
|
||||||
mycount[t_ctx.buf_used] += t_ctx.rows_added[t_ctx.buf_used];
|
mycount[t_ctx.buf_used] += t_ctx.rows_added[t_ctx.buf_used];
|
||||||
t_ctx.rows_added[t_ctx.buf_used] = 0;
|
t_ctx.rows_added[t_ctx.buf_used] = 0;
|
||||||
@ -999,12 +999,11 @@ exit:
|
|||||||
goto func_exit;
|
goto func_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
UNIV_MEM_INVALID(block[i][0],
|
UNIV_MEM_INVALID(block[i], srv_sort_buf_size);
|
||||||
srv_sort_buf_size);
|
|
||||||
|
|
||||||
if (crypt_block[i]) {
|
if (crypt_block[i]) {
|
||||||
UNIV_MEM_INVALID(crypt_block[i][0],
|
UNIV_MEM_INVALID(crypt_block[i],
|
||||||
srv_sort_buf_size);
|
srv_sort_buf_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user