Skip to content

Commit 6d0be01

Browse files
committed
Merge branch '11.4' into bb-11.8-release
2 parents bd0dc40 + 83df4a3 commit 6d0be01

File tree

290 files changed

+6654
-15330
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

290 files changed

+6654
-15330
lines changed

.github/workflows/windows-arm64.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,4 @@ jobs:
5454
$cidir = "$tmp/ci"
5555
mkdir $cidir
5656
fsutil file setCaseSensitiveInfo $cidir enable
57-
perl bld\mysql-test\mysql-test-run.pl --force --parallel=$parallel --suite=main,innodb --vardir=$cidir/var --mysqld=--lower-case-table-names=0 --mysqld=--loose-innodb-flush-log-at-trx-commit=2
57+
perl bld\mysql-test\mysql-test-run.pl --force --parallel=$parallel --suite=main,innodb --vardir=$cidir/var --mysqld=--lower-case-table-names=0 --mysqld=--loose-innodb-flush-log-at-trx-commit=2 --mysqld=--debug-no-sync

CMakeLists.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,9 +296,13 @@ IF(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION
296296
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_GLIBCXX_DEBUG -D_GLIBCXX_ASSERTIONS")
297297
ENDIF()
298298

299-
OPTION(ENABLE_GCOV "Enable gcov (debug, Linux builds only)" OFF)
299+
OPTION(ENABLE_GCOV "Enable gcov (debug, macOS and Linux builds only)" OFF)
300300
IF (ENABLE_GCOV)
301-
MY_CHECK_AND_SET_COMPILER_FLAG("-DHAVE_gcov -fprofile-arcs -ftest-coverage -lgcov" DEBUG)
301+
IF (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
302+
MY_CHECK_AND_SET_COMPILER_FLAG("--coverage" DEBUG)
303+
ELSE()
304+
MY_CHECK_AND_SET_COMPILER_FLAG("-DHAVE_gcov -fprofile-arcs -ftest-coverage -lgcov" DEBUG)
305+
ENDIF()
302306
ENDIF()
303307

304308
OPTION(WITHOUT_PACKED_SORT_KEYS "disable packed sort keys" OFF)

cmake/install_macros.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ FUNCTION(INSTALL_RUNTIME_DEPS)
286286
POST_EXCLUDE_REGEXES
287287
".*system32/.*\\.dll" # Windows stuff
288288
POST_INCLUDE_REGEXES
289+
"libssl" "libcrypto" # Account for OpenSSL libraries in system32
289290
DIRECTORIES
290291
$<$<BOOL:${VCPKG_INSTALLED_DIR}>:${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin
291292
$<$<AND:$<CONFIG:Debug>,$<BOOL:${VCPKG_INSTALLED_DIR}>>:${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/bin>

cmake/libfmt.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ MACRO(BUNDLE_LIBFMT)
1515
ExternalProject_Add(
1616
libfmt
1717
PREFIX "${dir}"
18-
URL "https://github.com/fmtlib/fmt/releases/download/11.1.4/fmt-11.1.4.zip"
19-
URL_MD5 ad6a56b15cddf4aad2a234e7cfc9e8c9
18+
URL "https://github.com/fmtlib/fmt/releases/download/12.0.0/fmt-12.0.0.zip"
19+
URL_MD5 9bd04e6e8c5b1733e4eefb473604219d
2020
INSTALL_COMMAND ""
2121
CONFIGURE_COMMAND ""
2222
BUILD_COMMAND ""

debian/mariadb-server.links

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/usr/bin/dh-exec
2+
usr/lib/${DEB_HOST_MULTIARCH}/libmariadb3/plugin/caching_sha2_password.so usr/lib/mysql/plugin/caching_sha2_password.so
3+
usr/lib/${DEB_HOST_MULTIARCH}/libmariadb3/plugin/client_ed25519.so usr/lib/mysql/plugin/client_ed25519.so
4+
usr/lib/${DEB_HOST_MULTIARCH}/libmariadb3/plugin/dialog.so usr/lib/mysql/plugin/dialog.so
5+
usr/lib/${DEB_HOST_MULTIARCH}/libmariadb3/plugin/mysql_clear_password.so usr/lib/mysql/plugin/mysql_clear_password.so
6+
usr/lib/${DEB_HOST_MULTIARCH}/libmariadb3/plugin/sha256_password.so usr/lib/mysql/plugin/sha256_password.so

extra/innochecksum.cc

Lines changed: 140 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ The parts not included are excluded by #ifndef UNIV_INNOCHECKSUM. */
5151
#include "page0zip.h" /* page_zip_*() */
5252
#include "trx0undo.h" /* TRX_* */
5353
#include "fil0crypt.h" /* fil_space_verify_crypt_checksum */
54-
5554
#include <string.h>
5655

5756
#ifndef PRIuMAX
@@ -74,6 +73,8 @@ static ulint extent_size;
7473
static ulint xdes_size;
7574
ulong srv_page_size;
7675
uint32_t srv_page_size_shift;
76+
static uint32_t dblwr_1;
77+
static uint32_t dblwr_2;
7778
/* Current page number (0 based). */
7879
uint32_t cur_page_num;
7980
/* Current space. */
@@ -97,8 +98,10 @@ FILE* log_file = NULL;
9798
/* Enabled for log write option. */
9899
static bool is_log_enabled = false;
99100
static bool skip_freed_pages;
101+
static uint32_t tablespace_flags= 0;
100102
static byte field_ref_zero_buf[UNIV_PAGE_SIZE_MAX];
101103
const byte *field_ref_zero = field_ref_zero_buf;
104+
constexpr uint32_t USE_FSP_FLAGS{UINT32_MAX};
102105

103106
#ifndef _WIN32
104107
/* advisory lock for non-window system. */
@@ -253,12 +256,9 @@ void print_leaf_stats(
253256
}
254257

255258
/** Init the page size for the tablespace.
256-
@param[in] buf buffer used to read the page */
257-
static void init_page_size(const byte* buf)
259+
@param[in] flags InnoDB tablespace flags */
260+
static void init_page_size_from_flags(const uint32_t flags)
258261
{
259-
const unsigned flags = mach_read_from_4(buf + FIL_PAGE_DATA
260-
+ FSP_SPACE_FLAGS);
261-
262262
if (fil_space_t::full_crc32(flags)) {
263263
const uint32_t ssize = FSP_FLAGS_FCRC32_GET_PAGE_SSIZE(flags);
264264
srv_page_size_shift = UNIV_ZIP_SIZE_SHIFT_MIN - 1 + ssize;
@@ -540,24 +540,15 @@ static bool is_page_corrupted(byte *buf, bool is_encrypted, uint32_t flags)
540540
return(is_corrupted);
541541
}
542542

543-
/********************************************//*
544-
Check if page is doublewrite buffer or not.
545-
@param [in] page buffer page
546-
547-
@retval true if page is doublewrite buffer otherwise false.
548-
*/
549-
static
550-
bool
551-
is_page_doublewritebuffer(
552-
const byte* page)
543+
/** Check if page is doublewrite buffer or not.
544+
@retval true if page is doublewrite buffer otherwise false. */
545+
static bool is_page_doublewritebuffer()
553546
{
554-
if ((cur_page_num >= extent_size)
555-
&& (cur_page_num < extent_size * 3)) {
556-
/* page is doublewrite buffer. */
557-
return (true);
558-
}
559-
560-
return (false);
547+
if (cur_space != 0) return false;
548+
const uint32_t extent{static_cast<uint32_t>(
549+
cur_page_num & ~(extent_size - 1))};
550+
return cur_page_num > FSP_DICT_HDR_PAGE_NO &&
551+
extent && (extent == dblwr_1 || extent == dblwr_2);
561552
}
562553

563554
/*******************************************************//*
@@ -764,7 +755,7 @@ Parse the page and collect/dump the information about page type
764755
@param [in] file file for diagnosis.
765756
@param [in] is_encrypted tablespace is encrypted
766757
*/
767-
void
758+
static void
768759
parse_page(
769760
const byte* page,
770761
byte* xdes,
@@ -784,6 +775,12 @@ parse_page(
784775
str = skip_page ? "Double_write_buffer" : "-";
785776
page_no = mach_read_from_4(page + FIL_PAGE_OFFSET);
786777
if (skip_freed_pages) {
778+
779+
/** Skip doublewrite pages when -r is enabled */
780+
if (is_page_doublewritebuffer()) {
781+
return;
782+
}
783+
787784
const byte *des= xdes + XDES_ARR_OFFSET +
788785
xdes_size * ((page_no & (physical_page_size - 1))
789786
/ extent_size);
@@ -978,6 +975,18 @@ parse_page(
978975
fprintf(file, "#::" UINT32PF "\t\t|\t\tTransaction system "
979976
"page\t\t|\t%s\n", cur_page_num, str);
980977
}
978+
979+
if (cur_space == 0 &&
980+
(mach_read_from_4(page + TRX_SYS_DOUBLEWRITE +
981+
TRX_SYS_DOUBLEWRITE_MAGIC) ==
982+
TRX_SYS_DOUBLEWRITE_MAGIC_N)) {
983+
dblwr_1 = mach_read_from_4(
984+
page + TRX_SYS_DOUBLEWRITE +
985+
TRX_SYS_DOUBLEWRITE_BLOCK1);
986+
dblwr_2 = mach_read_from_4(
987+
page + TRX_SYS_DOUBLEWRITE +
988+
TRX_SYS_DOUBLEWRITE_BLOCK2);
989+
}
981990
break;
982991

983992
case FIL_PAGE_TYPE_FSP_HDR:
@@ -1220,6 +1229,9 @@ static struct my_option innochecksum_options[] = {
12201229
{"skip-freed-pages", 'r', "skip freed pages for the tablespace",
12211230
&skip_freed_pages, &skip_freed_pages, 0, GET_BOOL, NO_ARG,
12221231
0, 0, 0, 0, 0, 0},
1232+
{"tablespace-flags", 0, "InnoDB tablespace flags (default: 4294967295 "
1233+
"= read from page 0)", &tablespace_flags, &tablespace_flags, 0,
1234+
GET_UINT, REQUIRED_ARG, USE_FSP_FLAGS, 0, USE_FSP_FLAGS, 0, 0, 0},
12231235

12241236
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
12251237
};
@@ -1280,6 +1292,14 @@ innochecksum_get_one_option(
12801292
my_end(0);
12811293
exit(EXIT_SUCCESS);
12821294
break;
1295+
default:
1296+
if (tablespace_flags != USE_FSP_FLAGS &&
1297+
!fil_space_t::is_valid_flags(tablespace_flags, false) &&
1298+
!fil_space_t::is_valid_flags(tablespace_flags, true)) {
1299+
fprintf(stderr, "Error: Provided --tablespace-flags "
1300+
"is not valid.");
1301+
return true;
1302+
}
12831303
}
12841304

12851305
return(false);
@@ -1410,6 +1430,87 @@ rewrite_checksum(
14101430
&& !write_file(filename, fil_in, buf, flags, pos);
14111431
}
14121432

1433+
/** Read and validate page 0, then initialize tablespace flags
1434+
and page size.
1435+
@param fil_in File pointer
1436+
@param buf Buffer to read page into
1437+
@return whether the page was read successfully */
1438+
static bool read_and_validate_page0(FILE *fil_in, byte *buf)
1439+
{
1440+
/* Read the minimum page size first */
1441+
size_t initial_page_size= UNIV_ZIP_SIZE_MIN;
1442+
if (tablespace_flags != USE_FSP_FLAGS)
1443+
{
1444+
init_page_size_from_flags(tablespace_flags);
1445+
initial_page_size= physical_page_size;
1446+
}
1447+
1448+
/* Read just enough to get the tablespace flags */
1449+
size_t bytes= fread(buf, 1, initial_page_size, fil_in);
1450+
1451+
if (bytes != initial_page_size)
1452+
{
1453+
fprintf(stderr, "Error: Was not able to read the "
1454+
"minimum page size of %zu bytes. Bytes read "
1455+
"was %zu\n", initial_page_size, bytes);
1456+
return false;
1457+
}
1458+
1459+
/* Read space_id and page offset */
1460+
cur_space= mach_read_from_4(buf + FIL_PAGE_SPACE_ID);
1461+
cur_page_num= mach_read_from_4(buf + FIL_PAGE_OFFSET);
1462+
1463+
/* Get tablespace flags from the FSP header */
1464+
uint32_t flags= mach_read_from_4(buf + FSP_HEADER_OFFSET +
1465+
FSP_SPACE_FLAGS);
1466+
1467+
if (tablespace_flags != USE_FSP_FLAGS)
1468+
{
1469+
if (cur_page_num == 0 && flags != tablespace_flags)
1470+
fprintf(stderr, "Error: Mismatch between provided tablespace "
1471+
"flags (0x%x) and file flags (0x%x)\n",
1472+
tablespace_flags, flags);
1473+
}
1474+
else
1475+
{
1476+
if (cur_page_num)
1477+
{
1478+
fprintf(stderr, "Error: First page of the tablespace file "
1479+
"should be 0, but encountered page number %" PRIu32 ". "
1480+
"If you are checking multi file system "
1481+
"tablespace files, please specify the correct "
1482+
"tablespace flags using --tablespace-flags option.\n",
1483+
cur_page_num);
1484+
return false;
1485+
}
1486+
/* Initialize page size parameters based on flags */
1487+
init_page_size_from_flags(flags);
1488+
/* Read the rest of the page if it's larger than the minimum size */
1489+
if (physical_page_size > UNIV_ZIP_SIZE_MIN)
1490+
{
1491+
/* Read rest of the page 0 to determine crypt_data */
1492+
ulint bytes= read_file(buf, true, physical_page_size, fil_in);
1493+
if (bytes != physical_page_size)
1494+
{
1495+
fprintf(stderr, "Error: Was not able to read the rest of the "
1496+
"page of " ULINTPF " bytes. Bytes read was " ULINTPF "\n",
1497+
physical_page_size - UNIV_ZIP_SIZE_MIN, bytes);
1498+
return false;
1499+
}
1500+
}
1501+
tablespace_flags= flags;
1502+
}
1503+
1504+
if (physical_page_size < UNIV_ZIP_SIZE_MIN ||
1505+
physical_page_size > UNIV_PAGE_SIZE_MAX)
1506+
{
1507+
fprintf(stderr, "Error: Invalid page size " ULINTPF
1508+
" encountered\n", physical_page_size);
1509+
return false;
1510+
}
1511+
return true;
1512+
}
1513+
14131514
int main(
14141515
int argc,
14151516
char **argv)
@@ -1545,51 +1646,13 @@ int main(
15451646
}
15461647
}
15471648

1548-
/* Read the minimum page size. */
1549-
bytes = fread(buf, 1, UNIV_ZIP_SIZE_MIN, fil_in);
1550-
partial_page_read = true;
1551-
1552-
if (bytes != UNIV_ZIP_SIZE_MIN) {
1553-
fprintf(stderr, "Error: Was not able to read the "
1554-
"minimum page size ");
1555-
fprintf(stderr, "of %d bytes. Bytes read was " ULINTPF "\n",
1556-
UNIV_ZIP_SIZE_MIN, bytes);
1557-
1649+
/* Read and validate page 0 */
1650+
if (!read_and_validate_page0(fil_in, buf)) {
15581651
exit_status = 1;
15591652
goto my_exit;
15601653
}
15611654

1562-
/* enable variable is_system_tablespace when space_id of given
1563-
file is zero. Use to skip the checksum verification and rewrite
1564-
for doublewrite pages. */
1565-
cur_space = mach_read_from_4(buf + FIL_PAGE_SPACE_ID);
1566-
cur_page_num = mach_read_from_4(buf + FIL_PAGE_OFFSET);
1567-
1568-
/* Determine page size, zip_size and page compression
1569-
from fsp_flags and encryption metadata from page 0 */
1570-
init_page_size(buf);
1571-
1572-
uint32_t flags = mach_read_from_4(FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + buf);
1573-
1574-
if (physical_page_size == UNIV_ZIP_SIZE_MIN) {
1575-
partial_page_read = false;
1576-
} else {
1577-
/* Read rest of the page 0 to determine crypt_data */
1578-
bytes = read_file(buf, partial_page_read, physical_page_size, fil_in);
1579-
if (bytes != physical_page_size) {
1580-
fprintf(stderr, "Error: Was not able to read the "
1581-
"rest of the page ");
1582-
fprintf(stderr, "of " ULINTPF " bytes. Bytes read was " ULINTPF "\n",
1583-
physical_page_size - UNIV_ZIP_SIZE_MIN, bytes);
1584-
1585-
exit_status = 1;
1586-
goto my_exit;
1587-
}
1588-
partial_page_read = false;
1589-
}
1590-
1591-
1592-
/* Now that we have full page 0 in buffer, check encryption */
1655+
/* Check if tablespace is encrypted */
15931656
bool is_encrypted = check_encryption(filename, buf);
15941657

15951658
/* Verify page 0 contents. Note that we can't allow
@@ -1600,7 +1663,8 @@ int main(
16001663
allow_mismatches = 0;
16011664

16021665
exit_status = verify_checksum(buf, is_encrypted,
1603-
&mismatch_count, flags);
1666+
&mismatch_count,
1667+
tablespace_flags);
16041668

16051669
if (exit_status) {
16061670
fprintf(stderr, "Error: Page 0 checksum mismatch, can't continue. \n");
@@ -1611,7 +1675,8 @@ int main(
16111675

16121676
if ((exit_status = rewrite_checksum(
16131677
filename, fil_in, buf,
1614-
&pos, is_encrypted, flags))) {
1678+
&pos, is_encrypted,
1679+
tablespace_flags))) {
16151680
goto my_exit;
16161681
}
16171682

@@ -1807,7 +1872,7 @@ int main(
18071872
first_non_zero:
18081873
if (is_system_tablespace) {
18091874
/* enable when page is double write buffer.*/
1810-
skip_page = is_page_doublewritebuffer(buf);
1875+
skip_page = is_page_doublewritebuffer();
18111876
} else {
18121877
skip_page = false;
18131878
}
@@ -1828,13 +1893,16 @@ int main(
18281893
&& !is_page_free(xdes, physical_page_size, cur_page_num)
18291894
&& (exit_status = verify_checksum(
18301895
buf, is_encrypted,
1831-
&mismatch_count, flags))) {
1896+
&mismatch_count,
1897+
tablespace_flags))) {
18321898
goto my_exit;
18331899
}
18341900

1835-
if ((exit_status = rewrite_checksum(
1836-
filename, fil_in, buf,
1837-
&pos, is_encrypted, flags))) {
1901+
if (!is_page_doublewritebuffer() &&
1902+
(exit_status = rewrite_checksum(
1903+
filename, fil_in, buf,
1904+
&pos, is_encrypted,
1905+
tablespace_flags))) {
18381906
goto my_exit;
18391907
}
18401908

extra/perror.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,8 +353,13 @@ int main(int argc,char *argv[])
353353
{
354354
found= 1;
355355
if (verbose)
356+
{
357+
int hundred= code / 100;
356358
printf("MariaDB error code %3d (%s): %s\n"
357-
"Learn more: https://mariadb.com/kb/en/e%3d/\n", code, name, msg, code);
359+
"Learn more: https://mariadb.com/docs/server/reference/"
360+
"error-codes/mariadb-error-codes-%d00-to-%d99/e%3d\n",
361+
code, name, msg, hundred, hundred, code);
362+
}
358363
else
359364
puts(msg);
360365
}

0 commit comments

Comments
 (0)