From 4c0cc079c24d2ea7e47a18ccf746c8d4b63a424e Mon Sep 17 00:00:00 2001 From: Andrew Mayorov Date: Mon, 8 Apr 2024 13:25:45 +0200 Subject: [PATCH] fix(dsrepl): apply unnecessary rebalancing transitions cleanly --- .../src/emqx_ds_replication_layer_meta.erl | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/emqx_durable_storage/src/emqx_ds_replication_layer_meta.erl b/apps/emqx_durable_storage/src/emqx_ds_replication_layer_meta.erl index dca2442b8..97d4e7412 100644 --- a/apps/emqx_durable_storage/src/emqx_ds_replication_layer_meta.erl +++ b/apps/emqx_durable_storage/src/emqx_ds_replication_layer_meta.erl @@ -481,15 +481,19 @@ modify_db_sites_trans(DB, Modifications) -> case Sites of Sites0 -> ok; - _Chagned -> + _Changed -> assign_db_sites_trans(DB, Sites) end. update_replica_set_trans(DB, Shard, Trans) -> case mnesia:read(?SHARD_TAB, {DB, Shard}, write) of [Record = #?SHARD_TAB{replica_set = ReplicaSet0, target_set = TargetSet0}] -> + %% NOTE + %% It's possible to complete a transition that's no longer planned. We + %% should anticipate that we may stray _away_ from the target set. + TargetSet1 = emqx_maybe:define(TargetSet0, ReplicaSet0), ReplicaSet = apply_transition(Trans, ReplicaSet0), - case lists:usort(TargetSet0) of + case lists:usort(TargetSet1) of ReplicaSet -> TargetSet = undefined; TS ->