@@ -18,6 +18,7 @@ start_link() ->
18
18
gen_server :start_link (? MODULE , [], []).
19
19
20
20
init ([]) ->
21
+ {ok , _ } = mnesia :subscribe ({table , links , simple }),
21
22
{ok , _ } = timer :send_interval (3600 * 1000 , trim_tables ),
22
23
{ok , undefined }.
23
24
@@ -27,9 +28,14 @@ handle_call(_Request, _From, State) ->
27
28
handle_cast (_Msg , State ) ->
28
29
{noreply , State }.
29
30
31
+ handle_info ({mnesia_table_event , {delete , {Tab , Key }, _Id }}, State ) ->
32
+ handle_delete (Tab , Key ),
33
+ {noreply , State };
30
34
handle_info (trim_tables , State ) ->
31
35
[trim_rxframes (R ) || R <- mnesia :dirty_all_keys (links )],
32
36
[mnesia :dirty_delete (events , E ) || E <- expired_events ()],
37
+ {noreply , State };
38
+ handle_info (_Other , State ) ->
33
39
{noreply , State }.
34
40
35
41
terminate (_Reason , _State ) ->
@@ -38,6 +44,21 @@ terminate(_Reason, _State) ->
38
44
code_change (_OldVsn , State , _Extra ) ->
39
45
{ok , State }.
40
46
47
+ handle_delete (links , DevAddr ) ->
48
+ lager :debug (" Node ~p deleted" , [lorawan_mac :binary_to_hex (DevAddr )]),
49
+ % delete linked records
50
+ ok = mnesia :dirty_delete (pending , DevAddr ),
51
+ delete_matched (rxframes , # rxframe {frid = '$1' , devaddr = DevAddr , _ = '_' }),
52
+ delete_matched (txframes , # txframe {frid = '$1' , devaddr = DevAddr , _ = '_' });
53
+ handle_delete (_Other , _Any ) ->
54
+ ok .
55
+
56
+ delete_matched (Table , Record ) ->
57
+ lists :foreach (
58
+ fun (Id ) ->
59
+ ok = mnesia :dirty_delete (Table , Id )
60
+ end ,
61
+ mnesia :dirty_select (Table , [{Record , [], ['$1' ]}])).
41
62
42
63
trim_rxframes (DevAddr ) ->
43
64
{ok , Count } = application :get_env (lorawan_server , retained_rxframes ),
0 commit comments