From d956c5cb97ff0e9a95d14d307e67aabcfaaa1c63 Mon Sep 17 00:00:00 2001 From: Diana Corbacho Date: Thu, 30 Jun 2016 13:20:35 +0100 Subject: [PATCH 01/11] Tune scheduling bind flags for Erlang VM --- scripts/rabbitmq-env | 5 ++++- scripts/rabbitmq-server.bat | 5 +++++ scripts/rabbitmq-service.bat | 5 +++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/scripts/rabbitmq-env b/scripts/rabbitmq-env index def47ebd276d..87385d484a82 100755 --- a/scripts/rabbitmq-env +++ b/scripts/rabbitmq-env @@ -62,8 +62,11 @@ RABBITMQ_HOME="$(rmq_realpath "${RABBITMQ_SCRIPTS_DIR}/..")" ## Set defaults . ${RABBITMQ_SCRIPTS_DIR}/rabbitmq-defaults +DEFAULT_SCHEDULING_BIND_TYPE_FLAG="tnnps" +[ "x" = "x$RABBITMQ_SCHEDULING_BIND_TYPE_FLAG" ] && RABBITMQ_SCHEDULING_BIND_TYPE_FLAG=${DEFAULT_SCHEDULING_BIND_TYPE_FLAG} + ## Common defaults -SERVER_ERL_ARGS="+P 1048576" +SERVER_ERL_ARGS="+P 1048576 +stbt $RABBITMQ_SCHEDULING_BIND_TYPE_FLAG " # We save the current value of $RABBITMQ_PID_FILE in case it was set by # an init script. If $CONF_ENV_FILE overrides it again, we must ignore diff --git a/scripts/rabbitmq-server.bat b/scripts/rabbitmq-server.bat index f014197a39ba..06094e0d6f0e 100644 --- a/scripts/rabbitmq-server.bat +++ b/scripts/rabbitmq-server.bat @@ -112,6 +112,10 @@ if "!ENV_OK!"=="false" ( EXIT /b 78 ) +if "!RABBITMQ_SCHEDULING_BIND_TYPE_FLAG!"=="" ( + set RABBITMQ_SCHEDULING_BIND_TYPE_FLAG="tnnps" +) + "!ERLANG_HOME!\bin\erl.exe" ^ -pa "!RABBITMQ_EBIN_ROOT!" ^ -boot start_sasl ^ @@ -120,6 +124,7 @@ if "!ENV_OK!"=="false" ( !RABBITMQ_NAME_TYPE! !RABBITMQ_NODENAME! ^ +W w ^ +A "!RABBITMQ_IO_THREAD_POOL_SIZE!" ^ ++stbt "!RABBITMQ_SCHEDULING_BIND_TYPE_FLAG!" ^ +P 1048576 ^ !RABBITMQ_LISTEN_ARG! ^ !RABBITMQ_SERVER_ERL_ARGS! ^ diff --git a/scripts/rabbitmq-service.bat b/scripts/rabbitmq-service.bat index b5dd2a5c7b82..2831b262df63 100644 --- a/scripts/rabbitmq-service.bat +++ b/scripts/rabbitmq-service.bat @@ -173,6 +173,10 @@ if "!RABBITMQ_SERVICE_RESTART!"=="" ( set RABBITMQ_SERVICE_RESTART=restart ) +if "!RABBITMQ_SCHEDULING_BIND_TYPE_FLAG!"=="" ( + set RABBITMQ_SCHEDULING_BIND_TYPE_FLAG="tnnps" +) + set ERLANG_SERVICE_ARGUMENTS= ^ -pa "!RABBITMQ_EBIN_ROOT!" ^ -boot start_sasl ^ @@ -180,6 +184,7 @@ set ERLANG_SERVICE_ARGUMENTS= ^ !RABBITMQ_CONFIG_ARG! ^ +W w ^ +A "!RABBITMQ_IO_THREAD_POOL_SIZE!" ^ ++stbt "!RABBITMQ_SCHEDULING_BIND_TYPE_FLAG!" ^ +P 1048576 ^ !RABBITMQ_LISTEN_ARG! ^ !RABBITMQ_SERVER_ERL_ARGS! ^ From 179873dc29cfd156986d0a02f61e8961f8edcda6 Mon Sep 17 00:00:00 2001 From: Diana Corbacho Date: Wed, 13 Jul 2016 11:03:50 +0100 Subject: [PATCH 02/11] Renaming --- scripts/rabbitmq-env | 6 +++--- scripts/rabbitmq-server.bat | 6 +++--- scripts/rabbitmq-service.bat | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/scripts/rabbitmq-env b/scripts/rabbitmq-env index 87385d484a82..b5933d495fbf 100755 --- a/scripts/rabbitmq-env +++ b/scripts/rabbitmq-env @@ -62,11 +62,11 @@ RABBITMQ_HOME="$(rmq_realpath "${RABBITMQ_SCRIPTS_DIR}/..")" ## Set defaults . ${RABBITMQ_SCRIPTS_DIR}/rabbitmq-defaults -DEFAULT_SCHEDULING_BIND_TYPE_FLAG="tnnps" -[ "x" = "x$RABBITMQ_SCHEDULING_BIND_TYPE_FLAG" ] && RABBITMQ_SCHEDULING_BIND_TYPE_FLAG=${DEFAULT_SCHEDULING_BIND_TYPE_FLAG} +DEFAULT_SCHEDULING_BIND_TYPE="tnnps" +[ "x" = "x$RABBITMQ_SCHEDULING_BIND_TYPE" ] && RABBITMQ_SCHEDULING_BIND_TYPE=${DEFAULT_SCHEDULING_BIND_TYPE} ## Common defaults -SERVER_ERL_ARGS="+P 1048576 +stbt $RABBITMQ_SCHEDULING_BIND_TYPE_FLAG " +SERVER_ERL_ARGS="+P 1048576 +stbt $RABBITMQ_SCHEDULING_BIND_TYPE " # We save the current value of $RABBITMQ_PID_FILE in case it was set by # an init script. If $CONF_ENV_FILE overrides it again, we must ignore diff --git a/scripts/rabbitmq-server.bat b/scripts/rabbitmq-server.bat index 06094e0d6f0e..a8ba29c6fb25 100644 --- a/scripts/rabbitmq-server.bat +++ b/scripts/rabbitmq-server.bat @@ -112,8 +112,8 @@ if "!ENV_OK!"=="false" ( EXIT /b 78 ) -if "!RABBITMQ_SCHEDULING_BIND_TYPE_FLAG!"=="" ( - set RABBITMQ_SCHEDULING_BIND_TYPE_FLAG="tnnps" +if "!RABBITMQ_SCHEDULING_BIND_TYPE!"=="" ( + set RABBITMQ_SCHEDULING_BIND_TYPE="tnnps" ) "!ERLANG_HOME!\bin\erl.exe" ^ @@ -124,7 +124,7 @@ if "!RABBITMQ_SCHEDULING_BIND_TYPE_FLAG!"=="" ( !RABBITMQ_NAME_TYPE! !RABBITMQ_NODENAME! ^ +W w ^ +A "!RABBITMQ_IO_THREAD_POOL_SIZE!" ^ -+stbt "!RABBITMQ_SCHEDULING_BIND_TYPE_FLAG!" ^ ++stbt "!RABBITMQ_SCHEDULING_BIND_TYPE!" ^ +P 1048576 ^ !RABBITMQ_LISTEN_ARG! ^ !RABBITMQ_SERVER_ERL_ARGS! ^ diff --git a/scripts/rabbitmq-service.bat b/scripts/rabbitmq-service.bat index 2831b262df63..ee2c406e3651 100644 --- a/scripts/rabbitmq-service.bat +++ b/scripts/rabbitmq-service.bat @@ -173,8 +173,8 @@ if "!RABBITMQ_SERVICE_RESTART!"=="" ( set RABBITMQ_SERVICE_RESTART=restart ) -if "!RABBITMQ_SCHEDULING_BIND_TYPE_FLAG!"=="" ( - set RABBITMQ_SCHEDULING_BIND_TYPE_FLAG="tnnps" +if "!RABBITMQ_SCHEDULING_BIND_TYPE!"=="" ( + set RABBITMQ_SCHEDULING_BIND_TYPE="tnnps" ) set ERLANG_SERVICE_ARGUMENTS= ^ @@ -184,7 +184,7 @@ set ERLANG_SERVICE_ARGUMENTS= ^ !RABBITMQ_CONFIG_ARG! ^ +W w ^ +A "!RABBITMQ_IO_THREAD_POOL_SIZE!" ^ -+stbt "!RABBITMQ_SCHEDULING_BIND_TYPE_FLAG!" ^ ++stbt "!RABBITMQ_SCHEDULING_BIND_TYPE!" ^ +P 1048576 ^ !RABBITMQ_LISTEN_ARG! ^ !RABBITMQ_SERVER_ERL_ARGS! ^ From c93d5366e9353a7319c2f7e04acb5309bea5e74e Mon Sep 17 00:00:00 2001 From: Karl Nilsson Date: Thu, 14 Jul 2016 11:19:17 +0100 Subject: [PATCH 03/11] Set scheduler bindings in rabbitmq-env.bat for windows rename SCHEDULING to SCHEDULER in line with erlang documentation --- scripts/rabbitmq-env | 6 +++--- scripts/rabbitmq-env.bat | 19 ++++++++++++++----- scripts/rabbitmq-server.bat | 8 +------- scripts/rabbitmq-service.bat | 8 +------- 4 files changed, 19 insertions(+), 22 deletions(-) diff --git a/scripts/rabbitmq-env b/scripts/rabbitmq-env index b5933d495fbf..44fac723a57f 100755 --- a/scripts/rabbitmq-env +++ b/scripts/rabbitmq-env @@ -62,11 +62,11 @@ RABBITMQ_HOME="$(rmq_realpath "${RABBITMQ_SCRIPTS_DIR}/..")" ## Set defaults . ${RABBITMQ_SCRIPTS_DIR}/rabbitmq-defaults -DEFAULT_SCHEDULING_BIND_TYPE="tnnps" -[ "x" = "x$RABBITMQ_SCHEDULING_BIND_TYPE" ] && RABBITMQ_SCHEDULING_BIND_TYPE=${DEFAULT_SCHEDULING_BIND_TYPE} +DEFAULT_SCHEDULER_BIND_TYPE="tnnps" +[ "x" = "x$RABBITMQ_SCHEDULER_BIND_TYPE" ] && RABBITMQ_SCHEDULER_BIND_TYPE=${DEFAULT_SCHEDULER_BIND_TYPE} ## Common defaults -SERVER_ERL_ARGS="+P 1048576 +stbt $RABBITMQ_SCHEDULING_BIND_TYPE " +SERVER_ERL_ARGS="+P 1048576 +stbt $RABBITMQ_SCHEDULER_BIND_TYPE " # We save the current value of $RABBITMQ_PID_FILE in case it was set by # an init script. If $CONF_ENV_FILE overrides it again, we must ignore diff --git a/scripts/rabbitmq-env.bat b/scripts/rabbitmq-env.bat index ea9cf4596226..b7ae20c90221 100644 --- a/scripts/rabbitmq-env.bat +++ b/scripts/rabbitmq-env.bat @@ -30,6 +30,14 @@ REM ## Set defaults REM . ${SCRIPT_DIR}/rabbitmq-defaults call "%SCRIPT_DIR%\rabbitmq-defaults.bat" +set DEFAULT_SCHEDULER_BIND_TYPE=tnnps +REM [ "x" = "x$RABBITMQ_SCHEDULER_BIND_TYPE" ] && RABBITMQ_SCHEDULER_BIND_TYPE=${DEFAULT_SCHEDULER_BIND_TYPE} + +REM set the default scheduling bind type +if "!RABBITMQ_SCHEDULER_BIND_TYPE!"=="" ( + set RABBITMQ_SCHEDULER_BIND_TYPE=!DEFAULT_SCHEDULER_BIND_TYPE! +) + REM These common defaults aren't referenced in the batch scripts REM ## Common defaults REM SERVER_ERL_ARGS="+P 1048576" @@ -41,9 +49,8 @@ REM echo -n "WARNING: ignoring /etc/rabbitmq/rabbitmq.conf -- " REM echo "location has moved to ${CONF_ENV_FILE}" REM fi -REM ERL_ARGS aren't referenced in the batch scripts REM Common defaults -REM set SERVER_ERL_ARGS=+P 1048576 +set SERVER_ERL_ARGS=+P 1048576 +stbt !RABBITMQ_SCHEDULER_BIND_TYPE! REM ## Get configuration variables from the configure environment file REM [ -f ${CONF_ENV_FILE} ] && . ${CONF_ENV_FILE} || true @@ -151,7 +158,9 @@ if "!RABBITMQ_DIST_PORT!"=="" ( ) REM [ "x" = "x$RABBITMQ_SERVER_ERL_ARGS" ] && RABBITMQ_SERVER_ERL_ARGS=${SERVER_ERL_ARGS} -REM No Windows equivalent +if "!RABBITMQ_SERVER_ERL_ARGS!"=="" ( + set RABBITMQ_SERVER_ERL_ARGS=!SERVER_ERL_ARGS! +) REM [ "x" = "x$RABBITMQ_CONFIG_FILE" ] && RABBITMQ_CONFIG_FILE=${CONFIG_FILE} if "!RABBITMQ_CONFIG_FILE!"=="" ( @@ -386,8 +395,8 @@ goto :filter_paths_done set paths=%1 set paths=%paths:"=% for /f "tokens=1* delims=;" %%a in ("%paths%") do ( - if not "%%a" == "" call :filter_path %%a - if not "%%b" == "" call :filter_paths %%b + if not "%%a" == "" call :filter_path "%%a" + if not "%%b" == "" call :filter_paths "%%b" ) set paths= exit /b diff --git a/scripts/rabbitmq-server.bat b/scripts/rabbitmq-server.bat index a8ba29c6fb25..585a830efa2d 100644 --- a/scripts/rabbitmq-server.bat +++ b/scripts/rabbitmq-server.bat @@ -112,10 +112,6 @@ if "!ENV_OK!"=="false" ( EXIT /b 78 ) -if "!RABBITMQ_SCHEDULING_BIND_TYPE!"=="" ( - set RABBITMQ_SCHEDULING_BIND_TYPE="tnnps" -) - "!ERLANG_HOME!\bin\erl.exe" ^ -pa "!RABBITMQ_EBIN_ROOT!" ^ -boot start_sasl ^ @@ -124,10 +120,8 @@ if "!RABBITMQ_SCHEDULING_BIND_TYPE!"=="" ( !RABBITMQ_NAME_TYPE! !RABBITMQ_NODENAME! ^ +W w ^ +A "!RABBITMQ_IO_THREAD_POOL_SIZE!" ^ -+stbt "!RABBITMQ_SCHEDULING_BIND_TYPE!" ^ -+P 1048576 ^ -!RABBITMQ_LISTEN_ARG! ^ !RABBITMQ_SERVER_ERL_ARGS! ^ +!RABBITMQ_LISTEN_ARG! ^ -kernel inet_default_connect_options "[{nodelay, true}]" ^ !RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS! ^ -sasl errlog_type error ^ diff --git a/scripts/rabbitmq-service.bat b/scripts/rabbitmq-service.bat index ee2c406e3651..f8a8d5a46481 100644 --- a/scripts/rabbitmq-service.bat +++ b/scripts/rabbitmq-service.bat @@ -173,10 +173,6 @@ if "!RABBITMQ_SERVICE_RESTART!"=="" ( set RABBITMQ_SERVICE_RESTART=restart ) -if "!RABBITMQ_SCHEDULING_BIND_TYPE!"=="" ( - set RABBITMQ_SCHEDULING_BIND_TYPE="tnnps" -) - set ERLANG_SERVICE_ARGUMENTS= ^ -pa "!RABBITMQ_EBIN_ROOT!" ^ -boot start_sasl ^ @@ -184,10 +180,8 @@ set ERLANG_SERVICE_ARGUMENTS= ^ !RABBITMQ_CONFIG_ARG! ^ +W w ^ +A "!RABBITMQ_IO_THREAD_POOL_SIZE!" ^ -+stbt "!RABBITMQ_SCHEDULING_BIND_TYPE!" ^ -+P 1048576 ^ -!RABBITMQ_LISTEN_ARG! ^ !RABBITMQ_SERVER_ERL_ARGS! ^ +!RABBITMQ_LISTEN_ARG! ^ -kernel inet_default_connect_options "[{nodelay,true}]" ^ !RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS! ^ -sasl errlog_type error ^ From 3448f97e0ab6c6978066f937a14d467ad9b2d6ca Mon Sep 17 00:00:00 2001 From: Michael Klishin Date: Thu, 14 Jul 2016 13:19:56 +0300 Subject: [PATCH 04/11] Update rabbitmq-components.mk --- rabbitmq-components.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/rabbitmq-components.mk b/rabbitmq-components.mk index 4d610020521a..c82ba0baa08c 100644 --- a/rabbitmq-components.mk +++ b/rabbitmq-components.mk @@ -44,6 +44,7 @@ dep_rabbitmq_event_exchange = git_rmq rabbitmq-event-exchange $(curren dep_rabbitmq_federation = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master dep_rabbitmq_federation_management = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master dep_rabbitmq_java_client = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master +dep_rabbitmq_jms_client = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master dep_rabbitmq_jms_topic_exchange = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master dep_rabbitmq_lvc = git_rmq rabbitmq-lvc-plugin $(current_rmq_ref) $(base_rmq_ref) master dep_rabbitmq_management = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master From 7b36b7ff75d5d7cea98b40690fd7b19c983b9c5c Mon Sep 17 00:00:00 2001 From: Alexey Lebedeff Date: Wed, 13 Jul 2016 18:15:04 +0300 Subject: [PATCH 05/11] Default timeouts: fix global/add per-command - Global timeout `?RPC_TIMEOUT` was not used, because default value of infinity was always introduced via `?TIMEOUT_DEF`. Now `infinity` is used for commands without timeout support, and `?RPC_TIMEOUT` otherwise. - `?COMMANDS_WITH_TIMEOUT` now can contain per-command default values for timeout, using tuple `{Command, DefaultTimeoutInMilliSeconds}` instead of just `Command`. --- include/rabbit_cli.hrl | 2 +- src/rabbit_control_main.erl | 28 ++++++++++++++++++++++------ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/include/rabbit_cli.hrl b/include/rabbit_cli.hrl index 7f5db6053b07..a0d1ecfdd519 100644 --- a/include/rabbit_cli.hrl +++ b/include/rabbit_cli.hrl @@ -34,7 +34,7 @@ -define(NODE_DEF(Node), {?NODE_OPT, {option, Node}}). -define(QUIET_DEF, {?QUIET_OPT, flag}). -define(VHOST_DEF, {?VHOST_OPT, {option, "/"}}). --define(TIMEOUT_DEF, {?TIMEOUT_OPT, {option, "infinity"}}). +-define(TIMEOUT_DEF, {?TIMEOUT_OPT, {option, use_default}}). -define(VERBOSE_DEF, {?VERBOSE_OPT, flag}). -define(MINIMAL_DEF, {?MINIMAL_OPT, flag}). diff --git a/src/rabbit_control_main.erl b/src/rabbit_control_main.erl index fb3da212872b..55839d34e046 100644 --- a/src/rabbit_control_main.erl +++ b/src/rabbit_control_main.erl @@ -116,6 +116,7 @@ forget_cluster_node, rename_cluster_node, cluster_status, status, environment, eval, force_boot, help, node_health_check, hipe_compile]). +%% [Command | {Command, DefaultTimeoutInMilliSeconds}] -define(COMMANDS_WITH_TIMEOUT, [list_user_permissions, list_policies, list_queues, list_exchanges, list_bindings, list_connections, list_channels, list_consumers, @@ -152,7 +153,7 @@ start() -> end end, try - T = case get_timeout(Opts) of + T = case get_timeout(Command, Opts) of {ok, Timeout} -> Timeout; {error, _} -> @@ -187,8 +188,23 @@ print_report0(Node, {Module, InfoFun, KeysFun}, VHostArg) -> end, io:nl(). -get_timeout(Opts) -> - parse_timeout(proplists:get_value(?TIMEOUT_OPT, Opts, ?RPC_TIMEOUT)). +get_timeout(Command, Opts) -> + Default = case proplists:lookup(Command, ?COMMANDS_WITH_TIMEOUT) of + none -> + infinity; + {Command, true} -> + ?RPC_TIMEOUT; + {Command, D} -> + D + end, + Result = case proplists:get_value(?TIMEOUT_OPT, Opts, Default) of + use_default -> + parse_timeout(Default); + Value -> + parse_timeout(Value) + end, + Result. + parse_number(N) when is_list(N) -> try list_to_integer(N) of @@ -234,11 +250,11 @@ do_action(Command, Node, Args, Opts, Inform, Timeout) -> false -> case ensure_app_running(Node) of ok -> - case lists:member(Command, ?COMMANDS_WITH_TIMEOUT) of - true -> + case proplists:lookup(Command, ?COMMANDS_WITH_TIMEOUT) of + {Command, _} -> announce_timeout(Timeout, Inform), action(Command, Node, Args, Opts, Inform, Timeout); - false -> + none -> action(Command, Node, Args, Opts, Inform) end; E -> E From d14f8647d92c866ab384c3fffaea405ffb77c354 Mon Sep 17 00:00:00 2001 From: Alexey Lebedeff Date: Thu, 14 Jul 2016 13:29:27 +0300 Subject: [PATCH 06/11] Reuse timeout/error logic for `node_health_check` --- src/rabbit_control_main.erl | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/rabbit_control_main.erl b/src/rabbit_control_main.erl index 55839d34e046..d2f0e8bcb09b 100644 --- a/src/rabbit_control_main.erl +++ b/src/rabbit_control_main.erl @@ -114,14 +114,15 @@ [stop, stop_app, start_app, wait, reset, force_reset, rotate_logs, join_cluster, change_cluster_node_type, update_cluster_nodes, forget_cluster_node, rename_cluster_node, cluster_status, status, - environment, eval, force_boot, help, node_health_check, hipe_compile]). + environment, eval, force_boot, help, hipe_compile]). %% [Command | {Command, DefaultTimeoutInMilliSeconds}] -define(COMMANDS_WITH_TIMEOUT, [list_user_permissions, list_policies, list_queues, list_exchanges, list_bindings, list_connections, list_channels, list_consumers, list_vhosts, list_parameters, - purge_queue]). + purge_queue, + {node_health_check, 70000}]). %%---------------------------------------------------------------------------- @@ -578,17 +579,6 @@ action(eval, Node, [Expr], _Opts, _Inform) -> action(help, _Node, _Args, _Opts, _Inform) -> io:format("~s", [rabbit_ctl_usage:usage()]); -action(node_health_check, Node, _Args, _Opts, Inform) -> - Inform("Checking health of node ~p", [Node]), - try - rabbit_health_check:node(Node), - io:format("Health check passed~n") - catch - {node_is_ko, ErrorMsg, ErrorCode} -> - io:format("Heath check failed:~n~s~n", [ErrorMsg]), - halt(ErrorCode) - end; - action(Command, Node, Args, Opts, Inform) -> %% For backward compatibility, run commands accepting a timeout with %% the default timeout. @@ -682,7 +672,17 @@ action(list_consumers, Node, _Args, Opts, Inform, Timeout) -> Inform("Listing consumers", []), VHostArg = list_to_binary(proplists:get_value(?VHOST_OPT, Opts)), call(Node, {rabbit_amqqueue, consumers_all, [VHostArg]}, - rabbit_amqqueue:consumer_info_keys(), Timeout). + rabbit_amqqueue:consumer_info_keys(), Timeout); + +action(node_health_check, Node, _Args, _Opts, Inform, Timeout) -> + Inform("Checking health of node ~p", [Node]), + case rabbit_health_check:node(Node, Timeout) of + ok -> + io:format("Health check passed~n"), + ok; + Other -> + Other + end. format_parse_error({_Line, Mod, Err}) -> lists:flatten(Mod:format_error(Err)). From 489293b05936aa502ba0acaa12e6777df25bf367 Mon Sep 17 00:00:00 2001 From: Alexey Lebedeff Date: Thu, 14 Jul 2016 13:31:49 +0300 Subject: [PATCH 07/11] Add `node_health_check` test suite --- test/health_check_SUITE.erl | 167 ++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 test/health_check_SUITE.erl diff --git a/test/health_check_SUITE.erl b/test/health_check_SUITE.erl new file mode 100644 index 000000000000..5c277204c6a2 --- /dev/null +++ b/test/health_check_SUITE.erl @@ -0,0 +1,167 @@ +%% The contents of this file are subject to the Mozilla Public License +%% Version 1.1 (the "License"); you may not use this file except in +%% compliance with the License. You may obtain a copy of the License +%% at http://www.mozilla.org/MPL/ +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and +%% limitations under the License. +%% +%% The Original Code is RabbitMQ. +%% +%% The Initial Developer of the Original Code is GoPivotal, Inc. +%% Copyright (c) 2016 Pivotal Software, Inc. All rights reserved. +%% +-module(health_check_SUITE). + +-include_lib("common_test/include/ct.hrl"). +-include_lib("amqp_client/include/amqp_client.hrl"). + +-export([all/0 + ,groups/0 + ,init_per_suite/1 + ,end_per_suite/1 + ,init_per_testcase/2 + ,end_per_testcase/2 + ]). + +-export([ignores_remote_dead_channel/1 + ,detects_local_dead_channel/1 + ,ignores_remote_dead_queue/1 + ,detects_local_dead_queue/1 + ,ignores_remote_alarms/1 + ,detects_local_alarm/1 + ,honors_timeout_argument/1 + ]). + +all() -> + [{group, all_cases}]. + +groups() -> + [{all_cases, [], + [ignores_remote_dead_queue + ,detects_local_dead_queue + ,ignores_remote_dead_channel + ,detects_local_dead_channel + ,ignores_remote_alarms + ,detects_local_alarm + ,honors_timeout_argument + ]}]. + +init_per_suite(Config) -> + rabbit_ct_helpers:log_environment(), + rabbit_ct_helpers:run_setup_steps(Config). + +end_per_suite(Config) -> + rabbit_ct_helpers:run_teardown_steps(Config). + +init_per_testcase(Testcase, Config0) -> + rabbit_ct_helpers:testcase_started(Config0, Testcase), + Config1 = rabbit_ct_helpers:set_config( + Config0, [{rmq_nodes_count, 2}, + {rmq_nodes_clustered, true}]), + rabbit_ct_helpers:run_steps(Config1, + rabbit_ct_broker_helpers:setup_steps() ++ + rabbit_ct_client_helpers:setup_steps()). + +end_per_testcase(Testcase, Config0) -> + Config1 = case rabbit_ct_helpers:get_config(Config0, save_config) of + undefined -> Config0; + C -> C + end, + Config2 = rabbit_ct_helpers:run_steps(Config1, + rabbit_ct_broker_helpers:teardown_steps() ++ + rabbit_ct_client_helpers:teardown_steps()), + rabbit_ct_helpers:testcase_finished(Config2, Testcase). + +%%---------------------------------------------------------------------------- +%% Test cases +%%---------------------------------------------------------------------------- +ignores_remote_dead_channel(Config) -> + [A, B] = open_channel_and_declare_queue_everywhere(Config), + CPid = suspend_single_channel(Config, B), + {ok, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A, ["-t", "5", "node_health_check"]), + resume_sys_process(Config, B, CPid), + ok. + +detects_local_dead_channel(Config) -> + [A|_] = open_channel_and_declare_queue_everywhere(Config), + CPid = suspend_single_channel(Config, A), + {error, 75, Str} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A, ["-t", "5", "node_health_check"]), + {match, _} = re:run(Str, "operation node_health_check.*timed out"), + resume_sys_process(Config, A, CPid), + ok. + +ignores_remote_dead_queue(Config) -> + [A, B] = open_channel_and_declare_queue_everywhere(Config), + QPid = suspend_single_queue(Config, B), + {ok, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A, ["-t", "5", "node_health_check"]), + resume_sys_process(Config, B, QPid), + ok. + +detects_local_dead_queue(Config) -> + [A|_] = open_channel_and_declare_queue_everywhere(Config), + QPid = suspend_single_queue(Config, A), + {error, 75, Str} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A, ["-t", "5", "node_health_check"]), + {match, _} = re:run(Str, "operation node_health_check.*timed out"), + resume_sys_process(Config, A, QPid), + ok. + +ignores_remote_alarms(Config) -> + [A, B] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename), + rabbit_ct_broker_helpers:rabbitmqctl(Config, B, + ["set_vm_memory_high_watermark", "0.000000001"]), + {ok, _} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A, ["-t", "5", "node_health_check"]), + ok. + +detects_local_alarm(Config) -> + [A|_] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename), + rabbit_ct_broker_helpers:rabbitmqctl(Config, A, + ["set_vm_memory_high_watermark", "0.000000001"]), + {error, 70, Str} = rabbit_ct_broker_helpers:rabbitmqctl(Config, A, ["-t", "5", "node_health_check"]), + {match, _} = re:run(Str, "resource alarm.*in effect"), + ok. + +honors_timeout_argument(Config) -> + [A|_] = open_channel_and_declare_queue_everywhere(Config), + QPid = suspend_single_queue(Config, A), + + case timer:tc(rabbit_ct_broker_helpers, rabbitmqctl, [Config, A, ["-t", "5", "node_health_check"]]) of + {TimeSpent, {error, 75, _}} -> + if TimeSpent < 5000000 -> exit({too_fast, TimeSpent}); + TimeSpent > 7000000 -> exit({too_slow, TimeSpent}); %% +2 seconds for rabbitmqctl overhead + true -> ok + end; + {_, Unexpected} -> + exit({unexpected, Unexpected}) + end, + resume_sys_process(Config, A, QPid), + ok. + +%%---------------------------------------------------------------------------- +%% Helpers +%%---------------------------------------------------------------------------- +open_channel_and_declare_queue_everywhere(Config) -> + Nodes = rabbit_ct_broker_helpers:get_node_configs(Config, nodename), + lists:foreach(fun(Node) -> + Ch = rabbit_ct_client_helpers:open_channel(Config, Node), + #'queue.declare_ok'{} = amqp_channel:call(Ch, #'queue.declare'{}) + end, + Nodes), + Nodes. + +suspend_single_queue(Config, Node) -> + [QPid|_] = [rabbit_amqqueue:pid_of(Q) || Q <- rabbit_ct_broker_helpers:rpc(Config, Node, rabbit_amqqueue, list, []), + Node == node(rabbit_amqqueue:pid_of(Q))], + rabbit_ct_broker_helpers:rpc(Config, Node, sys, suspend, [QPid]), + QPid. + +suspend_single_channel(Config, Node) -> + [CPid|_] = [Pid || Pid <- rabbit_ct_broker_helpers:rpc(Config, Node, rabbit_channel, list_local, []), + Node == node(Pid)], + rabbit_ct_broker_helpers:rpc(Config, Node, sys, suspend, [CPid]), + CPid. + +resume_sys_process(Config, Node, Pid) -> + rabbit_ct_broker_helpers:rpc(Config, Node, sys, resume, [Pid]). From ee00aa44a11b70b0a8438f203a59399c77fc79c7 Mon Sep 17 00:00:00 2001 From: Karl Nilsson Date: Thu, 14 Jul 2016 12:00:22 +0100 Subject: [PATCH 08/11] remove stale comment --- scripts/rabbitmq-env.bat | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/scripts/rabbitmq-env.bat b/scripts/rabbitmq-env.bat index b7ae20c90221..26d388ca6238 100644 --- a/scripts/rabbitmq-env.bat +++ b/scripts/rabbitmq-env.bat @@ -31,17 +31,13 @@ REM . ${SCRIPT_DIR}/rabbitmq-defaults call "%SCRIPT_DIR%\rabbitmq-defaults.bat" set DEFAULT_SCHEDULER_BIND_TYPE=tnnps -REM [ "x" = "x$RABBITMQ_SCHEDULER_BIND_TYPE" ] && RABBITMQ_SCHEDULER_BIND_TYPE=${DEFAULT_SCHEDULER_BIND_TYPE} +REM [ "x" = "x$RABBITMQ_SCHEDULER_BIND_TYPE" ] && RABBITMQ_SCHEDULER_BIND_TYPE=${DEFAULT_SCHEDULER_BIND_TYPE} REM set the default scheduling bind type if "!RABBITMQ_SCHEDULER_BIND_TYPE!"=="" ( set RABBITMQ_SCHEDULER_BIND_TYPE=!DEFAULT_SCHEDULER_BIND_TYPE! ) -REM These common defaults aren't referenced in the batch scripts -REM ## Common defaults -REM SERVER_ERL_ARGS="+P 1048576" -REM REM # warn about old rabbitmq.conf file, if no new one REM if [ -f /etc/rabbitmq/rabbitmq.conf ] && \ REM [ ! -f ${CONF_ENV_FILE} ] ; then From 73e2f61116c31dacff05f56166f2a2677ea5c839 Mon Sep 17 00:00:00 2001 From: Michael Klishin Date: Thu, 14 Jul 2016 14:34:17 +0300 Subject: [PATCH 09/11] Run client helper tear down steps before broker's --- test/health_check_SUITE.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/health_check_SUITE.erl b/test/health_check_SUITE.erl index 5c277204c6a2..4d8f56e9d305 100644 --- a/test/health_check_SUITE.erl +++ b/test/health_check_SUITE.erl @@ -71,8 +71,8 @@ end_per_testcase(Testcase, Config0) -> C -> C end, Config2 = rabbit_ct_helpers:run_steps(Config1, - rabbit_ct_broker_helpers:teardown_steps() ++ - rabbit_ct_client_helpers:teardown_steps()), + rabbit_ct_client_helpers:teardown_steps() ++ + rabbit_ct_broker_helpers:teardown_steps()), rabbit_ct_helpers:testcase_finished(Config2, Testcase). %%---------------------------------------------------------------------------- From b36f79044511465a8f1d2aa3cce6ee8a8a1b530b Mon Sep 17 00:00:00 2001 From: Karl Nilsson Date: Thu, 14 Jul 2016 12:35:03 +0100 Subject: [PATCH 10/11] use the default_bind bind type --- scripts/rabbitmq-env | 2 +- scripts/rabbitmq-env.bat | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/rabbitmq-env b/scripts/rabbitmq-env index 44fac723a57f..2f9e796f3564 100755 --- a/scripts/rabbitmq-env +++ b/scripts/rabbitmq-env @@ -62,7 +62,7 @@ RABBITMQ_HOME="$(rmq_realpath "${RABBITMQ_SCRIPTS_DIR}/..")" ## Set defaults . ${RABBITMQ_SCRIPTS_DIR}/rabbitmq-defaults -DEFAULT_SCHEDULER_BIND_TYPE="tnnps" +DEFAULT_SCHEDULER_BIND_TYPE="db" [ "x" = "x$RABBITMQ_SCHEDULER_BIND_TYPE" ] && RABBITMQ_SCHEDULER_BIND_TYPE=${DEFAULT_SCHEDULER_BIND_TYPE} ## Common defaults diff --git a/scripts/rabbitmq-env.bat b/scripts/rabbitmq-env.bat index 26d388ca6238..7587faaa6267 100644 --- a/scripts/rabbitmq-env.bat +++ b/scripts/rabbitmq-env.bat @@ -30,7 +30,7 @@ REM ## Set defaults REM . ${SCRIPT_DIR}/rabbitmq-defaults call "%SCRIPT_DIR%\rabbitmq-defaults.bat" -set DEFAULT_SCHEDULER_BIND_TYPE=tnnps +set DEFAULT_SCHEDULER_BIND_TYPE=db REM [ "x" = "x$RABBITMQ_SCHEDULER_BIND_TYPE" ] && RABBITMQ_SCHEDULER_BIND_TYPE=${DEFAULT_SCHEDULER_BIND_TYPE} REM set the default scheduling bind type From 0c316fc3b6c135236fb0a267b31595dc5762f9eb Mon Sep 17 00:00:00 2001 From: Michael Klishin Date: Thu, 14 Jul 2016 15:37:27 +0300 Subject: [PATCH 11/11] Update rabbitmq-components.mk --- rabbitmq-components.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/rabbitmq-components.mk b/rabbitmq-components.mk index c82ba0baa08c..eb9e9e3e030a 100644 --- a/rabbitmq-components.mk +++ b/rabbitmq-components.mk @@ -104,6 +104,7 @@ RABBITMQ_COMPONENTS = amqp_client \ rabbitmq_federation \ rabbitmq_federation_management \ rabbitmq_java_client \ + rabbitmq_jms_client \ rabbitmq_jms_topic_exchange \ rabbitmq_lvc \ rabbitmq_management \