diff options
author | Nick Vatamaniuc <vatamane@gmail.com> | 2023-02-24 18:14:28 -0500 |
---|---|---|
committer | Nick Vatamaniuc <nickva@users.noreply.github.com> | 2023-02-27 15:34:30 -0500 |
commit | f677dd5e8f5276c5dff8d48b4df5494d74df4748 (patch) | |
tree | 2372fafe104066a3a04be8e894a3b25b65abce1b | |
parent | 4df37bc8ca6a255d57c834207549707ffcd99cf3 (diff) | |
download | couchdb-f677dd5e8f5276c5dff8d48b4df5494d74df4748.tar.gz |
Use persistent terms for features
This is intended to speed up feature checks.
-rw-r--r-- | src/config/src/config.erl | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/src/config/src/config.erl b/src/config/src/config.erl index 7c38ff58f..7cd7251e6 100644 --- a/src/config/src/config.erl +++ b/src/config/src/config.erl @@ -31,7 +31,7 @@ -export([get_float/3, set_float/3, set_float/4]). -export([get_boolean/3, set_boolean/3, set_boolean/4]). --export([features/0, enable_feature/1, disable_feature/1]). +-export([features/0, enable_feature/1, disable_feature/1, is_enabled/1]). -export([listen_for_changes/2]). -export([subscribe_for_changes/1]). @@ -42,7 +42,7 @@ -export([is_sensitive/2]). --define(FEATURES, "features"). +-define(FEATURES, features). -define(TIMEOUT, 30000). -define(INVALID_SECTION, <<"Invalid configuration section">>). @@ -212,23 +212,23 @@ delete(Section, Key, Persist, Reason) when is_list(Section), is_list(Key) -> ). features() -> - application:get_env(config, enabled_features, []). + Map = persistent_term:get({?MODULE, ?FEATURES}, #{}), + lists:sort(maps:keys(Map)). enable_feature(Feature) when is_atom(Feature) -> - application:set_env( - config, - enabled_features, - lists:usort([Feature | features()]), - [{persistent, true}] - ). + Map = persistent_term:get({?MODULE, ?FEATURES}, #{}), + Map1 = Map#{Feature => true}, + persistent_term:put({?MODULE, ?FEATURES}, Map1). disable_feature(Feature) when is_atom(Feature) -> - application:set_env( - config, - enabled_features, - features() -- [Feature], - [{persistent, true}] - ). + Map = persistent_term:get({?MODULE, ?FEATURES}, #{}), + Map1 = maps:remove(Feature, Map), + persistent_term:put({?MODULE, ?FEATURES}, Map1). + +is_enabled(Feature) when is_atom(Feature) -> + Map = persistent_term:get({?MODULE, ?FEATURES}, #{}), + maps:get(Feature, Map, false). + listen_for_changes(CallbackModule, InitialState) -> config_listener_mon:subscribe(CallbackModule, InitialState). |