Fix deadlock in galeramon

The parameter extraction caused a recursive lock of the server
spinlock. To work around this, an unlocked version of server_get_parameter
is needed.

Ideally, a lock-free setup would be used but due to this being a bug fix,
it will have to be done later on.
This commit is contained in:
Markus Mäkelä
2018-05-11 09:00:54 +03:00
parent b776ed7821
commit 97eb7d2f9e
3 changed files with 28 additions and 15 deletions

View File

@ -695,7 +695,7 @@ static MXS_MONITORED_SERVER *get_candidate_master(MXS_MONITOR* mon)
moitor_servers->server->depth = 0;
char buf[50]; // Enough to hold most numbers
if (handle->use_priority && server_get_parameter(moitor_servers->server, "priority", buf, sizeof(buf)))
if (handle->use_priority && server_get_parameter_nolock(moitor_servers->server, "priority", buf, sizeof(buf)))
{
/** The server has a priority */
if ((currval = atoi(buf)) > 0)
@ -712,7 +712,7 @@ static MXS_MONITORED_SERVER *get_candidate_master(MXS_MONITOR* mon)
(!handle->use_priority || /** Server priority disabled*/
candidate_master == NULL || /** No candidate chosen */
/** Candidate has no priority */
!server_get_parameter(moitor_servers->server, "priority", buf, sizeof(buf))))
!server_get_parameter_nolock(moitor_servers->server, "priority", buf, sizeof(buf))))
{
if (min_id < 0 || moitor_servers->server->node_id < min_id)
{
@ -848,7 +848,7 @@ static void update_sst_donor_nodes(MXS_MONITOR *mon, int is_cluster)
*/
if (handle->use_priority &&
server_get_parameter(ptr->server, "priority", NULL, 0))
server_get_parameter_nolock(ptr->server, "priority", NULL, 0))
{
ignore_priority = false;
}
@ -983,8 +983,8 @@ static int compare_node_priority (const void *a, const void *b)
const MXS_MONITORED_SERVER *s_b = *(MXS_MONITORED_SERVER * const *)b;
char pri_a[50];
char pri_b[50];
bool have_a = server_get_parameter(s_a->server, "priority", pri_a, sizeof(pri_a));
bool have_b = server_get_parameter(s_b->server, "priority", pri_b, sizeof(pri_b));
bool have_a = server_get_parameter_nolock(s_a->server, "priority", pri_a, sizeof(pri_a));
bool have_b = server_get_parameter_nolock(s_b->server, "priority", pri_b, sizeof(pri_b));
/**
* Check priority parameter: