Sfoglia il codice sorgente

fix(persistent_sessions): postpone table creation until configs are loaded

Tobias Lindahl 4 anni fa
parent
commit
9188f5b67e

+ 1 - 0
apps/emqx/src/emqx_app.erl

@@ -41,6 +41,7 @@
 
 start(_Type, _Args) ->
     ok = maybe_load_config(),
+    ok = emqx_persistent_session:init_db_backend(),
     ok = maybe_start_quicer(),
     wait_boot_shards(),
     {ok, Sup} = emqx_sup:start_link(),

+ 8 - 9
apps/emqx/src/emqx_persistent_session.erl

@@ -80,15 +80,14 @@
 %%--------------------------------------------------------------------
 
 init_db_backend() ->
-    case persistent_term:get({?MODULE, backend_init_done}, undefined) of
-        undefined ->
-            Backend = case is_store_enabled() of
-                          true  -> emqx_persistent_session_mnesia_backend;
-                          false -> emqx_persistent_session_dummy_backend
-                      end,
-            persistent_term:put(?db_backend_key, Backend),
-            persistent_term:put(backend_init_done, true);
-        true ->
+    case is_store_enabled() of
+        true  ->
+            ok = emqx_trie:create_session_trie(),
+            emqx_persistent_session_mnesia_backend:create_tables(),
+            persistent_term:put(?db_backend_key, emqx_persistent_session_mnesia_backend),
+            ok;
+        false ->
+            persistent_term:put(?db_backend_key, emqx_persistent_session_dummy_backend),
             ok
     end.
 

+ 3 - 14
apps/emqx/src/emqx_persistent_session_mnesia_backend.erl

@@ -16,15 +16,11 @@
 
 -module(emqx_persistent_session_mnesia_backend).
 
--boot_mnesia({mnesia, [boot]}).
-
 -include("emqx.hrl").
 -include("emqx_persistent_session.hrl").
 
--export([ mnesia/1
-        ]).
-
--export([ first_message_id/0
+-export([ create_tables/0
+        , first_message_id/0
         , next_message_id/1
         , delete_message/1
         , first_session_message/0
@@ -39,14 +35,7 @@
         , ro_transaction/1
         ]).
 
-
-mnesia(Action) ->
-    emqx_persistent_session:init_db_backend(),
-    mnesia_opt(?db_backend =:= ?MODULE, Action).
-
-mnesia_opt(false, _) ->
-    ok;
-mnesia_opt(true, boot) ->
+create_tables() ->
     ok = mria:create_table(?SESSION_STORE, [
                 {type, set},
                 {rlog_shard, ?PERSISTENT_SESSION_SHARD},

+ 15 - 14
apps/emqx/src/emqx_trie.erl

@@ -19,7 +19,9 @@
 -include("emqx.hrl").
 
 %% Mnesia bootstrap
--export([mnesia/1]).
+-export([ mnesia/1
+        , create_session_trie/0
+        ]).
 
 -boot_mnesia({mnesia, [boot]}).
 
@@ -71,20 +73,19 @@ mnesia(boot) ->
                 {record_name, ?TRIE},
                 {attributes, record_info(fields, ?TRIE)},
                 {type, ordered_set},
-                {storage_properties, StoreProps}]),
+                {storage_properties, StoreProps}]).
 
-    case emqx_persistent_session:is_store_enabled() of
-        true ->
-            ok = mria:create_table(?SESSION_TRIE, [
-                        {rlog_shard, ?ROUTE_SHARD},
-                        {storage, disc_copies},
-                        {record_name, ?TRIE},
-                        {attributes, record_info(fields, ?TRIE)},
-                        {type, ordered_set},
-                        {storage_properties, StoreProps}]);
-        false ->
-            ok
-    end.
+create_session_trie() ->
+    StoreProps = [{ets, [{read_concurrency, true},
+                         {write_concurrency, true}
+                        ]}],
+    ok = mria:create_table(?SESSION_TRIE,
+                           [{rlog_shard, ?ROUTE_SHARD},
+                            {storage, disc_copies},
+                            {record_name, ?TRIE},
+                            {attributes, record_info(fields, ?TRIE)},
+                            {type, ordered_set},
+                            {storage_properties, StoreProps}]).
 
 %%--------------------------------------------------------------------
 %% Topics APIs