Fix redundant ER_PRIOR_COMMIT_FAILED in parallel replication
wait_for_prior_commit() can be called multiple times per event group, only do my_error() the first time the call fails. Remove redundant set_overwrite_status() calls. Signed-off-by: Kristian Nielsen <knielsen@knielsen-hq.org> Reviewed-by: Monty <monty@mariadb.org>
This commit is contained in:
parent
eef94c9d46
commit
2641409731
@ -157,8 +157,6 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id,
|
|||||||
wait_for_commit *wfc= &rgi->commit_orderer;
|
wait_for_commit *wfc= &rgi->commit_orderer;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
thd->get_stmt_da()->set_overwrite_status(true);
|
|
||||||
|
|
||||||
if (unlikely(rgi->worker_error))
|
if (unlikely(rgi->worker_error))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -317,10 +315,6 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id,
|
|||||||
wait_for_pending_deadlock_kill(thd, rgi);
|
wait_for_pending_deadlock_kill(thd, rgi);
|
||||||
thd->clear_error();
|
thd->clear_error();
|
||||||
thd->reset_killed();
|
thd->reset_killed();
|
||||||
/*
|
|
||||||
Would do thd->get_stmt_da()->set_overwrite_status(false) here, but
|
|
||||||
reset_diagnostics_area() already does that.
|
|
||||||
*/
|
|
||||||
thd->get_stmt_da()->reset_diagnostics_area();
|
thd->get_stmt_da()->reset_diagnostics_area();
|
||||||
wfc->wakeup_subsequent_commits(rgi->worker_error);
|
wfc->wakeup_subsequent_commits(rgi->worker_error);
|
||||||
}
|
}
|
||||||
@ -1567,9 +1561,7 @@ handle_rpl_parallel_thread(void *arg)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
delete qev->ev;
|
delete qev->ev;
|
||||||
thd->get_stmt_da()->set_overwrite_status(true);
|
|
||||||
err= thd->wait_for_prior_commit();
|
err= thd->wait_for_prior_commit();
|
||||||
thd->get_stmt_da()->set_overwrite_status(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
end_of_group=
|
end_of_group=
|
||||||
|
@ -8365,6 +8365,24 @@ end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
wait_for_commit::prior_commit_error(THD *thd)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Only raise a "prior commit failed" error if we didn't already raise
|
||||||
|
an error.
|
||||||
|
|
||||||
|
The ER_PRIOR_COMMIT_FAILED is just an internal mechanism to ensure that a
|
||||||
|
transaction does not commit successfully if a prior commit failed, so that
|
||||||
|
the parallel replication worker threads stop in an orderly fashion when
|
||||||
|
one of them get an error. Thus, if another worker already got another real
|
||||||
|
error, overriding it with ER_PRIOR_COMMIT_FAILED is not useful.
|
||||||
|
*/
|
||||||
|
if (!thd->get_stmt_da()->is_set())
|
||||||
|
my_error(ER_PRIOR_COMMIT_FAILED, MYF(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Wakeup anyone waiting for us to have committed.
|
Wakeup anyone waiting for us to have committed.
|
||||||
|
|
||||||
|
@ -2398,8 +2398,8 @@ struct wait_for_commit
|
|||||||
return wait_for_prior_commit2(thd, allow_kill);
|
return wait_for_prior_commit2(thd, allow_kill);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (wakeup_error)
|
if (unlikely(wakeup_error))
|
||||||
my_error(ER_PRIOR_COMMIT_FAILED, MYF(0));
|
prior_commit_error(thd);
|
||||||
return wakeup_error;
|
return wakeup_error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2450,6 +2450,7 @@ struct wait_for_commit
|
|||||||
void wakeup(int wakeup_error);
|
void wakeup(int wakeup_error);
|
||||||
|
|
||||||
int wait_for_prior_commit2(THD *thd, bool allow_kill);
|
int wait_for_prior_commit2(THD *thd, bool allow_kill);
|
||||||
|
void prior_commit_error(THD *thd);
|
||||||
void wakeup_subsequent_commits2(int wakeup_error);
|
void wakeup_subsequent_commits2(int wakeup_error);
|
||||||
void unregister_wait_for_prior_commit2();
|
void unregister_wait_for_prior_commit2();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user