summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@lshift.net>2009-01-22 15:54:44 +0000
committerMatthias Radestock <matthias@lshift.net>2009-01-22 15:54:44 +0000
commit8b9db9c0f50f03ddc794fa9b21ffaacdb70f7563 (patch)
treeecece9a90926be2f8fbaf16a683b2eaa5dbd7b25
parentdab8b76f56b1f5dcfa55a406a5670ca946c31174 (diff)
downloadrabbitmq-server-8b9db9c0f50f03ddc794fa9b21ffaacdb70f7563.tar.gz
don't infer table name from record type in mnesia ops
This is in preparation for prefixing all table names with 'rabbit_' in order to avoid conflicts with other apps running in the same VM. This is a fairly straightforward change. The only tricky bit is the untangling of rabbit_exchange:indexed_delete.
-rw-r--r--src/rabbit_access_control.erl30
-rw-r--r--src/rabbit_amqqueue.erl5
-rw-r--r--src/rabbit_exchange.erl57
-rw-r--r--src/rabbit_networking.erl2
4 files changed, 58 insertions, 36 deletions
diff --git a/src/rabbit_access_control.erl b/src/rabbit_access_control.erl
index 0d9632b5..10d721f2 100644
--- a/src/rabbit_access_control.erl
+++ b/src/rabbit_access_control.erl
@@ -173,8 +173,10 @@ add_user(Username, Password) ->
fun () ->
case mnesia:read({user, Username}) of
[] ->
- ok = mnesia:write(#user{username = Username,
- password = Password});
+ ok = mnesia:write(user,
+ #user{username = Username,
+ password = Password},
+ write);
_ ->
mnesia:abort({user_already_exists, Username})
end
@@ -188,12 +190,14 @@ delete_user(Username) ->
Username,
fun () ->
ok = mnesia:delete({user, Username}),
- [ok = mnesia:delete_object(R) ||
+ [ok = mnesia:delete_object(user_permissions, R, write) ||
R <- mnesia:match_object(
+ user_permission,
#user_permission{user_vhost = #user_vhost{
username = Username,
virtual_host = '_'},
- permission = '_'})],
+ permission = '_'},
+ read)],
ok
end)),
rabbit_log:info("Deleted user ~p~n", [Username]),
@@ -204,8 +208,10 @@ change_password(Username, Password) ->
rabbit_misc:with_user(
Username,
fun () ->
- ok = mnesia:write(#user{username = Username,
- password = Password})
+ ok = mnesia:write(user,
+ #user{username = Username,
+ password = Password},
+ write)
end)),
rabbit_log:info("Changed password for user ~p~n", [Username]),
R.
@@ -221,7 +227,9 @@ add_vhost(VHostPath) ->
fun () ->
case mnesia:read({vhost, VHostPath}) of
[] ->
- ok = mnesia:write(#vhost{virtual_host = VHostPath}),
+ ok = mnesia:write(vhost,
+ #vhost{virtual_host = VHostPath},
+ write),
[rabbit_exchange:declare(
rabbit_misc:r(VHostPath, exchange, Name),
Type, true, false, []) ||
@@ -287,12 +295,14 @@ set_permissions(Username, VHostPath, ConfigurationPerm, MessagingPerm) ->
rabbit_misc:with_user_and_vhost(
Username, VHostPath,
fun () -> ok = mnesia:write(
+ user_permission,
#user_permission{user_vhost = #user_vhost{
username = Username,
virtual_host = VHostPath},
permission = #permission{
configuration = ConfigurationPerm,
- messaging = MessagingPerm}})
+ messaging = MessagingPerm}},
+ write)
end)).
clear_permissions(Username, VHostPath) ->
@@ -329,8 +339,10 @@ list_permissions(QueryThunk) ->
match_user_vhost(Username, VHostPath) ->
fun () -> mnesia:match_object(
+ user_permission,
#user_permission{user_vhost = #user_vhost{
username = Username,
virtual_host = VHostPath},
- permission = '_'})
+ permission = '_'},
+ read)
end.
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl
index abbdce66..025571df 100644
--- a/src/rabbit_amqqueue.erl
+++ b/src/rabbit_amqqueue.erl
@@ -160,10 +160,10 @@ declare(QueueName, Durable, AutoDelete, Args) ->
store_queue(Q = #amqqueue{durable = true}) ->
ok = mnesia:write(durable_queues, Q, write),
- ok = mnesia:write(Q),
+ ok = mnesia:write(amqqueue, Q, write),
ok;
store_queue(Q = #amqqueue{durable = false}) ->
- ok = mnesia:write(Q),
+ ok = mnesia:write(amqqueue, Q, write),
ok.
start_queue_process(Q) ->
@@ -194,6 +194,7 @@ with_or_die(Name, F) ->
list(VHostPath) ->
mnesia:dirty_match_object(
+ amqqueue,
#amqqueue{name = rabbit_misc:r(VHostPath, queue), _ = '_'}).
map(VHostPath, F) -> rabbit_misc:filter_exit_map(F, list(VHostPath)).
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index 960e4945..c97b4adc 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -107,14 +107,14 @@ recover() ->
fun () ->
mnesia:foldl(
fun (Exchange, Acc) ->
- ok = mnesia:write(Exchange),
+ ok = mnesia:write(exchange, Exchange, write),
Acc
end, ok, durable_exchanges),
mnesia:foldl(
fun (Route, Acc) ->
{_, ReverseRoute} = route_with_reverse(Route),
- ok = mnesia:write(Route),
- ok = mnesia:write(ReverseRoute),
+ ok = mnesia:write(route, Route, write),
+ ok = mnesia:write(reverse_route, ReverseRoute, write),
Acc
end, ok, durable_routes),
ok
@@ -129,7 +129,7 @@ declare(ExchangeName, Type, Durable, AutoDelete, Args) ->
rabbit_misc:execute_mnesia_transaction(
fun () ->
case mnesia:wread({exchange, ExchangeName}) of
- [] -> ok = mnesia:write(Exchange),
+ [] -> ok = mnesia:write(exchange, Exchange, write),
if Durable ->
ok = mnesia:write(
durable_exchanges, Exchange, write);
@@ -173,6 +173,7 @@ lookup_or_die(Name) ->
list(VHostPath) ->
mnesia:dirty_match_object(
+ exchange,
#exchange{name = rabbit_misc:r(VHostPath, exchange), _ = '_'}).
map(VHostPath, F) ->
@@ -271,6 +272,7 @@ match_bindings(#exchange{name = Name}, Match) ->
[QName || #route{binding = Binding = #binding{
queue_name = QName}} <-
mnesia:dirty_match_object(
+ route,
#route{binding = #binding{exchange_name = Name,
_ = '_'}}),
Match(Binding)]
@@ -297,32 +299,35 @@ lookup_qpids(Queues) ->
%% to be implemented for 0.91 ?
delete_bindings_for_exchange(ExchangeName) ->
- indexed_delete(
- #route{binding = #binding{exchange_name = ExchangeName,
- _ = '_'}},
- fun delete_forward_routes/1, fun mnesia:delete_object/1).
+ [begin
+ ok = mnesia:delete_object(reverse_route, reverse_route(Route), write),
+ ok = delete_forward_routes(Route)
+ end || Route <- mnesia:match_object(
+ route,
+ #route{binding = #binding{exchange_name = ExchangeName,
+ _ = '_'}},
+ read)],
+ ok.
delete_bindings_for_queue(QueueName) ->
Exchanges = exchanges_for_queue(QueueName),
- indexed_delete(
- reverse_route(#route{binding = #binding{queue_name = QueueName,
- _ = '_'}}),
- fun mnesia:delete_object/1, fun delete_forward_routes/1),
+ [begin
+ ok = delete_forward_routes(reverse_route(Route)),
+ ok = mnesia:delete_object(reverse_route, Route, write)
+ end || Route <- mnesia:match_object(
+ reverse_route,
+ reverse_route(
+ #route{binding = #binding{queue_name = QueueName,
+ _ = '_'}}),
+ write)],
[begin
[X] = mnesia:read({exchange, ExchangeName}),
ok = maybe_auto_delete(X)
end || ExchangeName <- Exchanges],
ok.
-indexed_delete(Match, ForwardsDeleteFun, ReverseDeleteFun) ->
- [begin
- ok = ReverseDeleteFun(reverse_route(Route)),
- ok = ForwardsDeleteFun(Route)
- end || Route <- mnesia:match_object(Match)],
- ok.
-
delete_forward_routes(Route) ->
- ok = mnesia:delete_object(Route),
+ ok = mnesia:delete_object(route, Route, write),
ok = mnesia:delete_object(durable_routes, Route, write).
exchanges_for_queue(QueueName) ->
@@ -342,7 +347,7 @@ has_bindings(ExchangeName) ->
catch exit:{aborted, {badarg, _}} ->
%% work around OTP-7025, which was fixed in R12B-1, by
%% falling back on a less efficient method
- case mnesia:match_object(MatchHead) of
+ case mnesia:match_object(route, MatchHead, read) of
[] -> false;
[_|_] -> true
end
@@ -400,8 +405,9 @@ sync_binding(ExchangeName, QueueName, RoutingKey, Arguments, Durable, Fun) ->
true -> Fun(durable_routes, #route{binding = Binding}, write);
false -> ok
end,
- [ok, ok] = [Fun(element(1, R), R, write) ||
- R <- tuple_to_list(route_with_reverse(Binding))],
+ {Route, ReverseRoute} = route_with_reverse(Binding),
+ ok = Fun(route, Route, write),
+ ok = Fun(reverse_route, ReverseRoute, write),
ok.
list_bindings(VHostPath) ->
@@ -412,6 +418,7 @@ list_bindings(VHostPath) ->
queue_name = QueueName,
args = Arguments}}
<- mnesia:dirty_match_object(
+ route,
#route{binding = #binding{
exchange_name = rabbit_misc:r(VHostPath, exchange),
_ = '_'},
@@ -571,7 +578,7 @@ list_exchange_bindings(ExchangeName) ->
#route{binding = #binding{queue_name = QueueName,
key = RoutingKey,
args = Arguments}}
- <- mnesia:dirty_match_object(Route)].
+ <- mnesia:dirty_match_object(route, Route)].
% Refactoring is left as an exercise for the reader
list_queue_bindings(QueueName) ->
@@ -581,4 +588,4 @@ list_queue_bindings(QueueName) ->
#route{binding = #binding{exchange_name = ExchangeName,
key = RoutingKey,
args = Arguments}}
- <- mnesia:dirty_match_object(Route)].
+ <- mnesia:dirty_match_object(route, Route)].
diff --git a/src/rabbit_networking.erl b/src/rabbit_networking.erl
index 99ea37d8..81c40a31 100644
--- a/src/rabbit_networking.erl
+++ b/src/rabbit_networking.erl
@@ -123,6 +123,7 @@ stop_tcp_listener(Host, Port) ->
tcp_listener_started(IPAddress, Port) ->
ok = mnesia:dirty_write(
+ listener,
#listener{node = node(),
protocol = tcp,
host = tcp_host(IPAddress),
@@ -130,6 +131,7 @@ tcp_listener_started(IPAddress, Port) ->
tcp_listener_stopped(IPAddress, Port) ->
ok = mnesia:dirty_delete_object(
+ listener,
#listener{node = node(),
protocol = tcp,
host = tcp_host(IPAddress),