summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rabbit_binding.erl35
-rw-r--r--src/rabbit_exchange.erl21
2 files changed, 37 insertions, 19 deletions
diff --git a/src/rabbit_binding.erl b/src/rabbit_binding.erl
index 2f71bfab..5873537c 100644
--- a/src/rabbit_binding.erl
+++ b/src/rabbit_binding.erl
@@ -198,22 +198,33 @@ list(VHostPath) ->
Route)].
list_for_source(SrcName) ->
- Route = #route{binding = #binding{source = SrcName, _ = '_'}},
- [B || #route{binding = B} <- mnesia:dirty_match_object(rabbit_route,
- Route)].
+ mnesia:async_dirty(
+ fun() ->
+ Route = #route{binding = #binding{source = SrcName, _ = '_'}},
+ [B || #route{binding = B}
+ <- mnesia:match_object(rabbit_route, Route, read)]
+ end).
list_for_destination(DstName) ->
- Route = #route{binding = #binding{destination = DstName, _ = '_'}},
- [reverse_binding(B) || #reverse_route{reverse_binding = B} <-
- mnesia:dirty_match_object(rabbit_reverse_route,
- reverse_route(Route))].
+ mnesia:async_dirty(
+ fun() ->
+ Route = #route{binding = #binding{destination = DstName,
+ _ = '_'}},
+ [reverse_binding(B) ||
+ #reverse_route{reverse_binding = B} <-
+ mnesia:match_object(rabbit_reverse_route,
+ reverse_route(Route), read)]
+ end).
list_for_source_and_destination(SrcName, DstName) ->
- Route = #route{binding = #binding{source = SrcName,
- destination = DstName,
- _ = '_'}},
- [B || #route{binding = B} <- mnesia:dirty_match_object(rabbit_route,
- Route)].
+ mnesia:async_dirty(
+ fun() ->
+ Route = #route{binding = #binding{source = SrcName,
+ destination = DstName,
+ _ = '_'}},
+ [B || #route{binding = B} <- mnesia:match_object(rabbit_route,
+ Route, read)]
+ end).
info_keys() -> ?INFO_KEYS.
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index 84a44cd2..cab1b99f 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -24,7 +24,7 @@
info_keys/0, info/1, info/2, info_all/1, info_all/2,
publish/2, delete/2]).
%% these must be run inside a mnesia tx
--export([maybe_auto_delete/1, serial/1]).
+-export([maybe_auto_delete/1, serial/1, peek_serial/1]).
%%----------------------------------------------------------------------------
@@ -75,7 +75,8 @@
-spec(maybe_auto_delete/1::
(rabbit_types:exchange())
-> 'not_deleted' | {'deleted', rabbit_binding:deletions()}).
--spec(serial/1:: (rabbit_types:exchange()) -> 'none' | pos_integer()).
+-spec(serial/1 :: (rabbit_types:exchange()) -> 'none' | pos_integer()).
+-spec(peek_serial/1 :: (name()) -> pos_integer() | 'undefined').
-endif.
@@ -93,7 +94,7 @@ recover() ->
true -> store(X);
false -> ok
end,
- rabbit_exchange:callback(X, create, [Tx, X])
+ rabbit_exchange:callback(X, create, [map_create_tx(Tx), X])
end,
rabbit_durable_exchange),
[XName || #exchange{name = XName} <- Xs].
@@ -127,10 +128,7 @@ declare(XName, Type, Durable, AutoDelete, Internal, Args) ->
end
end,
fun ({new, Exchange}, Tx) ->
- ok = XT:create(case Tx of
- true -> transaction;
- false -> none
- end, Exchange),
+ ok = XT:create(map_create_tx(Tx), Exchange),
rabbit_event:notify_if(not Tx, exchange_created, info(Exchange)),
Exchange;
({existing, Exchange}, _Tx) ->
@@ -139,6 +137,9 @@ declare(XName, Type, Durable, AutoDelete, Internal, Args) ->
Err
end).
+map_create_tx(true) -> transaction;
+map_create_tx(false) -> none.
+
store(X = #exchange{name = Name, type = Type}) ->
ok = mnesia:write(rabbit_exchange, X, write),
case (type_to_module(Type)):serialise_events() of
@@ -330,6 +331,12 @@ next_serial(XName) ->
#exchange_serial{name = XName, next = Serial + 1}, write),
Serial.
+peek_serial(XName) ->
+ case mnesia:read({rabbit_exchange_serial, XName}) of
+ [#exchange_serial{next = Serial}] -> Serial;
+ _ -> undefined
+ end.
+
%% Used with atoms from records; e.g., the type is expected to exist.
type_to_module(T) ->
{ok, Module} = rabbit_registry:lookup_module(exchange, T),