Commit e22a57da authored by Andrei's avatar Andrei

MDEV-30620 Trying to lock uninitialized LOCK_parallel_entry

The error was seen by a number of mtr tests being caused
by overdue initialization of rpl_parallel::LOCK_parallel_entry.
Specifically, SHOW-SLAVE-STATUS might find in
rpl_parallel::workers_idle() a gtid domain hash entry
already inserted whose mutex had not done
mysql_mutex_init().

Fixed with swapping the mutex init and the its entry's stack insertion.

Tested with a generous number of `mtr --repeat` of a few of the reported
to fail tests, incl rpl.parallel_backup.
parent a72b2c3f
...@@ -2312,14 +2312,16 @@ rpl_parallel::find(uint32 domain_id) ...@@ -2312,14 +2312,16 @@ rpl_parallel::find(uint32 domain_id)
e->domain_id= domain_id; e->domain_id= domain_id;
e->stop_on_error_sub_id= (uint64)ULONGLONG_MAX; e->stop_on_error_sub_id= (uint64)ULONGLONG_MAX;
e->pause_sub_id= (uint64)ULONGLONG_MAX; e->pause_sub_id= (uint64)ULONGLONG_MAX;
mysql_mutex_init(key_LOCK_parallel_entry, &e->LOCK_parallel_entry,
MY_MUTEX_INIT_FAST);
mysql_cond_init(key_COND_parallel_entry, &e->COND_parallel_entry, NULL);
if (my_hash_insert(&domain_hash, (uchar *)e)) if (my_hash_insert(&domain_hash, (uchar *)e))
{ {
mysql_cond_destroy(&e->COND_parallel_entry);
mysql_mutex_destroy(&e->LOCK_parallel_entry);
my_free(e); my_free(e);
return NULL; return NULL;
} }
mysql_mutex_init(key_LOCK_parallel_entry, &e->LOCK_parallel_entry,
MY_MUTEX_INIT_FAST);
mysql_cond_init(key_COND_parallel_entry, &e->COND_parallel_entry, NULL);
} }
else else
e->force_abort= false; e->force_abort= false;
......
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