From 7f22265e31b208c4f7124a13b1e5f4786c708b0c Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Thu, 20 Jul 2017 14:22:18 +0800 Subject: [PATCH] Use global:trans/2 to clean routes and sessions --- src/emqttd_router.erl | 11 ++++++++--- src/emqttd_sm_helper.erl | 6 ++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/emqttd_router.erl b/src/emqttd_router.erl index 8806e9904..b3dd8b4ad 100644 --- a/src/emqttd_router.erl +++ b/src/emqttd_router.erl @@ -48,6 +48,8 @@ -define(ROUTER, ?MODULE). +-define(LOCK, {?ROUTER, clean_routes}). + %%-------------------------------------------------------------------- %% Mnesia Bootstrap %%-------------------------------------------------------------------- @@ -231,7 +233,7 @@ handle_cast({add_local_route, Topic}, State) -> %% why node()...? ets:insert(mqtt_local_route, {Topic, node()}), {noreply, State}; - + handle_cast({del_local_route, Topic}, State) -> ets:delete(mqtt_local_route, Topic), {noreply, State}; @@ -240,8 +242,11 @@ handle_cast(_Msg, State) -> {noreply, State}. handle_info({membership, {mnesia, down, Node}}, State) -> - clean_routes_(Node), - update_stats_(), + global:trans({?LOCK, self()}, + fun() -> + clean_routes_(Node), + update_stats_() + end), {noreply, State, hibernate}; handle_info({membership, _Event}, State) -> diff --git a/src/emqttd_sm_helper.erl b/src/emqttd_sm_helper.erl index 2081ea9e5..2e8e9a749 100644 --- a/src/emqttd_sm_helper.erl +++ b/src/emqttd_sm_helper.erl @@ -36,6 +36,8 @@ -record(state, {stats_fun, ticker}). +-define(LOCK, {?MODULE, clean_sessions}). + %% @doc Start a session helper -spec(start_link(fun()) -> {ok, pid()} | ignore | {error, any()}). start_link(StatsFun) -> @@ -59,8 +61,8 @@ handle_info({membership, {mnesia, down, Node}}, State) -> [{'==', {node, '$2'}, Node}], ['$1']}]), lists:foreach(fun(ClientId) -> mnesia:delete({mqtt_session, ClientId}) end, ClientIds) end, - mnesia:async_dirty(Fun), - {noreply, State}; + global:trans({?LOCK, self()}, fun() -> mnesia:async_dirty(Fun) end), + {noreply, State, hibernate}; handle_info({membership, _Event}, State) -> {noreply, State};