feat(dsrepl): also reflect pending transitions in ds status

This commit is contained in:
Andrew Mayorov 2024-05-16 18:56:21 +02:00
parent 26c4a4f597
commit 0119728d45
No known key found for this signature in database
GPG Key ID: 2837C62ACFBFED5D
1 changed files with 43 additions and 6 deletions

View File

@ -195,22 +195,51 @@ print_status() ->
end, end,
eval_qlc(mnesia:table(?NODE_TAB)) eval_qlc(mnesia:table(?NODE_TAB))
), ),
Shards = eval_qlc(mnesia:table(?SHARD_TAB)),
io:format( io:format(
"~nSHARDS:~n~s~s~n", "~nSHARDS:~n~s~s~n",
[string:pad("Id", 30), "Replicas"] [string:pad("Shard", 30), "Replicas"]
), ),
lists:foreach( lists:foreach(
fun(#?SHARD_TAB{shard = {DB, Shard}, replica_set = RS}) -> fun(#?SHARD_TAB{shard = DBShard, replica_set = RS}) ->
ShardStr = io_lib:format("~p/~s", [DB, Shard]), ShardStr = format_shard(DBShard),
ReplicasStr = string:join([format_replica(R) || R <- RS], " "), ReplicasStr = string:join([format_replica(R) || R <- RS], " "),
io:format( io:format(
"~s~s~n", "~s~s~n",
[string:pad(ShardStr, 30), ReplicasStr] [string:pad(ShardStr, 30), ReplicasStr]
) )
end, 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) -> format_replica(Site) ->
Marker = Marker =
case mria:cluster_status(?MODULE:node(Site)) of case mria:cluster_status(?MODULE:node(Site)) of
@ -220,6 +249,11 @@ format_replica(Site) ->
end, end,
io_lib:format("~s ~s", [Marker, Site]). 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(). -spec this_site() -> site().
this_site() -> this_site() ->
persistent_term:get(?emqx_ds_builtin_site). persistent_term:get(?emqx_ds_builtin_site).
@ -353,8 +387,8 @@ db_sites(DB) ->
[transition()] | undefined. [transition()] | undefined.
replica_set_transitions(DB, Shard) -> replica_set_transitions(DB, Shard) ->
case mnesia:dirty_read(?SHARD_TAB, {DB, Shard}) of case mnesia:dirty_read(?SHARD_TAB, {DB, Shard}) of
[#?SHARD_TAB{target_set = TargetSet, replica_set = ReplicaSet}] -> [Record] ->
compute_transitions(TargetSet, ReplicaSet); compute_transitions(Record);
[] -> [] ->
undefined undefined
end. end.
@ -706,6 +740,9 @@ compute_allocation(Shards, Sites, Opts) ->
), ),
Allocation. Allocation.
compute_transitions(#?SHARD_TAB{target_set = TargetSet, replica_set = ReplicaSet}) ->
compute_transitions(TargetSet, ReplicaSet).
compute_transitions(undefined, _ReplicaSet) -> compute_transitions(undefined, _ReplicaSet) ->
[]; [];
compute_transitions(TargetSet, ReplicaSet) -> compute_transitions(TargetSet, ReplicaSet) ->