./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 %% For debugging and tests
14 -export([get_backend_module/2]).
15 -ignore_xref([get_backend_module/2]).
16
17 -type function_name() :: atom().
18 -type main_module() :: module().
19 -type backend_module() :: module().
20 -type host_type_or_global() :: mongooseim:host_type_or_global().
21
22 -spec init(HostType :: host_type_or_global(),
23 MainModule :: main_module(),
24 TrackedFuns :: [function_name()],
25 Opts :: map()) -> ok.
26 init(HostType, MainModule, TrackedFuns, Opts) ->
27 1213 ensure_backend_metrics(MainModule, TrackedFuns),
28 1213 Backend = maps:get(backend, Opts, mnesia),
29 1213 BackendModule = backend_module(MainModule, Backend),
30 1213 persist_backend_name(HostType, MainModule, Backend, BackendModule),
31 1213 ok.
32
33 backend_module(Module, Backend) ->
34 1213 list_to_atom(atom_to_list(Module) ++ "_" ++ atom_to_list(Backend)).
35
36 call_metric(MainModule, FunName) ->
37 219843 [backends, MainModule, calls, FunName].
38
39 time_metric(MainModule, FunName) ->
40 219843 [backends, MainModule, FunName].
41
42 backend_key(HostType, MainModule) ->
43 346430 {backend_module, HostType, MainModule}.
44
45 backend_name_key(HostType, MainModule) ->
46 12437 {backend_name, HostType, MainModule}.
47
48 -spec ensure_backend_metrics(MainModule :: main_module(),
49 FunNames :: [function_name()]) -> ok.
50 ensure_backend_metrics(MainModule, FunNames) ->
51 1213 EnsureFun = fun(FunName) ->
52 4979 CM = call_metric(MainModule, FunName),
53 4979 TM = time_metric(MainModule, FunName),
54 4979 mongoose_metrics:ensure_metric(global, CM, spiral),
55 4979 mongoose_metrics:ensure_metric(global, TM, histogram)
56 end,
57 1213 lists:foreach(EnsureFun, FunNames).
58
59 persist_backend_name(HostType, MainModule, Backend, BackendModule) ->
60 1213 ModuleKey = backend_key(HostType, MainModule),
61 1213 persistent_term:put(ModuleKey, BackendModule),
62 1213 NameKey = backend_name_key(HostType, MainModule),
63 1213 persistent_term:put(NameKey, Backend).
64
65 %% @doc Get a backend module, stored in init.
66 -spec get_backend_module(HostType :: host_type_or_global(),
67 MainModule :: main_module()) ->
68 BackendModule :: backend_module().
69 get_backend_module(HostType, MainModule) ->
70 345217 ModuleKey = backend_key(HostType, MainModule),
71 345217 persistent_term:get(ModuleKey).
72
73 %% @doc Get a backend name, like `pgsql', stored in init.
74 -spec get_backend_name(HostType :: host_type_or_global(),
75 MainModule :: main_module()) -> BackendName :: atom().
76 get_backend_name(HostType, MainModule) ->
77 11224 Key = backend_name_key(HostType, MainModule),
78 11224 persistent_term:get(Key).
79
80 -spec call(HostType :: host_type_or_global(),
81 MainModule :: main_module(),
82 FunName :: function_name(),
83 Args :: [term()]) -> term().
84 call(HostType, MainModule, FunName, Args) ->
85 128788 BackendModule = get_backend_module(HostType, MainModule),
86 128788 erlang:apply(BackendModule, FunName, Args).
87
88 -spec call_tracked(HostType :: host_type_or_global(),
89 MainModule :: main_module(),
90 FunName :: function_name(),
91 Args :: [term()]) -> term().
92 call_tracked(HostType, MainModule, FunName, Args) ->
93 214864 BackendModule = get_backend_module(HostType, MainModule),
94 214864 CM = call_metric(MainModule, FunName),
95 214864 TM = time_metric(MainModule, FunName),
96 214864 mongoose_metrics:update(global, CM, 1),
97 214864 {Time, Result} = timer:tc(BackendModule, FunName, Args),
98 214864 mongoose_metrics:update(global, TM, Time),
99 214864 Result.
100
101 -spec is_exported(HostType :: host_type_or_global(),
102 MainModule :: main_module(),
103 FunName :: function_name(),
104 Arity :: integer()) -> boolean().
105 is_exported(HostType, MainModule, Function, Arity) ->
106 296 BackendModule = get_backend_module(HostType, MainModule),
107 296 erlang:function_exported(BackendModule, Function, Arity).
Line Hits Source