Merge 10.3 into 10.4
This commit is contained in:
commit
7ae37ff74f
@ -196,21 +196,17 @@ OPTION(WITH_ASAN "Enable address sanitizer" OFF)
|
||||
IF (WITH_ASAN AND NOT MSVC)
|
||||
# this flag might be set by default on some OS
|
||||
MY_CHECK_AND_SET_COMPILER_FLAG("-U_FORTIFY_SOURCE" DEBUG RELWITHDEBINFO)
|
||||
# gcc 4.8.1 and new versions of clang
|
||||
MY_CHECK_AND_SET_COMPILER_FLAG("-fsanitize=address -fPIC"
|
||||
DEBUG RELWITHDEBINFO)
|
||||
SET(HAVE_C_FSANITIZE ${have_C__fsanitize_address__fPIC})
|
||||
SET(HAVE_CXX_FSANITIZE ${have_CXX__fsanitize_address__fPIC})
|
||||
IF(HAVE_C_FSANITIZE AND HAVE_CXX_FSANITIZE)
|
||||
OPTION(WITH_ASAN_SCOPE "Enable -fsanitize-address-use-after-scope" OFF)
|
||||
SET(WITH_ASAN_OK 1)
|
||||
ELSE()
|
||||
# older versions of clang
|
||||
MY_CHECK_AND_SET_COMPILER_FLAG("-faddress-sanitizer -fPIC"
|
||||
DEBUG RELWITHDEBINFO)
|
||||
SET(HAVE_C_FADDRESS ${have_C__faddress_sanitizer__fPIC})
|
||||
SET(HAVE_CXX_FADDRESS ${have_CXX__faddress_sanitizer__fPIC})
|
||||
IF(HAVE_C_FADDRESS AND HAVE_CXX_FADDRESS)
|
||||
SET(WITH_ASAN_OK 1)
|
||||
IF(WITH_ASAN_SCOPE)
|
||||
MY_CHECK_AND_SET_COMPILER_FLAG(
|
||||
"-fsanitize=address -fsanitize-address-use-after-scope"
|
||||
DEBUG RELWITHDEBINFO)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
|
@ -4704,7 +4704,11 @@ sql_real_connect(char *host,char *database,char *user,char *password,
|
||||
return -1; // Retryable
|
||||
}
|
||||
|
||||
charset_info= get_charset_by_name(mysql.charset->name, MYF(0));
|
||||
if (!(charset_info= get_charset_by_name(mysql.charset->name, MYF(0))))
|
||||
{
|
||||
put_info("Unknown default character set", INFO_ERROR);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
connected=1;
|
||||
|
@ -173,6 +173,7 @@
|
||||
#cmakedefine HAVE_DECL_MADVISE 1
|
||||
#cmakedefine HAVE_DECL_MHA_MAPSIZE_VA 1
|
||||
#cmakedefine HAVE_MALLINFO 1
|
||||
#cmakedefine HAVE_MALLINFO2 1
|
||||
#cmakedefine HAVE_MEMCPY 1
|
||||
#cmakedefine HAVE_MEMMOVE 1
|
||||
#cmakedefine HAVE_MKSTEMP 1
|
||||
|
@ -365,6 +365,7 @@ CHECK_FUNCTION_EXISTS (localtime_r HAVE_LOCALTIME_R)
|
||||
CHECK_FUNCTION_EXISTS (lstat HAVE_LSTAT)
|
||||
CHECK_FUNCTION_EXISTS (madvise HAVE_MADVISE)
|
||||
CHECK_FUNCTION_EXISTS (mallinfo HAVE_MALLINFO)
|
||||
CHECK_FUNCTION_EXISTS (mallinfo2 HAVE_MALLINFO2)
|
||||
CHECK_FUNCTION_EXISTS (memcpy HAVE_MEMCPY)
|
||||
CHECK_FUNCTION_EXISTS (memmove HAVE_MEMMOVE)
|
||||
CHECK_FUNCTION_EXISTS (mkstemp HAVE_MKSTEMP)
|
||||
|
@ -61,7 +61,7 @@ my %debuggers = (
|
||||
lldb => {
|
||||
term => 1,
|
||||
options => '-s {script} {exe}',
|
||||
script => 'process launch --stop-at-entry {args}',
|
||||
script => 'process launch --stop-at-entry -- {args}',
|
||||
},
|
||||
valgrind => {
|
||||
options => '--tool=memcheck --show-reachable=yes --leak-check=yes --num-callers=16 --quiet --suppressions='.cwd().'/valgrind.supp {exe} {args} --loose-wait-for-pos-timeout=1500',
|
||||
|
@ -17128,6 +17128,220 @@ a
|
||||
3
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-25128: Split optimization for join with materialized semi-join
|
||||
#
|
||||
create table t1 (id int, a int, index (a), index (id, a)) engine=myisam;
|
||||
insert into t1 values
|
||||
(17,1),(17,3010),(17,3013),(17,3053),(21,2446),(21,2467),(21,2);
|
||||
create table t2 (a int) engine=myisam;
|
||||
insert into t2 values (1),(2),(3);
|
||||
create table t3 (id int) engine=myisam;
|
||||
insert into t3 values (1),(2);
|
||||
analyze table t1,t2,t3;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 analyze status Engine-independent statistics collected
|
||||
test.t1 analyze status OK
|
||||
test.t2 analyze status Engine-independent statistics collected
|
||||
test.t2 analyze status OK
|
||||
test.t3 analyze status Engine-independent statistics collected
|
||||
test.t3 analyze status OK
|
||||
set optimizer_switch="split_materialized=off";
|
||||
select * from t1, (select a from t1 cp2 group by a) dt, t3
|
||||
where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2);
|
||||
id a a id
|
||||
17 1 1 1
|
||||
21 2 2 2
|
||||
explain select * from t1, (select a from t1 cp2 group by a) dt, t3
|
||||
where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 2 Using where
|
||||
1 PRIMARY t1 ref a a 5 test.t3.id 1
|
||||
1 PRIMARY <subquery3> eq_ref distinct_key distinct_key 4 func 1
|
||||
1 PRIMARY <derived2> ref key0 key0 5 test.t3.id 2
|
||||
3 MATERIALIZED t2 ALL NULL NULL NULL NULL 3
|
||||
2 DERIVED cp2 index NULL a 5 NULL 7 Using index
|
||||
explain format=json select * from t1, (select a from t1 cp2 group by a) dt, t3
|
||||
where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2);
|
||||
EXPLAIN
|
||||
{
|
||||
"query_block": {
|
||||
"select_id": 1,
|
||||
"table": {
|
||||
"table_name": "t3",
|
||||
"access_type": "ALL",
|
||||
"rows": 2,
|
||||
"filtered": 100,
|
||||
"attached_condition": "t3.`id` is not null and t3.`id` is not null"
|
||||
},
|
||||
"table": {
|
||||
"table_name": "t1",
|
||||
"access_type": "ref",
|
||||
"possible_keys": ["a"],
|
||||
"key": "a",
|
||||
"key_length": "5",
|
||||
"used_key_parts": ["a"],
|
||||
"ref": ["test.t3.id"],
|
||||
"rows": 1,
|
||||
"filtered": 100
|
||||
},
|
||||
"table": {
|
||||
"table_name": "<subquery3>",
|
||||
"access_type": "eq_ref",
|
||||
"possible_keys": ["distinct_key"],
|
||||
"key": "distinct_key",
|
||||
"key_length": "4",
|
||||
"used_key_parts": ["a"],
|
||||
"ref": ["func"],
|
||||
"rows": 1,
|
||||
"filtered": 100,
|
||||
"materialized": {
|
||||
"unique": 1,
|
||||
"query_block": {
|
||||
"select_id": 3,
|
||||
"table": {
|
||||
"table_name": "t2",
|
||||
"access_type": "ALL",
|
||||
"rows": 3,
|
||||
"filtered": 100
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
"table_name": "<derived2>",
|
||||
"access_type": "ref",
|
||||
"possible_keys": ["key0"],
|
||||
"key": "key0",
|
||||
"key_length": "5",
|
||||
"used_key_parts": ["a"],
|
||||
"ref": ["test.t3.id"],
|
||||
"rows": 2,
|
||||
"filtered": 100,
|
||||
"materialized": {
|
||||
"query_block": {
|
||||
"select_id": 2,
|
||||
"table": {
|
||||
"table_name": "cp2",
|
||||
"access_type": "index",
|
||||
"key": "a",
|
||||
"key_length": "5",
|
||||
"used_key_parts": ["a"],
|
||||
"rows": 7,
|
||||
"filtered": 100,
|
||||
"using_index": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
set optimizer_switch="split_materialized=default";
|
||||
select * from t1, (select a from t1 cp2 group by a) dt, t3
|
||||
where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2);
|
||||
id a a id
|
||||
17 1 1 1
|
||||
21 2 2 2
|
||||
explain select * from t1, (select a from t1 cp2 group by a) dt, t3
|
||||
where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 2 Using where
|
||||
1 PRIMARY t1 ref a a 5 test.t3.id 1
|
||||
1 PRIMARY <subquery3> eq_ref distinct_key distinct_key 4 func 1
|
||||
1 PRIMARY <derived2> ref key0 key0 5 test.t3.id 2
|
||||
3 MATERIALIZED t2 ALL NULL NULL NULL NULL 3
|
||||
2 LATERAL DERIVED cp2 ref a a 5 test.t1.a 1 Using index
|
||||
explain format=json select * from t1, (select a from t1 cp2 group by a) dt, t3
|
||||
where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2);
|
||||
EXPLAIN
|
||||
{
|
||||
"query_block": {
|
||||
"select_id": 1,
|
||||
"table": {
|
||||
"table_name": "t3",
|
||||
"access_type": "ALL",
|
||||
"rows": 2,
|
||||
"filtered": 100,
|
||||
"attached_condition": "t3.`id` is not null and t3.`id` is not null"
|
||||
},
|
||||
"table": {
|
||||
"table_name": "t1",
|
||||
"access_type": "ref",
|
||||
"possible_keys": ["a"],
|
||||
"key": "a",
|
||||
"key_length": "5",
|
||||
"used_key_parts": ["a"],
|
||||
"ref": ["test.t3.id"],
|
||||
"rows": 1,
|
||||
"filtered": 100
|
||||
},
|
||||
"table": {
|
||||
"table_name": "<subquery3>",
|
||||
"access_type": "eq_ref",
|
||||
"possible_keys": ["distinct_key"],
|
||||
"key": "distinct_key",
|
||||
"key_length": "4",
|
||||
"used_key_parts": ["a"],
|
||||
"ref": ["func"],
|
||||
"rows": 1,
|
||||
"filtered": 100,
|
||||
"materialized": {
|
||||
"unique": 1,
|
||||
"query_block": {
|
||||
"select_id": 3,
|
||||
"table": {
|
||||
"table_name": "t2",
|
||||
"access_type": "ALL",
|
||||
"rows": 3,
|
||||
"filtered": 100
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
"table_name": "<derived2>",
|
||||
"access_type": "ref",
|
||||
"possible_keys": ["key0"],
|
||||
"key": "key0",
|
||||
"key_length": "5",
|
||||
"used_key_parts": ["a"],
|
||||
"ref": ["test.t3.id"],
|
||||
"rows": 2,
|
||||
"filtered": 100,
|
||||
"materialized": {
|
||||
"lateral": 1,
|
||||
"query_block": {
|
||||
"select_id": 2,
|
||||
"outer_ref_condition": "t1.a is not null",
|
||||
"table": {
|
||||
"table_name": "cp2",
|
||||
"access_type": "ref",
|
||||
"possible_keys": ["a"],
|
||||
"key": "a",
|
||||
"key_length": "5",
|
||||
"used_key_parts": ["a"],
|
||||
"ref": ["test.t1.a"],
|
||||
"rows": 1,
|
||||
"filtered": 100,
|
||||
"using_index": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
prepare stmt from "select * from t1, (select a from t1 cp2 group by a) dt, t3
|
||||
where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2)";
|
||||
execute stmt;
|
||||
id a a id
|
||||
17 1 1 1
|
||||
21 2 2 2
|
||||
execute stmt;
|
||||
id a a id
|
||||
17 1 1 1
|
||||
21 2 2 2
|
||||
deallocate prepare stmt;
|
||||
drop table t1,t2,t3;
|
||||
# End of 10.3 tests
|
||||
#
|
||||
# MDEV-18679: materialized view with SELECT S containing materialized
|
||||
|
@ -3479,6 +3479,43 @@ SELECT * from v1 WHERE a=3;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-25128: Split optimization for join with materialized semi-join
|
||||
--echo #
|
||||
|
||||
create table t1 (id int, a int, index (a), index (id, a)) engine=myisam;
|
||||
insert into t1 values
|
||||
(17,1),(17,3010),(17,3013),(17,3053),(21,2446),(21,2467),(21,2);
|
||||
|
||||
create table t2 (a int) engine=myisam;
|
||||
insert into t2 values (1),(2),(3);
|
||||
|
||||
create table t3 (id int) engine=myisam;
|
||||
insert into t3 values (1),(2);
|
||||
|
||||
analyze table t1,t2,t3;
|
||||
|
||||
let $q=
|
||||
select * from t1, (select a from t1 cp2 group by a) dt, t3
|
||||
where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2);
|
||||
|
||||
set optimizer_switch="split_materialized=off";
|
||||
eval $q;
|
||||
eval explain $q;
|
||||
eval explain format=json $q;
|
||||
|
||||
set optimizer_switch="split_materialized=default";
|
||||
eval $q;
|
||||
eval explain $q;
|
||||
eval explain format=json $q;
|
||||
|
||||
eval prepare stmt from "$q";
|
||||
execute stmt;
|
||||
execute stmt;
|
||||
deallocate prepare stmt;
|
||||
|
||||
drop table t1,t2,t3;
|
||||
|
||||
--echo # End of 10.3 tests
|
||||
|
||||
--echo #
|
||||
|
@ -6126,6 +6126,36 @@ a b c d e
|
||||
DROP TABLE t1,t2,t3,t4;
|
||||
set join_cache_level=@save_join_cache_level;
|
||||
#
|
||||
# MDEV-24767: forced BNLH used for equi-join supported by compound index
|
||||
#
|
||||
create table t1 (a int, b int, c int ) engine=myisam ;
|
||||
create table t2 (a int, b int, c int, primary key (c,a,b)) engine=myisam ;
|
||||
insert into t1 values (3,4,2), (5,6,4);
|
||||
insert into t2 values (3,4,2), (5,6,4);
|
||||
select t1.a, t1.b, t1.c from t1,t2
|
||||
where t2.a = t1.a and t2.b = t1.b and t2.c=t1.c;
|
||||
a b c
|
||||
3 4 2
|
||||
5 6 4
|
||||
explain select t1.a, t1.b, t1.c from t1,t2
|
||||
where t2.a = t1.a and t2.b = t1.b and t2.c=t1.c;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
|
||||
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 12 test.t1.c,test.t1.a,test.t1.b 1 Using index
|
||||
set join_cache_level=3;
|
||||
select t1.a, t1.b, t1.c from t1,t2
|
||||
where t2.a = t1.a and t2.b = t1.b and t2.c=t1.c;
|
||||
a b c
|
||||
3 4 2
|
||||
5 6 4
|
||||
explain select t1.a, t1.b, t1.c from t1,t2
|
||||
where t2.a = t1.a and t2.b = t1.b and t2.c=t1.c;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
|
||||
1 SIMPLE t2 hash_index PRIMARY #hash#PRIMARY:PRIMARY 12:12 test.t1.c,test.t1.a,test.t1.b 2 Using index; Using join buffer (flat, BNLH join)
|
||||
drop table t1,t2;
|
||||
set join_cache_level=@save_join_cache_level;
|
||||
#
|
||||
# MDEV-21243: Join buffer: condition is checked in wrong place for range access
|
||||
#
|
||||
create table t1(a int primary key);
|
||||
|
@ -4105,6 +4105,30 @@ DROP TABLE t1,t2,t3,t4;
|
||||
|
||||
set join_cache_level=@save_join_cache_level;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-24767: forced BNLH used for equi-join supported by compound index
|
||||
--echo #
|
||||
|
||||
create table t1 (a int, b int, c int ) engine=myisam ;
|
||||
create table t2 (a int, b int, c int, primary key (c,a,b)) engine=myisam ;
|
||||
insert into t1 values (3,4,2), (5,6,4);
|
||||
insert into t2 values (3,4,2), (5,6,4);
|
||||
|
||||
let $q=
|
||||
select t1.a, t1.b, t1.c from t1,t2
|
||||
where t2.a = t1.a and t2.b = t1.b and t2.c=t1.c;
|
||||
|
||||
eval $q;
|
||||
eval explain $q;
|
||||
|
||||
set join_cache_level=3;
|
||||
eval $q;
|
||||
eval explain $q;
|
||||
|
||||
drop table t1,t2;
|
||||
|
||||
set join_cache_level=@save_join_cache_level;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-21243: Join buffer: condition is checked in wrong place for range access
|
||||
--echo #
|
||||
@ -4145,7 +4169,8 @@ where
|
||||
drop table t1,t2,t3;
|
||||
|
||||
--echo # End of 10.3 tests
|
||||
# The following command must be the last one in the file
|
||||
|
||||
# The following command must be the last one in the file
|
||||
set @@optimizer_switch=@save_optimizer_switch;
|
||||
|
||||
set global innodb_stats_persistent= @innodb_stats_persistent_save;
|
||||
|
@ -1,4 +1,3 @@
|
||||
DROP TABLE IF EXISTS t1;
|
||||
select variable_value from information_schema.global_status where variable_name="handler_read_key" into @global_read_key;
|
||||
Warnings:
|
||||
Warning 1287 '<select expression> INTO <destination>;' is deprecated and will be removed in a future release. Please use 'SELECT <select list> INTO <destination> FROM...' instead
|
||||
@ -237,3 +236,15 @@ select @@in_transaction;
|
||||
0
|
||||
drop table t1;
|
||||
set @@global.general_log=@save_general_log;
|
||||
#
|
||||
# MDEV-25242 Server crashes in check_grant upon invoking function with userstat enabled
|
||||
#
|
||||
create function f() returns int return (select 1 from performance_schema.threads);
|
||||
set global userstat= 1;
|
||||
select f() from information_schema.table_statistics;
|
||||
ERROR 21000: Subquery returns more than 1 row
|
||||
set global userstat= 0;
|
||||
drop function f;
|
||||
#
|
||||
# End of 10.2 tests
|
||||
#
|
||||
|
@ -6,10 +6,6 @@
|
||||
-- source include/have_innodb.inc
|
||||
-- source include/have_log_bin.inc
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
|
||||
select variable_value from information_schema.global_status where variable_name="handler_read_key" into @global_read_key;
|
||||
show columns from information_schema.client_statistics;
|
||||
show columns from information_schema.user_statistics;
|
||||
@ -115,5 +111,18 @@ set @@autocommit=1;
|
||||
select @@in_transaction;
|
||||
drop table t1;
|
||||
|
||||
# Cleanup
|
||||
set @@global.general_log=@save_general_log;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-25242 Server crashes in check_grant upon invoking function with userstat enabled
|
||||
--echo #
|
||||
create function f() returns int return (select 1 from performance_schema.threads);
|
||||
set global userstat= 1;
|
||||
--error ER_SUBQUERY_NO_1_ROW
|
||||
select f() from information_schema.table_statistics;
|
||||
set global userstat= 0;
|
||||
drop function f;
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.2 tests
|
||||
--echo #
|
||||
|
@ -21,7 +21,7 @@ INSERT INTO t1 VALUES ('node2_committed_before');
|
||||
INSERT INTO t1 VALUES ('node2_committed_before');
|
||||
COMMIT;
|
||||
|
||||
--source suite/galera/include/galera_unload_provider.inc
|
||||
--source suite/galera/include/galera_stop_replication.inc
|
||||
|
||||
--connection node_1
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
|
||||
@ -53,7 +53,7 @@ INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
|
||||
INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after');
|
||||
|
||||
--connection node_2
|
||||
--source suite/galera/include/galera_load_provider.inc
|
||||
--source suite/galera/include/galera_start_replication.inc
|
||||
|
||||
#
|
||||
# client connections were killed by provider load, so have to re-open here
|
||||
|
@ -5,8 +5,9 @@ connection node_2;
|
||||
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1));
|
||||
INSERT INTO t1 VALUES (1, 'a'), (2, 'a'), (3, 'a'), (4, 'a'), (5, 'a'),(6, 'a');
|
||||
connection node_2;
|
||||
SET SESSION wsrep_sync_wait=0;
|
||||
Unloading wsrep provider ...
|
||||
SET GLOBAL wsrep_provider = 'none';
|
||||
SET GLOBAL wsrep_cluster_address = '';
|
||||
connection node_1;
|
||||
UPDATE t1 SET f2 = 'b' WHERE f1 > 1;
|
||||
UPDATE t1 SET f2 = 'c' WHERE f1 > 2;
|
||||
|
80
mysql-test/suite/galera/r/galera_log_bin_opt.result
Normal file
80
mysql-test/suite/galera/r/galera_log_bin_opt.result
Normal file
@ -0,0 +1,80 @@
|
||||
connection node_2;
|
||||
connection node_1;
|
||||
connection node_1;
|
||||
set global wsrep_on=OFF;
|
||||
reset master;
|
||||
set global wsrep_on=ON;
|
||||
connection node_2;
|
||||
set global wsrep_on=OFF;
|
||||
reset master;
|
||||
set global wsrep_on=ON;
|
||||
CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
CREATE TABLE t2 (id INT) ENGINE=InnoDB;
|
||||
INSERT INTO t2 VALUES (1);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
connection node_2;
|
||||
SELECT COUNT(*) = 1 FROM t1;
|
||||
COUNT(*) = 1
|
||||
1
|
||||
SELECT COUNT(*) = 2 FROM t2;
|
||||
COUNT(*) = 2
|
||||
1
|
||||
connection node_1;
|
||||
ALTER TABLE t1 ADD COLUMN f2 INTEGER;
|
||||
include/show_binlog_events.inc
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
mysqld-bin.000001 # Gtid # # GTID #-#-#
|
||||
mysqld-bin.000001 # Query # # use `test`; CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB
|
||||
mysqld-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
mysqld-bin.000001 # Annotate_rows # # INSERT INTO t1 VALUES (1)
|
||||
mysqld-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||
mysqld-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
|
||||
mysqld-bin.000001 # Xid # # COMMIT /* XID */
|
||||
mysqld-bin.000001 # Gtid # # GTID #-#-#
|
||||
mysqld-bin.000001 # Query # # use `test`; CREATE TABLE t2 (id INT) ENGINE=InnoDB
|
||||
mysqld-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
mysqld-bin.000001 # Annotate_rows # # INSERT INTO t2 VALUES (1)
|
||||
mysqld-bin.000001 # Table_map # # table_id: # (test.t2)
|
||||
mysqld-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
|
||||
mysqld-bin.000001 # Xid # # COMMIT /* XID */
|
||||
mysqld-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
mysqld-bin.000001 # Annotate_rows # # INSERT INTO t2 VALUES (1)
|
||||
mysqld-bin.000001 # Table_map # # table_id: # (test.t2)
|
||||
mysqld-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
|
||||
mysqld-bin.000001 # Xid # # COMMIT /* XID */
|
||||
mysqld-bin.000001 # Gtid # # GTID #-#-#
|
||||
mysqld-bin.000001 # Query # # use `test`; ALTER TABLE t1 ADD COLUMN f2 INTEGER
|
||||
connection node_2;
|
||||
SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1';
|
||||
COUNT(*) = 2
|
||||
1
|
||||
include/show_binlog_events.inc
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
mysqld-bin.000001 # Gtid # # GTID #-#-#
|
||||
mysqld-bin.000001 # Query # # use `test`; CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB
|
||||
mysqld-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
mysqld-bin.000001 # Annotate_rows # # INSERT INTO t1 VALUES (1)
|
||||
mysqld-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||
mysqld-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
|
||||
mysqld-bin.000001 # Xid # # COMMIT /* XID */
|
||||
mysqld-bin.000001 # Gtid # # GTID #-#-#
|
||||
mysqld-bin.000001 # Query # # use `test`; CREATE TABLE t2 (id INT) ENGINE=InnoDB
|
||||
mysqld-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
mysqld-bin.000001 # Annotate_rows # # INSERT INTO t2 VALUES (1)
|
||||
mysqld-bin.000001 # Table_map # # table_id: # (test.t2)
|
||||
mysqld-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
|
||||
mysqld-bin.000001 # Xid # # COMMIT /* XID */
|
||||
mysqld-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
mysqld-bin.000001 # Annotate_rows # # INSERT INTO t2 VALUES (1)
|
||||
mysqld-bin.000001 # Table_map # # table_id: # (test.t2)
|
||||
mysqld-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
|
||||
mysqld-bin.000001 # Xid # # COMMIT /* XID */
|
||||
mysqld-bin.000001 # Gtid # # GTID #-#-#
|
||||
mysqld-bin.000001 # Query # # use `test`; ALTER TABLE t1 ADD COLUMN f2 INTEGER
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
#cleanup
|
||||
connection node_1;
|
||||
SET GLOBAL wsrep_on=OFF;
|
||||
RESET MASTER;
|
@ -4,4 +4,4 @@
|
||||
wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.recover=yes;pc.ignore_sb=true'
|
||||
|
||||
[mysqld.2]
|
||||
wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.recover=yes;pc.ignore_sb=true'
|
||||
wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.recover=yes'
|
||||
|
@ -21,7 +21,8 @@ INSERT INTO t1 VALUES (1, 'a'), (2, 'a'), (3, 'a'), (4, 'a'), (5, 'a'),(6, 'a');
|
||||
|
||||
# Disconnect node #2
|
||||
--connection node_2
|
||||
--source suite/galera/include/galera_unload_provider.inc
|
||||
SET SESSION wsrep_sync_wait=0;
|
||||
--source suite/galera/include/galera_stop_replication.inc
|
||||
|
||||
--connection node_1
|
||||
UPDATE t1 SET f2 = 'b' WHERE f1 > 1;
|
||||
@ -43,7 +44,6 @@ UPDATE t1 SET f2 = 'c' WHERE f1 > 2;
|
||||
# ... and restart provider to force IST
|
||||
--echo Loading wsrep_provider ...
|
||||
--disable_query_log
|
||||
--eval SET GLOBAL wsrep_provider = '$wsrep_provider_orig';
|
||||
# Make sure IST will block ...
|
||||
--let $galera_sync_point = recv_IST_after_apply_trx
|
||||
--source include/galera_set_sync_point.inc
|
||||
|
46
mysql-test/suite/galera/t/galera_log_bin.inc
Normal file
46
mysql-test/suite/galera/t/galera_log_bin.inc
Normal file
@ -0,0 +1,46 @@
|
||||
--source include/galera_cluster.inc
|
||||
--source include/force_restart.inc
|
||||
|
||||
--connection node_1
|
||||
set global wsrep_on=OFF;
|
||||
reset master;
|
||||
set global wsrep_on=ON;
|
||||
--connection node_2
|
||||
set global wsrep_on=OFF;
|
||||
reset master;
|
||||
set global wsrep_on=ON;
|
||||
|
||||
#
|
||||
# Test Galera with --log-bin --log-slave-updates .
|
||||
# This way the actual MySQL binary log is used,
|
||||
# rather than Galera's own implementation
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
||||
CREATE TABLE t2 (id INT) ENGINE=InnoDB;
|
||||
INSERT INTO t2 VALUES (1);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
|
||||
--connection node_2
|
||||
SELECT COUNT(*) = 1 FROM t1;
|
||||
SELECT COUNT(*) = 2 FROM t2;
|
||||
|
||||
--connection node_1
|
||||
ALTER TABLE t1 ADD COLUMN f2 INTEGER;
|
||||
--let $MASTER_MYPORT=$NODE_MYPORT_1
|
||||
--source include/show_binlog_events.inc
|
||||
|
||||
--connection node_2
|
||||
SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1';
|
||||
--let $MASTER_MYPORT=$NODE_MYPORT_2
|
||||
--source include/show_binlog_events.inc
|
||||
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
|
||||
--echo #cleanup
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_on=OFF;
|
||||
RESET MASTER;
|
@ -1,46 +1 @@
|
||||
--source include/galera_cluster.inc
|
||||
--source include/force_restart.inc
|
||||
|
||||
--connection node_1
|
||||
set global wsrep_on=OFF;
|
||||
reset master;
|
||||
set global wsrep_on=ON;
|
||||
--connection node_2
|
||||
set global wsrep_on=OFF;
|
||||
reset master;
|
||||
set global wsrep_on=ON;
|
||||
|
||||
#
|
||||
# Test Galera with --log-bin --log-slave-updates .
|
||||
# This way the actual MySQL binary log is used,
|
||||
# rather than Galera's own implementation
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
||||
CREATE TABLE t2 (id INT) ENGINE=InnoDB;
|
||||
INSERT INTO t2 VALUES (1);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
|
||||
--connection node_2
|
||||
SELECT COUNT(*) = 1 FROM t1;
|
||||
SELECT COUNT(*) = 2 FROM t2;
|
||||
|
||||
--connection node_1
|
||||
ALTER TABLE t1 ADD COLUMN f2 INTEGER;
|
||||
--let $MASTER_MYPORT=$NODE_MYPORT_1
|
||||
--source include/show_binlog_events.inc
|
||||
|
||||
--connection node_2
|
||||
SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1';
|
||||
--let $MASTER_MYPORT=$NODE_MYPORT_2
|
||||
--source include/show_binlog_events.inc
|
||||
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
|
||||
--echo #cleanup
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_on=OFF;
|
||||
RESET MASTER;
|
||||
--source galera_log_bin.inc
|
||||
|
1
mysql-test/suite/galera/t/galera_log_bin_opt-master.opt
Normal file
1
mysql-test/suite/galera/t/galera_log_bin_opt-master.opt
Normal file
@ -0,0 +1 @@
|
||||
--log-slave-updates --log-bin
|
15
mysql-test/suite/galera/t/galera_log_bin_opt.cnf
Normal file
15
mysql-test/suite/galera/t/galera_log_bin_opt.cnf
Normal file
@ -0,0 +1,15 @@
|
||||
!include ../galera_2nodes.cnf
|
||||
|
||||
[mysqld]
|
||||
wsrep_sst_method=mariabackup
|
||||
wsrep_sst_auth="root:"
|
||||
|
||||
[mysqld.1]
|
||||
wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true'
|
||||
|
||||
[mysqld.2]
|
||||
wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true'
|
||||
|
||||
[sst]
|
||||
transferfmt=@ENV.MTR_GALERA_TFMT
|
||||
streamfmt=xbstream
|
2
mysql-test/suite/galera/t/galera_log_bin_opt.test
Normal file
2
mysql-test/suite/galera/t/galera_log_bin_opt.test
Normal file
@ -0,0 +1,2 @@
|
||||
--source include/have_mariabackup.inc
|
||||
--source galera_log_bin.inc
|
@ -10,7 +10,7 @@
|
||||
--connection node_2
|
||||
|
||||
#--connection node_2
|
||||
#--source suite/galera/include/galera_unload_provider.inc
|
||||
#--source suite/galera/include/galera_stop_replication.inc
|
||||
|
||||
--echo Shutting down server ...
|
||||
--source include/shutdown_mysqld.inc
|
||||
|
@ -37,7 +37,7 @@ SET GLOBAL wsrep_sst_method = 'mysqldump';
|
||||
#
|
||||
|
||||
#--connection node_2
|
||||
#--source suite/galera/include/galera_unload_provider.inc
|
||||
#--source suite/galera/include/galera_stop_replication.inc
|
||||
|
||||
--echo Shutting down server ...
|
||||
--source include/shutdown_mysqld.inc
|
||||
@ -63,7 +63,7 @@ INSERT INTO t1 VALUES (1);
|
||||
let $restart_noprint=2;
|
||||
--source include/start_mysqld.inc
|
||||
|
||||
#--source suite/galera/include/galera_load_provider.inc
|
||||
#--source suite/galera/include/galera_start_replication.inc
|
||||
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
|
||||
--source include/wait_condition.inc
|
||||
|
@ -29,10 +29,10 @@ INSERT INTO t1 VALUES (01), (02), (03), (04), (05);
|
||||
|
||||
# Disconnect nodes #2 and #3
|
||||
--connection node_2
|
||||
--source suite/galera/include/galera_unload_provider.inc
|
||||
--source suite/galera/include/galera_stop_replication.inc
|
||||
|
||||
--connection node_3
|
||||
--source suite/galera/include/galera_unload_provider.inc
|
||||
--source suite/galera/include/galera_stop_replication.inc
|
||||
|
||||
--connection node_1
|
||||
--source include/wait_until_connected_again.inc
|
||||
|
@ -1,152 +0,0 @@
|
||||
--echo #
|
||||
--echo # Testing robustness against random compression failures
|
||||
--echo #
|
||||
|
||||
--source include/not_embedded.inc
|
||||
--source include/have_innodb.inc
|
||||
|
||||
--let $simulate_comp_failures_save = `SELECT @@innodb_simulate_comp_failures`
|
||||
|
||||
--disable_query_log
|
||||
call mtr.add_suppression("InnoDB: Simulating a compression failure for table `test`\\.`t1`");
|
||||
--enable_query_log
|
||||
|
||||
# create the table with compressed pages of size 8K.
|
||||
CREATE TABLE t1(id INT AUTO_INCREMENT PRIMARY KEY, msg VARCHAR(255), KEY msg_i(msg)) ENGINE=INNODB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
|
||||
# percentage of compressions that will be forced to fail
|
||||
SET GLOBAL innodb_simulate_comp_failures = 25;
|
||||
|
||||
--disable_query_log
|
||||
--disable_result_log
|
||||
|
||||
let $num_inserts_ind = $num_inserts;
|
||||
let $commit_iterations=50;
|
||||
|
||||
while ($num_inserts_ind)
|
||||
{
|
||||
let $repeat = `select floor(rand() * 10)`;
|
||||
eval INSERT INTO t1(id, msg)
|
||||
VALUES ($num_inserts_ind, REPEAT('abcdefghijklmnopqrstuvwxyz', $repeat));
|
||||
dec $num_inserts_ind;
|
||||
}
|
||||
|
||||
--enable_query_log
|
||||
--enable_result_log
|
||||
|
||||
COMMIT;
|
||||
SELECT COUNT(id) FROM t1;
|
||||
|
||||
--disable_query_log
|
||||
--disable_result_log
|
||||
|
||||
# do random ops, making sure that some pages will get fragmented and reorganized.
|
||||
let $num_ops_ind = $num_ops;
|
||||
let $commit_count= $commit_iterations;
|
||||
|
||||
BEGIN;
|
||||
|
||||
while($num_ops_ind)
|
||||
{
|
||||
let $idx = `select floor(rand()*$num_inserts)`;
|
||||
let $insert_or_update = `select floor(rand()*3)`;
|
||||
|
||||
let $repeat = `select floor(rand() * 9) + 1`;
|
||||
|
||||
let $msg = query_get_value(`select repeat('abcdefghijklmnopqrstuvwxyz', $repeat) as x`, x, 1);
|
||||
|
||||
let $single_or_multi = `select floor(rand()*10)`;
|
||||
|
||||
if ($insert_or_update)
|
||||
{
|
||||
let $cnt = query_get_value(SELECT COUNT(*) cnt FROM t1 WHERE id=$idx, cnt, 1);
|
||||
|
||||
if ($cnt)
|
||||
{
|
||||
let $update = `select floor(rand()*2)`;
|
||||
|
||||
if ($update)
|
||||
{
|
||||
if ($single_or_multi)
|
||||
{
|
||||
eval UPDATE t1 SET msg=\"$msg\" WHERE id=$idx;
|
||||
}
|
||||
|
||||
if (!$single_or_multi)
|
||||
{
|
||||
eval UPDATE t1 SET msg=\"$msg\" WHERE id >= $idx - 100 AND id <= $idx + 100;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (!$update)
|
||||
{
|
||||
if ($single_or_multi)
|
||||
{
|
||||
eval INSERT INTO t1(msg, id) VALUES (\"$msg\", $idx) ON DUPLICATE KEY UPDATE msg=VALUES(msg), id = VALUES(id);
|
||||
}
|
||||
|
||||
if (!$single_or_multi)
|
||||
{
|
||||
let $diff = 200;
|
||||
|
||||
while ($diff)
|
||||
{
|
||||
eval INSERT INTO t1(msg, id) VALUES (\"$msg\", $idx + 100 - $diff) ON DUPLICATE KEY UPDATE msg=VALUES(msg), id=VALUES(id);
|
||||
|
||||
dec $diff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$cnt)
|
||||
{
|
||||
let $null_msg = `select floor(rand()*2)`;
|
||||
|
||||
if ($null_msg)
|
||||
{
|
||||
eval INSERT INTO t1(id,msg) VALUES ($idx, NULL);
|
||||
}
|
||||
|
||||
if (!$null_msg)
|
||||
{
|
||||
eval INSERT INTO t1(id, msg) VALUES ($idx, \"$msg\");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$insert_or_update)
|
||||
{
|
||||
if ($single_or_multi)
|
||||
{
|
||||
eval DELETE from t1 WHERE id=$idx;
|
||||
}
|
||||
|
||||
if (!$single_or_multi)
|
||||
{
|
||||
eval DELETE from t1 WHERE id >= $idx - 100 AND id <= $idx + 100;
|
||||
}
|
||||
}
|
||||
|
||||
dec $commit_count;
|
||||
if (!$commit_count)
|
||||
{
|
||||
let $commit_count= $commit_iterations;
|
||||
COMMIT;
|
||||
BEGIN;
|
||||
}
|
||||
|
||||
dec $num_ops_ind;
|
||||
}
|
||||
|
||||
COMMIT;
|
||||
|
||||
# final cleanup
|
||||
DROP TABLE t1;
|
||||
|
||||
eval SET GLOBAL innodb_simulate_comp_failures = $simulate_comp_failures_save;
|
||||
|
||||
--enable_query_log
|
@ -1,17 +0,0 @@
|
||||
#
|
||||
# Testing robustness against random compression failures
|
||||
#
|
||||
CREATE TABLE t1(id INT AUTO_INCREMENT PRIMARY KEY, msg VARCHAR(255), KEY msg_i(msg)) ENGINE=INNODB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`msg` varchar(255) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `msg_i` (`msg`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8
|
||||
SET GLOBAL innodb_simulate_comp_failures = 25;
|
||||
COMMIT;
|
||||
SELECT COUNT(id) FROM t1;
|
||||
COUNT(id)
|
||||
1500
|
@ -1,17 +0,0 @@
|
||||
#
|
||||
# Testing robustness against random compression failures
|
||||
#
|
||||
CREATE TABLE t1(id INT AUTO_INCREMENT PRIMARY KEY, msg VARCHAR(255), KEY msg_i(msg)) ENGINE=INNODB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`msg` varchar(255) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `msg_i` (`msg`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8
|
||||
SET GLOBAL innodb_simulate_comp_failures = 25;
|
||||
COMMIT;
|
||||
SELECT COUNT(id) FROM t1;
|
||||
COUNT(id)
|
||||
1000
|
@ -354,6 +354,20 @@ SELECT * FROM t1;
|
||||
a b c
|
||||
DROP TABLE t1;
|
||||
SET GLOBAL innodb_limit_optimistic_insert_debug = @saved_limit;
|
||||
#
|
||||
# MDEV-24796 Assertion page_has_next... failed
|
||||
# in btr_pcur_store_position()
|
||||
#
|
||||
CREATE TABLE t1 (c INT KEY) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES(1),(2);
|
||||
SET GLOBAL innodb_limit_optimistic_insert_debug=2;
|
||||
ALTER TABLE t1 ADD COLUMN d INT;
|
||||
DELETE FROM t1;
|
||||
InnoDB 0 transactions not purged
|
||||
SELECT * FROM t1 WHERE c<>1 ORDER BY c DESC;
|
||||
c d
|
||||
DROP TABLE t1;
|
||||
SET GLOBAL innodb_limit_optimistic_insert_debug = @saved_limit;
|
||||
# End of 10.3 tests
|
||||
#
|
||||
# MDEV-17899 Assertion failures on rollback of instant ADD/DROP
|
||||
@ -407,4 +421,4 @@ SELECT variable_value-@old_instant instants
|
||||
FROM information_schema.global_status
|
||||
WHERE variable_name = 'innodb_instant_alter_column';
|
||||
instants
|
||||
30
|
||||
31
|
||||
|
@ -1,2 +0,0 @@
|
||||
--innodb-file-per-table
|
||||
--skip-innodb-doublewrite
|
@ -1,9 +0,0 @@
|
||||
--source include/big_test.inc
|
||||
# test takes too long with valgrind
|
||||
--source include/not_valgrind.inc
|
||||
--source include/have_debug.inc
|
||||
--let $num_inserts = 1500
|
||||
--let $num_ops = 3500
|
||||
--source suite/innodb/include/innodb_simulate_comp_failures.inc
|
||||
# clean exit
|
||||
--exit
|
@ -1,2 +0,0 @@
|
||||
--innodb-file-per-table
|
||||
|
@ -1,8 +0,0 @@
|
||||
--source include/have_debug.inc
|
||||
--source include/not_valgrind.inc
|
||||
|
||||
--let $num_inserts = 1000
|
||||
--let $num_ops = 30
|
||||
--source suite/innodb/include/innodb_simulate_comp_failures.inc
|
||||
# clean exit
|
||||
--exit
|
@ -408,6 +408,22 @@ SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
SET GLOBAL innodb_limit_optimistic_insert_debug = @saved_limit;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-24796 Assertion page_has_next... failed
|
||||
--echo # in btr_pcur_store_position()
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (c INT KEY) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES(1),(2);
|
||||
SET GLOBAL innodb_limit_optimistic_insert_debug=2;
|
||||
ALTER TABLE t1 ADD COLUMN d INT;
|
||||
DELETE FROM t1;
|
||||
--source include/wait_all_purged.inc
|
||||
SELECT * FROM t1 WHERE c<>1 ORDER BY c DESC;
|
||||
DROP TABLE t1;
|
||||
|
||||
SET GLOBAL innodb_limit_optimistic_insert_debug = @saved_limit;
|
||||
|
||||
--echo # End of 10.3 tests
|
||||
|
||||
--echo #
|
||||
|
@ -1,77 +0,0 @@
|
||||
SET @start_global_value = @@global.innodb_simulate_comp_failures;
|
||||
SELECT @start_global_value;
|
||||
@start_global_value
|
||||
0
|
||||
Valid values are between 0 and 99
|
||||
select @@global.innodb_simulate_comp_failures between 0 and 99;
|
||||
@@global.innodb_simulate_comp_failures between 0 and 99
|
||||
1
|
||||
select @@global.innodb_simulate_comp_failures;
|
||||
@@global.innodb_simulate_comp_failures
|
||||
0
|
||||
select @@session.innodb_simulate_comp_failures;
|
||||
ERROR HY000: Variable 'innodb_simulate_comp_failures' is a GLOBAL variable
|
||||
show global variables like 'innodb_simulate_comp_failures';
|
||||
Variable_name Value
|
||||
innodb_simulate_comp_failures 0
|
||||
show session variables like 'innodb_simulate_comp_failures';
|
||||
Variable_name Value
|
||||
innodb_simulate_comp_failures 0
|
||||
select * from information_schema.global_variables where variable_name='innodb_simulate_comp_failures';
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
INNODB_SIMULATE_COMP_FAILURES 0
|
||||
select * from information_schema.session_variables where variable_name='innodb_simulate_comp_failures';
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
INNODB_SIMULATE_COMP_FAILURES 0
|
||||
set global innodb_simulate_comp_failures=10;
|
||||
select @@global.innodb_simulate_comp_failures;
|
||||
@@global.innodb_simulate_comp_failures
|
||||
10
|
||||
select * from information_schema.global_variables where variable_name='innodb_simulate_comp_failures';
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
INNODB_SIMULATE_COMP_FAILURES 10
|
||||
select * from information_schema.session_variables where variable_name='innodb_simulate_comp_failures';
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
INNODB_SIMULATE_COMP_FAILURES 10
|
||||
set session innodb_simulate_comp_failures=1;
|
||||
ERROR HY000: Variable 'innodb_simulate_comp_failures' is a GLOBAL variable and should be set with SET GLOBAL
|
||||
set global innodb_simulate_comp_failures=1.1;
|
||||
ERROR 42000: Incorrect argument type to variable 'innodb_simulate_comp_failures'
|
||||
set global innodb_simulate_comp_failures=1e1;
|
||||
ERROR 42000: Incorrect argument type to variable 'innodb_simulate_comp_failures'
|
||||
set global innodb_simulate_comp_failures="foo";
|
||||
ERROR 42000: Incorrect argument type to variable 'innodb_simulate_comp_failures'
|
||||
set global innodb_simulate_comp_failures=-7;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect innodb_simulate_comp_failures value: '-7'
|
||||
select @@global.innodb_simulate_comp_failures;
|
||||
@@global.innodb_simulate_comp_failures
|
||||
0
|
||||
select * from information_schema.global_variables where variable_name='innodb_simulate_comp_failures';
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
INNODB_SIMULATE_COMP_FAILURES 0
|
||||
set global innodb_simulate_comp_failures=106;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect innodb_simulate_comp_failures value: '106'
|
||||
select @@global.innodb_simulate_comp_failures;
|
||||
@@global.innodb_simulate_comp_failures
|
||||
99
|
||||
select * from information_schema.global_variables where variable_name='innodb_simulate_comp_failures';
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
INNODB_SIMULATE_COMP_FAILURES 99
|
||||
set global innodb_simulate_comp_failures=0;
|
||||
select @@global.innodb_simulate_comp_failures;
|
||||
@@global.innodb_simulate_comp_failures
|
||||
0
|
||||
set global innodb_simulate_comp_failures=99;
|
||||
select @@global.innodb_simulate_comp_failures;
|
||||
@@global.innodb_simulate_comp_failures
|
||||
99
|
||||
set global innodb_simulate_comp_failures=DEFAULT;
|
||||
select @@global.innodb_simulate_comp_failures;
|
||||
@@global.innodb_simulate_comp_failures
|
||||
0
|
||||
SET @@global.innodb_simulate_comp_failures = @start_global_value;
|
||||
SELECT @@global.innodb_simulate_comp_failures;
|
||||
@@global.innodb_simulate_comp_failures
|
||||
0
|
@ -1773,18 +1773,6 @@ NUMERIC_BLOCK_SIZE 0
|
||||
ENUM_VALUE_LIST NULL
|
||||
READ_ONLY NO
|
||||
COMMAND_LINE_ARGUMENT OPTIONAL
|
||||
VARIABLE_NAME INNODB_SIMULATE_COMP_FAILURES
|
||||
SESSION_VALUE NULL
|
||||
DEFAULT_VALUE 0
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
VARIABLE_TYPE INT UNSIGNED
|
||||
VARIABLE_COMMENT Simulate compression failures.
|
||||
NUMERIC_MIN_VALUE 0
|
||||
NUMERIC_MAX_VALUE 99
|
||||
NUMERIC_BLOCK_SIZE 0
|
||||
ENUM_VALUE_LIST NULL
|
||||
READ_ONLY NO
|
||||
COMMAND_LINE_ARGUMENT NONE
|
||||
VARIABLE_NAME INNODB_SORT_BUFFER_SIZE
|
||||
SESSION_VALUE NULL
|
||||
DEFAULT_VALUE 1048576
|
||||
@ -2138,7 +2126,7 @@ SESSION_VALUE NULL
|
||||
DEFAULT_VALUE ON
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
VARIABLE_TYPE BOOLEAN
|
||||
VARIABLE_COMMENT Enable atomic writes, instead of using the doublewrite buffer, for files on devices that supports atomic writes. To use this option one must use innodb_file_per_table=1, innodb_flush_method=O_DIRECT. This option only works on Linux with either FusionIO cards using the directFS filesystem or with Shannon cards using any file system.
|
||||
VARIABLE_COMMENT Enable atomic writes, instead of using the doublewrite buffer, for files on devices that supports atomic writes. This option only works on Linux with either FusionIO cards using the directFS filesystem or with Shannon cards using any file system.
|
||||
NUMERIC_MIN_VALUE NULL
|
||||
NUMERIC_MAX_VALUE NULL
|
||||
NUMERIC_BLOCK_SIZE NULL
|
||||
|
@ -1,65 +0,0 @@
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_debug.inc
|
||||
|
||||
SET @start_global_value = @@global.innodb_simulate_comp_failures;
|
||||
SELECT @start_global_value;
|
||||
|
||||
#
|
||||
# exists as global only
|
||||
#
|
||||
|
||||
--echo Valid values are between 0 and 99
|
||||
select @@global.innodb_simulate_comp_failures between 0 and 99;
|
||||
select @@global.innodb_simulate_comp_failures;
|
||||
|
||||
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
|
||||
select @@session.innodb_simulate_comp_failures;
|
||||
|
||||
show global variables like 'innodb_simulate_comp_failures';
|
||||
show session variables like 'innodb_simulate_comp_failures';
|
||||
select * from information_schema.global_variables where variable_name='innodb_simulate_comp_failures';
|
||||
select * from information_schema.session_variables where variable_name='innodb_simulate_comp_failures';
|
||||
|
||||
#
|
||||
# show that it's writable
|
||||
#
|
||||
|
||||
set global innodb_simulate_comp_failures=10;
|
||||
select @@global.innodb_simulate_comp_failures;
|
||||
select * from information_schema.global_variables where variable_name='innodb_simulate_comp_failures';
|
||||
select * from information_schema.session_variables where variable_name='innodb_simulate_comp_failures';
|
||||
|
||||
--error ER_GLOBAL_VARIABLE
|
||||
set session innodb_simulate_comp_failures=1;
|
||||
|
||||
#
|
||||
# incorrect types
|
||||
#
|
||||
|
||||
--error ER_WRONG_TYPE_FOR_VAR
|
||||
set global innodb_simulate_comp_failures=1.1;
|
||||
--error ER_WRONG_TYPE_FOR_VAR
|
||||
set global innodb_simulate_comp_failures=1e1;
|
||||
--error ER_WRONG_TYPE_FOR_VAR
|
||||
set global innodb_simulate_comp_failures="foo";
|
||||
|
||||
set global innodb_simulate_comp_failures=-7;
|
||||
select @@global.innodb_simulate_comp_failures;
|
||||
select * from information_schema.global_variables where variable_name='innodb_simulate_comp_failures';
|
||||
set global innodb_simulate_comp_failures=106;
|
||||
select @@global.innodb_simulate_comp_failures;
|
||||
select * from information_schema.global_variables where variable_name='innodb_simulate_comp_failures';
|
||||
|
||||
#
|
||||
# min/max/DEFAULT values
|
||||
#
|
||||
|
||||
set global innodb_simulate_comp_failures=0;
|
||||
select @@global.innodb_simulate_comp_failures;
|
||||
set global innodb_simulate_comp_failures=99;
|
||||
select @@global.innodb_simulate_comp_failures;
|
||||
set global innodb_simulate_comp_failures=DEFAULT;
|
||||
select @@global.innodb_simulate_comp_failures;
|
||||
|
||||
SET @@global.innodb_simulate_comp_failures = @start_global_value;
|
||||
SELECT @@global.innodb_simulate_comp_failures;
|
@ -4,10 +4,11 @@ INCLUDE (CheckFunctionExists)
|
||||
CHECK_INCLUDE_FILES (security/pam_ext.h HAVE_PAM_EXT_H)
|
||||
CHECK_INCLUDE_FILES (security/pam_appl.h HAVE_PAM_APPL_H)
|
||||
CHECK_FUNCTION_EXISTS (strndup HAVE_STRNDUP)
|
||||
CHECK_FUNCTION_EXISTS (getgrouplist HAVE_GETGROUPLIST)
|
||||
|
||||
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
# Check whether getgrouplist uses git_t for second and third arguments.
|
||||
# Check whether getgrouplist uses gtid_t for second and third arguments.
|
||||
SET(CMAKE_REQUIRED_FLAGS -Werror)
|
||||
CHECK_C_SOURCE_COMPILES(
|
||||
"
|
||||
@ -29,7 +30,7 @@ SET(CMAKE_REQUIRED_LIBRARIES pam)
|
||||
CHECK_FUNCTION_EXISTS(pam_syslog HAVE_PAM_SYSLOG)
|
||||
SET(CMAKE_REQUIRED_LIBRARIES)
|
||||
|
||||
IF(HAVE_PAM_APPL_H)
|
||||
IF(HAVE_PAM_APPL_H AND HAVE_GETGROUPLIST)
|
||||
FIND_LIBRARY(PAM_LIBRARY pam) # for srpm build-depends detection
|
||||
ADD_DEFINITIONS(-D_GNU_SOURCE)
|
||||
MYSQL_ADD_PLUGIN(auth_pam_v1 auth_pam_v1.c LINK_LIBRARIES pam MODULE_ONLY)
|
||||
@ -54,7 +55,7 @@ IF(HAVE_PAM_APPL_H)
|
||||
SET(CPACK_RPM_server_USER_FILELIST ${CPACK_RPM_server_USER_FILELIST} "%config(noreplace) ${INSTALL_PAMDATADIR}/*" PARENT_SCOPE)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
ENDIF(HAVE_PAM_APPL_H)
|
||||
ENDIF()
|
||||
|
||||
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake
|
||||
${CMAKE_CURRENT_BINARY_DIR}/config_auth_pam.h)
|
||||
|
@ -33,8 +33,7 @@ static int table_stats_fill(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
tmp_table.grant.privilege= 0;
|
||||
if (check_access(thd, SELECT_ACL, tmp_table.db.str,
|
||||
&tmp_table.grant.privilege, NULL, 0, 1) ||
|
||||
check_grant(thd, SELECT_ACL, &tmp_table, 1, UINT_MAX,
|
||||
1))
|
||||
check_grant(thd, SELECT_ACL, &tmp_table, 1, 1, 1))
|
||||
continue;
|
||||
|
||||
table->field[0]->store(table_stats->table, schema_length,
|
||||
|
@ -212,6 +212,9 @@ case "$1" in
|
||||
"$option" != "--port" && \
|
||||
"$option" != "--socket" ]]; then
|
||||
value=${1#*=}
|
||||
if [ "$value" == "$1" ]; then
|
||||
value=""
|
||||
fi
|
||||
case "$option" in
|
||||
'--innodb-data-home-dir')
|
||||
if [ -z "$INNODB_DATA_HOME_DIR_ARG" ]; then
|
||||
|
@ -236,6 +236,8 @@ public:
|
||||
SplM_field_info *spl_fields;
|
||||
/* The number of elements in the above list */
|
||||
uint spl_field_cnt;
|
||||
/* The list of equalities injected into WHERE for split optimization */
|
||||
List<Item> inj_cond_list;
|
||||
/* Contains the structures to generate all KEYUSEs for pushable equalities */
|
||||
List<KEY_FIELD> added_key_fields;
|
||||
/* The cache of evaluated execution plans for 'join' with pushed equalities */
|
||||
@ -1047,22 +1049,22 @@ SplM_plan_info * JOIN_TAB::choose_best_splitting(double record_count,
|
||||
bool JOIN::inject_best_splitting_cond(table_map remaining_tables)
|
||||
{
|
||||
Item *inj_cond= 0;
|
||||
List<Item> inj_cond_list;
|
||||
List<Item> *inj_cond_list= &spl_opt_info->inj_cond_list;
|
||||
List_iterator<KEY_FIELD> li(spl_opt_info->added_key_fields);
|
||||
KEY_FIELD *added_key_field;
|
||||
while ((added_key_field= li++))
|
||||
{
|
||||
if (remaining_tables & added_key_field->val->used_tables())
|
||||
continue;
|
||||
if (inj_cond_list.push_back(added_key_field->cond, thd->mem_root))
|
||||
if (inj_cond_list->push_back(added_key_field->cond, thd->mem_root))
|
||||
return true;
|
||||
}
|
||||
DBUG_ASSERT(inj_cond_list.elements);
|
||||
switch (inj_cond_list.elements) {
|
||||
DBUG_ASSERT(inj_cond_list->elements);
|
||||
switch (inj_cond_list->elements) {
|
||||
case 1:
|
||||
inj_cond= inj_cond_list.head(); break;
|
||||
inj_cond= inj_cond_list->head(); break;
|
||||
default:
|
||||
inj_cond= new (thd->mem_root) Item_cond_and(thd, inj_cond_list);
|
||||
inj_cond= new (thd->mem_root) Item_cond_and(thd, *inj_cond_list);
|
||||
if (!inj_cond)
|
||||
return true;
|
||||
}
|
||||
@ -1080,6 +1082,40 @@ bool JOIN::inject_best_splitting_cond(table_map remaining_tables)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@brief
|
||||
Test if equality is injected for split optimization
|
||||
|
||||
@param
|
||||
eq_item equality to to test
|
||||
|
||||
@retval
|
||||
true eq_item is equality injected for split optimization
|
||||
false otherwise
|
||||
*/
|
||||
|
||||
bool is_eq_cond_injected_for_split_opt(Item_func_eq *eq_item)
|
||||
{
|
||||
Item *left_item= eq_item->arguments()[0]->real_item();
|
||||
if (left_item->type() != Item::FIELD_ITEM)
|
||||
return false;
|
||||
Field *field= ((Item_field *) left_item)->field;
|
||||
if (!field->table->reginfo.join_tab)
|
||||
return false;
|
||||
JOIN *join= field->table->reginfo.join_tab->join;
|
||||
if (!join->spl_opt_info)
|
||||
return false;
|
||||
List_iterator_fast<Item> li(join->spl_opt_info->inj_cond_list);
|
||||
Item *item;
|
||||
while ((item= li++))
|
||||
{
|
||||
if (item == eq_item)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@brief
|
||||
Fix the splitting chosen for a splittable table in the final query plan
|
||||
|
@ -1200,7 +1200,7 @@ bool JOIN_CACHE::check_emb_key_usage()
|
||||
Item *item= ref->items[i]->real_item();
|
||||
Field *fld= ((Item_field *) item)->field;
|
||||
CACHE_FIELD *init_copy= field_descr+flag_fields+i;
|
||||
for (j= i, copy= init_copy; i < local_key_arg_fields; i++, copy++)
|
||||
for (j= i, copy= init_copy; j < local_key_arg_fields; j++, copy++)
|
||||
{
|
||||
if (fld->eq(copy->field))
|
||||
{
|
||||
|
@ -300,6 +300,8 @@ void set_postjoin_aggr_write_func(JOIN_TAB *tab);
|
||||
|
||||
static Item **get_sargable_cond(JOIN *join, TABLE *table);
|
||||
|
||||
bool is_eq_cond_injected_for_split_opt(Item_func_eq *eq_item);
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
|
||||
/*
|
||||
@ -22493,6 +22495,21 @@ make_cond_for_table_from_pred(THD *thd, Item *root_cond, Item *cond,
|
||||
cond->marker=3; // Checked when read
|
||||
return (COND*) 0;
|
||||
}
|
||||
/*
|
||||
If cond is an equality injected for split optimization then
|
||||
a. when retain_ref_cond == false : cond is removed unconditionally
|
||||
(cond that supports ref access is removed by the preceding code)
|
||||
b. when retain_ref_cond == true : cond is removed if it does not
|
||||
support ref access
|
||||
*/
|
||||
if (left_item->type() == Item::FIELD_ITEM &&
|
||||
is_eq_cond_injected_for_split_opt((Item_func_eq *) cond) &&
|
||||
(!retain_ref_cond ||
|
||||
!test_if_ref(root_cond, (Item_field*) left_item,right_item)))
|
||||
{
|
||||
cond->marker=3;
|
||||
return (COND*) 0;
|
||||
}
|
||||
}
|
||||
cond->marker=2;
|
||||
cond->set_join_tab_idx(join_tab_idx_arg);
|
||||
|
@ -617,8 +617,12 @@ Next alarm time: %lu\n",
|
||||
(ulong)alarm_info.next_alarm_time);
|
||||
#endif
|
||||
display_table_locks();
|
||||
#ifdef HAVE_MALLINFO
|
||||
struct mallinfo info= mallinfo();
|
||||
#if defined(HAVE_MALLINFO2)
|
||||
struct mallinfo2 info = mallinfo2();
|
||||
#elif defined(HAVE_MALLINFO)
|
||||
struct mallinfo info= mallinfo();
|
||||
#endif
|
||||
#if defined(HAVE_MALLINFO) || defined(HAVE_MALLINFO2)
|
||||
char llbuff[10][22];
|
||||
printf("\nMemory status:\n\
|
||||
Non-mmapped space allocated from system: %s\n\
|
||||
|
@ -166,13 +166,8 @@ before_first:
|
||||
|
||||
if (rec_is_metadata(rec, *index)) {
|
||||
ut_ad(!page_has_prev(block->frame));
|
||||
ut_d(const rec_t* p = rec);
|
||||
rec = page_rec_get_next(rec);
|
||||
if (page_rec_is_supremum(rec)) {
|
||||
ut_ad(page_has_next(block->frame)
|
||||
|| rec_is_alter_metadata(p, *index)
|
||||
|| block->page.id.page_no()
|
||||
!= index->page);
|
||||
goto before_first;
|
||||
}
|
||||
}
|
||||
|
@ -201,7 +201,6 @@ static char* innodb_large_prefix;
|
||||
stopword table to be used */
|
||||
static char* innobase_server_stopword_table;
|
||||
|
||||
static my_bool innobase_use_atomic_writes;
|
||||
static my_bool innobase_use_checksums;
|
||||
static my_bool innobase_locks_unsafe_for_binlog;
|
||||
static my_bool innobase_rollback_on_timeout;
|
||||
@ -4113,21 +4112,16 @@ static int innodb_init_params()
|
||||
|
||||
innobase_commit_concurrency_init_default();
|
||||
|
||||
srv_use_atomic_writes
|
||||
= innobase_use_atomic_writes && my_may_have_atomic_write;
|
||||
if (srv_use_atomic_writes && !srv_file_per_table)
|
||||
{
|
||||
fprintf(stderr, "InnoDB: Disabling atomic_writes as file_per_table is not used.\n");
|
||||
srv_use_atomic_writes= 0;
|
||||
}
|
||||
if (innodb_idle_flush_pct != 100) {
|
||||
ib::warn() << deprecated_idle_flush_pct;
|
||||
}
|
||||
|
||||
if (srv_use_atomic_writes) {
|
||||
fprintf(stderr, "InnoDB: using atomic writes.\n");
|
||||
#ifndef _WIN32
|
||||
if (srv_use_atomic_writes && my_may_have_atomic_write) {
|
||||
/*
|
||||
Force O_DIRECT on Unixes (on Windows writes are always
|
||||
unbuffered)
|
||||
*/
|
||||
#ifndef _WIN32
|
||||
switch (innodb_flush_method) {
|
||||
case SRV_O_DIRECT:
|
||||
case SRV_O_DIRECT_NO_FSYNC:
|
||||
@ -4136,8 +4130,8 @@ static int innodb_init_params()
|
||||
innodb_flush_method = SRV_O_DIRECT;
|
||||
fprintf(stderr, "InnoDB: using O_DIRECT due to atomic writes.\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
if (srv_read_only_mode) {
|
||||
ib::info() << "Started in read only mode";
|
||||
@ -19014,12 +19008,10 @@ static MYSQL_SYSVAR_BOOL(doublewrite, srv_use_doublewrite_buf,
|
||||
" Disable with --skip-innodb-doublewrite.",
|
||||
NULL, NULL, TRUE);
|
||||
|
||||
static MYSQL_SYSVAR_BOOL(use_atomic_writes, innobase_use_atomic_writes,
|
||||
static MYSQL_SYSVAR_BOOL(use_atomic_writes, srv_use_atomic_writes,
|
||||
PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY,
|
||||
"Enable atomic writes, instead of using the doublewrite buffer, for files "
|
||||
"on devices that supports atomic writes. "
|
||||
"To use this option one must use "
|
||||
"innodb_file_per_table=1, innodb_flush_method=O_DIRECT. "
|
||||
"This option only works on Linux with either FusionIO cards using "
|
||||
"the directFS filesystem or with Shannon cards using any file system.",
|
||||
NULL, NULL, TRUE);
|
||||
@ -20029,11 +20021,6 @@ static MYSQL_SYSVAR_BOOL(master_thread_disabled_debug,
|
||||
PLUGIN_VAR_OPCMDARG,
|
||||
"Disable master thread",
|
||||
NULL, srv_master_thread_disabled_debug_update, FALSE);
|
||||
|
||||
static MYSQL_SYSVAR_UINT(simulate_comp_failures, srv_simulate_comp_failures,
|
||||
PLUGIN_VAR_NOCMDARG,
|
||||
"Simulate compression failures.",
|
||||
NULL, NULL, 0, 0, 99, 0);
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
static MYSQL_SYSVAR_BOOL(force_primary_key,
|
||||
@ -20350,7 +20337,6 @@ static struct st_mysql_sys_var* innobase_system_variables[]= {
|
||||
MYSQL_SYSVAR(compression_pad_pct_max),
|
||||
MYSQL_SYSVAR(default_row_format),
|
||||
#ifdef UNIV_DEBUG
|
||||
MYSQL_SYSVAR(simulate_comp_failures),
|
||||
MYSQL_SYSVAR(trx_rseg_n_slots_debug),
|
||||
MYSQL_SYSVAR(limit_optimistic_insert_debug),
|
||||
MYSQL_SYSVAR(trx_purge_view_update_only_debug),
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2013, 2020, MariaDB Corporation.
|
||||
Copyright (c) 2013, 2021, MariaDB Corporation.
|
||||
|
||||
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
|
||||
@ -45,7 +45,7 @@ struct ha_table_option_struct
|
||||
uint atomic_writes; /*!< Use atomic writes for this
|
||||
table if this options is ON or
|
||||
in DEFAULT if
|
||||
srv_use_atomic_writes=1.
|
||||
innodb_use_atomic_writes.
|
||||
Atomic writes are not used if
|
||||
value OFF.*/
|
||||
uint encryption; /*!< DEFAULT, ON, OFF */
|
||||
|
@ -592,9 +592,6 @@ extern struct export_var_t export_vars;
|
||||
/** Global counters */
|
||||
extern srv_stats_t srv_stats;
|
||||
|
||||
/** Simulate compression failures. */
|
||||
extern uint srv_simulate_comp_failures;
|
||||
|
||||
/** Fatal semaphore wait threshold = maximum number of seconds
|
||||
that semaphore times out in InnoDB */
|
||||
#define DEFAULT_SRV_FATAL_SEMAPHORE_TIMEOUT 600
|
||||
|
@ -1349,33 +1349,6 @@ page_zip_compress(
|
||||
|
||||
MONITOR_INC(MONITOR_PAGE_COMPRESS);
|
||||
|
||||
/* Simulate a compression failure with a probability determined by
|
||||
innodb_simulate_comp_failures, only if the page has 2 or more
|
||||
records. */
|
||||
|
||||
if (srv_simulate_comp_failures
|
||||
&& !dict_index_is_ibuf(index)
|
||||
&& page_get_n_recs(page) >= 2
|
||||
&& ((ulint)(rand() % 100) < srv_simulate_comp_failures)
|
||||
&& strcmp(index->table->name.m_name, "IBUF_DUMMY")) {
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
ib::error()
|
||||
<< "Simulating a compression failure"
|
||||
<< " for table " << index->table->name
|
||||
<< " index "
|
||||
<< index->name()
|
||||
<< " page "
|
||||
<< page_get_page_no(page)
|
||||
<< "("
|
||||
<< (page_is_leaf(page) ? "leaf" : "non-leaf")
|
||||
<< ")";
|
||||
|
||||
#endif
|
||||
|
||||
goto err_exit;
|
||||
}
|
||||
|
||||
heap = mem_heap_create(page_zip_get_size(page_zip)
|
||||
+ n_fields * (2 + sizeof(ulint))
|
||||
+ REC_OFFS_HEADER_SIZE
|
||||
|
@ -4857,10 +4857,6 @@ wait_again:
|
||||
buf, i + 1, n_indexes);
|
||||
}
|
||||
|
||||
DBUG_EXECUTE_IF(
|
||||
"ib_merge_wait_after_sort",
|
||||
os_thread_sleep(20000000);); /* 20 sec */
|
||||
|
||||
if (error == DB_SUCCESS) {
|
||||
BtrBulk btr_bulk(sort_idx, trx,
|
||||
trx->get_flush_observer());
|
||||
|
@ -126,25 +126,23 @@ NOTE that since we do not hold dict_sys.latch when leaving the
|
||||
function, it may be that the referencing table has been dropped when
|
||||
we leave this function: this function is only for heuristic use!
|
||||
|
||||
@return TRUE if referenced */
|
||||
@return true if referenced */
|
||||
static
|
||||
ibool
|
||||
bool
|
||||
row_upd_index_is_referenced(
|
||||
/*========================*/
|
||||
dict_index_t* index, /*!< in: index */
|
||||
trx_t* trx) /*!< in: transaction */
|
||||
{
|
||||
dict_table_t* table = index->table;
|
||||
ibool froze_data_dict = FALSE;
|
||||
ibool is_referenced = FALSE;
|
||||
|
||||
if (table->referenced_set.empty()) {
|
||||
return(FALSE);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (trx->dict_operation_lock_mode == 0) {
|
||||
const bool froze_data_dict = !trx->dict_operation_lock_mode;
|
||||
if (froze_data_dict) {
|
||||
row_mysql_freeze_data_dictionary(trx);
|
||||
froze_data_dict = TRUE;
|
||||
}
|
||||
|
||||
dict_foreign_set::iterator it
|
||||
@ -152,13 +150,13 @@ row_upd_index_is_referenced(
|
||||
table->referenced_set.end(),
|
||||
dict_foreign_with_index(index));
|
||||
|
||||
is_referenced = (it != table->referenced_set.end());
|
||||
const bool is_referenced = (it != table->referenced_set.end());
|
||||
|
||||
if (froze_data_dict) {
|
||||
row_mysql_unfreeze_data_dictionary(trx);
|
||||
}
|
||||
|
||||
return(is_referenced);
|
||||
return is_referenced;
|
||||
}
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
@ -2264,7 +2262,6 @@ row_upd_sec_index_entry(
|
||||
dtuple_t* entry;
|
||||
dict_index_t* index;
|
||||
btr_cur_t* btr_cur;
|
||||
ibool referenced;
|
||||
dberr_t err = DB_SUCCESS;
|
||||
trx_t* trx = thr_get_trx(thr);
|
||||
ulint mode;
|
||||
@ -2275,7 +2272,7 @@ row_upd_sec_index_entry(
|
||||
|
||||
index = node->index;
|
||||
|
||||
referenced = row_upd_index_is_referenced(index, trx);
|
||||
const bool referenced = row_upd_index_is_referenced(index, trx);
|
||||
#ifdef WITH_WSREP
|
||||
bool foreign = wsrep_row_upd_index_is_foreign(index, trx);
|
||||
#endif /* WITH_WSREP */
|
||||
@ -2682,12 +2679,13 @@ row_upd_clust_rec_by_insert(
|
||||
upd_node_t* node, /*!< in/out: row update node */
|
||||
dict_index_t* index, /*!< in: clustered index of the record */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
ibool referenced,/*!< in: TRUE if index may be referenced in
|
||||
bool referenced,/*!< in: whether index may be referenced in
|
||||
a foreign key constraint */
|
||||
#ifdef WITH_WSREP
|
||||
bool foreign,/*!< in: whether this is a foreign key */
|
||||
#endif
|
||||
mtr_t* mtr) /*!< in/out: mtr; gets committed here */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction,
|
||||
may be committed and restarted */
|
||||
{
|
||||
mem_heap_t* heap;
|
||||
btr_pcur_t* pcur;
|
||||
@ -2757,10 +2755,7 @@ row_upd_clust_rec_by_insert(
|
||||
btr_cur_get_block(btr_cur), rec, index, offsets,
|
||||
thr, node->row, mtr);
|
||||
if (err != DB_SUCCESS) {
|
||||
err_exit:
|
||||
mtr_commit(mtr);
|
||||
mem_heap_free(heap);
|
||||
return(err);
|
||||
goto err_exit;
|
||||
}
|
||||
|
||||
/* If the the new row inherits externally stored
|
||||
@ -2820,14 +2815,14 @@ check_fk:
|
||||
}
|
||||
}
|
||||
|
||||
mtr_commit(mtr);
|
||||
mtr->commit();
|
||||
mtr->start();
|
||||
|
||||
node->state = UPD_NODE_INSERT_CLUSTERED;
|
||||
err = row_ins_clust_index_entry(index, entry, thr,
|
||||
dtuple_get_n_ext(entry));
|
||||
node->state = UPD_NODE_INSERT_CLUSTERED;
|
||||
|
||||
err_exit:
|
||||
mem_heap_free(heap);
|
||||
|
||||
return(err);
|
||||
}
|
||||
|
||||
@ -2847,7 +2842,8 @@ row_upd_clust_rec(
|
||||
mem_heap_t** offsets_heap,
|
||||
/*!< in/out: memory heap, can be emptied */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
mtr_t* mtr) /*!< in: mtr; gets committed here */
|
||||
mtr_t* mtr) /*!< in,out: mini-transaction; may be
|
||||
committed and restarted here */
|
||||
{
|
||||
mem_heap_t* heap = NULL;
|
||||
big_rec_t* big_rec = NULL;
|
||||
@ -2893,16 +2889,15 @@ row_upd_clust_rec(
|
||||
goto success;
|
||||
}
|
||||
|
||||
mtr_commit(mtr);
|
||||
|
||||
if (buf_LRU_buf_pool_running_out()) {
|
||||
|
||||
err = DB_LOCK_TABLE_FULL;
|
||||
goto func_exit;
|
||||
}
|
||||
|
||||
/* We may have to modify the tree structure: do a pessimistic descent
|
||||
down the index tree */
|
||||
|
||||
mtr->commit();
|
||||
mtr->start();
|
||||
|
||||
if (index->table->is_temporary()) {
|
||||
@ -2952,7 +2947,6 @@ success:
|
||||
}
|
||||
}
|
||||
|
||||
mtr_commit(mtr);
|
||||
func_exit:
|
||||
if (heap) {
|
||||
mem_heap_free(heap);
|
||||
@ -2977,17 +2971,17 @@ row_upd_del_mark_clust_rec(
|
||||
rec_offs* offsets,/*!< in/out: rec_get_offsets() for the
|
||||
record under the cursor */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
ibool referenced,
|
||||
/*!< in: TRUE if index may be referenced in
|
||||
bool referenced,
|
||||
/*!< in: whether index may be referenced in
|
||||
a foreign key constraint */
|
||||
#ifdef WITH_WSREP
|
||||
bool foreign,/*!< in: whether this is a foreign key */
|
||||
#endif
|
||||
mtr_t* mtr) /*!< in: mtr; gets committed here */
|
||||
mtr_t* mtr) /*!< in,out: mini-transaction;
|
||||
will be committed and restarted */
|
||||
{
|
||||
btr_pcur_t* pcur;
|
||||
btr_cur_t* btr_cur;
|
||||
dberr_t err;
|
||||
rec_t* rec;
|
||||
trx_t* trx = thr_get_trx(thr);
|
||||
|
||||
@ -3003,8 +2997,7 @@ row_upd_del_mark_clust_rec(
|
||||
if (!row_upd_store_row(node, trx->mysql_thd,
|
||||
thr->prebuilt && thr->prebuilt->table == node->table
|
||||
? thr->prebuilt->m_mysql_table : NULL)) {
|
||||
err = DB_COMPUTE_VALUE_FAILED;
|
||||
return err;
|
||||
return DB_COMPUTE_VALUE_FAILED;
|
||||
}
|
||||
|
||||
/* Mark the clustered index record deleted; we do not have to check
|
||||
@ -3012,7 +3005,7 @@ row_upd_del_mark_clust_rec(
|
||||
|
||||
rec = btr_cur_get_rec(btr_cur);
|
||||
|
||||
err = btr_cur_del_mark_set_clust_rec(
|
||||
dberr_t err = btr_cur_del_mark_set_clust_rec(
|
||||
btr_cur_get_block(btr_cur), rec,
|
||||
index, offsets, thr, node->row, mtr);
|
||||
|
||||
@ -3049,8 +3042,6 @@ row_upd_del_mark_clust_rec(
|
||||
#endif /* WITH_WSREP */
|
||||
}
|
||||
|
||||
mtr_commit(mtr);
|
||||
|
||||
return(err);
|
||||
}
|
||||
|
||||
@ -3067,14 +3058,12 @@ row_upd_clust_step(
|
||||
{
|
||||
dict_index_t* index;
|
||||
btr_pcur_t* pcur;
|
||||
ibool success;
|
||||
dberr_t err;
|
||||
mtr_t mtr;
|
||||
rec_t* rec;
|
||||
mem_heap_t* heap = NULL;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets;
|
||||
ibool referenced;
|
||||
ulint flags;
|
||||
trx_t* trx = thr_get_trx(thr);
|
||||
|
||||
@ -3082,8 +3071,7 @@ row_upd_clust_step(
|
||||
|
||||
index = dict_table_get_first_index(node->table);
|
||||
|
||||
referenced = row_upd_index_is_referenced(index, trx);
|
||||
|
||||
const bool referenced = row_upd_index_is_referenced(index, trx);
|
||||
#ifdef WITH_WSREP
|
||||
const bool foreign = wsrep_row_upd_index_is_foreign(index, trx);
|
||||
#endif
|
||||
@ -3129,14 +3117,9 @@ row_upd_clust_step(
|
||||
mode = BTR_MODIFY_LEAF;
|
||||
}
|
||||
|
||||
success = btr_pcur_restore_position(mode, pcur, &mtr);
|
||||
|
||||
if (!success) {
|
||||
if (!btr_pcur_restore_position(mode, pcur, &mtr)) {
|
||||
err = DB_RECORD_NOT_FOUND;
|
||||
|
||||
mtr_commit(&mtr);
|
||||
|
||||
return(err);
|
||||
goto exit_func;
|
||||
}
|
||||
|
||||
/* If this is a row in SYS_INDEXES table of the data dictionary,
|
||||
@ -3156,14 +3139,9 @@ row_upd_clust_step(
|
||||
mtr.start();
|
||||
index->set_modified(mtr);
|
||||
|
||||
success = btr_pcur_restore_position(BTR_MODIFY_LEAF, pcur,
|
||||
&mtr);
|
||||
if (!success) {
|
||||
if (!btr_pcur_restore_position(BTR_MODIFY_LEAF, pcur, &mtr)) {
|
||||
err = DB_ERROR;
|
||||
|
||||
mtr.commit();
|
||||
|
||||
return(err);
|
||||
goto exit_func;
|
||||
}
|
||||
}
|
||||
|
||||
@ -3176,7 +3154,6 @@ row_upd_clust_step(
|
||||
0, btr_pcur_get_block(pcur),
|
||||
rec, index, offsets, thr);
|
||||
if (err != DB_SUCCESS) {
|
||||
mtr.commit();
|
||||
goto exit_func;
|
||||
}
|
||||
}
|
||||
@ -3187,8 +3164,6 @@ row_upd_clust_step(
|
||||
btr_pcur_get_block(pcur),
|
||||
page_rec_get_heap_no(rec)));
|
||||
|
||||
/* NOTE: the following function calls will also commit mtr */
|
||||
|
||||
if (node->is_delete == PLAIN_DELETE) {
|
||||
err = row_upd_del_mark_clust_rec(
|
||||
node, index, offsets, thr, referenced,
|
||||
@ -3196,13 +3171,7 @@ row_upd_clust_step(
|
||||
foreign,
|
||||
#endif
|
||||
&mtr);
|
||||
|
||||
if (err == DB_SUCCESS) {
|
||||
node->state = UPD_NODE_UPDATE_ALL_SEC;
|
||||
node->index = dict_table_get_next_index(index);
|
||||
}
|
||||
|
||||
goto exit_func;
|
||||
goto all_done;
|
||||
}
|
||||
|
||||
/* If the update is made for MySQL, we already have the update vector
|
||||
@ -3217,14 +3186,13 @@ row_upd_clust_step(
|
||||
}
|
||||
|
||||
if (!node->is_delete && node->cmpl_info & UPD_NODE_NO_ORD_CHANGE) {
|
||||
|
||||
err = row_upd_clust_rec(
|
||||
flags, node, index, offsets, &heap, thr, &mtr);
|
||||
goto exit_func;
|
||||
}
|
||||
|
||||
if(!row_upd_store_row(node, trx->mysql_thd,
|
||||
thr->prebuilt ? thr->prebuilt->m_mysql_table : NULL)) {
|
||||
if (!row_upd_store_row(node, trx->mysql_thd, thr->prebuilt
|
||||
? thr->prebuilt->m_mysql_table : NULL)) {
|
||||
err = DB_COMPUTE_VALUE_FAILED;
|
||||
goto exit_func;
|
||||
}
|
||||
@ -3249,34 +3217,31 @@ row_upd_clust_step(
|
||||
foreign,
|
||||
#endif
|
||||
&mtr);
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
goto exit_func;
|
||||
all_done:
|
||||
if (err == DB_SUCCESS) {
|
||||
node->state = UPD_NODE_UPDATE_ALL_SEC;
|
||||
success:
|
||||
node->index = dict_table_get_next_index(index);
|
||||
}
|
||||
|
||||
node->state = UPD_NODE_UPDATE_ALL_SEC;
|
||||
} else {
|
||||
err = row_upd_clust_rec(
|
||||
flags, node, index, offsets, &heap, thr, &mtr);
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
goto exit_func;
|
||||
if (err == DB_SUCCESS) {
|
||||
ut_ad(node->is_delete != PLAIN_DELETE);
|
||||
node->state = node->is_delete
|
||||
? UPD_NODE_UPDATE_ALL_SEC
|
||||
: UPD_NODE_UPDATE_SOME_SEC;
|
||||
goto success;
|
||||
}
|
||||
|
||||
ut_ad(node->is_delete != PLAIN_DELETE);
|
||||
node->state = node->is_delete ?
|
||||
UPD_NODE_UPDATE_ALL_SEC :
|
||||
UPD_NODE_UPDATE_SOME_SEC;
|
||||
}
|
||||
|
||||
node->index = dict_table_get_next_index(index);
|
||||
|
||||
exit_func:
|
||||
if (heap) {
|
||||
mtr.commit();
|
||||
if (UNIV_LIKELY_NULL(heap)) {
|
||||
mem_heap_free(heap);
|
||||
}
|
||||
return(err);
|
||||
return err;
|
||||
}
|
||||
|
||||
/***********************************************************//**
|
||||
|
@ -481,9 +481,6 @@ current_time % 5 != 0. */
|
||||
#endif /* MEM_PERIODIC_CHECK */
|
||||
# define SRV_MASTER_DICT_LRU_INTERVAL (47)
|
||||
|
||||
/** Simulate compression failures. */
|
||||
UNIV_INTERN uint srv_simulate_comp_failures;
|
||||
|
||||
/** Buffer pool dump status frequence in percentages */
|
||||
UNIV_INTERN ulong srv_buf_dump_status_frequency;
|
||||
|
||||
|
59
vio/viossl.c
59
vio/viossl.c
@ -85,13 +85,14 @@ static void ssl_set_sys_error(int ssl_error)
|
||||
@param vio VIO object representing a SSL connection.
|
||||
@param ret Value returned by a SSL I/O function.
|
||||
@param event[out] The type of I/O event to wait/retry.
|
||||
@param should_wait[out] whether to wait for 'event'
|
||||
|
||||
@return Whether a SSL I/O operation should be deferred.
|
||||
@retval TRUE Temporary failure, retry operation.
|
||||
@retval FALSE Indeterminate failure.
|
||||
*/
|
||||
|
||||
static my_bool ssl_should_retry(Vio *vio, int ret, enum enum_vio_io_event *event)
|
||||
static my_bool ssl_should_retry(Vio *vio, int ret, enum enum_vio_io_event *event, my_bool *should_wait)
|
||||
{
|
||||
int ssl_error;
|
||||
SSL *ssl= vio->ssl_arg;
|
||||
@ -108,6 +109,7 @@ static my_bool ssl_should_retry(Vio *vio, int ret, enum enum_vio_io_event *event
|
||||
ERR_GET_REASON(err) == X509_R_CERT_ALREADY_IN_HASH_TABLE)
|
||||
{
|
||||
ERR_clear_error();
|
||||
*should_wait= FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
@ -120,12 +122,15 @@ static my_bool ssl_should_retry(Vio *vio, int ret, enum enum_vio_io_event *event
|
||||
{
|
||||
case SSL_ERROR_WANT_READ:
|
||||
*event= VIO_IO_EVENT_READ;
|
||||
*should_wait= TRUE;
|
||||
break;
|
||||
case SSL_ERROR_WANT_WRITE:
|
||||
*event= VIO_IO_EVENT_WRITE;
|
||||
*should_wait= TRUE;
|
||||
break;
|
||||
default:
|
||||
should_retry= FALSE;
|
||||
*should_wait= FALSE;
|
||||
ssl_set_sys_error(ssl_error);
|
||||
ERR_clear_error();
|
||||
break;
|
||||
@ -135,6 +140,32 @@ static my_bool ssl_should_retry(Vio *vio, int ret, enum enum_vio_io_event *event
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Handle SSL io error.
|
||||
|
||||
@param[in] vio Vio
|
||||
@param[in] ret return from the failed IO operation
|
||||
|
||||
@return 0 - should retry last read/write operation
|
||||
1 - some error has occured
|
||||
*/
|
||||
static int handle_ssl_io_error(Vio *vio, int ret)
|
||||
{
|
||||
enum enum_vio_io_event event;
|
||||
my_bool should_wait;
|
||||
|
||||
/* Process the SSL I/O error. */
|
||||
if (!ssl_should_retry(vio, ret, &event, &should_wait))
|
||||
return 1;
|
||||
|
||||
if (!should_wait)
|
||||
return 1;
|
||||
|
||||
/* Attempt to wait for an I/O event. */
|
||||
return vio_socket_io_wait(vio, event);
|
||||
}
|
||||
|
||||
|
||||
size_t vio_ssl_read(Vio *vio, uchar *buf, size_t size)
|
||||
{
|
||||
int ret;
|
||||
@ -150,13 +181,7 @@ size_t vio_ssl_read(Vio *vio, uchar *buf, size_t size)
|
||||
{
|
||||
while ((ret= SSL_read(ssl, buf, (int)size)) < 0)
|
||||
{
|
||||
enum enum_vio_io_event event;
|
||||
|
||||
/* Process the SSL I/O error. */
|
||||
if (!ssl_should_retry(vio, ret, &event))
|
||||
break;
|
||||
/* Attempt to wait for an I/O event. */
|
||||
if (vio_socket_io_wait(vio, event))
|
||||
if (handle_ssl_io_error(vio,ret))
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -183,14 +208,7 @@ size_t vio_ssl_write(Vio *vio, const uchar *buf, size_t size)
|
||||
{
|
||||
while ((ret= SSL_write(ssl, buf, (int)size)) < 0)
|
||||
{
|
||||
enum enum_vio_io_event event;
|
||||
|
||||
/* Process the SSL I/O error. */
|
||||
if (!ssl_should_retry(vio, ret, &event))
|
||||
break;
|
||||
|
||||
/* Attempt to wait for an I/O event. */
|
||||
if (vio_socket_io_wait(vio, event))
|
||||
if (handle_ssl_io_error(vio,ret))
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -278,14 +296,7 @@ static int ssl_handshake_loop(Vio *vio, SSL *ssl, ssl_handshake_func_t func)
|
||||
/* Initiate the SSL handshake. */
|
||||
while ((ret= func(ssl)) < 1)
|
||||
{
|
||||
enum enum_vio_io_event event;
|
||||
|
||||
/* Process the SSL I/O error. */
|
||||
if (!ssl_should_retry(vio, ret, &event))
|
||||
break;
|
||||
|
||||
/* Wait for I/O so that the handshake can proceed. */
|
||||
if (vio_socket_io_wait(vio, event))
|
||||
if (handle_ssl_io_error(vio,ret))
|
||||
break;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user