diff options
| author | Michael Klishin <mklishin@pivotal.io> | 2018-09-27 06:20:33 +0300 |
|---|---|---|
| committer | Michael Klishin <mklishin@pivotal.io> | 2018-09-27 06:20:33 +0300 |
| commit | cab7e5805bd692d4e4bcf422075a21ecef2b7209 (patch) | |
| tree | 034790ac26bcb9d194083e7dea07b870d6756ae1 | |
| parent | ee1f21168baa52e6bbd74201be54131640361e5e (diff) | |
| download | rabbitmq-server-git-cab7e5805bd692d4e4bcf422075a21ecef2b7209.tar.gz | |
Make rabbit_vhost:add/2 idempotent
Part of rabbitmq/rabbitmq-cli#260
[#160792770]
| -rw-r--r-- | src/rabbit_vhost.erl | 11 | ||||
| -rw-r--r-- | test/vhost_SUITE.erl | 12 |
2 files changed, 19 insertions, 4 deletions
diff --git a/src/rabbit_vhost.erl b/src/rabbit_vhost.erl index fdcba35db2..bf89805d13 100644 --- a/src/rabbit_vhost.erl +++ b/src/rabbit_vhost.erl @@ -83,7 +83,13 @@ recover(VHost) -> -define(INFO_KEYS, [name, tracing, cluster_state]). -add(VHostPath, ActingUser) -> +add(VHost, ActingUser) -> + case exists(VHost) of + true -> ok; + false -> do_add(VHost, ActingUser) + end. + +do_add(VHostPath, ActingUser) -> rabbit_log:info("Adding vhost '~s'~n", [VHostPath]), R = rabbit_misc:execute_mnesia_transaction( fun () -> @@ -91,7 +97,8 @@ add(VHostPath, ActingUser) -> [] -> ok = mnesia:write(rabbit_vhost, #vhost{virtual_host = VHostPath}, write); - [_] -> mnesia:abort({vhost_already_exists, VHostPath}) + %% the vhost already exists + [_] -> ok end end, fun (ok, true) -> diff --git a/test/vhost_SUITE.erl b/test/vhost_SUITE.erl index 6ed84dcfe3..c999a19eb0 100644 --- a/test/vhost_SUITE.erl +++ b/test/vhost_SUITE.erl @@ -34,7 +34,8 @@ groups() -> ClusterSize1Tests = [ single_node_vhost_deletion_forces_connection_closure, vhost_failure_forces_connection_closure, - dead_vhost_connection_refused + dead_vhost_connection_refused, + vhost_creation_idempotency ], ClusterSize2Tests = [ cluster_vhost_deletion_forces_connection_closure, @@ -43,7 +44,8 @@ groups() -> vhost_failure_forces_connection_closure_on_failure_node, dead_vhost_connection_refused_on_failure_node, node_starts_with_dead_vhosts, - node_starts_with_dead_vhosts_and_ignore_slaves + node_starts_with_dead_vhosts_and_ignore_slaves, + vhost_creation_idempotency ], [ {cluster_size_1_network, [], ClusterSize1Tests}, @@ -373,6 +375,12 @@ node_starts_with_dead_vhosts_and_ignore_slaves(Config) -> true = rabbit_ct_broker_helpers:rpc(Config, 1, rabbit_vhost_sup_sup, is_vhost_alive, [VHost2]). +vhost_creation_idempotency(Config) -> + VHost = <<"idempotency-test">>, + ?assertEqual(ok, rabbit_ct_broker_helpers:add_vhost(Config, VHost)), + ?assertEqual(ok, rabbit_ct_broker_helpers:add_vhost(Config, VHost)), + ?assertEqual(ok, rabbit_ct_broker_helpers:add_vhost(Config, VHost)). + %% ------------------------------------------------------------------- %% Helpers %% ------------------------------------------------------------------- |
