diff options
| author | sylvainhubsch <sylvain.hubsch@gmail.com> | 2018-02-11 12:05:08 -0800 |
|---|---|---|
| committer | sylvainhubsch <sylvain.hubsch@gmail.com> | 2018-02-11 12:05:08 -0800 |
| commit | 6ff1fb788a795a08dd98b5c925e44422886691ad (patch) | |
| tree | 9f7cc906964b3726a23bcc88006456bd0c16772b /src | |
| parent | ee7ffd2e2cad1c748954245788842d77153e5434 (diff) | |
| download | rabbitmq-server-git-6ff1fb788a795a08dd98b5c925e44422886691ad.tar.gz | |
rabbit_router:match_bindings/2 optimize (uses ets:select directly); improves rabbit_exchange_type_headers, should improves rabbitmq_jms_topic_exchange too
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_router.erl | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/src/rabbit_router.erl b/src/rabbit_router.erl index 1f3017fa07..aaa2f1e170 100644 --- a/src/rabbit_router.erl +++ b/src/rabbit_router.erl @@ -36,17 +36,14 @@ %%---------------------------------------------------------------------------- -%% TODO: Maybe this should be handled by a cursor instead. -%% TODO: This causes a full scan for each entry with the same source +%% No need to call mnesia:dirty_select/2 (cf. note below), let alone go +%% through qlc because query is so simple ! match_bindings(SrcName, Match) -> - Query = qlc:q([DestinationName || - #route{binding = Binding = #binding{ - source = SrcName1, - destination = DestinationName}} <- - mnesia:table(rabbit_route), - SrcName == SrcName1, - Match(Binding)]), - mnesia:async_dirty(fun qlc:e/1, [Query]). + MatchHead = #route{binding = #binding{source = SrcName, + _ = '_'}}, + Routes = ets:select(rabbit_route, [{MatchHead, [], [['$_']]}]), + [ Dest || [#route{binding = Binding = #binding{destination = Dest}}] <- + Routes, Match(Binding)]. match_routing_key(SrcName, [RoutingKey]) -> find_routes(#route{binding = #binding{source = SrcName, |
