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 f84863c03..71b94cd54 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 @@ -130,17 +130,40 @@ print_status() -> eval_qlc(mnesia:table(?NODE_TAB)) ), io:format( - "~nSHARDS:~nId Replicas~n", [] + "~nSHARDS:~n~s~s~s~n", [ + string:pad("Id", 30), + string:pad("Leader", 24), + string:pad("Replicas", 60) + ] ), + Leaderboard = ra_leaderboard:overview(), lists:foreach( fun(#?SHARD_TAB{shard = {DB, Shard}, replica_set = RS}) -> ShardStr = string:pad(io_lib:format("~p/~s", [DB, Shard]), 30), - ReplicasStr = string:pad(io_lib:format("~p", [RS]), 40), - io:format("~s ~s~n", [ShardStr, ReplicasStr]) + LeaderStr = string:pad(print_leader({DB, Shard}, RS, Leaderboard), 24), + ReplicasStr = string:pad([[R, " "] || R <- RS], 60), + io:format("~s~s~s~n", [ShardStr, LeaderStr, ReplicasStr]) end, eval_qlc(mnesia:table(?SHARD_TAB)) ). +print_leader({DB, Shard}, Sites, Leaderboard) -> + ClusterName = emqx_ds_replication_layer_shard:cluster_name(DB, Shard), + Servers = [ + {{emqx_ds_replication_layer_shard:server_name(DB, Shard, S), ?MODULE:node(S)}, S} + || S <- Sites + ], + case lists:keyfind(ClusterName, 1, Leaderboard) of + {ClusterName, Leader, _Members} -> + case lists:keyfind(Leader, 1, Servers) of + {{_Name, Node}, Site} when Node == node() -> [Site, " *"]; + {{_Name, _}, Site} -> Site; + false -> "X" + end; + false -> + "?" + end. + -spec this_site() -> site(). this_site() -> persistent_term:get(?emqx_ds_builtin_site). diff --git a/apps/emqx_durable_storage/src/emqx_ds_replication_layer_shard.erl b/apps/emqx_durable_storage/src/emqx_ds_replication_layer_shard.erl index 62a6edab2..983ce54e2 100644 --- a/apps/emqx_durable_storage/src/emqx_ds_replication_layer_shard.erl +++ b/apps/emqx_durable_storage/src/emqx_ds_replication_layer_shard.erl @@ -21,7 +21,9 @@ %% Static server configuration -export([ shard_servers/2, - local_server/2 + local_server/2, + cluster_name/2, + server_name/3 ]). %% Dynamic server location API