3030 create_or_get /1 ,
3131 set /1 ,
3232 delete /2 ,
33+ delete_if /3 ,
3334 update /2 ,
3435 update_decorators /2 ,
3536 exists /1
@@ -384,34 +385,51 @@ list_for_count_in_khepri(VHostName) ->
384385 rabbit_khepri :timeout_error ().
385386
386387delete (QueueName , Reason ) ->
388+ delete_if (QueueName , [], Reason ).
389+
390+ -spec delete_if (QName , Conditions , Reason ) -> Ret when
391+ QName :: rabbit_amqqueue :name (),
392+ Conditions :: [khepri_condition :condition ()],
393+ Reason :: atom (),
394+ Ret :: ok |
395+ Deletions :: rabbit_binding :deletions () |
396+ rabbit_khepri :timeout_error ().
397+
398+ delete_if (QueueName , Conditions , Reason ) ->
387399 rabbit_khepri :handle_fallback (
388- #{mnesia => fun () -> delete_in_mnesia (QueueName , Reason ) end ,
389- khepri => fun () -> delete_in_khepri (QueueName ) end
400+ #{mnesia => fun () -> delete_in_mnesia (QueueName , Conditions , Reason ) end ,
401+ khepri => fun () -> delete_in_khepri (QueueName , Conditions ) end
390402 }).
391403
392- delete_in_mnesia (QueueName , Reason ) ->
404+ delete_in_mnesia (QueueName , Conditions , Reason ) ->
393405 rabbit_mnesia :execute_mnesia_transaction (
394406 fun () ->
395407 case {mnesia :wread ({? MNESIA_TABLE , QueueName }),
396408 mnesia :wread ({? MNESIA_DURABLE_TABLE , QueueName })} of
397409 {[], []} ->
398410 ok ;
399- _ ->
400- OnlyDurable = case Reason of
401- missing_owner -> true ;
402- _ -> false
403- end ,
404- internal_delete_in_mnesia (QueueName , OnlyDurable , Reason )
411+ {Qs , DurableQs } ->
412+ case queue_matches_conditions (Qs ++ DurableQs , Conditions ) of
413+ true ->
414+ OnlyDurable = case Reason of
415+ missing_owner -> true ;
416+ _ -> false
417+ end ,
418+ internal_delete_in_mnesia (QueueName , OnlyDurable , Reason );
419+ false ->
420+ ok
421+ end
405422 end
406423 end ).
407424
408- delete_in_khepri (QueueName ) ->
409- delete_in_khepri (QueueName , false ).
425+ delete_in_khepri (QueueName , Conditions ) ->
426+ delete_in_khepri (QueueName , Conditions , false ).
410427
411- delete_in_khepri (QueueName , OnlyDurable ) ->
428+ delete_in_khepri (QueueName , Conditions , OnlyDurable ) ->
429+ Path0 = khepri_queue_path (QueueName ),
430+ Path = khepri_path :combine_with_conditions (Path0 , Conditions ),
412431 rabbit_khepri :transaction (
413432 fun () ->
414- Path = khepri_queue_path (QueueName ),
415433 case khepri_tx_adv :delete (Path ) of
416434 {ok , #{data := _ }} ->
417435 % % we want to execute some things, as decided by rabbit_exchange,
@@ -438,7 +456,7 @@ internal_delete(QueueName, OnlyDurable, Reason) ->
438456 % % HA queues are removed it can be removed.
439457 rabbit_khepri :handle_fallback (
440458 #{mnesia => fun () -> internal_delete_in_mnesia (QueueName , OnlyDurable , Reason ) end ,
441- khepri => fun () -> delete_in_khepri (QueueName , OnlyDurable ) end
459+ khepri => fun () -> delete_in_khepri (QueueName , [], OnlyDurable ) end
442460 }).
443461
444462internal_delete_in_mnesia (QueueName , OnlyDurable , Reason ) ->
@@ -1360,6 +1378,20 @@ clear_in_khepri() ->
13601378% % Internal
13611379% % --------------------------------------------------------------
13621380
1381+ queue_matches_conditions (_ , []) ->
1382+ true ;
1383+ queue_matches_conditions ([], _Conditions ) ->
1384+ false ;
1385+ queue_matches_conditions ([Q | _ ], [# if_data_matches {pattern = Pattern ,
1386+ conditions = Conditions } | Rest ]) ->
1387+ MatchSpec = ets :match_spec_compile ([{Pattern , Conditions , [match ]}]),
1388+ case ets :match_spec_run ([Q ], MatchSpec ) of
1389+ [match ] -> queue_matches_conditions ([Q ], Rest );
1390+ [] -> false
1391+ end ;
1392+ queue_matches_conditions (_ , [Condition | _ ]) ->
1393+ error ({unsupported_condition , Condition }).
1394+
13631395list_with_possible_retry_in_mnesia (Fun ) ->
13641396 % % amqqueue migration:
13651397 % % The `rabbit_queue' or `rabbit_durable_queue' tables
0 commit comments