mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge remote-tracking branch 'origin/10.2' into 10.3
This commit is contained in:
@ -2670,3 +2670,26 @@ myisam_block_size 1024
|
|||||||
select @@global.myisam_block_size;
|
select @@global.myisam_block_size;
|
||||||
@@global.myisam_block_size
|
@@global.myisam_block_size
|
||||||
1024
|
1024
|
||||||
|
#
|
||||||
|
# MDEV-20704 An index on a double column erroneously uses prefix compression
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id INT NOT NULL PRIMARY KEY,
|
||||||
|
d DOUBLE,
|
||||||
|
KEY (d)
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
|
||||||
|
MyISAM file: MYSQLD_DATADIR/test/t1
|
||||||
|
Record format: Fixed length
|
||||||
|
Character set: latin1_swedish_ci (8)
|
||||||
|
Data records: 0 Deleted blocks: 0
|
||||||
|
Recordlength: 13
|
||||||
|
|
||||||
|
table description:
|
||||||
|
Key Start Len Index Type
|
||||||
|
1 2 4 unique long
|
||||||
|
2 6 8 multip. double NULL
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# End of 5.5 tests
|
||||||
|
#
|
||||||
|
@ -1802,3 +1802,22 @@ drop table t1;
|
|||||||
#
|
#
|
||||||
show variables like 'myisam_block_size';
|
show variables like 'myisam_block_size';
|
||||||
select @@global.myisam_block_size;
|
select @@global.myisam_block_size;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-20704 An index on a double column erroneously uses prefix compression
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id INT NOT NULL PRIMARY KEY,
|
||||||
|
d DOUBLE,
|
||||||
|
KEY (d)
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||||
|
--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
|
||||||
|
--exec $MYISAMCHK -d $MYSQLD_DATADIR/test/t1
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 5.5 tests
|
||||||
|
--echo #
|
||||||
|
@ -0,0 +1,50 @@
|
|||||||
|
include/master-slave.inc
|
||||||
|
[connection master]
|
||||||
|
connection server_2;
|
||||||
|
include/stop_slave.inc
|
||||||
|
SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads;
|
||||||
|
SET @old_parallel_mode=@@GLOBAL.slave_parallel_mode;
|
||||||
|
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||||
|
SET GLOBAL slave_parallel_mode='optimistic';
|
||||||
|
SET GLOBAL slave_parallel_threads= 3;
|
||||||
|
CHANGE MASTER TO master_use_gtid=slave_pos;
|
||||||
|
CALL mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends");
|
||||||
|
include/start_slave.inc
|
||||||
|
connection server_1;
|
||||||
|
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t1 (a int PRIMARY KEY) ENGINE=InnoDB;
|
||||||
|
include/save_master_gtid.inc
|
||||||
|
connection server_2;
|
||||||
|
include/sync_with_master_gtid.inc
|
||||||
|
connect con_temp2,127.0.0.1,root,,test,$SERVER_MYPORT_2,;
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO t1 VALUES (32);
|
||||||
|
connection server_1;
|
||||||
|
INSERT INTO t1 VALUES (32);
|
||||||
|
connection server_2;
|
||||||
|
SET GLOBAL debug_dbug="+d,hold_worker_on_schedule";
|
||||||
|
SET debug_sync="debug_sync_action SIGNAL reached_pause WAIT_FOR continue_worker";
|
||||||
|
connection server_1;
|
||||||
|
SET gtid_seq_no=100;
|
||||||
|
INSERT INTO t1 VALUES (33);
|
||||||
|
connection server_2;
|
||||||
|
SET debug_sync='now WAIT_FOR reached_pause';
|
||||||
|
connection server_1;
|
||||||
|
INSERT INTO t1 VALUES (34);
|
||||||
|
connection server_2;
|
||||||
|
connection con_temp2;
|
||||||
|
COMMIT;
|
||||||
|
connection server_2;
|
||||||
|
include/stop_slave.inc
|
||||||
|
include/assert.inc [table t1 should have zero rows where a>32]
|
||||||
|
SELECT * FROM t1 WHERE a>32;
|
||||||
|
a
|
||||||
|
DELETE FROM t1 WHERE a=32;
|
||||||
|
SET GLOBAL slave_parallel_threads=@old_parallel_threads;
|
||||||
|
SET GLOBAL slave_parallel_mode=@old_parallel_mode;
|
||||||
|
SET GLOBAL debug_dbug=@old_debug;
|
||||||
|
SET DEBUG_SYNC= 'RESET';
|
||||||
|
include/start_slave.inc
|
||||||
|
connection server_1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
include/rpl_end.inc
|
@ -0,0 +1 @@
|
|||||||
|
--source suite/rpl/include/rpl_parallel_ignored_errors.inc
|
112
mysql-test/suite/rpl/include/rpl_parallel_ignored_errors.inc
Normal file
112
mysql-test/suite/rpl/include/rpl_parallel_ignored_errors.inc
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
# ==== Purpose ====
|
||||||
|
#
|
||||||
|
# Test verifies that, in parallel replication, transaction failure notification
|
||||||
|
# is propagated to all the workers. Workers should abort the execution of
|
||||||
|
# transaction event groups, whose event positions are higher than the failing
|
||||||
|
# transaction group.
|
||||||
|
#
|
||||||
|
# ==== Implementation ====
|
||||||
|
#
|
||||||
|
# Steps:
|
||||||
|
# 0 - Create a table t1 on master which has a primary key. Enable parallel
|
||||||
|
# replication on slave with slave_parallel_mode='optimistic' and
|
||||||
|
# slave_parallel_threads=3.
|
||||||
|
# 1 - On slave start a transaction and execute a local INSERT statement
|
||||||
|
# which will insert value 32. This is done to block the INSERT coming
|
||||||
|
# from master.
|
||||||
|
# 2 - On master execute an INSERT statement with value 32, so that it is
|
||||||
|
# blocked on slave.
|
||||||
|
# 3 - On slave enable a debug sync point such that it holds the worker thread
|
||||||
|
# execution as soon as work is scheduled to it.
|
||||||
|
# 4 - INSERT value 33 on master. It will be held on slave by other worker
|
||||||
|
# thread due to debug simulation.
|
||||||
|
# 5 - INSERT value 34 on master.
|
||||||
|
# 6 - On slave, enusre that INSERT 34 has reached a state where it waits for
|
||||||
|
# its prior transactions to commit.
|
||||||
|
# 7 - Commit the local INSERT 32 on slave server so that first worker will
|
||||||
|
# error out.
|
||||||
|
# 8 - Now send a continue signal to second worker processing 33. It should
|
||||||
|
# wakeup and propagate the error to INSERT 34.
|
||||||
|
# 9 - Upon slave stop due to error, check that no rows are found after the
|
||||||
|
# failed INSERT 32.
|
||||||
|
#
|
||||||
|
# ==== References ====
|
||||||
|
#
|
||||||
|
# MDEV-20645: Replication consistency is broken as workers miss the error
|
||||||
|
# notification from an earlier failed group.
|
||||||
|
#
|
||||||
|
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_debug.inc
|
||||||
|
--source include/have_debug_sync.inc
|
||||||
|
--source include/have_binlog_format_statement.inc
|
||||||
|
--source include/master-slave.inc
|
||||||
|
|
||||||
|
--enable_connect_log
|
||||||
|
--connection server_2
|
||||||
|
--source include/stop_slave.inc
|
||||||
|
SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads;
|
||||||
|
SET @old_parallel_mode=@@GLOBAL.slave_parallel_mode;
|
||||||
|
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||||
|
SET GLOBAL slave_parallel_mode='optimistic';
|
||||||
|
SET GLOBAL slave_parallel_threads= 3;
|
||||||
|
CHANGE MASTER TO master_use_gtid=slave_pos;
|
||||||
|
CALL mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends");
|
||||||
|
--source include/start_slave.inc
|
||||||
|
|
||||||
|
--connection server_1
|
||||||
|
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t1 (a int PRIMARY KEY) ENGINE=InnoDB;
|
||||||
|
--source include/save_master_gtid.inc
|
||||||
|
|
||||||
|
--connection server_2
|
||||||
|
--source include/sync_with_master_gtid.inc
|
||||||
|
|
||||||
|
--connect (con_temp2,127.0.0.1,root,,test,$SERVER_MYPORT_2,)
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO t1 VALUES (32);
|
||||||
|
|
||||||
|
--connection server_1
|
||||||
|
INSERT INTO t1 VALUES (32);
|
||||||
|
|
||||||
|
--connection server_2
|
||||||
|
--let $wait_condition= SELECT COUNT(*) = 1 FROM information_schema.processlist WHERE info like "INSERT INTO t1 VALUES (32)"
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
SET GLOBAL debug_dbug="+d,hold_worker_on_schedule";
|
||||||
|
SET debug_sync="debug_sync_action SIGNAL reached_pause WAIT_FOR continue_worker";
|
||||||
|
|
||||||
|
--connection server_1
|
||||||
|
SET gtid_seq_no=100;
|
||||||
|
INSERT INTO t1 VALUES (33);
|
||||||
|
|
||||||
|
--connection server_2
|
||||||
|
SET debug_sync='now WAIT_FOR reached_pause';
|
||||||
|
|
||||||
|
--connection server_1
|
||||||
|
INSERT INTO t1 VALUES (34);
|
||||||
|
|
||||||
|
--connection server_2
|
||||||
|
--let $wait_condition= SELECT COUNT(*) = 1 FROM information_schema.processlist WHERE state like "Waiting for prior transaction to commit"
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
--connection con_temp2
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
# Clean up.
|
||||||
|
--connection server_2
|
||||||
|
--source include/stop_slave.inc
|
||||||
|
--let $assert_cond= COUNT(*) = 0 FROM t1 WHERE a>32
|
||||||
|
--let $assert_text= table t1 should have zero rows where a>32
|
||||||
|
--source include/assert.inc
|
||||||
|
SELECT * FROM t1 WHERE a>32;
|
||||||
|
DELETE FROM t1 WHERE a=32;
|
||||||
|
|
||||||
|
SET GLOBAL slave_parallel_threads=@old_parallel_threads;
|
||||||
|
SET GLOBAL slave_parallel_mode=@old_parallel_mode;
|
||||||
|
SET GLOBAL debug_dbug=@old_debug;
|
||||||
|
SET DEBUG_SYNC= 'RESET';
|
||||||
|
--source include/start_slave.inc
|
||||||
|
|
||||||
|
--connection server_1
|
||||||
|
DROP TABLE t1;
|
||||||
|
--disable_connect_log
|
||||||
|
--source include/rpl_end.inc
|
50
mysql-test/suite/rpl/r/rpl_parallel_ignored_errors.result
Normal file
50
mysql-test/suite/rpl/r/rpl_parallel_ignored_errors.result
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
include/master-slave.inc
|
||||||
|
[connection master]
|
||||||
|
connection server_2;
|
||||||
|
include/stop_slave.inc
|
||||||
|
SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads;
|
||||||
|
SET @old_parallel_mode=@@GLOBAL.slave_parallel_mode;
|
||||||
|
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||||
|
SET GLOBAL slave_parallel_mode='optimistic';
|
||||||
|
SET GLOBAL slave_parallel_threads= 3;
|
||||||
|
CHANGE MASTER TO master_use_gtid=slave_pos;
|
||||||
|
CALL mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends");
|
||||||
|
include/start_slave.inc
|
||||||
|
connection server_1;
|
||||||
|
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t1 (a int PRIMARY KEY) ENGINE=InnoDB;
|
||||||
|
include/save_master_gtid.inc
|
||||||
|
connection server_2;
|
||||||
|
include/sync_with_master_gtid.inc
|
||||||
|
connect con_temp2,127.0.0.1,root,,test,$SERVER_MYPORT_2,;
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO t1 VALUES (32);
|
||||||
|
connection server_1;
|
||||||
|
INSERT INTO t1 VALUES (32);
|
||||||
|
connection server_2;
|
||||||
|
SET GLOBAL debug_dbug="+d,hold_worker_on_schedule";
|
||||||
|
SET debug_sync="debug_sync_action SIGNAL reached_pause WAIT_FOR continue_worker";
|
||||||
|
connection server_1;
|
||||||
|
SET gtid_seq_no=100;
|
||||||
|
INSERT INTO t1 VALUES (33);
|
||||||
|
connection server_2;
|
||||||
|
SET debug_sync='now WAIT_FOR reached_pause';
|
||||||
|
connection server_1;
|
||||||
|
INSERT INTO t1 VALUES (34);
|
||||||
|
connection server_2;
|
||||||
|
connection con_temp2;
|
||||||
|
COMMIT;
|
||||||
|
connection server_2;
|
||||||
|
include/stop_slave.inc
|
||||||
|
include/assert.inc [table t1 should have zero rows where a>32]
|
||||||
|
SELECT * FROM t1 WHERE a>32;
|
||||||
|
a
|
||||||
|
DELETE FROM t1 WHERE a=32;
|
||||||
|
SET GLOBAL slave_parallel_threads=@old_parallel_threads;
|
||||||
|
SET GLOBAL slave_parallel_mode=@old_parallel_mode;
|
||||||
|
SET GLOBAL debug_dbug=@old_debug;
|
||||||
|
SET DEBUG_SYNC= 'RESET';
|
||||||
|
include/start_slave.inc
|
||||||
|
connection server_1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
include/rpl_end.inc
|
1
mysql-test/suite/rpl/t/rpl_parallel_ignored_errors.test
Normal file
1
mysql-test/suite/rpl/t/rpl_parallel_ignored_errors.test
Normal file
@ -0,0 +1 @@
|
|||||||
|
--source include/rpl_parallel_ignored_errors.inc
|
@ -349,7 +349,7 @@ sub start_mysqlds()
|
|||||||
$options[$j]= quote_shell_word($options[$j]);
|
$options[$j]= quote_shell_word($options[$j]);
|
||||||
$tmp.= " $options[$j]";
|
$tmp.= " $options[$j]";
|
||||||
}
|
}
|
||||||
elseif ("--defaults-group-suffix=" eq substr($options[$j], 0, 24))
|
elsif ("--defaults-group-suffix=" eq substr($options[$j], 0, 24))
|
||||||
{
|
{
|
||||||
$suffix_found= 1;
|
$suffix_found= 1;
|
||||||
}
|
}
|
||||||
@ -368,7 +368,6 @@ sub start_mysqlds()
|
|||||||
print "wanted mysqld binary.\n\n";
|
print "wanted mysqld binary.\n\n";
|
||||||
$info_sent= 1;
|
$info_sent= 1;
|
||||||
}
|
}
|
||||||
$com.= $tmp;
|
|
||||||
|
|
||||||
if (!$suffix_found)
|
if (!$suffix_found)
|
||||||
{
|
{
|
||||||
@ -376,6 +375,8 @@ sub start_mysqlds()
|
|||||||
$com.= $groups[$i];
|
$com.= $groups[$i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$com.= $tmp;
|
||||||
|
|
||||||
if ($opt_wsrep_new_cluster) {
|
if ($opt_wsrep_new_cluster) {
|
||||||
$com.= " --wsrep-new-cluster";
|
$com.= " --wsrep-new-cluster";
|
||||||
}
|
}
|
||||||
|
@ -1209,12 +1209,9 @@ PSI_statement_info stmt_info_new_packet;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef EMBEDDED_LIBRARY
|
#ifndef EMBEDDED_LIBRARY
|
||||||
void net_before_header_psi(struct st_net *net, void *user_data, size_t /* unused: count */)
|
void net_before_header_psi(struct st_net *net, void *thd, size_t /* unused: count */)
|
||||||
{
|
{
|
||||||
THD *thd;
|
DBUG_ASSERT(thd);
|
||||||
thd= static_cast<THD*> (user_data);
|
|
||||||
DBUG_ASSERT(thd != NULL);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
We only come where when the server is IDLE, waiting for the next command.
|
We only come where when the server is IDLE, waiting for the next command.
|
||||||
Technically, it is a wait on a socket, which may take a long time,
|
Technically, it is a wait on a socket, which may take a long time,
|
||||||
@ -1223,7 +1220,8 @@ void net_before_header_psi(struct st_net *net, void *user_data, size_t /* unused
|
|||||||
Instead, start explicitly an IDLE event.
|
Instead, start explicitly an IDLE event.
|
||||||
*/
|
*/
|
||||||
MYSQL_SOCKET_SET_STATE(net->vio->mysql_socket, PSI_SOCKET_STATE_IDLE);
|
MYSQL_SOCKET_SET_STATE(net->vio->mysql_socket, PSI_SOCKET_STATE_IDLE);
|
||||||
MYSQL_START_IDLE_WAIT(thd->m_idle_psi, &thd->m_idle_state);
|
MYSQL_START_IDLE_WAIT(static_cast<THD*>(thd)->m_idle_psi,
|
||||||
|
&static_cast<THD*>(thd)->m_idle_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void net_after_header_psi(struct st_net *net, void *user_data,
|
void net_after_header_psi(struct st_net *net, void *user_data,
|
||||||
|
@ -228,6 +228,12 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id,
|
|||||||
entry->stop_on_error_sub_id == (uint64)ULONGLONG_MAX)
|
entry->stop_on_error_sub_id == (uint64)ULONGLONG_MAX)
|
||||||
entry->stop_on_error_sub_id= sub_id;
|
entry->stop_on_error_sub_id= sub_id;
|
||||||
mysql_mutex_unlock(&entry->LOCK_parallel_entry);
|
mysql_mutex_unlock(&entry->LOCK_parallel_entry);
|
||||||
|
DBUG_EXECUTE_IF("hold_worker_on_schedule", {
|
||||||
|
if (entry->stop_on_error_sub_id < (uint64)ULONGLONG_MAX)
|
||||||
|
{
|
||||||
|
debug_sync_set_action(thd, STRING_WITH_LEN("now SIGNAL continue_worker"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
DBUG_EXECUTE_IF("rpl_parallel_simulate_wait_at_retry", {
|
DBUG_EXECUTE_IF("rpl_parallel_simulate_wait_at_retry", {
|
||||||
if (rgi->current_gtid.seq_no == 1000) {
|
if (rgi->current_gtid.seq_no == 1000) {
|
||||||
@ -1136,6 +1142,13 @@ handle_rpl_parallel_thread(void *arg)
|
|||||||
bool did_enter_cond= false;
|
bool did_enter_cond= false;
|
||||||
PSI_stage_info old_stage;
|
PSI_stage_info old_stage;
|
||||||
|
|
||||||
|
DBUG_EXECUTE_IF("hold_worker_on_schedule", {
|
||||||
|
if (rgi->current_gtid.domain_id == 0 &&
|
||||||
|
rgi->current_gtid.seq_no == 100) {
|
||||||
|
debug_sync_set_action(thd,
|
||||||
|
STRING_WITH_LEN("now SIGNAL reached_pause WAIT_FOR continue_worker"));
|
||||||
|
}
|
||||||
|
});
|
||||||
DBUG_EXECUTE_IF("rpl_parallel_scheduled_gtid_0_x_100", {
|
DBUG_EXECUTE_IF("rpl_parallel_scheduled_gtid_0_x_100", {
|
||||||
if (rgi->current_gtid.domain_id == 0 &&
|
if (rgi->current_gtid.domain_id == 0 &&
|
||||||
rgi->current_gtid.seq_no == 100) {
|
rgi->current_gtid.seq_no == 100) {
|
||||||
@ -1177,7 +1190,10 @@ handle_rpl_parallel_thread(void *arg)
|
|||||||
skip_event_group= do_gco_wait(rgi, gco, &did_enter_cond, &old_stage);
|
skip_event_group= do_gco_wait(rgi, gco, &did_enter_cond, &old_stage);
|
||||||
|
|
||||||
if (unlikely(entry->stop_on_error_sub_id <= rgi->wait_commit_sub_id))
|
if (unlikely(entry->stop_on_error_sub_id <= rgi->wait_commit_sub_id))
|
||||||
|
{
|
||||||
skip_event_group= true;
|
skip_event_group= true;
|
||||||
|
rgi->worker_error= 1;
|
||||||
|
}
|
||||||
if (likely(!skip_event_group))
|
if (likely(!skip_event_group))
|
||||||
do_ftwrl_wait(rgi, &did_enter_cond, &old_stage);
|
do_ftwrl_wait(rgi, &did_enter_cond, &old_stage);
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2007, 2013, Oracle and/or its affiliates.
|
/* Copyright (c) 2007, 2013, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2008, 2014, SkySQL Ab.
|
Copyright (c) 2008, 2019, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -319,7 +319,7 @@ unpack_row(rpl_group_info *rgi,
|
|||||||
normal unpack operation.
|
normal unpack operation.
|
||||||
*/
|
*/
|
||||||
uint16 const metadata= tabledef->field_metadata(i);
|
uint16 const metadata= tabledef->field_metadata(i);
|
||||||
uchar const *const old_pack_ptr= pack_ptr;
|
IF_DBUG(uchar const *const old_pack_ptr= pack_ptr;,)
|
||||||
|
|
||||||
pack_ptr= f->unpack(f->ptr, pack_ptr, row_end, metadata);
|
pack_ptr= f->unpack(f->ptr, pack_ptr, row_end, metadata);
|
||||||
DBUG_PRINT("debug", ("field: %s; metadata: 0x%x;"
|
DBUG_PRINT("debug", ("field: %s; metadata: 0x%x;"
|
||||||
@ -337,10 +337,9 @@ unpack_row(rpl_group_info *rgi,
|
|||||||
Galera Node throws "Could not read field" error and drops out of cluster
|
Galera Node throws "Could not read field" error and drops out of cluster
|
||||||
*/
|
*/
|
||||||
WSREP_WARN("ROW event unpack field: %s metadata: 0x%x;"
|
WSREP_WARN("ROW event unpack field: %s metadata: 0x%x;"
|
||||||
" pack_ptr: %p; conv_table %p conv_field %p table %s"
|
" conv_table %p conv_field %p table %s"
|
||||||
" row_end: %p",
|
" row_end: %p",
|
||||||
f->field_name.str, metadata,
|
f->field_name.str, metadata, conv_table, conv_field,
|
||||||
old_pack_ptr, conv_table, conv_field,
|
|
||||||
(table_found) ? "found" : "not found", row_end
|
(table_found) ? "found" : "not found", row_end
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -8486,9 +8486,9 @@ bool st_select_lex::add_cross_joined_table(TABLE_LIST *left_op,
|
|||||||
|
|
||||||
TABLE_LIST *tbl;
|
TABLE_LIST *tbl;
|
||||||
List<TABLE_LIST> *right_op_jl= right_op->join_list;
|
List<TABLE_LIST> *right_op_jl= right_op->join_list;
|
||||||
TABLE_LIST *r_tbl= right_op_jl->pop();
|
IF_DBUG(const TABLE_LIST *r_tbl=,) right_op_jl->pop();
|
||||||
DBUG_ASSERT(right_op == r_tbl);
|
DBUG_ASSERT(right_op == r_tbl);
|
||||||
TABLE_LIST *l_tbl= right_op_jl->pop();
|
IF_DBUG(const TABLE_LIST *l_tbl=,) right_op_jl->pop();
|
||||||
DBUG_ASSERT(left_op == l_tbl);
|
DBUG_ASSERT(left_op == l_tbl);
|
||||||
TABLE_LIST *cj_nest;
|
TABLE_LIST *cj_nest;
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ bool Sql_cmd_alter_table_exchange_partition::execute(THD *thd)
|
|||||||
referenced from this structure will be modified.
|
referenced from this structure will be modified.
|
||||||
@todo move these into constructor...
|
@todo move these into constructor...
|
||||||
*/
|
*/
|
||||||
HA_CREATE_INFO create_info(lex->create_info);
|
IF_DBUG(HA_CREATE_INFO create_info(lex->create_info);,)
|
||||||
Alter_info alter_info(lex->alter_info, thd->mem_root);
|
Alter_info alter_info(lex->alter_info, thd->mem_root);
|
||||||
ulong priv_needed= ALTER_ACL | DROP_ACL | INSERT_ACL | CREATE_ACL;
|
ulong priv_needed= ALTER_ACL | DROP_ACL | INSERT_ACL | CREATE_ACL;
|
||||||
|
|
||||||
|
@ -4067,16 +4067,16 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
/* Use packed keys for long strings on the first column */
|
/* Use packed keys for long strings on the first column */
|
||||||
if (!((*db_options) & HA_OPTION_NO_PACK_KEYS) &&
|
if (!((*db_options) & HA_OPTION_NO_PACK_KEYS) &&
|
||||||
!((create_info->table_options & HA_OPTION_NO_PACK_KEYS)) &&
|
!((create_info->table_options & HA_OPTION_NO_PACK_KEYS)) &&
|
||||||
(key_part_length >= KEY_DEFAULT_PACK_LENGTH &&
|
(key_part_length >= KEY_DEFAULT_PACK_LENGTH &&
|
||||||
(sql_field->real_field_type() == MYSQL_TYPE_STRING ||
|
(sql_field->real_field_type() == MYSQL_TYPE_STRING ||
|
||||||
sql_field->real_field_type() == MYSQL_TYPE_VARCHAR ||
|
sql_field->real_field_type() == MYSQL_TYPE_VARCHAR ||
|
||||||
sql_field->pack_flag & FIELDFLAG_BLOB)))
|
f_is_blob(sql_field->pack_flag))))
|
||||||
{
|
{
|
||||||
if ((column_nr == 0 && (sql_field->pack_flag & FIELDFLAG_BLOB)) ||
|
if ((column_nr == 0 && f_is_blob(sql_field->pack_flag)) ||
|
||||||
sql_field->real_field_type() == MYSQL_TYPE_VARCHAR)
|
sql_field->real_field_type() == MYSQL_TYPE_VARCHAR)
|
||||||
key_info->flags|= HA_BINARY_PACK_KEY | HA_VAR_LENGTH_KEY;
|
key_info->flags|= HA_BINARY_PACK_KEY | HA_VAR_LENGTH_KEY;
|
||||||
else
|
else
|
||||||
key_info->flags|= HA_PACK_KEY;
|
key_info->flags|= HA_PACK_KEY;
|
||||||
}
|
}
|
||||||
/* Check if the key segment is partial, set the key flag accordingly */
|
/* Check if the key segment is partial, set the key flag accordingly */
|
||||||
if (key_part_length != sql_field->key_length)
|
if (key_part_length != sql_field->key_length)
|
||||||
@ -10907,7 +10907,8 @@ bool Sql_cmd_create_table_like::execute(THD *thd)
|
|||||||
LEX *lex= thd->lex;
|
LEX *lex= thd->lex;
|
||||||
SELECT_LEX *select_lex= &lex->select_lex;
|
SELECT_LEX *select_lex= &lex->select_lex;
|
||||||
TABLE_LIST *first_table= select_lex->table_list.first;
|
TABLE_LIST *first_table= select_lex->table_list.first;
|
||||||
DBUG_ASSERT(first_table == lex->query_tables && first_table != 0);
|
DBUG_ASSERT(first_table == lex->query_tables);
|
||||||
|
DBUG_ASSERT(first_table != 0);
|
||||||
bool link_to_local;
|
bool link_to_local;
|
||||||
TABLE_LIST *create_table= first_table;
|
TABLE_LIST *create_table= first_table;
|
||||||
TABLE_LIST *select_tables= lex->create_last_non_select_table->next_global;
|
TABLE_LIST *select_tables= lex->create_last_non_select_table->next_global;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2002, 2011, Oracle and/or its affiliates.
|
/* Copyright (c) 2002, 2011, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2010, 2013, Monty Program Ab.
|
Copyright (c) 2010, 2019, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -419,26 +419,12 @@ static bool create_wsrep_THD(wsrep_thread_args* args)
|
|||||||
{
|
{
|
||||||
mysql_mutex_lock(&LOCK_thread_count);
|
mysql_mutex_lock(&LOCK_thread_count);
|
||||||
ulong old_wsrep_running_threads= wsrep_running_threads;
|
ulong old_wsrep_running_threads= wsrep_running_threads;
|
||||||
#ifdef HAVE_PSI_THREAD_INTERFACE
|
DBUG_ASSERT(args->thread_type == WSREP_APPLIER_THREAD ||
|
||||||
PSI_thread_key key;
|
args->thread_type == WSREP_ROLLBACKER_THREAD);
|
||||||
|
bool res= mysql_thread_create(args->thread_type == WSREP_APPLIER_THREAD
|
||||||
switch (args->thread_type)
|
? key_wsrep_applier : key_wsrep_rollbacker,
|
||||||
{
|
&args->thread_id, &connection_attrib,
|
||||||
case WSREP_APPLIER_THREAD:
|
start_wsrep_THD, (void*)args);
|
||||||
key= key_wsrep_applier;
|
|
||||||
break;
|
|
||||||
case WSREP_ROLLBACKER_THREAD:
|
|
||||||
key= key_wsrep_rollbacker;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
key= 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool res= mysql_thread_create(key, &args->thread_id, &connection_attrib, start_wsrep_THD,
|
|
||||||
(void*)args);
|
|
||||||
/*
|
/*
|
||||||
if starting a thread on server startup, wait until the this thread's THD
|
if starting a thread on server startup, wait until the this thread's THD
|
||||||
is fully initialized (otherwise a THD initialization code might
|
is fully initialized (otherwise a THD initialization code might
|
||||||
|
@ -2296,8 +2296,8 @@ static void fil_crypt_rotation_list_fill()
|
|||||||
release fil_system.mutex. */
|
release fil_system.mutex. */
|
||||||
space->n_pending_ops++;
|
space->n_pending_ops++;
|
||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
fil_space_t* s= fil_system.read_page0(
|
ut_d(const fil_space_t* s=)
|
||||||
space->id);
|
fil_system.read_page0(space->id);
|
||||||
ut_ad(!s || s == space);
|
ut_ad(!s || s == space);
|
||||||
#endif
|
#endif
|
||||||
space->n_pending_ops--;
|
space->n_pending_ops--;
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
sphinx : MDEV-10986, MDEV-10985
|
|
||||||
union-5539 : MDEV-10986, MDEV-10985
|
|
@ -23,6 +23,8 @@ return "'indexer' binary not found" unless $exe_sphinx_indexer;
|
|||||||
my $exe_sphinx_searchd = &locate_sphinx_binary('searchd');
|
my $exe_sphinx_searchd = &locate_sphinx_binary('searchd');
|
||||||
return "'searchd' binary not found" unless $exe_sphinx_searchd;
|
return "'searchd' binary not found" unless $exe_sphinx_searchd;
|
||||||
|
|
||||||
|
my $sphinx_config= "$::opt_vardir/my_sphinx.conf";
|
||||||
|
|
||||||
# Check for Sphinx engine
|
# Check for Sphinx engine
|
||||||
|
|
||||||
return "SphinxSE not found" unless $ENV{HA_SPHINX_SO} or $::mysqld_variables{'sphinx'} eq "ON";
|
return "SphinxSE not found" unless $ENV{HA_SPHINX_SO} or $::mysqld_variables{'sphinx'} eq "ON";
|
||||||
@ -95,11 +97,38 @@ sub searchd_start {
|
|||||||
&::mtr_verbose("Started $sphinx->{proc}");
|
&::mtr_verbose("Started $sphinx->{proc}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub wait_exp_backoff {
|
||||||
|
my $timeout= shift; # Seconds
|
||||||
|
my $start_wait= shift; # Seconds
|
||||||
|
my $scale_factor= shift;
|
||||||
|
|
||||||
|
$searchd_status= "$exe_sphinx_searchd --status" .
|
||||||
|
" --config $sphinx_config > /dev/null 2>&1";
|
||||||
|
|
||||||
|
my $scale= $start_wait;
|
||||||
|
my $total_sleep= 0;
|
||||||
|
while (1) {
|
||||||
|
my $status = system($searchd_status);
|
||||||
|
if (not $status) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ($total_sleep >= $timeout) {
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::mtr_milli_sleep($scale * 1000);
|
||||||
|
$total_sleep+= $scale;
|
||||||
|
$scale*= $scale_factor;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::mtr_warning("Getting a response from searchd timed out");
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
sub searchd_wait {
|
sub searchd_wait {
|
||||||
my ($sphinx) = @_; # My::Config::Group
|
my ($sphinx) = @_; # My::Config::Group
|
||||||
|
|
||||||
return not &::sleep_until_file_created($sphinx->value('pid_file'), 20,
|
return wait_exp_backoff(30, 0.1, 2)
|
||||||
$sphinx->{'proc'})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
############# declaration methods ######################
|
############# declaration methods ######################
|
||||||
|
@ -5,10 +5,12 @@ id w query
|
|||||||
2 1 ;mode=extended2;limit=1000000;maxmatches=500
|
2 1 ;mode=extended2;limit=1000000;maxmatches=500
|
||||||
3 1 ;mode=extended2;limit=1000000;maxmatches=500
|
3 1 ;mode=extended2;limit=1000000;maxmatches=500
|
||||||
4 1 ;mode=extended2;limit=1000000;maxmatches=500
|
4 1 ;mode=extended2;limit=1000000;maxmatches=500
|
||||||
|
5 1 ;mode=extended2;limit=1000000;maxmatches=500
|
||||||
SELECT a.* FROM (SELECT * FROM ts si WHERE si.query='@* 123nothingtofind123;mode=extended2;limit=1000000;maxmatches=500') AS a UNION SELECT b.* FROM (SELECT * FROM ts si WHERE si.query=';mode=extended2;limit=1000000;maxmatches=500') AS b;
|
SELECT a.* FROM (SELECT * FROM ts si WHERE si.query='@* 123nothingtofind123;mode=extended2;limit=1000000;maxmatches=500') AS a UNION SELECT b.* FROM (SELECT * FROM ts si WHERE si.query=';mode=extended2;limit=1000000;maxmatches=500') AS b;
|
||||||
id w query
|
id w query
|
||||||
1 1 ;mode=extended2;limit=1000000;maxmatches=500
|
1 1 ;mode=extended2;limit=1000000;maxmatches=500
|
||||||
2 1 ;mode=extended2;limit=1000000;maxmatches=500
|
2 1 ;mode=extended2;limit=1000000;maxmatches=500
|
||||||
3 1 ;mode=extended2;limit=1000000;maxmatches=500
|
3 1 ;mode=extended2;limit=1000000;maxmatches=500
|
||||||
4 1 ;mode=extended2;limit=1000000;maxmatches=500
|
4 1 ;mode=extended2;limit=1000000;maxmatches=500
|
||||||
|
5 1 ;mode=extended2;limit=1000000;maxmatches=500
|
||||||
drop table ts;
|
drop table ts;
|
||||||
|
@ -9,7 +9,7 @@ if [ $1 = 0 ] ; then
|
|||||||
%{_sysconfdir}/init.d/mysql stop > /dev/null
|
%{_sysconfdir}/init.d/mysql stop > /dev/null
|
||||||
fi
|
fi
|
||||||
if [ -x /sbin/chkconfig ] ; then
|
if [ -x /sbin/chkconfig ] ; then
|
||||||
/sbin/chkconfig --del mysql > /dev/null 2>&1
|
/sbin/chkconfig --del mysql > /dev/null 2>&1 || :
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user