Commit f027c121 authored by Vladislav Vaintroub's avatar Vladislav Vaintroub

MDEV-28471 mysql_install_db.exe does not work with --innodb-page-size=64K

The error message "InnoDB: innodb_page_size=65536 requires innodb_buffer_pool_size >= 20MiB current 10MiB" is the relevant one.

The root cause:
mysql_install_db bootstraps with --innodb-buffer-pool-size=10M.
Small bufferpool is here by design - bootstrap should succeed,
even if there is not much RAM available, bootstrap does not need that much
memory.

For pagesize 64K specifically, Innodb thinks it needs a larger bufferpool,
and thus it lets the bootstrap process die (although the expected behavior
in this case would be to adjust value, give warning and continue)

The workaround:
- pass --innodb-buffer-pool-size=20M, which is suitable for all page sizes.
- check the same limit in MSI custom action.

Also, the patch adds mtr test for 64K page size.
parent c1063a1b
...@@ -42,6 +42,13 @@ remove_file $log; ...@@ -42,6 +42,13 @@ remove_file $log;
rmdir $ddir; rmdir $ddir;
# MDEV-28471 - mysql_install_db.exe fails with --innodb-page-size=64K
--disable_result_log
exec $MYSQL_INSTALL_DB_EXE --datadir=$ddir --password=foo -R --innodb-page-size=64K --verbose
--enable_result_log
rmdir $ddir;
# Tests with config file
let $restart_parameters=; let $restart_parameters=;
connection default; connection default;
......
...@@ -333,7 +333,7 @@ static char *init_bootstrap_command_line(char *cmdline, size_t size) ...@@ -333,7 +333,7 @@ static char *init_bootstrap_command_line(char *cmdline, size_t size)
" %s" " %s"
" --bootstrap" " --bootstrap"
" --datadir=." " --datadir=."
" --loose-innodb-buffer-pool-size=10M" " --loose-innodb-buffer-pool-size=20M"
"\"" "\""
, mysqld_path, opt_verbose_bootstrap ? "--console" : ""); , mysqld_path, opt_verbose_bootstrap ? "--console" : "");
return cmdline; return cmdline;
......
...@@ -663,6 +663,12 @@ unsigned long long GetMaxBufferSize(unsigned long long totalPhys) ...@@ -663,6 +663,12 @@ unsigned long long GetMaxBufferSize(unsigned long long totalPhys)
} }
/*
Magic undocumented number for bufferpool minimum,
allows innodb to start also for all page sizes.
*/
static constexpr unsigned long long minBufferpoolMB= 20;
/* /*
Checks SERVICENAME, PORT and BUFFERSIZE parameters Checks SERVICENAME, PORT and BUFFERSIZE parameters
*/ */
...@@ -791,34 +797,37 @@ extern "C" UINT __stdcall CheckDatabaseProperties (MSIHANDLE hInstall) ...@@ -791,34 +797,37 @@ extern "C" UINT __stdcall CheckDatabaseProperties (MSIHANDLE hInstall)
unsigned long long availableMemory= unsigned long long availableMemory=
GetMaxBufferSize(memstatus.ullTotalPhys)/ONE_MB; GetMaxBufferSize(memstatus.ullTotalPhys)/ONE_MB;
swprintf_s(invalidValueMsg, swprintf_s(invalidValueMsg,
L"Invalid buffer pool size. Please use a number between 1 and %llu", L"Invalid buffer pool size. Please use a number between %llu and %llu",
availableMemory); minBufferpoolMB, availableMemory);
if(BufferPoolSizeLen == 0 || BufferPoolSizeLen > 15) if (BufferPoolSizeLen == 0 || BufferPoolSizeLen > 15 || !BufferPoolSize[0])
{
ErrorMsg= invalidValueMsg;
goto LExit;
}
for (DWORD i=0; i < BufferPoolSizeLen && BufferPoolSize[BufferPoolSizeLen];
i++)
{
if(BufferPoolSize[i]< '0' || BufferPoolSize[i] > '9')
{ {
ErrorMsg= invalidValueMsg; ErrorMsg= invalidValueMsg;
goto LExit; goto LExit;
} }
}
BufferPoolSize[BufferPoolSizeLen]=0; BufferPoolSize[BufferPoolSizeLen]=0;
MsiSetPropertyW(hInstall, L"BUFFERPOOLSIZE", BufferPoolSize); MsiSetPropertyW(hInstall, L"BUFFERPOOLSIZE", BufferPoolSize);
long long sz = _wtoi64(BufferPoolSize); wchar_t *end;
if(sz <= 0 || sz > (long long)availableMemory) unsigned long long sz = wcstoull(BufferPoolSize, &end, 10);
if (sz > availableMemory || sz < minBufferpoolMB || *end)
{ {
if(sz > 0) if (*end == 0)
{
if(sz > availableMemory)
{ {
swprintf_s(invalidValueMsg, swprintf_s(invalidValueMsg,
L"Value for buffer pool size is too large." L"Value for buffer pool size is too large."
L"Only approximately %llu MB is available for allocation." L"Only approximately %llu MB is available for allocation."
L"Please use a number between 1 and %llu.", L"Please use a number between %llu and %llu.",
availableMemory, availableMemory); availableMemory, minBufferpoolMB, availableMemory);
}
else if(sz < minBufferpoolMB)
{
swprintf_s(invalidValueMsg,
L"Value for buffer pool size is too small."
L"Please use a number between %llu and %llu.",
minBufferpoolMB, availableMemory);
}
} }
ErrorMsg= invalidValueMsg; ErrorMsg= invalidValueMsg;
goto LExit; goto LExit;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment