@@ -259,11 +259,14 @@ start_cluster(Q) ->
259259 NewQ1 = amqqueue :set_type_state (NewQ0 ,
260260 #{nodes => [LeaderNode | FollowerNodes ]}),
261261
262+ Versions = erpc :multicall (FollowerNodes , rabbit_fifo , version , []),
263+ MinVersion = lists :min ([rabbit_fifo :version () | Versions ]),
264+
262265 rabbit_log :debug (" Will start up to ~w replicas for quorum ~ts with leader on node '~ts '" ,
263266 [QuorumSize , rabbit_misc :rs (QName ), LeaderNode ]),
264267 case rabbit_amqqueue :internal_declare (NewQ1 , false ) of
265268 {created , NewQ } ->
266- RaConfs = [make_ra_conf (NewQ , ServerId )
269+ RaConfs = [make_ra_conf (NewQ , ServerId , voter , MinVersion )
267270 || ServerId <- members (NewQ )],
268271
269272 % % khepri projections on remote nodes are eventually consistent
@@ -544,6 +547,10 @@ spawn_deleter(QName) ->
544547 delete (Q , false , false , <<" expired" >>)
545548 end ).
546549
550+ spawn_notify_decorators (QName , startup = Fun , Args ) ->
551+ spawn (fun () ->
552+ notify_decorators (QName , Fun , Args )
553+ end );
547554spawn_notify_decorators (QName , Fun , Args ) ->
548555 % % run in ra process for now
549556 catch notify_decorators (QName , Fun , Args ).
@@ -1339,7 +1346,9 @@ add_member(Q, Node, Membership, Timeout) when ?amqqueue_is_quorum(Q) ->
13391346 % % TODO parallel calls might crash this, or add a duplicate in quorum_nodes
13401347 ServerId = {RaName , Node },
13411348 Members = members (Q ),
1342- Conf = make_ra_conf (Q , ServerId , Membership ),
1349+
1350+ MachineVersion = erpc :call (Node , rabbit_fifo , version , []),
1351+ Conf = make_ra_conf (Q , ServerId , Membership , MachineVersion ),
13431352 case ra :start_server (? RA_SYSTEM , Conf ) of
13441353 ok ->
13451354 ServerIdSpec =
@@ -1912,9 +1921,9 @@ format_ra_event(ServerId, Evt, QRef) ->
19121921 {'$gen_cast' , {queue_event , QRef , {ServerId , Evt }}}.
19131922
19141923make_ra_conf (Q , ServerId ) ->
1915- make_ra_conf (Q , ServerId , voter ).
1924+ make_ra_conf (Q , ServerId , voter , rabbit_fifo : version () ).
19161925
1917- make_ra_conf (Q , ServerId , Membership ) ->
1926+ make_ra_conf (Q , ServerId , Membership , MacVersion ) ->
19181927 TickTimeout = application :get_env (rabbit , quorum_tick_interval ,
19191928 ? TICK_INTERVAL ),
19201929 SnapshotInterval = application :get_env (rabbit , quorum_snapshot_interval ,
@@ -1923,10 +1932,12 @@ make_ra_conf(Q, ServerId, Membership) ->
19231932 quorum_min_checkpoint_interval ,
19241933 ? MIN_CHECKPOINT_INTERVAL ),
19251934 make_ra_conf (Q , ServerId , TickTimeout ,
1926- SnapshotInterval , CheckpointInterval , Membership ).
1935+ SnapshotInterval , CheckpointInterval ,
1936+ Membership , MacVersion ).
19271937
19281938make_ra_conf (Q , ServerId , TickTimeout ,
1929- SnapshotInterval , CheckpointInterval , Membership ) ->
1939+ SnapshotInterval , CheckpointInterval ,
1940+ Membership , MacVersion ) ->
19301941 QName = amqqueue :get_name (Q ),
19311942 RaMachine = ra_machine (Q ),
19321943 [{ClusterName , _ } | _ ] = Members = members (Q ),
@@ -1947,6 +1958,7 @@ make_ra_conf(Q, ServerId, TickTimeout,
19471958 log_init_args => LogCfg ,
19481959 tick_timeout => TickTimeout ,
19491960 machine => RaMachine ,
1961+ initial_machine_version => MacVersion ,
19501962 ra_event_formatter => Formatter }).
19511963
19521964make_mutable_config (Q ) ->
0 commit comments