diff --git a/src/emqx_router.erl b/src/emqx_router.erl index 0463526d6..793735d55 100644 --- a/src/emqx_router.erl +++ b/src/emqx_router.erl @@ -101,9 +101,13 @@ do_add_route(Topic, Dest) when is_binary(Topic) -> %% @doc Match routes -spec(match_routes(emqx_topic:topic()) -> [emqx_types:route()]). match_routes(Topic) when is_binary(Topic) -> - %% Optimize: routing table will be replicated to all router nodes. - Matched = mnesia:ets(fun emqx_trie:match/1, [Topic]), - lists:append([lookup_routes(To) || To <- [Topic | Matched]]). + case emqx_trie:empty() of + true -> lookup_routes(Topic); + false -> + %% Optimize: routing table will be replicated to all router nodes. + Matched = mnesia:ets(fun emqx_trie:match/1, [Topic]), + lists:append([lookup_routes(To) || To <- [Topic | Matched]]) + end. -spec(lookup_routes(emqx_topic:topic()) -> [emqx_types:route()]). lookup_routes(Topic) -> diff --git a/src/emqx_trie.erl b/src/emqx_trie.erl index 27ff52827..a892b1fc2 100644 --- a/src/emqx_trie.erl +++ b/src/emqx_trie.erl @@ -24,6 +24,7 @@ %% Trie APIs -export([insert/1, match/1, lookup/1, delete/1]). +-export([empty/0]). %% Mnesia tables -define(TRIE, emqx_trie). @@ -100,6 +101,11 @@ delete(Topic) when is_binary(Topic) -> [] -> ok end. +%% @doc Is the trie empty? +-spec(empty() -> boolean()). +empty() -> + ets:info(?TRIE, size) == 0. + %%------------------------------------------------------------------------------ %% Internal functions %%------------------------------------------------------------------------------