Skip to content

Commit 18f126f

Browse files
committed
Separate db trimming to a dedicated process
1 parent c8a3fb7 commit 18f126f

File tree

7 files changed

+79
-36
lines changed

7 files changed

+79
-36
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@ priv/admin/angular-simple-logger.min.js
1414
priv/admin/ng-google-chart.min.js
1515
priv/admin/ng-admin.min.css
1616
priv/admin/ng-admin.min.js
17+
priv/admin/bootstrap-colorpicker-module.min.js
18+
priv/admin/colorpicker.min.css
1719
log/

lorawan_server.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
% see https://github.com/erlang-lager/lager#overload-protection
3232
% {error_logger_hwm, undefined},
3333
{handlers, [
34-
% {lager_console_backend, debug},
34+
% {lager_console_backend, [{level, debug}]},
3535
{lager_file_backend, [{file, "log/debug.log"}, {level, debug}]},
3636
{lager_file_backend, [{file, "log/error.log"}, {level, error}]}
3737
]}

src/lorawan_app.erl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ start(_Type, _Args) ->
1919
ok = ensure_erlang_version(19),
2020
lorawan_db:ensure_tables(),
2121
syn:init(),
22-
{ok, _} = timer:apply_interval(3600*1000, lorawan_db, trim_tables, []),
2322

