From 932e608a4db2c30c283b46a5dab4233f1a85901b Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Thu, 29 Oct 2009 13:00:09 +0000 Subject: On application:stop, if we're not clustered, walk through all the ram tables, and clear them. This has been tested by declaring durable and non durable queues and checking that they disappear on application:stop from rabbit_queue table. The durable queue does correctly still restart on subsequent application:start --- src/rabbit.erl | 1 + src/rabbit_mnesia.erl | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/rabbit.erl b/src/rabbit.erl index 092ca3c9..1db85f4e 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -210,6 +210,7 @@ start(normal, []) -> stop(_State) -> terminated_ok = error_logger:delete_report_handler(rabbit_error_logger), ok = rabbit_alarm:stop(), + ok = rabbit_mnesia:maybe_empty_ram_only_tables(), ok. %--------------------------------------------------------------------------- diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl index c4d5aac6..03054ece 100644 --- a/src/rabbit_mnesia.erl +++ b/src/rabbit_mnesia.erl @@ -32,7 +32,7 @@ -module(rabbit_mnesia). -export([ensure_mnesia_dir/0, dir/0, status/0, init/0, is_db_empty/0, - cluster/1, reset/0, force_reset/0]). + cluster/1, reset/0, force_reset/0, maybe_empty_ram_only_tables/0]). -export([table_names/0]). @@ -54,6 +54,7 @@ -spec(cluster/1 :: ([erlang_node()]) -> 'ok'). -spec(reset/0 :: () -> 'ok'). -spec(force_reset/0 :: () -> 'ok'). +-spec(maybe_empty_ram_only_tables/0 :: () -> 'ok'). -spec(create_tables/0 :: () -> 'ok'). -endif. @@ -98,6 +99,12 @@ cluster(ClusterNodes) -> reset() -> reset(false). force_reset() -> reset(true). +maybe_empty_ram_only_tables() -> + case is_clustered() of + true -> ok; + false -> empty_ram_only_tables() + end. + %%-------------------------------------------------------------------- table_definitions() -> @@ -433,3 +440,18 @@ leave_cluster(Nodes, RunningNodes) -> false -> throw({error, {no_running_cluster_nodes, Nodes, RunningNodes}}) end. + +is_clustered() -> + RunningNodes = mnesia:system_info(running_db_nodes), + [node()] /= RunningNodes andalso [] /= RunningNodes. + +empty_ram_only_tables() -> + Node = node(), + lists:foreach( + fun (TabName) -> + case lists:member(Node, mnesia:table_info(TabName, ram_copies)) of + true -> {atomic, ok} = mnesia:clear_table(TabName); + false -> ok + end + end, table_names()), + ok. -- cgit v1.2.1 From 5cff5d8bf0cdd8475043dcb53a12ab2e52e66da3 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Thu, 29 Oct 2009 13:54:11 +0000 Subject: placation of Matthias - more sensible rabbit_mnesia API --- src/rabbit.erl | 5 ++++- src/rabbit_mnesia.erl | 40 ++++++++++++++++++---------------------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/rabbit.erl b/src/rabbit.erl index 1db85f4e..c66a44a7 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -210,7 +210,10 @@ start(normal, []) -> stop(_State) -> terminated_ok = error_logger:delete_report_handler(rabbit_error_logger), ok = rabbit_alarm:stop(), - ok = rabbit_mnesia:maybe_empty_ram_only_tables(), + ok = case rabbit_mnesia:is_clustered() of + true -> ok; + false -> rabbit_mnesia:empty_ram_only_tables() + end, ok. %--------------------------------------------------------------------------- diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl index 03054ece..749038db 100644 --- a/src/rabbit_mnesia.erl +++ b/src/rabbit_mnesia.erl @@ -32,7 +32,8 @@ -module(rabbit_mnesia). -export([ensure_mnesia_dir/0, dir/0, status/0, init/0, is_db_empty/0, - cluster/1, reset/0, force_reset/0, maybe_empty_ram_only_tables/0]). + cluster/1, reset/0, force_reset/0, is_clustered/0, + empty_ram_only_tables/0]). -export([table_names/0]). @@ -54,7 +55,8 @@ -spec(cluster/1 :: ([erlang_node()]) -> 'ok'). -spec(reset/0 :: () -> 'ok'). -spec(force_reset/0 :: () -> 'ok'). --spec(maybe_empty_ram_only_tables/0 :: () -> 'ok'). +-spec(is_clustered/0 :: () -> boolean()). +-spec(empty_ram_only_tables/0 :: () -> 'ok'). -spec(create_tables/0 :: () -> 'ok'). -endif. @@ -99,11 +101,20 @@ cluster(ClusterNodes) -> reset() -> reset(false). force_reset() -> reset(true). -maybe_empty_ram_only_tables() -> - case is_clustered() of - true -> ok; - false -> empty_ram_only_tables() - end. +is_clustered() -> + RunningNodes = mnesia:system_info(running_db_nodes), + [node()] /= RunningNodes andalso [] /= RunningNodes. + +empty_ram_only_tables() -> + Node = node(), + lists:foreach( + fun (TabName) -> + case lists:member(Node, mnesia:table_info(TabName, ram_copies)) of + true -> {atomic, ok} = mnesia:clear_table(TabName); + false -> ok + end + end, table_names()), + ok. %%-------------------------------------------------------------------- @@ -440,18 +451,3 @@ leave_cluster(Nodes, RunningNodes) -> false -> throw({error, {no_running_cluster_nodes, Nodes, RunningNodes}}) end. - -is_clustered() -> - RunningNodes = mnesia:system_info(running_db_nodes), - [node()] /= RunningNodes andalso [] /= RunningNodes. - -empty_ram_only_tables() -> - Node = node(), - lists:foreach( - fun (TabName) -> - case lists:member(Node, mnesia:table_info(TabName, ram_copies)) of - true -> {atomic, ok} = mnesia:clear_table(TabName); - false -> ok - end - end, table_names()), - ok. -- cgit v1.2.1 From 5a35aa20b59aad41a95fb1dbd720070584ddc488 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Thu, 29 Oct 2009 18:08:21 +0000 Subject: When clustered, on application:stop, make sure we call on_node_node(node()). This is necessary because application:stop does not constitute a node failure, thus other nodes won't notice. Tested by creating a 2-node cluster, creating durable and non durable queues and checking that they're removed from mnesia tables as appropriate on application:stop on one of the nodes. Of course, even with the application stopped on one node, rabbitmqctl status still reports both nodes in the list of running_nodes. All tests pass. --- src/rabbit.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rabbit.erl b/src/rabbit.erl index c66a44a7..29407e4e 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -211,7 +211,7 @@ stop(_State) -> terminated_ok = error_logger:delete_report_handler(rabbit_error_logger), ok = rabbit_alarm:stop(), ok = case rabbit_mnesia:is_clustered() of - true -> ok; + true -> rabbit_amqqueue:on_node_down(node()); false -> rabbit_mnesia:empty_ram_only_tables() end, ok. -- cgit v1.2.1