From b4f4e936b25f04cc0d71e997fac8ce7b78dffd5f Mon Sep 17 00:00:00 2001 From: Karl Nilsson Date: Thu, 11 Jul 2024 11:12:37 +0100 Subject: [PATCH] Ensure cluster_index_term is updated after snapshot installation. If the snapshot contained a member change it may not update the leaderboard correctly. --- src/ra_server.erl | 3 +++ src/ra_server_sup_sup.erl | 1 + test/ra_2_SUITE.erl | 4 ++++ test/ra_server_SUITE.erl | 1 + 4 files changed, 9 insertions(+) diff --git a/src/ra_server.erl b/src/ra_server.erl index be4d0893..b301d1da 100644 --- a/src/ra_server.erl +++ b/src/ra_server.erl @@ -1384,6 +1384,9 @@ handle_receive_snapshot(#install_snapshot_rpc{term = Term, log => Log, commit_index => SnapIndex, last_applied => SnapIndex, + %% this may not be the actual cluster index + cluster_index_term => {SnapIndex, + SnapTerm}, cluster => make_cluster(Id, ClusterIds), membership => get_membership(ClusterIds, State0), machine_state => MacState}), diff --git a/src/ra_server_sup_sup.erl b/src/ra_server_sup_sup.erl index c96f152e..855af650 100644 --- a/src/ra_server_sup_sup.erl +++ b/src/ra_server_sup_sup.erl @@ -166,6 +166,7 @@ delete_server_rpc(System, RaName) -> catch ets:delete(ra_state, RaName), catch ets:delete(ra_open_file_metrics, Pid), catch ra_counters:delete({RaName, node()}), + catch ra_leaderboard:clear(RaName), ok end. diff --git a/test/ra_2_SUITE.erl b/test/ra_2_SUITE.erl index 8468ca41..8dc869e0 100644 --- a/test/ra_2_SUITE.erl +++ b/test/ra_2_SUITE.erl @@ -157,9 +157,13 @@ server_is_force_deleted(Config) -> % force roll over ok = force_roll_over(), Pid = ra_directory:where_is(?SYS, UId), + {Name, _} = ServerId, + ?assertEqual(ServerId, ra_leaderboard:lookup_leader(Name)), ok = ra:force_delete_server(?SYS, ServerId), validate_ets_table_deletes([UId], [Pid], [ServerId]), + ?assertEqual(undefined, ra_leaderboard:lookup_leader(Name)), + ct:pal("ra_leaderboard overview ~p", [ra_leaderboard:overview()]), % start a node with the same nodeid but different uid % simulating the case where a queue got deleted then re-declared shortly % afterwards diff --git a/test/ra_server_SUITE.erl b/test/ra_server_SUITE.erl index 89113683..321e45ce 100644 --- a/test/ra_server_SUITE.erl +++ b/test/ra_server_SUITE.erl @@ -1489,6 +1489,7 @@ follower_install_snapshot_machine_version(_Config) -> effective_machine_module = MacMod1, effective_machine_version = 1}, last_applied := 4, + cluster_index_term := {4, 5}, machine_state := SnapData, %% old machine state commit_index := 4}, _} = ra_server:handle_receive_snapshot(ISR, State0),