mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MDEV-36684 - main.mdl_sync fails under valgrind (test for Bug#42643)
Valgrind is single threaded and only changes threads as part of system calls or waits. Some busy loops were identified and fixed where the server assumes that some other thread will change the state, which will not happen with valgrind. Based on patch by Monty. Original patch introduced VALGRIND_YIELD, which emits pthread_yield() only in valgrind builds. However it was agreed that it is a good idea to emit yield() unconditionally, such that other affected schedulers (like SCHED_FIFO) benefit from this change. Also avoid pthread_yield() in favour of standard std::this_thread::yield().
This commit is contained in:
@ -4460,6 +4460,7 @@ restart:
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
error= FALSE;
|
error= FALSE;
|
||||||
|
std::this_thread::yield();
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
goto error;
|
goto error;
|
||||||
@ -4522,6 +4523,7 @@ restart:
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
error= FALSE;
|
error= FALSE;
|
||||||
|
std::this_thread::yield();
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
/* Classes in mysql */
|
/* Classes in mysql */
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <thread>
|
||||||
#include "dur_prop.h"
|
#include "dur_prop.h"
|
||||||
#include <waiting_threads.h>
|
#include <waiting_threads.h>
|
||||||
#include "sql_const.h"
|
#include "sql_const.h"
|
||||||
|
@ -901,6 +901,7 @@ retry:
|
|||||||
{
|
{
|
||||||
mysql_mutex_unlock(&element->LOCK_table_share);
|
mysql_mutex_unlock(&element->LOCK_table_share);
|
||||||
lf_hash_search_unpin(thd->tdc_hash_pins);
|
lf_hash_search_unpin(thd->tdc_hash_pins);
|
||||||
|
std::this_thread::yield();
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
lf_hash_search_unpin(thd->tdc_hash_pins);
|
lf_hash_search_unpin(thd->tdc_hash_pins);
|
||||||
|
@ -1076,6 +1076,7 @@ static void trx_purge_close_tables(purge_node_t *node, THD *thd) noexcept
|
|||||||
|
|
||||||
void purge_sys_t::wait_FTS(bool also_sys)
|
void purge_sys_t::wait_FTS(bool also_sys)
|
||||||
{
|
{
|
||||||
|
std::this_thread::yield();
|
||||||
for (const uint32_t mask= also_sys ? ~0U : ~PAUSED_SYS; m_FTS_paused & mask;)
|
for (const uint32_t mask= also_sys ? ~0U : ~PAUSED_SYS; m_FTS_paused & mask;)
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user