mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
MDEV-7825: Parallel replication race condition on gco->flags, possibly resulting in slave hang
The patch for optimistic parallel replication as a memory optimisation moved the gco->installed field into a bit in gco->flags. However, that is just plain wrong. The gco->flags field is owned by the SQL driver thread, but gco->installed is used by the worker threads, so this will cause a race condition. The user-visible problem might be conflicts between transactions and/or slave threads hanging. So revert this part of the optimistic parallel replication patch, going back to using a separate field gco->installed like in 10.0.
This commit is contained in:
@ -66,7 +66,8 @@ struct group_commit_orderer {
|
||||
This flag is set when this GCO has been installed into the next_gco pointer
|
||||
of the previous GCO.
|
||||
*/
|
||||
static const uint8 INSTALLED = 0x01;
|
||||
bool installed;
|
||||
|
||||
/*
|
||||
This flag is set for a GCO in which we have event groups with multiple
|
||||
different commit_id values from the master. This happens when we
|
||||
@ -77,13 +78,13 @@ struct group_commit_orderer {
|
||||
of current commit_id, as DDL is not safe to speculatively apply in parallel
|
||||
with prior event groups.
|
||||
*/
|
||||
static const uint8 MULTI_BATCH = 0x02;
|
||||
static const uint8 MULTI_BATCH = 0x01;
|
||||
/*
|
||||
This flag is set for a GCO that contains DDL. If set, it forces a switch to
|
||||
a new GCO upon seeing a new commit_id, as DDL is not safe to speculatively
|
||||
replicate in parallel with subsequent transactions.
|
||||
*/
|
||||
static const uint8 FORCE_SWITCH = 0x04;
|
||||
static const uint8 FORCE_SWITCH = 0x02;
|
||||
uint8 flags;
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user