./ct_report/coverage/mongoose_backend.COVER.html

1 -module(mongoose_backend).
2
3 %% API
4 -export([init/4,
5 call/4,
6 call_tracked/4,
7 is_exported/4,
8 get_backend_name/2]).
9
10 %% remove after mongoose_rdbms is refactored not to use dynamically compiled backend
11 -ignore_xref([get_backend_name/2]).
12
13 %% Legacy call from backend_module
14 -export([ensure_backend_metrics/2]).
15
16 %% For debugging and tests
17 -export([get_backend_module/2]).
18 -ignore_xref([get_backend_module/2]).
19
20 -type function_name() :: atom().
21 -type main_module() :: module().
22 -type backend_module() :: module().
23 -type host_type_or_global() :: mongooseim:host_type_or_global().
24
25 -spec init(HostType :: host_type_or_global(),
26 MainModule :: main_module(),
27 TrackedFuns :: [function_name()],
28 Opts :: gen_mod:module_opts()) -> ok.
29 init(HostType, MainModule, TrackedFuns, Opts) ->
30 931 ensure_backend_metrics(MainModule, TrackedFuns),
31 931 Backend = gen_mod:get_opt(backend, Opts, mnesia),
32 931 BackendModule = backend_module(MainModule, Backend),
33 931 persist_backend_name(HostType, MainModule, Backend, BackendModule),
34 931 ok.
35
36 backend_module(Module, Backend) ->
37 931 list_to_atom(atom_to_list(Module) ++ "_" ++ atom_to_list(Backend)).
38
39 call_metric(MainModule, FunName) ->
40 127935 [backends, MainModule, calls, FunName].
41
42 time_metric(MainModule, FunName) ->
43 127935 [backends, MainModule, FunName].
44
45 backend_key(HostType, MainModule) ->
46 220192 {backend_module, HostType, MainModule}.
47
48 backend_name_key(HostType, MainModule) ->
49 4697 {backend_name, HostType, MainModule}.
50
51 -spec ensure_backend_metrics(MainModule :: main_module(),
52 FunNames :: [function_name()]) -> ok.
53 ensure_backend_metrics(MainModule, FunNames) ->
54 1220 EnsureFun = fun(FunName) ->
55 4550 CM = call_metric(MainModule, FunName),
56 4550 TM = time_metric(MainModule, FunName),
57 4550 mongoose_metrics:ensure_metric(global, CM, spiral),
58 4550 mongoose_metrics:ensure_metric(global, TM, histogram)
59 end,
60 1220 lists:foreach(EnsureFun, FunNames).
61
62 persist_backend_name(HostType, MainModule, Backend, BackendModule) ->
63 931 ModuleKey = backend_key(HostType, MainModule),
64 931 persistent_term:put(ModuleKey, BackendModule),
65 931 NameKey = backend_name_key(HostType, MainModule),
66 931 persistent_term:put(NameKey, Backend).
67
68 %% @doc Get a backend module, stored in init.
69 -spec get_backend_module(HostType :: host_type_or_global(),
70 MainModule :: main_module()) ->
71 BackendModule :: backend_module().
72 get_backend_module(HostType, MainModule) ->
73 219261 ModuleKey = backend_key(HostType, MainModule),
74 219261 persistent_term:get(ModuleKey).
75
76 %% @doc Get a backend name, like `pgsql', stored in init.
77 -spec get_backend_name(HostType :: host_type_or_global(),
78 MainModule :: main_module()) -> BackendName :: atom().
79 get_backend_name(HostType, MainModule) ->
80 3766 Key = backend_name_key(HostType, MainModule),
81 3766 persistent_term:get(Key).
82
83 -spec call(HostType :: host_type_or_global(),
84 MainModule :: main_module(),
85 FunName :: function_name(),
86 Args :: [term()]) -> term().
87 call(HostType, MainModule, FunName, Args) ->
88 95418 BackendModule = get_backend_module(HostType, MainModule),
89 95418 erlang:apply(BackendModule, FunName, Args).
90
91 -spec call_tracked(HostType :: host_type_or_global(),
92 MainModule :: main_module(),
93 FunName :: function_name(),
94 Args :: [term()]) -> term().
95 call_tracked(HostType, MainModule, FunName, Args) ->
96 123385 BackendModule = get_backend_module(HostType, MainModule),
97 123385 CM = call_metric(MainModule, FunName),
98 123385 TM = time_metric(MainModule, FunName),
99 123385 mongoose_metrics:update(global, CM, 1),
100 123385 {Time, Result} = timer:tc(BackendModule, FunName, Args),
101 123385 mongoose_metrics:update(global, TM, Time),
102 123385 Result.
103
104 -spec is_exported(HostType :: host_type_or_global(),
105 MainModule :: main_module(),
106 FunName :: function_name(),
107 Arity :: integer()) -> boolean().
108 is_exported(HostType, MainModule, Function, Arity) ->
109 389 BackendModule = get_backend_module(HostType, MainModule),
110 389 erlang:function_exported(BackendModule, Function, Arity).
Line Hits Source