summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Vatamaniuc <vatamane@gmail.com>2023-02-24 18:14:28 -0500
committerNick Vatamaniuc <nickva@users.noreply.github.com>2023-02-27 15:34:30 -0500
commitf677dd5e8f5276c5dff8d48b4df5494d74df4748 (patch)
tree2372fafe104066a3a04be8e894a3b25b65abce1b
parent4df37bc8ca6a255d57c834207549707ffcd99cf3 (diff)
downloadcouchdb-f677dd5e8f5276c5dff8d48b4df5494d74df4748.tar.gz
Use persistent terms for features
This is intended to speed up feature checks.
-rw-r--r--src/config/src/config.erl30
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).