Rolling back misunderstanding about how preening works
This commit is contained in:
parent
b985a1832b
commit
ac559c126e
|
|
@ -30,7 +30,7 @@
|
|||
-record(vhost_realm, {virtual_host, realm}).
|
||||
|
||||
-record(realm, {name,ignore}).
|
||||
-record(realm_resource, {realm, resource}).
|
||||
-record(realm_resource, {realm, resource, durable}).
|
||||
|
||||
-record(user_realm, {username, realm, ticket_pattern}).
|
||||
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ declare(RealmName, NameBin, Durable, AutoDelete, Args) ->
|
|||
fun () ->
|
||||
case mnesia:wread({amqqueue, QName}) of
|
||||
[] -> ok = recover_queue(Q),
|
||||
ok = rabbit_realm:add(RealmName, QName),
|
||||
ok = rabbit_realm:add(RealmName, QName, Durable),
|
||||
Q;
|
||||
[ExistingQ] -> ExistingQ
|
||||
end
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ declare(RealmName, NameBin, Type, Durable, AutoDelete, Args) ->
|
|||
durable_exchanges, Exchange, write);
|
||||
true -> ok
|
||||
end,
|
||||
ok = rabbit_realm:add(RealmName, XName),
|
||||
ok = rabbit_realm:add(RealmName, XName, Durable),
|
||||
Exchange;
|
||||
[ExistingX] -> ExistingX
|
||||
end
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
-export([recover/0]).
|
||||
-export([add_realm/1, delete_realm/1, list_vhost_realms/1]).
|
||||
-export([add/2, delete/2, check/2, delete_from_all/1]).
|
||||
-export([add/3, check/2, delete_from_all/1]).
|
||||
-export([access_request/3, enter_realm/3, leave_realms/1]).
|
||||
-export([on_node_down/1]).
|
||||
|
||||
|
|
@ -44,8 +44,8 @@
|
|||
-spec(add_realm/1 :: (realm_name()) -> 'ok').
|
||||
-spec(delete_realm/1 :: (realm_name()) -> 'ok').
|
||||
-spec(list_vhost_realms/1 :: (vhost()) -> [name()]).
|
||||
-spec(add/2 :: (realm_name(), r(e_or_q())) -> 'ok').
|
||||
-spec(delete/2 :: (realm_name(), r(e_or_q())) -> 'ok').
|
||||
% -spec(add/3 :: (realm_name(), r(e_or_q())) -> 'ok').
|
||||
% -spec(delete/3 :: (realm_name(), r(e_or_q())) -> 'ok').
|
||||
-spec(check/2 :: (realm_name(), r(e_or_q())) -> bool() | not_found()).
|
||||
-spec(delete_from_all/1 :: (r(e_or_q())) -> 'ok').
|
||||
-spec(access_request/3 :: (username(), bool(), ticket()) ->
|
||||
|
|
@ -109,21 +109,18 @@ list_vhost_realms(VHostPath) ->
|
|||
VHostPath,
|
||||
fun () -> mnesia:read({vhost_realm, VHostPath}) end))].
|
||||
|
||||
add(Realm = #resource{kind = realm}, Resource = #resource{}) ->
|
||||
manage_link(fun mnesia:write/1, Realm, Resource).
|
||||
|
||||
delete(Realm = #resource{kind = realm}, Resource = #resource{}) ->
|
||||
manage_link(fun mnesia:delete_object/1, Realm, Resource).
|
||||
add(Realm = #resource{kind = realm}, Resource = #resource{}, Durable) ->
|
||||
manage_link(fun mnesia:write/1, Realm, Resource, Durable).
|
||||
|
||||
% This links or unlinks a resource to a realm
|
||||
manage_link(Action, Realm = #resource{kind = realm, name = RealmName},
|
||||
Resource = #resource{name = ResourceName}) ->
|
||||
Resource = #resource{name = ResourceName}, Durable) ->
|
||||
Table = realm_table_for_resource(Resource),
|
||||
rabbit_misc:execute_mnesia_transaction(
|
||||
fun () ->
|
||||
case mnesia:read({realm, Realm}) of
|
||||
[] -> mnesia:abort(not_found);
|
||||
[_] -> Action({Table, RealmName, ResourceName})
|
||||
[_] -> Action({Table, RealmName, ResourceName, Durable})
|
||||
end
|
||||
end).
|
||||
|
||||
|
|
@ -132,7 +129,6 @@ realm_table_for_resource(#resource{kind = queue}) -> realm_queue.
|
|||
parent_table_for_resource(#resource{kind = exchange}) -> exchange;
|
||||
parent_table_for_resource(#resource{kind = queue}) -> amqqueue.
|
||||
|
||||
|
||||
check(#resource{kind = realm, name = Realm}, Resource = #resource{}) ->
|
||||
F = mnesia:match_object(#realm_resource{resource = Resource#resource.name, realm = Realm}),
|
||||
case mnesia:async_dirty(F) of
|
||||
|
|
@ -236,14 +232,14 @@ preen_realm(Resource = #resource{}) ->
|
|||
LinkType = realm_table_for_resource(Resource),
|
||||
Q = qlc:q([L#realm_resource.resource || L <- mnesia:table(LinkType)]),
|
||||
Cursor = qlc:cursor(Q),
|
||||
preen_next(Cursor,LinkType,parent_table_for_resource(Resource)),
|
||||
preen_next(Cursor, LinkType, parent_table_for_resource(Resource)),
|
||||
qlc:delete_cursor(Cursor).
|
||||
|
||||
preen_next(Cursor,LinkType,ParentTable) ->
|
||||
|
||||
preen_next(Cursor, LinkType, ParentTable) ->
|
||||
case qlc:next_answers(Cursor,1) of
|
||||
[] -> ok;
|
||||
[ResourceKey] ->
|
||||
case mnesia:read({ParentTable,ResourceKey}) of
|
||||
case mnesia:match_object({ParentTable,ResourceKey,'_'}) of
|
||||
[] ->
|
||||
mnesia:delete_object({LinkType,'_',ResourceKey});
|
||||
_ -> ok
|
||||
|
|
|
|||
|
|
@ -25,7 +25,9 @@
|
|||
|
||||
-module(rabbit_tests).
|
||||
|
||||
-export([all_tests/0, test_parsing/0]).
|
||||
-include("rabbit.hrl").
|
||||
|
||||
-export([all_tests/0, test_parsing/0,preening_test/0]).
|
||||
|
||||
-import(lists).
|
||||
|
||||
|
|
@ -46,6 +48,25 @@ all_tests() ->
|
|||
test_parsing() ->
|
||||
passed = test_content_properties(),
|
||||
passed.
|
||||
|
||||
preening_test() ->
|
||||
Realm = #resource{virtual_host = <<"/">>,kind = realm, name = <<"/data">>},
|
||||
loop(Realm,1),
|
||||
rabbit_realm:recover().
|
||||
|
||||
loop(_,0) -> ok;
|
||||
loop(Realm,N) ->
|
||||
declare(Realm,true),
|
||||
declare(Realm,false),
|
||||
loop(Realm,N-1).
|
||||
|
||||
declare(Realm,Durable) ->
|
||||
X = rabbit_misc:binstring_guid("x"),
|
||||
Q = rabbit_misc:binstring_guid("amq.gen"),
|
||||
AutoDelete = false,
|
||||
rabbit_exchange:declare(Realm,X, <<"direct">>, Durable, AutoDelete, undefined),
|
||||
rabbit_amqqueue:declare(Realm, Q, Durable, AutoDelete, undefined).
|
||||
|
||||
|
||||
test_content_properties() ->
|
||||
test_content_prop_roundtrip([], <<0, 0>>),
|
||||
|
|
|
|||
Loading…
Reference in New Issue