|
@@ -323,17 +323,11 @@ get_db(get, #{bindings := #{ds := DB}}) ->
|
|
|
}).
|
|
}).
|
|
|
|
|
|
|
|
db_replicas(get, #{bindings := #{ds := DB}}) ->
|
|
db_replicas(get, #{bindings := #{ds := DB}}) ->
|
|
|
- Replicas = lists:flatmap(
|
|
|
|
|
- fun(Shard) ->
|
|
|
|
|
- #{replica_set := RS} = emqx_ds_replication_layer_meta:shard_info(DB, Shard),
|
|
|
|
|
- maps:keys(RS)
|
|
|
|
|
- end,
|
|
|
|
|
- emqx_ds_replication_layer_meta:shards(DB)
|
|
|
|
|
- ),
|
|
|
|
|
- ?OK(lists:usort(Replicas));
|
|
|
|
|
|
|
+ Replicas = emqx_ds_replication_layer_meta:db_sites(DB),
|
|
|
|
|
+ ?OK(Replicas);
|
|
|
db_replicas(put, #{bindings := #{ds := DB}, body := Sites}) ->
|
|
db_replicas(put, #{bindings := #{ds := DB}, body := Sites}) ->
|
|
|
case update_db_sites(DB, Sites, rest) of
|
|
case update_db_sites(DB, Sites, rest) of
|
|
|
- ok ->
|
|
|
|
|
|
|
+ {ok, _} ->
|
|
|
{202, <<"OK">>};
|
|
{202, <<"OK">>};
|
|
|
{error, Description} ->
|
|
{error, Description} ->
|
|
|
?BAD_REQUEST(400, Description)
|
|
?BAD_REQUEST(400, Description)
|
|
@@ -341,39 +335,43 @@ db_replicas(put, #{bindings := #{ds := DB}, body := Sites}) ->
|
|
|
|
|
|
|
|
db_replica(put, #{bindings := #{ds := DB, site := Site}}) ->
|
|
db_replica(put, #{bindings := #{ds := DB, site := Site}}) ->
|
|
|
case join(DB, Site, rest) of
|
|
case join(DB, Site, rest) of
|
|
|
- ok ->
|
|
|
|
|
|
|
+ {ok, _} ->
|
|
|
{202, <<"OK">>};
|
|
{202, <<"OK">>};
|
|
|
{error, Description} ->
|
|
{error, Description} ->
|
|
|
?BAD_REQUEST(400, Description)
|
|
?BAD_REQUEST(400, Description)
|
|
|
end;
|
|
end;
|
|
|
db_replica(delete, #{bindings := #{ds := DB, site := Site}}) ->
|
|
db_replica(delete, #{bindings := #{ds := DB, site := Site}}) ->
|
|
|
case leave(DB, Site, rest) of
|
|
case leave(DB, Site, rest) of
|
|
|
- ok ->
|
|
|
|
|
|
|
+ {ok, Sites} when is_list(Sites) ->
|
|
|
{202, <<"OK">>};
|
|
{202, <<"OK">>};
|
|
|
|
|
+ {ok, unchanged} ->
|
|
|
|
|
+ ?NOT_FOUND(<<"Site is not part of replica set">>);
|
|
|
{error, Description} ->
|
|
{error, Description} ->
|
|
|
?BAD_REQUEST(400, Description)
|
|
?BAD_REQUEST(400, Description)
|
|
|
end.
|
|
end.
|
|
|
|
|
|
|
|
-spec update_db_sites(emqx_ds:db(), [emqx_ds_replication_layer_meta:site()], rest | cli) ->
|
|
-spec update_db_sites(emqx_ds:db(), [emqx_ds_replication_layer_meta:site()], rest | cli) ->
|
|
|
- ok | {error, binary()}.
|
|
|
|
|
|
|
+ {ok, [emqx_ds_replication_layer_meta:site()]} | {error, _}.
|
|
|
update_db_sites(DB, Sites, Via) when is_list(Sites) ->
|
|
update_db_sites(DB, Sites, Via) when is_list(Sites) ->
|
|
|
- ?SLOG(warning, #{
|
|
|
|
|
|
|
+ ?SLOG(notice, #{
|
|
|
msg => "durable_storage_rebalance_request", ds => DB, sites => Sites, via => Via
|
|
msg => "durable_storage_rebalance_request", ds => DB, sites => Sites, via => Via
|
|
|
}),
|
|
}),
|
|
|
meta_result_to_binary(emqx_ds_replication_layer_meta:assign_db_sites(DB, Sites));
|
|
meta_result_to_binary(emqx_ds_replication_layer_meta:assign_db_sites(DB, Sites));
|
|
|
update_db_sites(_, _, _) ->
|
|
update_db_sites(_, _, _) ->
|
|
|
{error, <<"Bad type">>}.
|
|
{error, <<"Bad type">>}.
|
|
|
|
|
|
|
|
--spec join(emqx_ds:db(), emqx_ds_replication_layer_meta:site(), rest | cli) -> ok | {error, _}.
|
|
|
|
|
|
|
+-spec join(emqx_ds:db(), emqx_ds_replication_layer_meta:site(), rest | cli) ->
|
|
|
|
|
+ {ok, unchanged | [emqx_ds_replication_layer_meta:site()]} | {error, _}.
|
|
|
join(DB, Site, Via) ->
|
|
join(DB, Site, Via) ->
|
|
|
- ?SLOG(warning, #{
|
|
|
|
|
|
|
+ ?SLOG(notice, #{
|
|
|
msg => "durable_storage_join_request", ds => DB, site => Site, via => Via
|
|
msg => "durable_storage_join_request", ds => DB, site => Site, via => Via
|
|
|
}),
|
|
}),
|
|
|
meta_result_to_binary(emqx_ds_replication_layer_meta:join_db_site(DB, Site)).
|
|
meta_result_to_binary(emqx_ds_replication_layer_meta:join_db_site(DB, Site)).
|
|
|
|
|
|
|
|
--spec leave(emqx_ds:db(), emqx_ds_replication_layer_meta:site(), rest | cli) -> ok | {error, _}.
|
|
|
|
|
|
|
+-spec leave(emqx_ds:db(), emqx_ds_replication_layer_meta:site(), rest | cli) ->
|
|
|
|
|
+ {ok, unchanged | [emqx_ds_replication_layer_meta:site()]} | {error, _}.
|
|
|
leave(DB, Site, Via) ->
|
|
leave(DB, Site, Via) ->
|
|
|
- ?SLOG(warning, #{
|
|
|
|
|
|
|
+ ?SLOG(notice, #{
|
|
|
msg => "durable_storage_leave_request", ds => DB, site => Site, via => Via
|
|
msg => "durable_storage_leave_request", ds => DB, site => Site, via => Via
|
|
|
}),
|
|
}),
|
|
|
meta_result_to_binary(emqx_ds_replication_layer_meta:leave_db_site(DB, Site)).
|
|
meta_result_to_binary(emqx_ds_replication_layer_meta:leave_db_site(DB, Site)).
|
|
@@ -468,8 +466,8 @@ list_shards(DB) ->
|
|
|
|| Shard <- emqx_ds_replication_layer_meta:shards(DB)
|
|
|| Shard <- emqx_ds_replication_layer_meta:shards(DB)
|
|
|
].
|
|
].
|
|
|
|
|
|
|
|
-meta_result_to_binary(ok) ->
|
|
|
|
|
- ok;
|
|
|
|
|
|
|
+meta_result_to_binary({ok, Result}) ->
|
|
|
|
|
+ {ok, Result};
|
|
|
meta_result_to_binary({error, {nonexistent_sites, UnknownSites}}) ->
|
|
meta_result_to_binary({error, {nonexistent_sites, UnknownSites}}) ->
|
|
|
Msg = ["Unknown sites: " | lists:join(", ", UnknownSites)],
|
|
Msg = ["Unknown sites: " | lists:join(", ", UnknownSites)],
|
|
|
{error, iolist_to_binary(Msg)};
|
|
{error, iolist_to_binary(Msg)};
|