From ab3526260cef6c9a7c4f49d09ce76a81a2607684 Mon Sep 17 00:00:00 2001 From: Tobias Lindahl Date: Thu, 28 Oct 2021 13:40:38 +0200 Subject: [PATCH] feat(persistent_sessions): make table type in mnesia backend configurable --- apps/emqx/etc/emqx.conf | 6 ++++++ apps/emqx/src/emqx_persistent_session.erl | 13 +++++++++---- apps/emqx/src/emqx_persistent_session.hrl | 3 ++- .../src/emqx_persistent_session_mnesia_backend.erl | 11 ++++++----- apps/emqx/src/emqx_schema.erl | 4 ++++ apps/emqx/src/emqx_trie.erl | 7 ++++--- 6 files changed, 31 insertions(+), 13 deletions(-) diff --git a/apps/emqx/etc/emqx.conf b/apps/emqx/etc/emqx.conf index 786c3d1d6..6bd734ec2 100644 --- a/apps/emqx/etc/emqx.conf +++ b/apps/emqx/etc/emqx.conf @@ -1646,6 +1646,12 @@ persistent_session_store { ## ValueType: Boolean ## Default: false enabled = false + ## Which database backend should be used + ## + ## @doc persistent_session_store.db_backend + ## ValueType: mnesia_ram | mnesia_disc + ## Default: mnesia_ram + db_backend = mnesia_ram ## How long are undelivered messages retained in the store ## diff --git a/apps/emqx/src/emqx_persistent_session.erl b/apps/emqx/src/emqx_persistent_session.erl index 71dac02c3..49e442d53 100644 --- a/apps/emqx/src/emqx_persistent_session.erl +++ b/apps/emqx/src/emqx_persistent_session.erl @@ -82,12 +82,17 @@ init_db_backend() -> 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), + TableType = + case emqx_config:get(?db_backend_key) of + mnesia_ram -> ram_copies; + mnesia_disc -> disc_copies + end, + ok = emqx_trie:create_session_trie(TableType), + emqx_persistent_session_mnesia_backend:create_tables(TableType), + persistent_term:put(?db_backend_module, emqx_persistent_session_mnesia_backend), ok; false -> - persistent_term:put(?db_backend_key, emqx_persistent_session_dummy_backend), + persistent_term:put(?db_backend_module, emqx_persistent_session_dummy_backend), ok end. diff --git a/apps/emqx/src/emqx_persistent_session.hrl b/apps/emqx/src/emqx_persistent_session.hrl index 4cb51160a..371139441 100644 --- a/apps/emqx/src/emqx_persistent_session.hrl +++ b/apps/emqx/src/emqx_persistent_session.hrl @@ -30,4 +30,5 @@ -define(is_enabled_key, [persistent_session_store, enabled]). -define(msg_retain, [persistent_session_store, max_retain_undelivered]). --define(db_backend, (persistent_term:get(?db_backend_key))). +-define(db_backend_module, [persistent_session_store, db_backend_module]). +-define(db_backend, (persistent_term:get(?db_backend_module))). diff --git a/apps/emqx/src/emqx_persistent_session_mnesia_backend.erl b/apps/emqx/src/emqx_persistent_session_mnesia_backend.erl index 512984845..9d587292f 100644 --- a/apps/emqx/src/emqx_persistent_session_mnesia_backend.erl +++ b/apps/emqx/src/emqx_persistent_session_mnesia_backend.erl @@ -19,7 +19,7 @@ -include("emqx.hrl"). -include("emqx_persistent_session.hrl"). --export([ create_tables/0 +-export([ create_tables/1 , first_message_id/0 , next_message_id/1 , delete_message/1 @@ -35,11 +35,12 @@ , ro_transaction/1 ]). -create_tables() -> +create_tables(TableType) when TableType =:= ram_copies; + TableType =:= disc_copies -> ok = mria:create_table(?SESSION_STORE, [ {type, set}, {rlog_shard, ?PERSISTENT_SESSION_SHARD}, - {storage, disc_copies}, + {storage, TableType}, {record_name, session_store}, {attributes, record_info(fields, session_store)}, {storage_properties, [{ets, [{read_concurrency, true}]}]}]), @@ -47,7 +48,7 @@ create_tables() -> ok = mria:create_table(?SESS_MSG_TAB, [ {type, ordered_set}, {rlog_shard, ?PERSISTENT_SESSION_SHARD}, - {storage, disc_copies}, + {storage, TableType}, {record_name, session_msg}, {attributes, record_info(fields, session_msg)}, {storage_properties, [{ets, [{read_concurrency, true}, @@ -56,7 +57,7 @@ create_tables() -> ok = mria:create_table(?MSG_TAB, [ {type, ordered_set}, {rlog_shard, ?PERSISTENT_SESSION_SHARD}, - {storage, disc_copies}, + {storage, TableType}, {record_name, message}, {attributes, record_info(fields, message)}, {storage_properties, [{ets, [{read_concurrency, true}, diff --git a/apps/emqx/src/emqx_schema.erl b/apps/emqx/src/emqx_schema.erl index 99a7ed59b..4059415f7 100644 --- a/apps/emqx/src/emqx_schema.erl +++ b/apps/emqx/src/emqx_schema.erl @@ -160,6 +160,10 @@ fields("persistent_session_store") -> sc(boolean(), #{ default => "false" })}, + {"db_backend", + sc(hoconsc:union([mnesia_ram, mnesia_disc]), + #{ default => "mnesia_ram" + })}, {"max_retain_undelivered", sc(duration(), #{ default => "1h" diff --git a/apps/emqx/src/emqx_trie.erl b/apps/emqx/src/emqx_trie.erl index 1881ecb6b..d93cfa483 100644 --- a/apps/emqx/src/emqx_trie.erl +++ b/apps/emqx/src/emqx_trie.erl @@ -20,7 +20,7 @@ %% Mnesia bootstrap -export([ mnesia/1 - , create_session_trie/0 + , create_session_trie/1 ]). -boot_mnesia({mnesia, [boot]}). @@ -75,13 +75,14 @@ mnesia(boot) -> {type, ordered_set}, {storage_properties, StoreProps}]). -create_session_trie() -> +create_session_trie(TableType) when TableType =:= ram_copies; + TableType =:= disc_copies -> StoreProps = [{ets, [{read_concurrency, true}, {write_concurrency, true} ]}], ok = mria:create_table(?SESSION_TRIE, [{rlog_shard, ?ROUTE_SHARD}, - {storage, disc_copies}, + {storage, TableType}, {record_name, ?TRIE}, {attributes, record_info(fields, ?TRIE)}, {type, ordered_set},