mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
Merge branch '10.6' into 10.7
This commit is contained in:
commit
ef77c05126
18 changed files with 391 additions and 81 deletions
|
@ -23,7 +23,8 @@ macro(restore WHAT)
|
|||
endmacro()
|
||||
|
||||
foreach (WHAT SUMMARY DESCRIPTION)
|
||||
if(NOT CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_PACKAGE_${WHAT})
|
||||
if(CPACK_RPM_PACKAGE_COMPONENT AND
|
||||
NOT CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_PACKAGE_${WHAT})
|
||||
message(FATAL_ERROR "CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_PACKAGE_${WHAT} is not defined")
|
||||
endif()
|
||||
endforeach()
|
||||
|
|
|
@ -105,8 +105,7 @@ ELSEIF(RPM)
|
|||
SET(SEMODULE_PACKAGE /usr/bin/semodule_package CACHE FILEPATH "")
|
||||
SET(PLUGIN_AUTH_SOCKET YES CACHE STRING "")
|
||||
SET(WITH_EMBEDDED_SERVER ON CACHE BOOL "")
|
||||
# not yet, SLES 12.3 doesn't provide pcre2
|
||||
#SET(WITH_PCRE system CACHE STRING "")
|
||||
SET(WITH_PCRE system CACHE STRING "")
|
||||
IF(RPM MATCHES "fedora|centos|rhel")
|
||||
SET(WITH_ROCKSDB_BZip2 OFF CACHE STRING "")
|
||||
ENDIF()
|
||||
|
@ -129,7 +128,6 @@ ELSE()
|
|||
SET(WITH_JEMALLOC static CACHE STRING "")
|
||||
SET(PLUGIN_AUTH_SOCKET STATIC CACHE STRING "")
|
||||
SET(WITH_STRIPPED_CLIENT ON CACHE BOOL "Strip all client binaries")
|
||||
SET(WITH_PCRE bundled CACHE STRING "")
|
||||
SET(WITH_ROCKSDB_BZip2 OFF CACHE STRING "")
|
||||
SET(WITH_ROCKSDB_LZ4 OFF CACHE STRING "")
|
||||
ENDIF()
|
||||
|
|
|
@ -3280,6 +3280,30 @@ pk i v a b
|
|||
2 2 4 2 4
|
||||
drop table t1, t2;
|
||||
#
|
||||
# MDEV-26553: Always FALSE/NULL disjunct on top level of WHERE is removed
|
||||
#
|
||||
create table t1 (a int, b int, index idx(a,b));
|
||||
insert into t1 values (1,1), (1,2), (2,1), (2,2), (3,3);
|
||||
create table t2 (c int);
|
||||
insert into t2 values (5), (2), (3), (4);
|
||||
select 1 from t1 s1
|
||||
where 1 not in (select 1 from t1
|
||||
where ((a = 1 or a = 2) and b = 1) or (b > 5 and b < 1));
|
||||
1
|
||||
select 1 from t1 s1
|
||||
where 1 not in (select 1 from t1
|
||||
where ((a = 1 or a = 2) and b = 1) or b = NULL);
|
||||
1
|
||||
select c from t2
|
||||
where 2 not in (select 1 from t1
|
||||
where ((a=1 or a=2) and b = 1) or (b > 5 and b < 1));
|
||||
c
|
||||
5
|
||||
2
|
||||
3
|
||||
4
|
||||
drop table t1,t2;
|
||||
#
|
||||
# End of 10.2 tests
|
||||
#
|
||||
#
|
||||
|
|
|
@ -2239,6 +2239,30 @@ select * from t1 inner join t2 on ( t2.b = t1.v or t2.a = t1.pk);
|
|||
select * from t1 inner join t2 on ( t2.b = t1.v or t2.a = t1.pk);
|
||||
drop table t1, t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-26553: Always FALSE/NULL disjunct on top level of WHERE is removed
|
||||
--echo #
|
||||
|
||||
create table t1 (a int, b int, index idx(a,b));
|
||||
insert into t1 values (1,1), (1,2), (2,1), (2,2), (3,3);
|
||||
|
||||
create table t2 (c int);
|
||||
insert into t2 values (5), (2), (3), (4);
|
||||
|
||||
select 1 from t1 s1
|
||||
where 1 not in (select 1 from t1
|
||||
where ((a = 1 or a = 2) and b = 1) or (b > 5 and b < 1));
|
||||
|
||||
select 1 from t1 s1
|
||||
where 1 not in (select 1 from t1
|
||||
where ((a = 1 or a = 2) and b = 1) or b = NULL);
|
||||
|
||||
select c from t2
|
||||
where 2 not in (select 1 from t1
|
||||
where ((a=1 or a=2) and b = 1) or (b > 5 and b < 1));
|
||||
|
||||
drop table t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.2 tests
|
||||
--echo #
|
||||
|
|
|
@ -3269,6 +3269,30 @@ pk i v a b
|
|||
2 2 4 2 4
|
||||
drop table t1, t2;
|
||||
#
|
||||
# MDEV-26553: Always FALSE/NULL disjunct on top level of WHERE is removed
|
||||
#
|
||||
create table t1 (a int, b int, index idx(a,b));
|
||||
insert into t1 values (1,1), (1,2), (2,1), (2,2), (3,3);
|
||||
create table t2 (c int);
|
||||
insert into t2 values (5), (2), (3), (4);
|
||||
select 1 from t1 s1
|
||||
where 1 not in (select 1 from t1
|
||||
where ((a = 1 or a = 2) and b = 1) or (b > 5 and b < 1));
|
||||
1
|
||||
select 1 from t1 s1
|
||||
where 1 not in (select 1 from t1
|
||||
where ((a = 1 or a = 2) and b = 1) or b = NULL);
|
||||
1
|
||||
select c from t2
|
||||
where 2 not in (select 1 from t1
|
||||
where ((a=1 or a=2) and b = 1) or (b > 5 and b < 1));
|
||||
c
|
||||
5
|
||||
2
|
||||
3
|
||||
4
|
||||
drop table t1,t2;
|
||||
#
|
||||
# End of 10.2 tests
|
||||
#
|
||||
#
|
||||
|
|
|
@ -5084,7 +5084,7 @@ sub mysqld_start ($$) {
|
|||
$mysqld->{'started_opts'}= $extra_opts;
|
||||
|
||||
my $expect_file= "$opt_vardir/tmp/".$mysqld->name().".expect";
|
||||
my $rc= $oldexe eq $exe ||
|
||||
my $rc= $oldexe eq ($exe || '') ||
|
||||
sleep_until_file_created($mysqld->value('pid-file'), $expect_file,
|
||||
$opt_start_timeout, $mysqld->{'proc'}, $warn_seconds);
|
||||
if (!$rc)
|
||||
|
|
144
mysql-test/suite/perfschema/r/digest_view.result
Normal file
144
mysql-test/suite/perfschema/r/digest_view.result
Normal file
|
@ -0,0 +1,144 @@
|
|||
CREATE TABLE test.v1 (a int, b int);
|
||||
INSERT INTO test.v1 VALUES (1, 100), (2, 200), (3, 300);
|
||||
CREATE TABLE test.t1 (a int, b int);
|
||||
INSERT INTO test.t1 VALUES (1, 100), (2, 200), (3, 300);
|
||||
TRUNCATE TABLE performance_schema.events_statements_summary_by_digest;
|
||||
EXPLAIN EXTENDED SELECT * from test.v1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE v1 ALL NULL NULL NULL NULL 3 100.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`v1`.`a` AS `a`,`test`.`v1`.`b` AS `b` from `test`.`v1`
|
||||
EXPLAIN EXTENDED SELECT * from test.v1 where a = 1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE v1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
Warnings:
|
||||
Note 1003 select `test`.`v1`.`a` AS `a`,`test`.`v1`.`b` AS `b` from `test`.`v1` where `test`.`v1`.`a` = 1
|
||||
EXPLAIN EXTENDED SELECT * from test.v1 where b > 100;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE v1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
Warnings:
|
||||
Note 1003 select `test`.`v1`.`a` AS `a`,`test`.`v1`.`b` AS `b` from `test`.`v1` where `test`.`v1`.`b` > 100
|
||||
EXPLAIN EXTENDED SELECT a, b from test.v1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE v1 ALL NULL NULL NULL NULL 3 100.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`v1`.`a` AS `a`,`test`.`v1`.`b` AS `b` from `test`.`v1`
|
||||
EXPLAIN EXTENDED SELECT b, a from test.v1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE v1 ALL NULL NULL NULL NULL 3 100.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`v1`.`b` AS `b`,`test`.`v1`.`a` AS `a` from `test`.`v1`
|
||||
SELECT * from test.v1;
|
||||
a b
|
||||
1 100
|
||||
2 200
|
||||
3 300
|
||||
SELECT * from test.v1 where a = 1;
|
||||
a b
|
||||
1 100
|
||||
SELECT * from test.v1 where b > 100;
|
||||
a b
|
||||
2 200
|
||||
3 300
|
||||
SELECT a, b from test.v1;
|
||||
a b
|
||||
1 100
|
||||
2 200
|
||||
3 300
|
||||
SELECT b, a from test.v1;
|
||||
b a
|
||||
100 1
|
||||
200 2
|
||||
300 3
|
||||
#
|
||||
# DIGESTS SEEN ON TABLE
|
||||
#
|
||||
SELECT SCHEMA_NAME, DIGEST_TEXT, COUNT_STAR
|
||||
FROM performance_schema.events_statements_summary_by_digest
|
||||
ORDER BY DIGEST_TEXT;
|
||||
SCHEMA_NAME DIGEST_TEXT COUNT_STAR
|
||||
test EXPLAIN EXTENDED SELECT * FROM `test` . `v1` 1
|
||||
test EXPLAIN EXTENDED SELECT * FROM `test` . `v1` WHERE `a` = ? 1
|
||||
test EXPLAIN EXTENDED SELECT * FROM `test` . `v1` WHERE `b` > ? 1
|
||||
test EXPLAIN EXTENDED SELECT `a` , `b` FROM `test` . `v1` 1
|
||||
test EXPLAIN EXTENDED SELECT `b` , `a` FROM `test` . `v1` 1
|
||||
test SELECT * FROM `test` . `v1` 1
|
||||
test SELECT * FROM `test` . `v1` WHERE `a` = ? 1
|
||||
test SELECT * FROM `test` . `v1` WHERE `b` > ? 1
|
||||
test SELECT `a` , `b` FROM `test` . `v1` 1
|
||||
test SELECT `b` , `a` FROM `test` . `v1` 1
|
||||
test SHOW WARNINGS 5
|
||||
test TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1
|
||||
DROP TABLE test.v1;
|
||||
CREATE VIEW test.v1 AS SELECT * FROM test.t1;
|
||||
EXPLAIN EXTENDED SELECT * from test.v1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`
|
||||
EXPLAIN EXTENDED SELECT * from test.v1 where a = 1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` = 1
|
||||
EXPLAIN EXTENDED SELECT * from test.v1 where b > 100;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`b` > 100
|
||||
EXPLAIN EXTENDED SELECT a, b from test.v1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`
|
||||
EXPLAIN EXTENDED SELECT b, a from test.v1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`b` AS `b`,`test`.`t1`.`a` AS `a` from `test`.`t1`
|
||||
SELECT * from test.v1;
|
||||
a b
|
||||
1 100
|
||||
2 200
|
||||
3 300
|
||||
SELECT * from test.v1 where a = 1;
|
||||
a b
|
||||
1 100
|
||||
SELECT * from test.v1 where b > 100;
|
||||
a b
|
||||
2 200
|
||||
3 300
|
||||
SELECT a, b from test.v1;
|
||||
a b
|
||||
1 100
|
||||
2 200
|
||||
3 300
|
||||
SELECT b, a from test.v1;
|
||||
b a
|
||||
100 1
|
||||
200 2
|
||||
300 3
|
||||
#
|
||||
# DIGESTS SEEN ON VIEW
|
||||
#
|
||||
SELECT SCHEMA_NAME, DIGEST_TEXT, COUNT_STAR
|
||||
FROM performance_schema.events_statements_summary_by_digest
|
||||
ORDER BY DIGEST_TEXT;
|
||||
SCHEMA_NAME DIGEST_TEXT COUNT_STAR
|
||||
test CREATE VIEW `test` . `v1` AS SELECT * FROM `test` . `t1` 1
|
||||
test DROP TABLE `test` . `v1` 1
|
||||
test EXPLAIN EXTENDED SELECT * FROM `test` . `v1` 2
|
||||
test EXPLAIN EXTENDED SELECT * FROM `test` . `v1` WHERE `a` = ? 2
|
||||
test EXPLAIN EXTENDED SELECT * FROM `test` . `v1` WHERE `b` > ? 2
|
||||
test EXPLAIN EXTENDED SELECT `a` , `b` FROM `test` . `v1` 2
|
||||
test EXPLAIN EXTENDED SELECT `b` , `a` FROM `test` . `v1` 2
|
||||
test SELECT * FROM `test` . `v1` 2
|
||||
test SELECT * FROM `test` . `v1` WHERE `a` = ? 2
|
||||
test SELECT * FROM `test` . `v1` WHERE `b` > ? 2
|
||||
test SELECT SCHEMA_NAME , `DIGEST_TEXT` , `COUNT_STAR` FROM `performance_schema` . `events_statements_summary_by_digest` ORDER BY `DIGEST_TEXT` 1
|
||||
test SELECT `a` , `b` FROM `test` . `v1` 2
|
||||
test SELECT `b` , `a` FROM `test` . `v1` 2
|
||||
test SHOW WARNINGS 10
|
||||
test TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1
|
||||
DROP VIEW test.v1;
|
||||
DROP TABLE test.t1;
|
76
mysql-test/suite/perfschema/t/digest_view.test
Normal file
76
mysql-test/suite/perfschema/t/digest_view.test
Normal file
|
@ -0,0 +1,76 @@
|
|||
# ----------------------------------------------------
|
||||
# Tests for the performance schema statement Digests.
|
||||
# ----------------------------------------------------
|
||||
|
||||
# Test case to show behavior of statements digest when
|
||||
# using a view
|
||||
|
||||
# Test requires: sp-protocol/ps-protocol/view-protocol/cursor-protocol disabled
|
||||
--source include/no_protocol.inc
|
||||
--source include/not_embedded.inc
|
||||
|
||||
CREATE TABLE test.v1 (a int, b int);
|
||||
INSERT INTO test.v1 VALUES (1, 100), (2, 200), (3, 300);
|
||||
|
||||
CREATE TABLE test.t1 (a int, b int);
|
||||
INSERT INTO test.t1 VALUES (1, 100), (2, 200), (3, 300);
|
||||
|
||||
|
||||
TRUNCATE TABLE performance_schema.events_statements_summary_by_digest;
|
||||
|
||||
#
|
||||
# test.v1 is a table.
|
||||
# Every query here is different, and should have a different digest.
|
||||
#
|
||||
|
||||
EXPLAIN EXTENDED SELECT * from test.v1;
|
||||
EXPLAIN EXTENDED SELECT * from test.v1 where a = 1;
|
||||
EXPLAIN EXTENDED SELECT * from test.v1 where b > 100;
|
||||
EXPLAIN EXTENDED SELECT a, b from test.v1;
|
||||
EXPLAIN EXTENDED SELECT b, a from test.v1;
|
||||
|
||||
SELECT * from test.v1;
|
||||
SELECT * from test.v1 where a = 1;
|
||||
SELECT * from test.v1 where b > 100;
|
||||
SELECT a, b from test.v1;
|
||||
SELECT b, a from test.v1;
|
||||
|
||||
--echo #
|
||||
--echo # DIGESTS SEEN ON TABLE
|
||||
--echo #
|
||||
|
||||
SELECT SCHEMA_NAME, DIGEST_TEXT, COUNT_STAR
|
||||
FROM performance_schema.events_statements_summary_by_digest
|
||||
ORDER BY DIGEST_TEXT;
|
||||
|
||||
DROP TABLE test.v1;
|
||||
CREATE VIEW test.v1 AS SELECT * FROM test.t1;
|
||||
|
||||
#
|
||||
# test.v1 is now a view.
|
||||
# the query digests should be unchanged.
|
||||
#
|
||||
|
||||
EXPLAIN EXTENDED SELECT * from test.v1;
|
||||
EXPLAIN EXTENDED SELECT * from test.v1 where a = 1;
|
||||
EXPLAIN EXTENDED SELECT * from test.v1 where b > 100;
|
||||
EXPLAIN EXTENDED SELECT a, b from test.v1;
|
||||
EXPLAIN EXTENDED SELECT b, a from test.v1;
|
||||
|
||||
SELECT * from test.v1;
|
||||
SELECT * from test.v1 where a = 1;
|
||||
SELECT * from test.v1 where b > 100;
|
||||
SELECT a, b from test.v1;
|
||||
SELECT b, a from test.v1;
|
||||
|
||||
--echo #
|
||||
--echo # DIGESTS SEEN ON VIEW
|
||||
--echo #
|
||||
|
||||
SELECT SCHEMA_NAME, DIGEST_TEXT, COUNT_STAR
|
||||
FROM performance_schema.events_statements_summary_by_digest
|
||||
ORDER BY DIGEST_TEXT;
|
||||
|
||||
DROP VIEW test.v1;
|
||||
DROP TABLE test.t1;
|
||||
|
|
@ -5753,6 +5753,7 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
|
|||
if (!s->const_keys.is_clear_all())
|
||||
{
|
||||
sargable_cond= get_sargable_cond(join, s->table);
|
||||
bool is_sargable_cond_of_where= sargable_cond == &join->conds;
|
||||
|
||||
select= make_select(s->table, found_const_table_map,
|
||||
found_const_table_map,
|
||||
|
@ -5769,6 +5770,12 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
|
|||
*/
|
||||
*sargable_cond= select->cond;
|
||||
|
||||
if (is_sargable_cond_of_where &&
|
||||
join->conds && join->conds->type() == Item::COND_ITEM &&
|
||||
((Item_cond*) (join->conds))->functype() ==
|
||||
Item_func::COND_AND_FUNC)
|
||||
join->cond_equal= &((Item_cond_and*) (join->conds))->m_cond_equal;
|
||||
|
||||
s->quick=select->quick;
|
||||
s->needed_reg=select->needed_reg;
|
||||
select->quick=0;
|
||||
|
|
|
@ -31,6 +31,8 @@ CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
|
|||
SET(CPACK_RPM_columnstore-engine_POST_INSTALL_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/columnstore/build/postInstall_storage_engine.sh PARENT_SCOPE)
|
||||
SET(CPACK_RPM_columnstore-engine_PRE_UNINSTALL_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/columnstore/build/preUn_storage_engine.sh PARENT_SCOPE)
|
||||
APPEND_FOR_CPACK(CPACK_RPM_columnstore-engine_PACKAGE_VERSION "")
|
||||
SET(CPACK_RPM_columnstore-engine_PACKAGE_SUMMARY "MariaDB ColumnStore storage engine" PARENT_SCOPE)
|
||||
SET(CPACK_RPM_columnstore-engine_PACKAGE_DESCRIPTION "The MariaDB ColumnStore storage engine is a high-performance columnar analytical engine, aimed at rapid processing of analytical queries on very large amounts of data." PARENT_SCOPE)
|
||||
ENDIF()
|
||||
INSTALL_MYSQL_TEST("${CMAKE_CURRENT_SOURCE_DIR}/mysql-test/" "plugin/columnstore")
|
||||
ENDIF()
|
||||
|
|
|
@ -352,26 +352,6 @@ or the MySQL version that created the redo log file. */
|
|||
header */
|
||||
#define LOG_FILE_HDR_SIZE (4 * OS_FILE_LOG_BLOCK_SIZE)
|
||||
|
||||
/** Memory mapped file */
|
||||
class mapped_file_t
|
||||
{
|
||||
public:
|
||||
mapped_file_t()= default;
|
||||
mapped_file_t(const mapped_file_t &)= delete;
|
||||
mapped_file_t &operator=(const mapped_file_t &)= delete;
|
||||
mapped_file_t(mapped_file_t &&)= delete;
|
||||
mapped_file_t &operator=(mapped_file_t &&)= delete;
|
||||
~mapped_file_t() noexcept;
|
||||
|
||||
dberr_t map(const char *path, bool read_only= false,
|
||||
bool nvme= false) noexcept;
|
||||
dberr_t unmap() noexcept;
|
||||
byte *data() noexcept { return m_area.data(); }
|
||||
|
||||
private:
|
||||
span<byte> m_area;
|
||||
};
|
||||
|
||||
/** Abstraction for reading, writing and flushing file cache to disk */
|
||||
class file_io
|
||||
{
|
||||
|
|
|
@ -336,12 +336,12 @@ public:
|
|||
bool is_initialised() const { return last_stored_lsn != 0; }
|
||||
|
||||
/** Register a redo log snippet for a page.
|
||||
@param page_id page identifier
|
||||
@param it page iterator
|
||||
@param start_lsn start LSN of the mini-transaction
|
||||
@param lsn @see mtr_t::commit_lsn()
|
||||
@param l redo log snippet @see log_t::FORMAT_10_5
|
||||
@param len length of l, in bytes */
|
||||
inline void add(const page_id_t page_id, lsn_t start_lsn, lsn_t lsn,
|
||||
inline void add(map::iterator it, lsn_t start_lsn, lsn_t lsn,
|
||||
const byte *l, size_t len);
|
||||
|
||||
/** Parse and register one mini-transaction in log_t::FORMAT_10_5.
|
||||
|
|
|
@ -224,47 +224,6 @@ void log_t::create()
|
|||
(aligned_malloc(OS_FILE_LOG_BLOCK_SIZE, OS_FILE_LOG_BLOCK_SIZE));
|
||||
}
|
||||
|
||||
mapped_file_t::~mapped_file_t() noexcept
|
||||
{
|
||||
if (!m_area.empty())
|
||||
unmap();
|
||||
}
|
||||
|
||||
dberr_t mapped_file_t::map(const char *path, bool read_only,
|
||||
bool nvme) noexcept
|
||||
{
|
||||
auto fd= mysql_file_open(innodb_log_file_key, path,
|
||||
read_only ? O_RDONLY : O_RDWR, MYF(MY_WME));
|
||||
if (fd == -1)
|
||||
return DB_ERROR;
|
||||
|
||||
const auto file_size= os_file_get_size(path).m_total_size;
|
||||
|
||||
const int nvme_flag= nvme ? MAP_SYNC : 0;
|
||||
void *ptr= my_mmap(0, static_cast<size_t>(file_size),
|
||||
read_only ? PROT_READ : PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED_VALIDATE | nvme_flag, fd, 0);
|
||||
mysql_file_close(fd, MYF(MY_WME));
|
||||
|
||||
if (ptr == MAP_FAILED)
|
||||
return DB_ERROR;
|
||||
|
||||
m_area= {static_cast<byte *>(ptr),
|
||||
static_cast<span<byte>::size_type>(file_size)};
|
||||
return DB_SUCCESS;
|
||||
}
|
||||
|
||||
dberr_t mapped_file_t::unmap() noexcept
|
||||
{
|
||||
ut_ad(!m_area.empty());
|
||||
|
||||
if (my_munmap(m_area.data(), m_area.size()))
|
||||
return DB_ERROR;
|
||||
|
||||
m_area= {};
|
||||
return DB_SUCCESS;
|
||||
}
|
||||
|
||||
file_os_io::file_os_io(file_os_io &&rhs) : m_fd(rhs.m_fd)
|
||||
{
|
||||
rhs.m_fd= OS_FILE_CLOSED;
|
||||
|
@ -334,6 +293,66 @@ dberr_t file_os_io::flush() noexcept
|
|||
|
||||
#include <libpmem.h>
|
||||
|
||||
/** Memory mapped file */
|
||||
class mapped_file_t
|
||||
{
|
||||
public:
|
||||
mapped_file_t()= default;
|
||||
mapped_file_t(const mapped_file_t &)= delete;
|
||||
mapped_file_t &operator=(const mapped_file_t &)= delete;
|
||||
mapped_file_t(mapped_file_t &&)= delete;
|
||||
mapped_file_t &operator=(mapped_file_t &&)= delete;
|
||||
~mapped_file_t() noexcept;
|
||||
|
||||
dberr_t map(const char *path, bool read_only= false,
|
||||
bool nvme= false) noexcept;
|
||||
dberr_t unmap() noexcept;
|
||||
byte *data() noexcept { return m_area.data(); }
|
||||
|
||||
private:
|
||||
span<byte> m_area;
|
||||
};
|
||||
|
||||
mapped_file_t::~mapped_file_t() noexcept
|
||||
{
|
||||
if (!m_area.empty())
|
||||
unmap();
|
||||
}
|
||||
|
||||
dberr_t mapped_file_t::map(const char *path, bool read_only,
|
||||
bool nvme) noexcept
|
||||
{
|
||||
auto fd= mysql_file_open(innodb_log_file_key, path,
|
||||
read_only ? O_RDONLY : O_RDWR, MYF(MY_WME));
|
||||
if (fd == -1)
|
||||
return DB_ERROR;
|
||||
|
||||
const auto file_size= size_t{os_file_get_size(path).m_total_size};
|
||||
|
||||
const int nvme_flag= nvme ? MAP_SYNC : 0;
|
||||
void *ptr=
|
||||
my_mmap(0, file_size, read_only ? PROT_READ : PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED_VALIDATE | nvme_flag, fd, 0);
|
||||
mysql_file_close(fd, MYF(MY_WME));
|
||||
|
||||
if (ptr == MAP_FAILED)
|
||||
return DB_ERROR;
|
||||
|
||||
m_area= {static_cast<byte *>(ptr), file_size};
|
||||
return DB_SUCCESS;
|
||||
}
|
||||
|
||||
dberr_t mapped_file_t::unmap() noexcept
|
||||
{
|
||||
ut_ad(!m_area.empty());
|
||||
|
||||
if (my_munmap(m_area.data(), m_area.size()))
|
||||
return DB_ERROR;
|
||||
|
||||
m_area= {};
|
||||
return DB_SUCCESS;
|
||||
}
|
||||
|
||||
static bool is_pmem(const char *path) noexcept
|
||||
{
|
||||
mapped_file_t mf;
|
||||
|
|
|
@ -1971,20 +1971,17 @@ inline void page_recv_t::will_not_read()
|
|||
|
||||
|
||||
/** Register a redo log snippet for a page.
|
||||
@param page_id page identifier
|
||||
@param it page iterator
|
||||
@param start_lsn start LSN of the mini-transaction
|
||||
@param lsn @see mtr_t::commit_lsn()
|
||||
@param recs redo log snippet @see log_t::FORMAT_10_5
|
||||
@param len length of l, in bytes */
|
||||
inline void recv_sys_t::add(const page_id_t page_id,
|
||||
lsn_t start_lsn, lsn_t lsn, const byte *l,
|
||||
size_t len)
|
||||
inline void recv_sys_t::add(map::iterator it, lsn_t start_lsn, lsn_t lsn,
|
||||
const byte *l, size_t len)
|
||||
{
|
||||
mysql_mutex_assert_owner(&mutex);
|
||||
std::pair<map::iterator, bool> p= pages.emplace(map::value_type
|
||||
(page_id, page_recv_t()));
|
||||
page_recv_t& recs= p.first->second;
|
||||
ut_ad(p.second == recs.log.empty());
|
||||
page_id_t page_id = it->first;
|
||||
page_recv_t &recs= it->second;
|
||||
|
||||
switch (*l & 0x70) {
|
||||
case FREE_PAGE: case INIT_PAGE:
|
||||
|
@ -2078,6 +2075,7 @@ bool recv_sys_t::parse(lsn_t checkpoint_lsn, store_t *store, bool apply)
|
|||
loop:
|
||||
const byte *const log= buf + recovered_offset;
|
||||
const lsn_t start_lsn= recovered_lsn;
|
||||
map::iterator cached_pages_it = pages.end();
|
||||
|
||||
/* Check that the entire mini-transaction is included within the buffer */
|
||||
const byte *l;
|
||||
|
@ -2401,8 +2399,12 @@ same_page:
|
|||
/* fall through */
|
||||
case STORE_YES:
|
||||
if (!mlog_init.will_avoid_read(id, start_lsn))
|
||||
add(id, start_lsn, end_lsn, recs,
|
||||
{
|
||||
if (cached_pages_it == pages.end() || cached_pages_it->first != id)
|
||||
cached_pages_it= pages.emplace(id, page_recv_t()).first;
|
||||
add(cached_pages_it, start_lsn, end_lsn, recs,
|
||||
static_cast<size_t>(l + rlen - recs));
|
||||
}
|
||||
continue;
|
||||
case STORE_NO:
|
||||
if (!is_init)
|
||||
|
@ -4123,7 +4125,9 @@ completed:
|
|||
|
||||
log_sys.last_checkpoint_lsn = checkpoint_lsn;
|
||||
|
||||
if (!srv_read_only_mode && srv_operation == SRV_OPERATION_NORMAL) {
|
||||
if (!srv_read_only_mode && srv_operation == SRV_OPERATION_NORMAL
|
||||
&& (~log_t::FORMAT_ENCRYPTED & log_sys.log.format)
|
||||
== log_t::FORMAT_10_5) {
|
||||
/* Write a FILE_CHECKPOINT marker as the first thing,
|
||||
before generating any other redo log. This ensures
|
||||
that subsequent crash recovery will be possible even
|
||||
|
|
|
@ -128,6 +128,9 @@ IF (CURL_FOUND)
|
|||
LINK_LIBRARIES curl z STORAGE_ENGINE NOT_EMBEDDED CONFIG s3.cnf)
|
||||
ENDIF()
|
||||
|
||||
SET(CPACK_RPM_s3-engine_PACKAGE_SUMMARY "Amazon S3 archival storage engine for MariaDB" PARENT_SCOPE)
|
||||
SET(CPACK_RPM_s3-engine_PACKAGE_DESCRIPTION "The S3 storage engine allows one to archive MariaDB tables in Amazon S3 (or any third-party public or private cloud that implements S3 API), but still have them accessible in MariaDB in read-only mode." PARENT_SCOPE)
|
||||
|
||||
IF(TARGET s3)
|
||||
MYSQL_ADD_EXECUTABLE(aria_s3_copy aria_s3_copy.cc ${S3_SOURCES} COMPONENT s3-engine)
|
||||
TARGET_LINK_LIBRARIES(aria_s3_copy aria myisam mysys mysys_ssl curl z)
|
||||
|
|
|
@ -86,7 +86,9 @@ set(LIB_DIR "lib")
|
|||
set(INCLUDE_DIR "include")
|
||||
set(GRN_INCLUDE_DIR "include/groonga")
|
||||
set(DATA_DIR "share")
|
||||
set(GRN_DATA_DIR "${DATA_DIR}/${GRN_PROJECT_NAME}")
|
||||
if(NOT DEFINED GRN_DATA_DIR)
|
||||
set(GRN_DATA_DIR "${DATA_DIR}/${GRN_PROJECT_NAME}")
|
||||
endif()
|
||||
set(CONFIG_DIR "etc")
|
||||
set(GRN_CONFIG_DIR "${CONFIG_DIR}/${GRN_PROJECT_NAME}")
|
||||
set(GRN_CONFIG_PATH "${CMAKE_INSTALL_PREFIX}/${GRN_CONFIG_DIR}/groonga.conf")
|
||||
|
|
|
@ -16,7 +16,9 @@
|
|||
# MA 02110-1335 USA
|
||||
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
set(GROONGA_NORMALIZER_MYSQL_PROJECT_NAME "groonga-normalizer-mysql")
|
||||
if(NOT DEFINED GROONGA_NORMALIZER_MYSQL_PROJECT_NAME)
|
||||
set(GROONGA_NORMALIZER_MYSQL_PROJECT_NAME "groonga-normalizer-mysql")
|
||||
endif()
|
||||
project("${GROONGA_NORMALIZER_MYSQL_PROJECT_NAME}")
|
||||
|
||||
if(DEFINED GROONGA_NORMALIZER_MYSQL_EMBED)
|
||||
|
|
|
@ -59,7 +59,7 @@ int main(int argc __attribute__((unused)), char **argv)
|
|||
|
||||
pthread_mutex_init(&mutex, 0);
|
||||
|
||||
#define CYCLES 3000
|
||||
#define CYCLES 30000
|
||||
#define THREADS 30
|
||||
|
||||
diag("N CPUs: %d", my_getncpus());
|
||||
|
|
Loading…
Reference in a new issue