|
@@ -44,32 +44,16 @@
|
|
|
, code_change/3
|
|
, code_change/3
|
|
|
]).
|
|
]).
|
|
|
|
|
|
|
|
|
|
+-ifdef(TEST).
|
|
|
|
|
+-export([create_table/0]).
|
|
|
|
|
+-endif.
|
|
|
|
|
+
|
|
|
-define(TAB, ?MODULE).
|
|
-define(TAB, ?MODULE).
|
|
|
|
|
|
|
|
-record(state, {max_predef_topic_id = 0}).
|
|
-record(state, {max_predef_topic_id = 0}).
|
|
|
|
|
|
|
|
-record(emqx_sn_registry, {key, value}).
|
|
-record(emqx_sn_registry, {key, value}).
|
|
|
|
|
|
|
|
-%% Mnesia bootstrap
|
|
|
|
|
--export([mnesia/1]).
|
|
|
|
|
-
|
|
|
|
|
--boot_mnesia({mnesia, [boot]}).
|
|
|
|
|
--copy_mnesia({mnesia, [copy]}).
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-%% @doc Create or replicate tables.
|
|
|
|
|
--spec(mnesia(boot | copy) -> ok).
|
|
|
|
|
-mnesia(boot) ->
|
|
|
|
|
- %% Optimize storage
|
|
|
|
|
- StoreProps = [{ets, [{read_concurrency, true}]}],
|
|
|
|
|
- ok = ekka_mnesia:create_table(?MODULE, [
|
|
|
|
|
- {attributes, record_info(fields, emqx_sn_registry)},
|
|
|
|
|
- {ram_copies, [node()]},
|
|
|
|
|
- {storage_properties, StoreProps}]);
|
|
|
|
|
-
|
|
|
|
|
-mnesia(copy) ->
|
|
|
|
|
- ok = ekka_mnesia:copy_table(?MODULE, ram_copies).
|
|
|
|
|
-
|
|
|
|
|
%%-----------------------------------------------------------------------------
|
|
%%-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
-spec(start_link(list()) -> {ok, pid()} | ignore | {error, Reason :: term()}).
|
|
-spec(start_link(list()) -> {ok, pid()} | ignore | {error, Reason :: term()}).
|
|
@@ -123,6 +107,7 @@ unregister_topic(ClientId) ->
|
|
|
%%-----------------------------------------------------------------------------
|
|
%%-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
init([PredefTopics]) ->
|
|
init([PredefTopics]) ->
|
|
|
|
|
+ create_table(),
|
|
|
%% {predef, TopicId} -> TopicName
|
|
%% {predef, TopicId} -> TopicName
|
|
|
%% {predef, TopicName} -> TopicId
|
|
%% {predef, TopicName} -> TopicId
|
|
|
%% {ClientId, TopicId} -> TopicName
|
|
%% {ClientId, TopicId} -> TopicName
|
|
@@ -137,6 +122,15 @@ init([PredefTopics]) ->
|
|
|
end, 0, PredefTopics),
|
|
end, 0, PredefTopics),
|
|
|
{ok, #state{max_predef_topic_id = MaxPredefId}}.
|
|
{ok, #state{max_predef_topic_id = MaxPredefId}}.
|
|
|
|
|
|
|
|
|
|
+create_table() ->
|
|
|
|
|
+ %% Optimize storage
|
|
|
|
|
+ StoreProps = [{ets, [{read_concurrency, true}]}],
|
|
|
|
|
+ ok = ekka_mnesia:create_table(?MODULE, [
|
|
|
|
|
+ {attributes, record_info(fields, emqx_sn_registry)},
|
|
|
|
|
+ {ram_copies, [node()]},
|
|
|
|
|
+ {storage_properties, StoreProps}]),
|
|
|
|
|
+ ok = ekka_mnesia:copy_table(?MODULE, ram_copies).
|
|
|
|
|
+
|
|
|
handle_call({register, ClientId, TopicName}, _From,
|
|
handle_call({register, ClientId, TopicName}, _From,
|
|
|
State = #state{max_predef_topic_id = PredefId}) ->
|
|
State = #state{max_predef_topic_id = PredefId}) ->
|
|
|
case lookup_topic_id(ClientId, TopicName) of
|
|
case lookup_topic_id(ClientId, TopicName) of
|