diff options
author | Kristian Nielsen <knielsen@knielsen-hq.org> | 2015-05-26 15:03:22 +0200 |
---|---|---|
committer | Kristian Nielsen <knielsen@knielsen-hq.org> | 2015-05-26 15:03:22 +0200 |
commit | 903f8dc72d3b8c8036bb8fbeec51d503b732b4cf (patch) | |
tree | 35028f97c96a903f7af2c63d6441babf49e51879 /sql/rpl_parallel.cc | |
parent | 5bd25a9c530dc5d059f6153abf36639c0e213cb0 (diff) | |
parent | e5f1e841dc32ccb8e8630876e8073efd778d3efd (diff) | |
download | mariadb-git-903f8dc72d3b8c8036bb8fbeec51d503b732b4cf.tar.gz |
Merge MDEV-8147 into 10.1
Diffstat (limited to 'sql/rpl_parallel.cc')
-rw-r--r-- | sql/rpl_parallel.cc | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc index 35c8be2c3d3..29a87cc627b 100644 --- a/sql/rpl_parallel.cc +++ b/sql/rpl_parallel.cc @@ -167,6 +167,8 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id, done and also no longer need waiting for. */ entry->last_committed_sub_id= sub_id; + if (entry->need_sub_id_signal) + mysql_cond_broadcast(&entry->COND_parallel_entry); /* Now free any GCOs in which all transactions have committed. */ group_commit_orderer *tmp_gco= rgi->gco; @@ -1928,26 +1930,29 @@ rpl_parallel::wait_for_workers_idle(THD *thd) max_i= domain_hash.records; for (i= 0; i < max_i; ++i) { - bool active; - wait_for_commit my_orderer; + PSI_stage_info old_stage; struct rpl_parallel_entry *e; + int err= 0; e= (struct rpl_parallel_entry *)my_hash_element(&domain_hash, i); mysql_mutex_lock(&e->LOCK_parallel_entry); - if ((active= (e->current_sub_id > e->last_committed_sub_id))) - { - wait_for_commit *waitee= &e->current_group_info->commit_orderer; - my_orderer.register_wait_for_prior_commit(waitee); - thd->wait_for_commit_ptr= &my_orderer; - } - mysql_mutex_unlock(&e->LOCK_parallel_entry); - if (active) + e->need_sub_id_signal= true; + thd->ENTER_COND(&e->COND_parallel_entry, &e->LOCK_parallel_entry, + &stage_waiting_for_workers_idle, &old_stage); + while (e->current_sub_id > e->last_committed_sub_id) { - int err= my_orderer.wait_for_prior_commit(thd); - thd->wait_for_commit_ptr= NULL; - if (err) - return err; + if (thd->check_killed()) + { + thd->send_kill_message(); + err= 1; + break; + } + mysql_cond_wait(&e->COND_parallel_entry, &e->LOCK_parallel_entry); } + e->need_sub_id_signal= false; + thd->EXIT_COND(&old_stage); + if (err) + return err; } return 0; } |