From 0119728d451e4fdb1d113327c1e4714a0ec04efa Mon Sep 17 00:00:00 2001 From: Andrew Mayorov Date: Thu, 16 May 2024 18:56:21 +0200 Subject: [PATCH] feat(dsrepl): also reflect pending transitions in ds status --- .../src/emqx_ds_replication_layer_meta.erl | 49 ++++++++++++++++--- 1 file changed, 43 insertions(+), 6 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 71c25c97e..481a47ca1 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 @@ -195,22 +195,51 @@ print_status() -> end, eval_qlc(mnesia:table(?NODE_TAB)) ), + Shards = eval_qlc(mnesia:table(?SHARD_TAB)), io:format( "~nSHARDS:~n~s~s~n", - [string:pad("Id", 30), "Replicas"] + [string:pad("Shard", 30), "Replicas"] ), lists:foreach( - fun(#?SHARD_TAB{shard = {DB, Shard}, replica_set = RS}) -> - ShardStr = io_lib:format("~p/~s", [DB, Shard]), + fun(#?SHARD_TAB{shard = DBShard, replica_set = RS}) -> + ShardStr = format_shard(DBShard), ReplicasStr = string:join([format_replica(R) || R <- RS], " "), io:format( "~s~s~n", [string:pad(ShardStr, 30), ReplicasStr] ) end, - eval_qlc(mnesia:table(?SHARD_TAB)) + Shards + ), + PendingTransitions = lists:filtermap( + fun(Record = #?SHARD_TAB{shard = DBShard}) -> + case compute_transitions(Record) of + [] -> false; + Transitions -> {true, {DBShard, Transitions}} + end + end, + Shards + ), + PendingTransitions /= [] andalso + io:format( + "~nREPLICA TRANSITIONS:~n~s~s~n", + [string:pad("Shard", 30), "Transitions"] + ), + lists:foreach( + fun({DBShard, Transitions}) -> + ShardStr = format_shard(DBShard), + TransStr = string:join(lists:map(fun format_transition/1, Transitions), " "), + io:format( + "~s~s~n", + [string:pad(ShardStr, 30), TransStr] + ) + end, + PendingTransitions ). +format_shard({DB, Shard}) -> + io_lib:format("~p/~s", [DB, Shard]). + format_replica(Site) -> Marker = case mria:cluster_status(?MODULE:node(Site)) of @@ -220,6 +249,11 @@ format_replica(Site) -> end, io_lib:format("~s ~s", [Marker, Site]). +format_transition({add, Site}) -> + io_lib:format("+~s", [Site]); +format_transition({del, Site}) -> + io_lib:format("-~s", [Site]). + -spec this_site() -> site(). this_site() -> persistent_term:get(?emqx_ds_builtin_site). @@ -353,8 +387,8 @@ db_sites(DB) -> [transition()] | undefined. replica_set_transitions(DB, Shard) -> case mnesia:dirty_read(?SHARD_TAB, {DB, Shard}) of - [#?SHARD_TAB{target_set = TargetSet, replica_set = ReplicaSet}] -> - compute_transitions(TargetSet, ReplicaSet); + [Record] -> + compute_transitions(Record); [] -> undefined end. @@ -706,6 +740,9 @@ compute_allocation(Shards, Sites, Opts) -> ), Allocation. +compute_transitions(#?SHARD_TAB{target_set = TargetSet, replica_set = ReplicaSet}) -> + compute_transitions(TargetSet, ReplicaSet). + compute_transitions(undefined, _ReplicaSet) -> []; compute_transitions(TargetSet, ReplicaSet) ->