1313 lookup /1 , lookup_many /1 , lookup_or_die /1 , list /0 , list /1 , lookup_scratch /2 ,
1414 update_scratch /3 , update_decorators /2 , immutable /1 ,
1515 info_keys /0 , info /1 , info /2 , info_all /1 , info_all /2 , info_all /4 ,
16- route /2 , route /3 , delete /3 , validate_binding /2 , count /0 ]).
16+ route /2 , route /3 , delete /3 , validate_binding /2 , count /0 ,
17+ ensure_deleted /3 ]).
1718-export ([list_names /0 ]).
1819-export ([serialise_events /1 ]).
1920-export ([serial /1 , peek_serial /1 ]).
@@ -91,10 +92,16 @@ serial(X) ->
9192 true -> rabbit_db_exchange :next_serial (X # exchange .name )
9293 end .
9394
94- -spec declare
95- (name (), type (), boolean (), boolean (), boolean (),
96- rabbit_framing :amqp_table (), rabbit_types :username ())
97- -> rabbit_types :exchange ().
95+ -spec declare (Name , Type , Durable , AutoDelete , Internal , Args , Username ) ->
96+ Ret when
97+ Name :: name (),
98+ Type :: type (),
99+ Durable :: boolean (),
100+ AutoDelete :: boolean (),
101+ Internal :: boolean (),
102+ Args :: rabbit_framing :amqp_table (),
103+ Username :: rabbit_types :username (),
104+ Ret :: {ok , rabbit_types :exchange ()} | {error , timeout }.
98105
99106declare (XName , Type , Durable , AutoDelete , Internal , Args , Username ) ->
100107 X = rabbit_exchange_decorator :set (
@@ -121,14 +128,16 @@ declare(XName, Type, Durable, AutoDelete, Internal, Args, Username) ->
121128 Serial = serial (Exchange ),
122129 ok = callback (X , create , Serial , [Exchange ]),
123130 rabbit_event :notify (exchange_created , info (Exchange )),
124- Exchange ;
131+ { ok , Exchange } ;
125132 {existing , Exchange } ->
126- Exchange
133+ {ok , Exchange };
134+ {error , timeout } = Err ->
135+ Err
127136 end ;
128137 _ ->
129138 rabbit_log :warning (" ignoring exchange.declare for exchange ~tp ,
130139 exchange.delete in progress~n ." , [XName ]),
131- X
140+ { ok , X }
132141 end .
133142
134143% % Used with binaries sent over the wire; the type may not exist.
@@ -444,9 +453,13 @@ cons_if_present(XName, L) ->
444453
445454-spec delete
446455 (name (), 'true' , rabbit_types :username ()) ->
447- 'ok' | rabbit_types :error ('not_found' | 'in_use' );
456+ 'ok' |
457+ rabbit_types :error ('not_found' | 'in_use' ) |
458+ rabbit_khepri :timeout_error ();
448459 (name (), 'false' , rabbit_types :username ()) ->
449- 'ok' | rabbit_types :error ('not_found' ).
460+ 'ok' |
461+ rabbit_types :error ('not_found' ) |
462+ rabbit_khepri :timeout_error ().
450463
451464delete (XName , IfUnused , Username ) ->
452465 try
@@ -478,6 +491,26 @@ process_deletions({deleted, #exchange{name = XName} = X, Bs, Deletions}) ->
478491 rabbit_binding :add_deletion (
479492 XName , {X , deleted , Bs }, Deletions )).
480493
494+ -spec ensure_deleted (ExchangeName , IfUnused , Username ) -> Ret when
495+ ExchangeName :: name (),
496+ IfUnused :: boolean (),
497+ Username :: rabbit_types :username (),
498+ Ret :: ok |
499+ rabbit_types :error ('in_use' ) |
500+ rabbit_khepri :timeout_error ().
501+ % % @doc A wrapper around `delete/3' which returns `ok' in the case that the
502+ % % exchange did not exist at time of deletion.
503+
504+ ensure_deleted (XName , IfUnused , Username ) ->
505+ case delete (XName , IfUnused , Username ) of
506+ ok ->
507+ ok ;
508+ {error , not_found } ->
509+ ok ;
510+ {error , _ } = Err ->
511+ Err
512+ end .
513+
481514-spec validate_binding
482515 (rabbit_types :exchange (), rabbit_types :binding ())
483516 -> rabbit_types :ok_or_error ({'binding_invalid' , string (), [any ()]}).
0 commit comments