1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
%%%-------------------------------------------------------------------
%% @doc dreki public API
%% @end
%%%-------------------------------------------------------------------
-module(dreki_app).
-behaviour(application).
-include_lib("kernel/include/logger.hrl").
-export([start/2, stop/1]).
start(Type, Args) ->
ok = before_start(Type, Args),
case dreki_sup:start_link() of
{ok, Pid} ->
ok = after_start(),
{ok, Pid};
Error ->
Error
end.
stop(_State) ->
dreki_tasks:stop(),
ok.
%% internal functions
before_start(Type, Args) ->
logger:set_application_level(dreki, debug),
logger:set_application_level(dreki_web, debug),
logger:set_application_level(partisan, info),
logger:set_application_level(plum_db, info),
logger:set_handler_config(default, level, debug),
opentelemetry_logger_metadata:setup(),
?LOG_NOTICE(#{message => "Dreki starting...."}),
application:stop(partisan),
ok = dreki_config:init(Args),
ok = dreki_plum:before_start(),
ok = maybe_create_mnesia(),
{ok, _} = mnesia_rocksdb:register(),
ok = dreki_urn:start(),
{ok, _} = dreki_world_dns:start(),
?LOG_NOTICE(#{message => "Pre-Start done"}),
ok = dreki_plum:after_start(),
ok.
after_start() ->
%%ok = dreki_plum:after_start(),
ok = setup_event_manager(),
ok = dreki_store:start(),
?LOG_NOTICE(#{message => "Dreki Ready"}),
ok = dreki_config:set([dreki, status], ready),
dreki_event_manager:notify(dreki_ready),
ok.
maybe_create_mnesia() ->
ok = maybe_create_mnesia(mnesia:system_info(use_dir)).
maybe_create_mnesia(false) ->
?LOG_NOTICE(#{message => "Creating mnesia directory"}),
stopped = mnesia:stop(),
ok = mnesia:create_schema([node()]),
ok = mnesia:start(),
ok;
maybe_create_mnesia(true) ->
ok.
setup_event_manager() ->
%% TODO: Alarm handler
%% We subscribe to partisan up and down events and republish them
Mod = partisan_peer_service:manager(),
Mod:on_up('_', fun(Node) ->
dreki_event_manager:notify({partisan_peer_service, peer_up, Node})
end),
Mod:on_down('_', fun(Node) ->
dreki_event_manager:notify({partisan_peer_service, peer_down, Node})
end),
ok.
|