[Tarantool-patches] [PATCH v8 1/2] applier: filter incoming synchro packets via transaction initiator
Serge Petrenko
sergepetrenko at tarantool.org
Tue Jun 15 14:55:04 MSK 2021
15.06.2021 14:35, Serge Petrenko via Tarantool-patches пишет:
>
>
> 11.06.2021 18:22, Cyrill Gorcunov пишет:
>> Currently we use synchro packets filtration based on their contents,
>> in particular by their xrow->replica_id value. Still there was a
>> question if we can optimize this moment and rather filter out all
>> packets coming from non-leader replica.
>>
>> Raft specification requires that only data from a current leader
>> should be applied to local WAL but doesn't put a concrete claim on
>> the data transport, ie how exactly rows are reaching replicas. This
>> implies that data propagation may reach replicas indirectly via transit
>> hops. Thus we drop applier->instance_id filtering and rely on
>> xrow->replica_id matching instead.
>>
>> In the test (inspired by Serge Petrenko's test) we recreate the
>> situation
>> where replica3 obtains master's node data (which is a raft leader)
>> indirectly via replica2 node.
>>
>> Closes #6035
>>
>> Signed-off-by: Cyrill Gorcunov <gorcunov at gmail.com>
>> ---
>>
>
> I've found a way to make the test work as discussed: replication 1 <->
> 2 -> 3 from
> the beginning. Without replication reconfiguration. Take a look at the
> diff below.
>
> Although the diff doesn't simplify anything, and it makes the test
> run longer: 2.5 s vs 0.8 s
> on my machine. So it's up to you whether you want to apply it.
>
> I'm starting to like your test version more, to be honest.
>
>
> Here's the diff:
Pushed the diff on top of your branch as a separate commit.
> =================================================
>
> diff --git a/test/replication/gh-6035-applier-filter.result
> b/test/replication/gh-6035-applier-filter.result
> index 077cd46e5..4ddebcc6b 100644
> --- a/test/replication/gh-6035-applier-filter.result
> +++ b/test/replication/gh-6035-applier-filter.result
> @@ -31,7 +31,7 @@ test_run:cmd('create server replica2 with
> script="replication/gh-6035-replica2.l
> | - true
> | ...
>
> -test_run:cmd('start server master')
> +test_run:cmd('start server master with wait=False')
> | ---
> | - true
> | ...
> @@ -44,25 +44,24 @@ test_run:cmd('start server replica2')
> | - true
> | ...
>
> -test_run:switch('replica2')
> +--
> +-- Make the master to be RAFT leader.
> +test_run:switch('replica1')
> | ---
> | - true
> | ...
> -box.cfg{replication = {require('fio').cwd() .. "/replica1.sock"}}
> +box.cfg{election_mode = 'voter'}
> | ---
> | ...
>
> ---
> --- Make the master to be RAFT leader.
> test_run:switch('master')
> | ---
> | - true
> | ...
> +test_run:wait_lsn('master', 'replica1')
> + | ---
> + | ...
> box.cfg({ \
> - replication = { \
> - require('fio').cwd() .. "/master.sock", \
> - require('fio').cwd() .. "/replica1.sock", \
> - }, \
> replication_synchro_quorum = 2, \
> election_mode = 'manual', \
> })
> diff --git a/test/replication/gh-6035-applier-filter.test.lua
> b/test/replication/gh-6035-applier-filter.test.lua
> index 4e72abe5f..4ec7a6e6a 100644
> --- a/test/replication/gh-6035-applier-filter.test.lua
> +++ b/test/replication/gh-6035-applier-filter.test.lua
> @@ -19,21 +19,18 @@ test_run:cmd('create server master with
> script="replication/gh-6035-master.lua"'
> test_run:cmd('create server replica1 with
> script="replication/gh-6035-replica1.lua"')
> test_run:cmd('create server replica2 with
> script="replication/gh-6035-replica2.lua"')
>
> -test_run:cmd('start server master')
> +test_run:cmd('start server master with wait=False')
> test_run:cmd('start server replica1')
> test_run:cmd('start server replica2')
>
> -test_run:switch('replica2')
> -box.cfg{replication = {require('fio').cwd() .. "/replica1.sock"}}
> -
> --
> -- Make the master to be RAFT leader.
> +test_run:switch('replica1')
> +box.cfg{election_mode = 'voter'}
> +
> test_run:switch('master')
> +test_run:wait_lsn('master', 'replica1')
> box.cfg({ \
> - replication = { \
> - require('fio').cwd() .. "/master.sock", \
> - require('fio').cwd() .. "/replica1.sock", \
> - }, \
> replication_synchro_quorum = 2, \
> election_mode = 'manual', \
> })
> diff --git a/test/replication/gh-6035-node.lua
> b/test/replication/gh-6035-node.lua
> index e3819471a..4ed41b3cf 100644
> --- a/test/replication/gh-6035-node.lua
> +++ b/test/replication/gh-6035-node.lua
> @@ -10,6 +10,10 @@ require('console').listen(os.getenv('ADMIN'))
> if INSTANCE_ID == "master" then
> box.cfg({
> listen = unix_socket("master"),
> + replication = {
> + unix_socket("master"),
> + unix_socket("replica1")
> + },
> })
> elseif INSTANCE_ID == "replica1" then
> box.cfg({
> @@ -18,13 +22,12 @@ elseif INSTANCE_ID == "replica1" then
> unix_socket("master"),
> unix_socket("replica1")
> },
> - election_mode = 'voter'
> })
> else
> assert(INSTANCE_ID == "replica2")
> box.cfg({
> replication = {
> - unix_socket("master"),
> + unix_socket("replica1"),
> },
> election_mode = 'voter'
> })
>
>
> ====================================================
>
--
Serge Petrenko
More information about the Tarantool-patches
mailing list