2423
{ok, Handlers} = lorawan_handler:init(),
2524
Dispatch = cowboy_router:compile([

src/lorawan_db.erl

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
%
66
-module(lorawan_db).
77

8-
-export([ensure_tables/0, ensure_table/2, trim_tables/0]).
9-
-export([get_rxframes/1, purge_txframes/1]).
8+
-export([ensure_tables/0, ensure_table/2]).
9+
-export([get_rxframes/1, get_last_rxframes/2]).
1010

1111
-include_lib("lorawan_server_api/include/lorawan_application.hrl").
1212
-include("lorawan.hrl").
@@ -141,9 +141,6 @@ set_defaults(users) ->
141141
set_defaults(_Else) ->
142142
ok.
143143

144-
trim_tables() ->
145-
[trim_rxframes(R) || R <- mnesia:dirty_all_keys(links)],
146-
[mnesia:dirty_delete(events, E) || E <- expired_events()].
147144

148145
get_rxframes(DevAddr) ->
149146
{_, Frames} = get_last_rxframes(DevAddr, 50),
@@ -157,6 +154,9 @@ get_rxframes(DevAddr) ->
157154
Frames
158155
end.
159156

157+
occured_rxframe_after(StartDate, #rxframe{datetime = FrameDate}) ->
158+
StartDate =< FrameDate.
159+
160160
get_last_rxframes(DevAddr, Count) ->
161161
Rec = mnesia:dirty_index_read(rxframes, DevAddr, #rxframe.devaddr),
162162
SRec = lists:sort(fun(#rxframe{frid = A}, #rxframe{frid = B}) -> A < B end, Rec),
@@ -166,32 +166,4 @@ get_last_rxframes(DevAddr, Count) ->
166166
true -> {[], SRec}
167167
end.
168168

169-
occured_rxframe_after(StartDate, #rxframe{datetime = FrameDate}) ->
170-
StartDate =< FrameDate.
171-
172-
trim_rxframes(DevAddr) ->
173-
{ok, Count} = application:get_env(lorawan_server, retained_rxframes),
174-
case get_last_rxframes(DevAddr, Count) of
175-
{[], _} ->
176-
ok;
177-
{ExpRec, _} ->
178-
lager:debug("Expired ~w rxframes from ~w", [length(ExpRec), DevAddr]),
179-
lists:foreach(fun(R) -> mnesia:dirty_delete_object(rxframes, R) end,
180-
ExpRec)
181-
end.
182-
183-
expired_events() ->
184-
{ok, AgeSeconds} = application:get_env(lorawan_server, event_lifetime),
185-
ETime = calendar:gregorian_seconds_to_datetime(
186-
calendar:datetime_to_gregorian_seconds(calendar:universal_time()) - AgeSeconds),
187-
mnesia:dirty_select(events,
188-
[{#event{evid='$1', last_rx='$2', _='_'}, [{'=<', '$2', {const, ETime}}], ['$1']}]).
189-
190-
purge_txframes(DevAddr) ->
191-
lists:foreach(
192-
fun(Obj) ->
193-
ok = mnesia:dirty_delete_object(txframes, Obj)
194-
end,
195-
mnesia:dirty_match_object(txframes, #txframe{devaddr=DevAddr, _='_'})).
196-
197169
% end of file

src/lorawan_db_guard.erl

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
%
2+
% Copyright (c) 2016-2017 Petr Gotthard <petr.gotthard@centrum.cz>
3+
% All rights reserved.
4+
% Distributed under the terms of the MIT License. See the LICENSE file.
5+
%
6+
-module(lorawan_db_guard).
7+
-behaviour(gen_server).
8+
9+
-export([purge_txframes/1]).
10+
11+
-export([start_link/0]).
12+
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
13+
14+
-include_lib("lorawan_server_api/include/lorawan_application.hrl").
15+
-include("lorawan.hrl").
16+
17+
start_link() ->
18+
gen_server:start_link(?MODULE, [], []).
19+
20+
init([]) ->
21+
{ok, _} = timer:send_interval(3600*1000, trim_tables),
22+
{ok, undefined}.
23+
24+
handle_call(_Request, _From, State) ->
25+
{reply, ignored, State}.
26+
27+
handle_cast(_Msg, State) ->
28+
{noreply, State}.
29+
30+
handle_info(trim_tables, State) ->
31+
[trim_rxframes(R) || R <- mnesia:dirty_all_keys(links)],
32+
[mnesia:dirty_delete(events, E) || E <- expired_events()],
33+
{noreply, State}.
34+
35+
terminate(_Reason, _State) ->
36+
ok.
37+
38+
code_change(_OldVsn, State, _Extra) ->
39+
{ok, State}.
40+
41+
42+
trim_rxframes(DevAddr) ->
43+
{ok, Count} = application:get_env(lorawan_server, retained_rxframes),
44+
case lorawan_db:get_last_rxframes(DevAddr, Count) of
45+
{[], _} ->
46+
ok;
47+
{ExpRec, _} ->
48+
lager:debug("Expired ~w rxframes from ~w", [length(ExpRec), DevAddr]),
49+
lists:foreach(fun(R) -> mnesia:dirty_delete_object(rxframes, R) end,
50+
ExpRec)
51+
end.
52+
53+
purge_txframes(DevAddr) ->
54+
lists:foreach(
55+
fun(Obj) ->
56+
ok = mnesia:dirty_delete_object(txframes, Obj)
57+
end,
58+
mnesia:dirty_match_object(txframes, #txframe{devaddr=DevAddr, _='_'})).
59+
60+
expired_events() ->
61+
{ok, AgeSeconds} = application:get_env(lorawan_server, event_lifetime),
62+
ETime = calendar:gregorian_seconds_to_datetime(
63+
calendar:datetime_to_gregorian_seconds(calendar:universal_time()) - AgeSeconds),
64+
mnesia:dirty_select(events,
65+
[{#event{evid='$1', last_rx='$2', _='_'}, [{'=<', '$2', {const, ETime}}], ['$1']}]).
66+
67+
% end of file

src/lorawan_mac.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ fcnt32_inc(FCntUp, N) ->
334334
reset_link(DevAddr) ->
335335
ok = mnesia:dirty_delete(pending, DevAddr),
336336
% delete previously stored TX frames
337-
lorawan_db:purge_txframes(DevAddr).
337+
lorawan_db_guard:purge_txframes(DevAddr).
338338

339339
build_rxframe(Gateway, Link, RxQ, Confirm, Frame) ->
340340
TXPower = case Link#link.adr_use of

src/lorawan_sup.erl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ start_link() ->
1616
init([]) ->
1717
lorawan_utils:throw_info(server, started),
1818
{ok, {{one_for_one, 10, 10}, [
19+
{db_guard,
20+
{lorawan_db_guard, start_link, []},
21+
permanent, 5000, worker, [lorawan_db_guard]},
1922
{gateways,
2023
{lorawan_gw_sup, start_link, []},
2124
permanent, infinity, supervisor, [lorawan_gw_sup]},

0 commit comments

Comments
 (0)