Commit c6ba758d authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.2 into 10.3

parents 6426b52e 619dc2b2
...@@ -966,6 +966,9 @@ copy_file(ds_ctxt_t *datasink, ...@@ -966,6 +966,9 @@ copy_file(ds_ctxt_t *datasink,
ds_file_t *dstfile = NULL; ds_file_t *dstfile = NULL;
datafile_cur_t cursor; datafile_cur_t cursor;
xb_fil_cur_result_t res; xb_fil_cur_result_t res;
const char *dst_path =
(xtrabackup_copy_back || xtrabackup_move_back)?
dst_file_path : trim_dotslash(dst_file_path);
if (!datafile_open(src_file_path, &cursor, thread_n)) { if (!datafile_open(src_file_path, &cursor, thread_n)) {
goto error_close; goto error_close;
...@@ -973,8 +976,7 @@ copy_file(ds_ctxt_t *datasink, ...@@ -973,8 +976,7 @@ copy_file(ds_ctxt_t *datasink,
strncpy(dst_name, cursor.rel_path, sizeof(dst_name)); strncpy(dst_name, cursor.rel_path, sizeof(dst_name));
dstfile = ds_open(datasink, trim_dotslash(dst_file_path), dstfile = ds_open(datasink, dst_path, &cursor.statinfo);
&cursor.statinfo);
if (dstfile == NULL) { if (dstfile == NULL) {
msg("[%02u] error: " msg("[%02u] error: "
"cannot open the destination stream for %s\n", "cannot open the destination stream for %s\n",
......
...@@ -480,7 +480,7 @@ get_mysql_vars(MYSQL *connection) ...@@ -480,7 +480,7 @@ get_mysql_vars(MYSQL *connection)
innodb_data_file_path_var, MYF(MY_FAE)); innodb_data_file_path_var, MYF(MY_FAE));
} }
if (innodb_data_home_dir_var && *innodb_data_home_dir_var) { if (innodb_data_home_dir_var) {
innobase_data_home_dir = my_strdup( innobase_data_home_dir = my_strdup(
innodb_data_home_dir_var, MYF(MY_FAE)); innodb_data_home_dir_var, MYF(MY_FAE));
} }
...@@ -1607,6 +1607,44 @@ write_xtrabackup_info(MYSQL *connection, const char * filename, bool history) ...@@ -1607,6 +1607,44 @@ write_xtrabackup_info(MYSQL *connection, const char * filename, bool history)
extern const char *innodb_checksum_algorithm_names[]; extern const char *innodb_checksum_algorithm_names[];
#ifdef _WIN32
#include <algorithm>
#endif
static std::string make_local_paths(const char *data_file_path)
{
if (strchr(data_file_path, '/') == 0
#ifdef _WIN32
&& strchr(data_file_path, '\\') == 0
#endif
){
return std::string(data_file_path);
}
std::ostringstream buf;
char *dup = strdup(innobase_data_file_path);
ut_a(dup);
char *p;
char * token = strtok_r(dup, ";", &p);
while (token) {
if (buf.tellp())
buf << ";";
char *fname = strrchr(token, '/');
#ifdef _WIN32
fname = std::max(fname,strrchr(token, '\\'));
#endif
if (fname)
buf << fname + 1;
else
buf << token;
token = strtok_r(NULL, ";", &p);
}
free(dup);
return buf.str();
}
bool write_backup_config_file() bool write_backup_config_file()
{ {
int rc= backup_file_printf("backup-my.cnf", int rc= backup_file_printf("backup-my.cnf",
...@@ -1623,7 +1661,7 @@ bool write_backup_config_file() ...@@ -1623,7 +1661,7 @@ bool write_backup_config_file()
"%s%s\n" "%s%s\n"
"%s\n", "%s\n",
innodb_checksum_algorithm_names[srv_checksum_algorithm], innodb_checksum_algorithm_names[srv_checksum_algorithm],
innobase_data_file_path, make_local_paths(innobase_data_file_path).c_str(),
srv_n_log_files, srv_n_log_files,
srv_log_file_size, srv_log_file_size,
srv_page_size, srv_page_size,
......
...@@ -4562,8 +4562,6 @@ xtrabackup_apply_delta( ...@@ -4562,8 +4562,6 @@ xtrabackup_apply_delta(
posix_fadvise(src_file, 0, 0, POSIX_FADV_SEQUENTIAL); posix_fadvise(src_file, 0, 0, POSIX_FADV_SEQUENTIAL);
os_file_set_nocache(src_file, src_path, "OPEN");
dst_file = xb_delta_open_matching_space( dst_file = xb_delta_open_matching_space(
dbname, space_name, info, dbname, space_name, info,
dst_path, sizeof(dst_path), &success); dst_path, sizeof(dst_path), &success);
...@@ -4574,8 +4572,6 @@ xtrabackup_apply_delta( ...@@ -4574,8 +4572,6 @@ xtrabackup_apply_delta(
posix_fadvise(dst_file, 0, 0, POSIX_FADV_DONTNEED); posix_fadvise(dst_file, 0, 0, POSIX_FADV_DONTNEED);
os_file_set_nocache(dst_file, dst_path, "OPEN");
/* allocate buffer for incremental backup (4096 pages) */ /* allocate buffer for incremental backup (4096 pages) */
incremental_buffer_base = static_cast<byte *> incremental_buffer_base = static_cast<byte *>
(malloc((page_size / 4 + 1) * page_size)); (malloc((page_size / 4 + 1) * page_size));
...@@ -4681,6 +4677,13 @@ xtrabackup_apply_delta( ...@@ -4681,6 +4677,13 @@ xtrabackup_apply_delta(
} }
} }
/* Free file system buffer cache after the batch was written. */
#ifdef __linux__
os_file_flush_func(dst_file);
#endif
posix_fadvise(dst_file, 0, 0, POSIX_FADV_DONTNEED);
incremental_buffers++; incremental_buffers++;
} }
......
...@@ -13,6 +13,9 @@ sub skip_combinations { ...@@ -13,6 +13,9 @@ sub skip_combinations {
my %skip = ( 'include/have_innodb.combinations' => [ @combinations ]); my %skip = ( 'include/have_innodb.combinations' => [ @combinations ]);
$skip{'include/innodb_encrypt_log.combinations'} = [ 'crypt' ]
unless $ENV{DEBUG_KEY_MANAGEMENT_SO};
# don't run tests for the wrong platform # don't run tests for the wrong platform
$skip{'include/platform.combinations'} = [ (IS_WINDOWS) ? 'unix' : 'win' ]; $skip{'include/platform.combinations'} = [ (IS_WINDOWS) ? 'unix' : 'win' ];
......
...@@ -58,6 +58,7 @@ set autocommit=1; ...@@ -58,6 +58,7 @@ set autocommit=1;
-- source include/search_pattern_in_file.inc -- source include/search_pattern_in_file.inc
--source include/start_mysqld.inc --source include/start_mysqld.inc
let MYSQLD_DATADIR =`SELECT @@datadir`;
--list_files $MYSQLD_DATADIR/test --list_files $MYSQLD_DATADIR/test
FLUSH TABLES t1, t2, t3 FOR EXPORT; FLUSH TABLES t1, t2, t3 FOR EXPORT;
......
...@@ -27,11 +27,9 @@ galera_ist_mysqldump : MDEV-13549 Galera test failures ...@@ -27,11 +27,9 @@ galera_ist_mysqldump : MDEV-13549 Galera test failures
galera_ssl_upgrade : MDEV-13549 Galera test failures galera_ssl_upgrade : MDEV-13549 Galera test failures
galera.MW-329 : wsrep_local_replays not stable galera.MW-329 : wsrep_local_replays not stable
galera.MW-328A : have_deadlocks test not stable galera.MW-328A : have_deadlocks test not stable
galera_var_retry_autocommit: MDEV-15794 Test failure on galera.galera_var_retry_autocommit galera_var_retry_autocommit : MDEV-15794 Test failure on galera.galera_var_retry_autocommit
galera_var_auto_inc_control_on: MDEV-15803 Test failure on galera.galera_var_auto_inc_control_on galera_var_auto_inc_control_on : MDEV-15803 Test failure on galera.galera_var_auto_inc_control_on
pxc-421 : MDEV-15804 Test failure on galera.pxc-421
query_cache : MDEV-15805 Test failure on galera.query_cache query_cache : MDEV-15805 Test failure on galera.query_cache
galera.galera_gra_log : MDEV-15808 Test failure on galera.galera_gra_log
galera.MW-44 : MDEV-15809 Test failure on galera.MW-44 galera.MW-44 : MDEV-15809 Test failure on galera.MW-44
galera.galera_pc_ignore_sb : MDEV-15811 Test failure on galera_pc_ignore_sb galera.galera_pc_ignore_sb : MDEV-15811 Test failure on galera_pc_ignore_sb
galera_kill_applier : race condition at the start of the test galera_kill_applier : race condition at the start of the test
......
...@@ -4,6 +4,7 @@ CREATE TABLE t1 (f1 INTEGER); ...@@ -4,6 +4,7 @@ CREATE TABLE t1 (f1 INTEGER);
connection node_1; connection node_1;
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
connection node_2; connection node_2;
SET SESSION wsrep_on=ON;
SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) = 0 FROM t1;
COUNT(*) = 0 COUNT(*) = 0
1 1
...@@ -30,6 +31,5 @@ DELIMITER ; ...@@ -30,6 +31,5 @@ DELIMITER ;
ROLLBACK /* added by mysqlbinlog */; ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
SET SESSION wsrep_on=ON;
CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query"); CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query");
DROP TABLE t1; DROP TABLE t1;
connection node_1;
connection node_2;
Performing State Transfer on a server that has been temporarily disconnected Performing State Transfer on a server that has been temporarily disconnected
connection node_1; connection node_1;
CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB;
......
connection node_1;
CREATE TABLE t1 (
id int primary key
);
CREATE TABLE t2 (
id int primary key ,
f_id int DEFAULT NULL, FOREIGN KEY(f_id) REFERENCES t1 (id)
);
insert into t1 select 1;
#Running 200 insert in t2 table
select count(*) from t2;
count(*)
200
delete from t2;
delete from t1;
drop table t2,t1;
...@@ -10,16 +10,26 @@ id INT PRIMARY KEY AUTO_INCREMENT, ...@@ -10,16 +10,26 @@ id INT PRIMARY KEY AUTO_INCREMENT,
parent_id INT parent_id INT
) ENGINE=InnoDB; ) ENGINE=InnoDB;
INSERT INTO parent VALUES (1, 0); INSERT INTO parent VALUES (1, 0);
connection node_2;
INSERT INTO child (parent_id) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4;; INSERT INTO child (parent_id) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4;;
connection node_1a;
INSERT INTO parent (f2) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4;; INSERT INTO parent (f2) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4;;
connection node_2a;
INSERT INTO parent (f2) SELECT 2 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4;; INSERT INTO parent (f2) SELECT 2 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4;;
connection node_1b;
ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES parent(id);; ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES parent(id);;
connection node_1a;
connection node_1b;
connection node_2;
connection node_2a;
connection node_1;
SELECT COUNT(*) = 20001 FROM parent; SELECT COUNT(*) = 20001 FROM parent;
COUNT(*) = 20001 COUNT(*) = 20001
1 1
SELECT COUNT(*) = 10000 FROM child; SELECT COUNT(*) = 10000 FROM child;
COUNT(*) = 10000 COUNT(*) = 10000
1 1
connection node_2;
SELECT COUNT(*) = 20001 FROM parent; SELECT COUNT(*) = 20001 FROM parent;
COUNT(*) = 20001 COUNT(*) = 20001
1 1
......
connection node_1;
connection node_2;
Setting SST method to mysqldump ... Setting SST method to mysqldump ...
call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'"); call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'");
call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos");
connection node_1;
CREATE USER 'sst'; CREATE USER 'sst';
GRANT ALL PRIVILEGES ON *.* TO 'sst'; GRANT ALL PRIVILEGES ON *.* TO 'sst';
SET GLOBAL wsrep_sst_auth = 'sst:'; SET GLOBAL wsrep_sst_auth = 'sst:';
connection node_2;
SET GLOBAL wsrep_sst_method = 'mysqldump'; SET GLOBAL wsrep_sst_method = 'mysqldump';
Performing State Transfer on a server that has been temporarily disconnected Performing State Transfer on a server that has been temporarily disconnected
connection node_1;
CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB;
SET AUTOCOMMIT=OFF; SET AUTOCOMMIT=OFF;
START TRANSACTION; START TRANSACTION;
...@@ -15,6 +20,7 @@ INSERT INTO t1 VALUES ('node1_committed_before'); ...@@ -15,6 +20,7 @@ INSERT INTO t1 VALUES ('node1_committed_before');
INSERT INTO t1 VALUES ('node1_committed_before'); INSERT INTO t1 VALUES ('node1_committed_before');
INSERT INTO t1 VALUES ('node1_committed_before'); INSERT INTO t1 VALUES ('node1_committed_before');
COMMIT; COMMIT;
connection node_2;
SET AUTOCOMMIT=OFF; SET AUTOCOMMIT=OFF;
START TRANSACTION; START TRANSACTION;
INSERT INTO t1 VALUES ('node2_committed_before'); INSERT INTO t1 VALUES ('node2_committed_before');
...@@ -25,6 +31,7 @@ INSERT INTO t1 VALUES ('node2_committed_before'); ...@@ -25,6 +31,7 @@ INSERT INTO t1 VALUES ('node2_committed_before');
COMMIT; COMMIT;
Unloading wsrep provider ... Unloading wsrep provider ...
SET GLOBAL wsrep_provider = 'none'; SET GLOBAL wsrep_provider = 'none';
connection node_1;
SET AUTOCOMMIT=OFF; SET AUTOCOMMIT=OFF;
START TRANSACTION; START TRANSACTION;
INSERT INTO t1 VALUES ('node1_committed_during'); INSERT INTO t1 VALUES ('node1_committed_during');
...@@ -39,6 +46,7 @@ INSERT INTO t1 VALUES ('node1_to_be_committed_after'); ...@@ -39,6 +46,7 @@ INSERT INTO t1 VALUES ('node1_to_be_committed_after');
INSERT INTO t1 VALUES ('node1_to_be_committed_after'); INSERT INTO t1 VALUES ('node1_to_be_committed_after');
INSERT INTO t1 VALUES ('node1_to_be_committed_after'); INSERT INTO t1 VALUES ('node1_to_be_committed_after');
INSERT INTO t1 VALUES ('node1_to_be_committed_after'); INSERT INTO t1 VALUES ('node1_to_be_committed_after');
connect node_1a_galera_st_disconnect_slave, 127.0.0.1, root, , test, $NODE_MYPORT_1;
SET AUTOCOMMIT=OFF; SET AUTOCOMMIT=OFF;
START TRANSACTION; START TRANSACTION;
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
...@@ -46,6 +54,7 @@ INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); ...@@ -46,6 +54,7 @@ INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
connection node_2;
Loading wsrep provider ... Loading wsrep provider ...
SET AUTOCOMMIT=OFF; SET AUTOCOMMIT=OFF;
START TRANSACTION; START TRANSACTION;
...@@ -55,6 +64,7 @@ INSERT INTO t1 VALUES ('node2_committed_after'); ...@@ -55,6 +64,7 @@ INSERT INTO t1 VALUES ('node2_committed_after');
INSERT INTO t1 VALUES ('node2_committed_after'); INSERT INTO t1 VALUES ('node2_committed_after');
INSERT INTO t1 VALUES ('node2_committed_after'); INSERT INTO t1 VALUES ('node2_committed_after');
COMMIT; COMMIT;
connection node_1;
INSERT INTO t1 VALUES ('node1_to_be_committed_after'); INSERT INTO t1 VALUES ('node1_to_be_committed_after');
INSERT INTO t1 VALUES ('node1_to_be_committed_after'); INSERT INTO t1 VALUES ('node1_to_be_committed_after');
INSERT INTO t1 VALUES ('node1_to_be_committed_after'); INSERT INTO t1 VALUES ('node1_to_be_committed_after');
...@@ -69,6 +79,7 @@ INSERT INTO t1 VALUES ('node1_committed_after'); ...@@ -69,6 +79,7 @@ INSERT INTO t1 VALUES ('node1_committed_after');
INSERT INTO t1 VALUES ('node1_committed_after'); INSERT INTO t1 VALUES ('node1_committed_after');
INSERT INTO t1 VALUES ('node1_committed_after'); INSERT INTO t1 VALUES ('node1_committed_after');
COMMIT; COMMIT;
connection node_1a_galera_st_disconnect_slave;
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
...@@ -83,6 +94,7 @@ COUNT(*) = 0 ...@@ -83,6 +94,7 @@ COUNT(*) = 0
1 1
COMMIT; COMMIT;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
connection node_1;
SELECT COUNT(*) = 35 FROM t1; SELECT COUNT(*) = 35 FROM t1;
COUNT(*) = 35 COUNT(*) = 35
1 1
...@@ -92,12 +104,15 @@ COUNT(*) = 0 ...@@ -92,12 +104,15 @@ COUNT(*) = 0
DROP TABLE t1; DROP TABLE t1;
COMMIT; COMMIT;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
connection node_1;
CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query");
DROP USER sst; DROP USER sst;
connection node_2;
CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query");
CALL mtr.add_suppression("InnoDB: Error: Table \"mysql\"\\.\"innodb_index_stats\" not found"); CALL mtr.add_suppression("InnoDB: Error: Table \"mysql\"\\.\"innodb_index_stats\" not found");
CALL mtr.add_suppression("Can't open and lock time zone table"); CALL mtr.add_suppression("Can't open and lock time zone table");
CALL mtr.add_suppression("Can't open and lock privilege tables"); CALL mtr.add_suppression("Can't open and lock privilege tables");
CALL mtr.add_suppression("Info table is not ready to be used"); CALL mtr.add_suppression("Info table is not ready to be used");
CALL mtr.add_suppression("Native table .* has the wrong structure"); CALL mtr.add_suppression("Native table .* has the wrong structure");
connection node_2;
Restarting server ... Restarting server ...
...@@ -12,7 +12,6 @@ INSERT INTO t1 VALUES (2); ...@@ -12,7 +12,6 @@ INSERT INTO t1 VALUES (2);
connection node_1; connection node_1;
INSERT INTO t1 VALUES (3); INSERT INTO t1 VALUES (3);
connection node_2; connection node_2;
set SESSION wsrep_sync_wait=0;
INSERT INTO t1 VALUES (4); INSERT INTO t1 VALUES (4);
set GLOBAL wsrep_slave_threads=5; set GLOBAL wsrep_slave_threads=5;
SELECT COUNT(*) = 5 FROM t1; SELECT COUNT(*) = 5 FROM t1;
......
...@@ -17,6 +17,7 @@ CREATE TABLE t1 (f1 INTEGER); ...@@ -17,6 +17,7 @@ CREATE TABLE t1 (f1 INTEGER);
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
--connection node_2 --connection node_2
SET SESSION wsrep_on=ON;
SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) = 0 FROM t1;
# Make sure the GRA file produced is readable and contains the failure # Make sure the GRA file produced is readable and contains the failure
...@@ -24,8 +25,6 @@ SELECT COUNT(*) = 0 FROM t1; ...@@ -24,8 +25,6 @@ SELECT COUNT(*) = 0 FROM t1;
--replace_regex /SET TIMESTAMP=[0-9]+/SET TIMESTAMP=<TIMESTAMP>/ /pseudo_thread_id=[0-9]+/pseudo_thread_id=<PSEUDO_THREAD_ID>/ --replace_regex /SET TIMESTAMP=[0-9]+/SET TIMESTAMP=<TIMESTAMP>/ /pseudo_thread_id=[0-9]+/pseudo_thread_id=<PSEUDO_THREAD_ID>/
--exec $MYSQL_BINLOG --short-form $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log --exec $MYSQL_BINLOG --short-form $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log
SET SESSION wsrep_on=ON;
CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query"); CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query");
DROP TABLE t1; DROP TABLE t1;
!include ../galera_2nodes.cnf
[mysqld.1]
[mysqld.2]
wsrep_slave_threads=6
--source include/galera_cluster.inc
--source include/have_innodb.inc
--connection node_1
CREATE TABLE t1 (
id int primary key
);
CREATE TABLE t2 (
id int primary key ,
f_id int DEFAULT NULL, FOREIGN KEY(f_id) REFERENCES t1 (id)
);
insert into t1 select 1;
--disable_query_log
--let $count=200
--echo #Running 200 insert in t2 table
while($count)
{
#Repeatedly execute the following SQL until you generate thousands of data
--eval insert into t2 values ($count, 1);
--dec $count
}
--enable_query_log
select count(*) from t2;
delete from t2;
delete from t1;
drop table t2,t1;
...@@ -36,9 +36,7 @@ INSERT INTO t1 VALUES (3); ...@@ -36,9 +36,7 @@ INSERT INTO t1 VALUES (3);
--eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig'; --eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig';
--enable_query_log --enable_query_log
set SESSION wsrep_sync_wait=0;
--source include/wait_until_connected_again.inc --source include/wait_until_connected_again.inc
--source include/galera_wait_ready.inc
INSERT INTO t1 VALUES (4); INSERT INTO t1 VALUES (4);
set GLOBAL wsrep_slave_threads=5; set GLOBAL wsrep_slave_threads=5;
......
...@@ -47,6 +47,7 @@ SELECT ST_AsText(g) FROM t_wl6455 WHERE g = POINT(10,10); ...@@ -47,6 +47,7 @@ SELECT ST_AsText(g) FROM t_wl6455 WHERE g = POINT(10,10);
ST_AsText(g) ST_AsText(g)
INSERT INTO t_wl6455 VALUES(10, POINT(10,10)); INSERT INTO t_wl6455 VALUES(10, POINT(10,10));
COMMIT; COMMIT;
FLUSH TABLES;
INSERT INTO t_wl6455 VALUES(11, POINT(11,11)); INSERT INTO t_wl6455 VALUES(11, POINT(11,11));
BEGIN; BEGIN;
INSERT INTO t_wl6455 VALUES(1, POINT(1,1)); INSERT INTO t_wl6455 VALUES(1, POINT(1,1));
......
...@@ -62,6 +62,9 @@ SELECT ST_AsText(g) FROM t_wl6455 WHERE g = POINT(10,10); ...@@ -62,6 +62,9 @@ SELECT ST_AsText(g) FROM t_wl6455 WHERE g = POINT(10,10);
INSERT INTO t_wl6455 VALUES(10, POINT(10,10)); INSERT INTO t_wl6455 VALUES(10, POINT(10,10));
COMMIT; COMMIT;
# Avoid corrupting non-crash-safe system tables on the kill below.
FLUSH TABLES;
INSERT INTO t_wl6455 VALUES(11, POINT(11,11)); INSERT INTO t_wl6455 VALUES(11, POINT(11,11));
BEGIN; BEGIN;
INSERT INTO t_wl6455 VALUES(1, POINT(1,1)); INSERT INTO t_wl6455 VALUES(1, POINT(1,1));
......
--innodb --innodb-data-home-dir= --innodb-data-file-path=$MYSQLTEST_VARDIR/tmp/absolute_path_ibdata1:3M;ibdata_second:1M:autoextend
\ No newline at end of file
CREATE TABLE t(i INT) ENGINE INNODB;
INSERT INTO t VALUES(1);
# xtrabackup backup
# remove datadir
# xtrabackup copy back
# restart server
SELECT * from t;
i
1
DROP TABLE t;
# This test just backs up and restores empty database
# Innodb system tablespace is specified with absolute path in the .opt file
CREATE TABLE t(i INT) ENGINE INNODB;
INSERT INTO t VALUES(1);
echo # xtrabackup backup;
let $targetdir=$MYSQLTEST_VARDIR/tmp/backup;
let $_innodb_data_file_path=`select @@innodb_data_file_path`;
let $_innodb_data_home_dir=`select @@innodb_data_home_dir`;
let $_datadir= `SELECT @@datadir`;
--disable_result_log
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir;
--enable_result_log
exec $XTRABACKUP --prepare --target-dir=$targetdir;
--source include/shutdown_mysqld.inc
echo # remove datadir;
rmdir $_datadir;
#remove out-of-datadir ibdata1
remove_file $MYSQLTEST_VARDIR/tmp/absolute_path_ibdata1;
echo # xtrabackup copy back;
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --copy-back --datadir=$_datadir --target-dir=$targetdir "--innodb_data_file_path=$_innodb_data_file_path" --innodb_data_home_dir=$_innodb_data_home_dir;
echo # restart server;
--source include/start_mysqld.inc
--enable_result_log
SELECT * from t;
DROP TABLE t;
rmdir $targetdir;
...@@ -8775,16 +8775,20 @@ void sql_print_information(const char *format, ...) ...@@ -8775,16 +8775,20 @@ void sql_print_information(const char *format, ...)
va_list args; va_list args;
DBUG_ENTER("sql_print_information"); DBUG_ENTER("sql_print_information");
if (disable_log_notes)
DBUG_VOID_RETURN; // Skip notes during start/shutdown
va_start(args, format); va_start(args, format);
error_log_print(INFORMATION_LEVEL, format, args); sql_print_information_v(format, args);
va_end(args); va_end(args);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
void sql_print_information_v(const char *format, va_list ap)
{
if (disable_log_notes)
return; // Skip notes during start/shutdown
error_log_print(INFORMATION_LEVEL, format, ap);
}
void void
TC_LOG::run_prepare_ordered(THD *thd, bool all) TC_LOG::run_prepare_ordered(THD *thd, bool all)
......
...@@ -1111,6 +1111,7 @@ int vprint_msg_to_log(enum loglevel level, const char *format, va_list args); ...@@ -1111,6 +1111,7 @@ int vprint_msg_to_log(enum loglevel level, const char *format, va_list args);
void sql_print_error(const char *format, ...); void sql_print_error(const char *format, ...);
void sql_print_warning(const char *format, ...); void sql_print_warning(const char *format, ...);
void sql_print_information(const char *format, ...); void sql_print_information(const char *format, ...);
void sql_print_information_v(const char *format, va_list ap);
typedef void (*sql_print_message_func)(const char *format, ...); typedef void (*sql_print_message_func)(const char *format, ...);
extern sql_print_message_func sql_print_message_handlers[]; extern sql_print_message_func sql_print_message_handlers[];
......
...@@ -1974,6 +1974,12 @@ fil_crypt_rotate_pages( ...@@ -1974,6 +1974,12 @@ fil_crypt_rotate_pages(
continue; continue;
} }
/* If space is marked as stopping, stop rotating
pages. */
if (state->space->is_stopping()) {
break;
}
fil_crypt_rotate_page(key_state, state); fil_crypt_rotate_page(key_state, state);
} }
} }
...@@ -2022,6 +2028,10 @@ fil_crypt_flush_space( ...@@ -2022,6 +2028,10 @@ fil_crypt_flush_space(
crypt_data->type = CRYPT_SCHEME_UNENCRYPTED; crypt_data->type = CRYPT_SCHEME_UNENCRYPTED;
} }
if (space->is_stopping()) {
return;
}
/* update page 0 */ /* update page 0 */
mtr_t mtr; mtr_t mtr;
mtr.start(); mtr.start();
......
...@@ -462,7 +462,6 @@ row_undo_mod_del_mark_or_remove_sec_low( ...@@ -462,7 +462,6 @@ row_undo_mod_del_mark_or_remove_sec_low(
btr_pcur_t pcur; btr_pcur_t pcur;
btr_cur_t* btr_cur; btr_cur_t* btr_cur;
ibool success; ibool success;
ibool old_has;
dberr_t err = DB_SUCCESS; dberr_t err = DB_SUCCESS;
mtr_t mtr; mtr_t mtr;
mtr_t mtr_vers; mtr_t mtr_vers;
...@@ -538,11 +537,12 @@ row_undo_mod_del_mark_or_remove_sec_low( ...@@ -538,11 +537,12 @@ row_undo_mod_del_mark_or_remove_sec_low(
&mtr_vers); &mtr_vers);
ut_a(success); ut_a(success);
old_has = row_vers_old_has_index_entry(FALSE, /* For temporary table, we can skip to check older version of
btr_pcur_get_rec(&(node->pcur)), clustered index entry, because there is no MVCC or purge. */
&mtr_vers, index, entry, if (!node->table->is_temporary()
0, 0); && row_vers_old_has_index_entry(
if (old_has) { FALSE, btr_pcur_get_rec(&node->pcur),
&mtr_vers, index, entry, 0, 0)) {
err = btr_cur_del_mark_set_sec_rec(BTR_NO_LOCKING_FLAG, err = btr_cur_del_mark_set_sec_rec(BTR_NO_LOCKING_FLAG,
btr_cur, TRUE, thr, &mtr); btr_cur, TRUE, thr, &mtr);
ut_ad(err == DB_SUCCESS); ut_ad(err == DB_SUCCESS);
...@@ -561,18 +561,14 @@ row_undo_mod_del_mark_or_remove_sec_low( ...@@ -561,18 +561,14 @@ row_undo_mod_del_mark_or_remove_sec_low(
} }
if (modify_leaf) { if (modify_leaf) {
success = btr_cur_optimistic_delete(btr_cur, 0, &mtr); err = btr_cur_optimistic_delete(btr_cur, 0, &mtr)
if (success) { ? DB_SUCCESS : DB_FAIL;
err = DB_SUCCESS;
} else {
err = DB_FAIL;
}
} else { } else {
/* Passing rollback=false, /* Passing rollback=false,
because we are deleting a secondary index record: because we are deleting a secondary index record:
the distinction only matters when deleting a the distinction only matters when deleting a
record that contains externally stored columns. */ record that contains externally stored columns. */
ut_ad(!dict_index_is_clust(index)); ut_ad(!index->is_primary());
btr_cur_pessimistic_delete(&err, FALSE, btr_cur, 0, btr_cur_pessimistic_delete(&err, FALSE, btr_cur, 0,
false, &mtr); false, &mtr);
......
...@@ -456,17 +456,15 @@ wsrep_row_upd_check_foreign_constraints( ...@@ -456,17 +456,15 @@ wsrep_row_upd_check_foreign_constraints(
@param[in] node query node @param[in] node query node
@param[in] trx transaction @param[in] trx transaction
@return whether the node cannot be ignored */ @return whether the node cannot be ignored */
inline
bool inline bool wsrep_must_process_fk(const upd_node_t* node, const trx_t* trx)
wsrep_must_process_fk(const upd_node_t* node, const trx_t* trx)
{ {
if (que_node_get_type(node->common.parent) != QUE_NODE_UPDATE if (!wsrep_on_trx(trx)) {
|| !wsrep_on_trx(trx)) {
return false; return false;
} }
return que_node_get_type(node->common.parent) != QUE_NODE_UPDATE
return static_cast<upd_node_t*>(node->common.parent)->cascade_node || static_cast<upd_node_t*>(node->common.parent)->cascade_node
== node; != node;
} }
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
......
...@@ -2140,13 +2140,11 @@ trx_undo_report_row_operation( ...@@ -2140,13 +2140,11 @@ trx_undo_report_row_operation(
/** Copy an undo record to heap. /** Copy an undo record to heap.
@param[in] roll_ptr roll pointer to a record that exists @param[in] roll_ptr roll pointer to a record that exists
@param[in] is_temp whether this is a temporary table
@param[in,out] heap memory heap where copied */ @param[in,out] heap memory heap where copied */
static static
trx_undo_rec_t* trx_undo_rec_t*
trx_undo_get_undo_rec_low( trx_undo_get_undo_rec_low(
roll_ptr_t roll_ptr, roll_ptr_t roll_ptr,
bool is_temp,
mem_heap_t* heap) mem_heap_t* heap)
{ {
trx_undo_rec_t* undo_rec; trx_undo_rec_t* undo_rec;
...@@ -2162,10 +2160,8 @@ trx_undo_get_undo_rec_low( ...@@ -2162,10 +2160,8 @@ trx_undo_get_undo_rec_low(
&offset); &offset);
ut_ad(page_no > FSP_FIRST_INODE_PAGE_NO); ut_ad(page_no > FSP_FIRST_INODE_PAGE_NO);
ut_ad(offset >= TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE); ut_ad(offset >= TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE);
rseg = is_temp rseg = trx_sys.rseg_array[rseg_id];
? trx_sys.temp_rsegs[rseg_id] ut_ad(rseg->is_persistent());
: trx_sys.rseg_array[rseg_id];
ut_ad(is_temp == !rseg->is_persistent());
mtr_start(&mtr); mtr_start(&mtr);
...@@ -2181,7 +2177,6 @@ trx_undo_get_undo_rec_low( ...@@ -2181,7 +2177,6 @@ trx_undo_get_undo_rec_low(
/** Copy an undo record to heap. /** Copy an undo record to heap.
@param[in] roll_ptr roll pointer to record @param[in] roll_ptr roll pointer to record
@param[in] is_temp whether this is a temporary table
@param[in,out] heap memory heap where copied @param[in,out] heap memory heap where copied
@param[in] trx_id id of the trx that generated @param[in] trx_id id of the trx that generated
the roll pointer: it points to an the roll pointer: it points to an
...@@ -2196,7 +2191,6 @@ static MY_ATTRIBUTE((warn_unused_result)) ...@@ -2196,7 +2191,6 @@ static MY_ATTRIBUTE((warn_unused_result))
bool bool
trx_undo_get_undo_rec( trx_undo_get_undo_rec(
roll_ptr_t roll_ptr, roll_ptr_t roll_ptr,
bool is_temp,
mem_heap_t* heap, mem_heap_t* heap,
trx_id_t trx_id, trx_id_t trx_id,
const table_name_t& name, const table_name_t& name,
...@@ -2208,7 +2202,7 @@ trx_undo_get_undo_rec( ...@@ -2208,7 +2202,7 @@ trx_undo_get_undo_rec(
missing_history = purge_sys.view.changes_visible(trx_id, name); missing_history = purge_sys.view.changes_visible(trx_id, name);
if (!missing_history) { if (!missing_history) {
*undo_rec = trx_undo_get_undo_rec_low(roll_ptr, is_temp, heap); *undo_rec = trx_undo_get_undo_rec_low(roll_ptr, heap);
} }
rw_lock_s_unlock(&purge_sys.latch); rw_lock_s_unlock(&purge_sys.latch);
...@@ -2273,12 +2267,13 @@ trx_undo_prev_version_build( ...@@ -2273,12 +2267,13 @@ trx_undo_prev_version_build(
bool dummy_extern; bool dummy_extern;
byte* buf; byte* buf;
ut_ad(!index->table->is_temporary());
ut_ad(!rw_lock_own(&purge_sys.latch, RW_LOCK_S)); ut_ad(!rw_lock_own(&purge_sys.latch, RW_LOCK_S));
ut_ad(mtr_memo_contains_page_flagged(index_mtr, index_rec, ut_ad(mtr_memo_contains_page_flagged(index_mtr, index_rec,
MTR_MEMO_PAGE_S_FIX MTR_MEMO_PAGE_S_FIX
| MTR_MEMO_PAGE_X_FIX)); | MTR_MEMO_PAGE_X_FIX));
ut_ad(rec_offs_validate(rec, index, offsets)); ut_ad(rec_offs_validate(rec, index, offsets));
ut_a(dict_index_is_clust(index)); ut_a(index->is_primary());
roll_ptr = row_get_rec_roll_ptr(rec, index, offsets); roll_ptr = row_get_rec_roll_ptr(rec, index, offsets);
...@@ -2289,19 +2284,16 @@ trx_undo_prev_version_build( ...@@ -2289,19 +2284,16 @@ trx_undo_prev_version_build(
return(true); return(true);
} }
const bool is_temp = dict_table_is_temporary(index->table);
rec_trx_id = row_get_rec_trx_id(rec, index, offsets); rec_trx_id = row_get_rec_trx_id(rec, index, offsets);
ut_ad(!index->table->skip_alter_undo); ut_ad(!index->table->skip_alter_undo);
if (trx_undo_get_undo_rec( if (trx_undo_get_undo_rec(
roll_ptr, is_temp, heap, rec_trx_id, index->table->name, roll_ptr, heap, rec_trx_id, index->table->name,
&undo_rec)) { &undo_rec)) {
if (v_status & TRX_UNDO_PREV_IN_PURGE) { if (v_status & TRX_UNDO_PREV_IN_PURGE) {
/* We are fetching the record being purged */ /* We are fetching the record being purged */
ut_ad(!is_temp); undo_rec = trx_undo_get_undo_rec_low(roll_ptr, heap);
undo_rec = trx_undo_get_undo_rec_low(
roll_ptr, is_temp, heap);
} else { } else {
/* The undo record may already have been purged, /* The undo record may already have been purged,
during purge or semi-consistent read. */ during purge or semi-consistent read. */
......
...@@ -315,6 +315,9 @@ if(MRN_BUNDLED) ...@@ -315,6 +315,9 @@ if(MRN_BUNDLED)
${MRN_ALL_SOURCES} ${MRN_ALL_SOURCES}
STORAGE_ENGINE MODULE_ONLY STORAGE_ENGINE MODULE_ONLY
LINK_LIBRARIES ${MRN_LIBRARIES}) LINK_LIBRARIES ${MRN_LIBRARIES})
if(NOT TARGET mroonga)
return()
endif()
else() else()
add_library(mroonga MODULE ${MRN_ALL_SOURCES}) add_library(mroonga MODULE ${MRN_ALL_SOURCES})
......
...@@ -220,8 +220,8 @@ static int rocksdb_compact_column_family(THD *const thd, ...@@ -220,8 +220,8 @@ static int rocksdb_compact_column_family(THD *const thd,
if (const char *const cf = value->val_str(value, buff, &len)) { if (const char *const cf = value->val_str(value, buff, &len)) {
auto cfh = cf_manager.get_cf(cf); auto cfh = cf_manager.get_cf(cf);
if (cfh != nullptr && rdb != nullptr) { if (cfh != nullptr && rdb != nullptr) {
sql_print_information("RocksDB: Manual compaction of column family: %s\n", sql_print_verbose_info("RocksDB: Manual compaction of column family: %s\n",
cf); cf);
rdb->CompactRange(getCompactRangeOptions(), cfh, nullptr, nullptr); rdb->CompactRange(getCompactRangeOptions(), cfh, nullptr, nullptr);
} }
} }
...@@ -7776,8 +7776,8 @@ int ha_rocksdb::check(THD *const thd, HA_CHECK_OPT *const check_opt) { ...@@ -7776,8 +7776,8 @@ int ha_rocksdb::check(THD *const thd, HA_CHECK_OPT *const check_opt) {
/* For each secondary index, check that we can get a PK value from it */ /* For each secondary index, check that we can get a PK value from it */
// NO_LINT_DEBUG // NO_LINT_DEBUG
sql_print_information("CHECKTABLE %s: Checking table %s", table_name, sql_print_verbose_info("CHECKTABLE %s: Checking table %s", table_name,
table_name); table_name);
ha_rows UNINIT_VAR(row_checksums_at_start); // set/used iff first_index==true ha_rows UNINIT_VAR(row_checksums_at_start); // set/used iff first_index==true
ha_rows row_checksums = ha_rows(-1); ha_rows row_checksums = ha_rows(-1);
bool first_index = true; bool first_index = true;
...@@ -7792,8 +7792,8 @@ int ha_rocksdb::check(THD *const thd, HA_CHECK_OPT *const check_opt) { ...@@ -7792,8 +7792,8 @@ int ha_rocksdb::check(THD *const thd, HA_CHECK_OPT *const check_opt) {
row_checksums_at_start = m_row_checksums_checked; row_checksums_at_start = m_row_checksums_checked;
int res; int res;
// NO_LINT_DEBUG // NO_LINT_DEBUG
sql_print_information("CHECKTABLE %s: Checking index %s", table_name, sql_print_verbose_info("CHECKTABLE %s: Checking index %s", table_name,
table->key_info[keyno].name); table->key_info[keyno].name);
while (1) { while (1) {
if (!rows) if (!rows)
res = index_first(table->record[0]); res = index_first(table->record[0]);
...@@ -7881,9 +7881,9 @@ int ha_rocksdb::check(THD *const thd, HA_CHECK_OPT *const check_opt) { ...@@ -7881,9 +7881,9 @@ int ha_rocksdb::check(THD *const thd, HA_CHECK_OPT *const check_opt) {
} }
} }
// NO_LINT_DEBUG // NO_LINT_DEBUG
sql_print_information("CHECKTABLE %s: ... %lld index entries checked " sql_print_verbose_info("CHECKTABLE %s: ... %lld index entries checked "
"(%lld had checksums)", "(%lld had checksums)",
table_name, rows, checksums); table_name, rows, checksums);
if (first_index) { if (first_index) {
row_checksums = m_row_checksums_checked - row_checksums_at_start; row_checksums = m_row_checksums_checked - row_checksums_at_start;
...@@ -7894,8 +7894,8 @@ int ha_rocksdb::check(THD *const thd, HA_CHECK_OPT *const check_opt) { ...@@ -7894,8 +7894,8 @@ int ha_rocksdb::check(THD *const thd, HA_CHECK_OPT *const check_opt) {
} }
if (row_checksums != ha_rows(-1)) { if (row_checksums != ha_rows(-1)) {
// NO_LINT_DEBUG // NO_LINT_DEBUG
sql_print_information("CHECKTABLE %s: %lld table records had checksums", sql_print_verbose_info("CHECKTABLE %s: %lld table records had checksums",
table_name, row_checksums); table_name, row_checksums);
} }
extra(HA_EXTRA_NO_KEYREAD); extra(HA_EXTRA_NO_KEYREAD);
...@@ -12656,8 +12656,20 @@ double ha_rocksdb::read_time(uint index, uint ranges, ha_rows rows) { ...@@ -12656,8 +12656,20 @@ double ha_rocksdb::read_time(uint index, uint ranges, ha_rows rows) {
DBUG_RETURN((rows / 20.0) + 1); DBUG_RETURN((rows / 20.0) + 1);
} }
void sql_print_verbose_info(const char *format, ...)
{
va_list args;
if (global_system_variables.log_warnings > 2) {
va_start(args, format);
sql_print_information_v(format, args);
va_end(args);
}
}
} // namespace myrocks } // namespace myrocks
/** /**
Construct and emit duplicate key error message using information Construct and emit duplicate key error message using information
from table's record buffer. from table's record buffer.
......
...@@ -1415,4 +1415,8 @@ struct Rdb_inplace_alter_ctx : public my_core::inplace_alter_handler_ctx { ...@@ -1415,4 +1415,8 @@ struct Rdb_inplace_alter_ctx : public my_core::inplace_alter_handler_ctx {
const int MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL= MariaDB_PLUGIN_MATURITY_GAMMA; const int MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL= MariaDB_PLUGIN_MATURITY_GAMMA;
extern bool prevent_myrocks_loading; extern bool prevent_myrocks_loading;
void sql_print_verbose_info(const char *format, ...);
} // namespace myrocks } // namespace myrocks
...@@ -4906,8 +4906,8 @@ void Rdb_dict_manager::add_create_index( ...@@ -4906,8 +4906,8 @@ void Rdb_dict_manager::add_create_index(
rocksdb::WriteBatch *const batch) const { rocksdb::WriteBatch *const batch) const {
for (const auto &gl_index_id : gl_index_ids) { for (const auto &gl_index_id : gl_index_ids) {
// NO_LINT_DEBUG // NO_LINT_DEBUG
sql_print_information("RocksDB: Begin index creation (%u,%u)", sql_print_verbose_info("RocksDB: Begin index creation (%u,%u)",
gl_index_id.cf_id, gl_index_id.index_id); gl_index_id.cf_id, gl_index_id.index_id);
start_create_index(batch, gl_index_id); start_create_index(batch, gl_index_id);
} }
} }
...@@ -4986,8 +4986,8 @@ void Rdb_dict_manager::rollback_ongoing_index_creation() const { ...@@ -4986,8 +4986,8 @@ void Rdb_dict_manager::rollback_ongoing_index_creation() const {
for (const auto &gl_index_id : gl_index_ids) { for (const auto &gl_index_id : gl_index_ids) {
// NO_LINT_DEBUG // NO_LINT_DEBUG
sql_print_information("RocksDB: Removing incomplete create index (%u,%u)", sql_print_verbose_info("RocksDB: Removing incomplete create index (%u,%u)",
gl_index_id.cf_id, gl_index_id.index_id); gl_index_id.cf_id, gl_index_id.index_id);
start_drop_index(batch, gl_index_id); start_drop_index(batch, gl_index_id);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment