diff --git a/deps/rabbit/src/rabbit_db_exchange.erl b/deps/rabbit/src/rabbit_db_exchange.erl index 56077ca8a850..ae704e7af034 100644 --- a/deps/rabbit/src/rabbit_db_exchange.erl +++ b/deps/rabbit/src/rabbit_db_exchange.erl @@ -409,8 +409,12 @@ create_or_get_in_mnesia(#exchange{name = XName} = X) -> end). create_or_get_in_khepri(#exchange{name = XName} = X) -> - Path = khepri_exchange_path(XName), - case rabbit_khepri:create(Path, X) of + Path0 = khepri_exchange_path(XName), + Path1 = khepri_path:combine_with_conditions( + Path0, [#if_any{conditions = + [#if_node_exists{exists = false}, + #if_has_payload{has_payload = false}]}]), + case rabbit_khepri:put(Path1, X) of ok -> {new, X}; {error, {khepri, mismatching_node, #{node_props := #{data := ExistingX}}}} -> diff --git a/deps/rabbit/src/rabbit_definitions.erl b/deps/rabbit/src/rabbit_definitions.erl index 257f76232e10..573e4f577c88 100644 --- a/deps/rabbit/src/rabbit_definitions.erl +++ b/deps/rabbit/src/rabbit_definitions.erl @@ -507,9 +507,9 @@ apply_defs(Map, ActingUser, SuccessFun) when is_function(SuccessFun) -> concurrent_for_all(vhosts, ActingUser, Map, fun add_vhost/2), validate_limits(Map), concurrent_for_all(permissions, ActingUser, Map, fun add_permission/2), - concurrent_for_all(topic_permissions, ActingUser, Map, fun add_topic_permission/2), concurrent_for_all(exchanges, ActingUser, Map, fun add_exchange/2), + concurrent_for_all(topic_permissions, ActingUser, Map, fun add_topic_permission/2), sequential_for_all(global_parameters, ActingUser, Map, fun add_global_parameter/2), %% importing policies concurrently can be unsafe as queues will be getting