From 1da16a83e5383c37bbfcdda83767209d22e0e663 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Mon, 31 Jan 2011 16:23:56 +0000 Subject: Bump up sync timers in queue and msg_store to 25ms --- src/rabbit_amqqueue_process.erl | 2 +- src/rabbit_msg_store.erl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rabbit_amqqueue_process.erl b/src/rabbit_amqqueue_process.erl index 3418c663..28430cb2 100644 --- a/src/rabbit_amqqueue_process.erl +++ b/src/rabbit_amqqueue_process.erl @@ -21,7 +21,7 @@ -behaviour(gen_server2). -define(UNSENT_MESSAGE_LIMIT, 100). --define(SYNC_INTERVAL, 5). %% milliseconds +-define(SYNC_INTERVAL, 25). %% milliseconds -define(RAM_DURATION_UPDATE_INTERVAL, 5000). -define(BASE_MESSAGE_PROPERTIES, diff --git a/src/rabbit_msg_store.erl b/src/rabbit_msg_store.erl index e9c356e1..7f3cf35f 100644 --- a/src/rabbit_msg_store.erl +++ b/src/rabbit_msg_store.erl @@ -33,7 +33,7 @@ -include("rabbit_msg_store.hrl"). --define(SYNC_INTERVAL, 5). %% milliseconds +-define(SYNC_INTERVAL, 25). %% milliseconds -define(CLEAN_FILENAME, "clean.dot"). -define(FILE_SUMMARY_FILENAME, "file_summary.ets"). -- cgit v1.2.1 From b334a2b41a447503fc690b98f67e1c88050f8a6c Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Wed, 2 Feb 2011 17:30:41 +0000 Subject: Make tcp listen options configurable --- ebin/rabbit_app.in | 9 ++++++++- scripts/rabbitmq-server | 1 - scripts/rabbitmq-server.bat | 1 - scripts/rabbitmq-service.bat | 1 - src/rabbit_networking.erl | 16 +++++----------- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/ebin/rabbit_app.in b/ebin/rabbit_app.in index cc7221d6..f837684c 100644 --- a/ebin/rabbit_app.in +++ b/ebin/rabbit_app.in @@ -34,4 +34,11 @@ {collect_statistics, none}, {auth_mechanisms, ['PLAIN', 'AMQPLAIN']}, {auth_backends, [rabbit_auth_backend_internal]}, - {delegate_count, 16}]}]}. + {delegate_count, 16}, + {tcp_listen_options, [binary, + {packet, raw}, + {reuseaddr, true}, + {backlog, 128}, + {nodelay, true}, + {exit_on_close, false}]} + ]}]}. diff --git a/scripts/rabbitmq-server b/scripts/rabbitmq-server index 5c390a51..2f80eb96 100755 --- a/scripts/rabbitmq-server +++ b/scripts/rabbitmq-server @@ -16,7 +16,6 @@ ## SERVER_ERL_ARGS="+K true +A30 +P 1048576 \ --kernel inet_default_listen_options [{nodelay,true}] \ -kernel inet_default_connect_options [{nodelay,true}]" CONFIG_FILE=/etc/rabbitmq/rabbitmq LOG_BASE=/var/log/rabbitmq diff --git a/scripts/rabbitmq-server.bat b/scripts/rabbitmq-server.bat index 0cfa5ea8..2ca9f2b3 100644 --- a/scripts/rabbitmq-server.bat +++ b/scripts/rabbitmq-server.bat @@ -142,7 +142,6 @@ if not "!RABBITMQ_NODE_IP_ADDRESS!"=="" ( +W w ^ +A30 ^ +P 1048576 ^ --kernel inet_default_listen_options "[{nodelay, true}]" ^ -kernel inet_default_connect_options "[{nodelay, true}]" ^ !RABBITMQ_LISTEN_ARG! ^ -kernel error_logger {file,\""!RABBITMQ_LOG_BASE!/!RABBITMQ_NODENAME!.log"\"} ^ diff --git a/scripts/rabbitmq-service.bat b/scripts/rabbitmq-service.bat index 43520b55..bc452fea 100644 --- a/scripts/rabbitmq-service.bat +++ b/scripts/rabbitmq-service.bat @@ -207,7 +207,6 @@ set ERLANG_SERVICE_ARGUMENTS= ^ -s rabbit ^ +W w ^ +A30 ^ --kernel inet_default_listen_options "[{nodelay,true}]" ^ -kernel inet_default_connect_options "[{nodelay,true}]" ^ !RABBITMQ_LISTEN_ARG! ^ -kernel error_logger {file,\""!RABBITMQ_LOG_BASE!/!RABBITMQ_NODENAME!.log"\"} ^ diff --git a/src/rabbit_networking.erl b/src/rabbit_networking.erl index 283d25c7..36f61628 100644 --- a/src/rabbit_networking.erl +++ b/src/rabbit_networking.erl @@ -32,16 +32,6 @@ -include("rabbit.hrl"). -include_lib("kernel/include/inet.hrl"). --define(RABBIT_TCP_OPTS, [ - binary, - {packet, raw}, % no packaging - {reuseaddr, true}, % allow rebind without waiting - {backlog, 128}, % use the maximum listen(2) backlog value - %% {nodelay, true}, % TCP_NODELAY - disable Nagle's alg. - %% {delay_send, true}, - {exit_on_close, false} - ]). - -define(SSL_TIMEOUT, 5). %% seconds -define(FIRST_TEST_BIND_PORT, 10000). @@ -200,7 +190,7 @@ start_listener0({IPAddress, Port, Family, Name}, Protocol, Label, OnConnect) -> rabbit_sup, {Name, {tcp_listener_sup, start_link, - [IPAddress, Port, [Family | ?RABBIT_TCP_OPTS], + [IPAddress, Port, [Family | tcp_opts()], {?MODULE, tcp_listener_started, [Protocol]}, {?MODULE, tcp_listener_stopped, [Protocol]}, OnConnect, Label]}, @@ -315,6 +305,10 @@ hostname() -> cmap(F) -> rabbit_misc:filter_exit_map(F, connections()). +tcp_opts() -> + {ok, Opts} = application:get_env(rabbit, tcp_listen_options), + Opts. + %%-------------------------------------------------------------------- %% There are three kinds of machine (for our purposes). -- cgit v1.2.1 From 6e7b0edd6c210611e25fad6bdecde59d29f585c2 Mon Sep 17 00:00:00 2001 From: Emile Joubert Date: Wed, 2 Feb 2011 18:12:45 +0000 Subject: First version of renaming rabbitmq.conf --- packaging/RPMS/Fedora/rabbitmq-server.spec | 3 +++ packaging/debs/Debian/debian/postinst | 4 ++++ packaging/macports/Portfile.in | 2 +- scripts/rabbitmq-env | 6 +++++- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packaging/RPMS/Fedora/rabbitmq-server.spec b/packaging/RPMS/Fedora/rabbitmq-server.spec index a2e2d2fc..0bd3b0f0 100644 --- a/packaging/RPMS/Fedora/rabbitmq-server.spec +++ b/packaging/RPMS/Fedora/rabbitmq-server.spec @@ -92,6 +92,9 @@ fi %post /sbin/chkconfig --add %{name} +if [ -f %{_sysconfdir}/rabbitmq/rabbitmq.conf ] && [ ! -f %{_sysconfdir}/rabbitmq/rabbitmq-env.conf ]; then + mv %{_sysconfdir}/rabbitmq/rabbitmq.conf %{_sysconfdir}/rabbitmq/rabbitmq-env.conf +fi %preun if [ $1 = 0 ]; then diff --git a/packaging/debs/Debian/debian/postinst b/packaging/debs/Debian/debian/postinst index 134f16ee..b11340ef 100644 --- a/packaging/debs/Debian/debian/postinst +++ b/packaging/debs/Debian/debian/postinst @@ -35,6 +35,10 @@ chown -R rabbitmq:rabbitmq /var/log/rabbitmq case "$1" in configure) + if [ -f /etc/rabbitmq/rabbitmq.conf ] && \ + [ ! -f /etc/rabbitmq/rabbitmq-env.conf ]; then + mv /etc/rabbitmq/rabbitmq.conf /etc/rabbitmq/rabbitmq-env.conf + fi ;; abort-upgrade|abort-remove|abort-deconfigure) diff --git a/packaging/macports/Portfile.in b/packaging/macports/Portfile.in index f8417b83..be8964b5 100644 --- a/packaging/macports/Portfile.in +++ b/packaging/macports/Portfile.in @@ -81,7 +81,7 @@ post-destroot { xinstall -d -g [existsgroup ${servergroup}] -m 775 ${destroot}${serverhome} xinstall -d -g [existsgroup ${servergroup}] -m 775 ${destroot}${mnesiadbdir} - reinplace -E "s:(/etc/rabbitmq/rabbitmq.conf):${prefix}\\1:g" \ + reinplace -E "s:(/etc/rabbitmq/rabbitmq):${prefix}\\1:g" \ ${realsbin}/rabbitmq-env foreach var {CONFIG_FILE LOG_BASE MNESIA_BASE PIDS_FILE} { reinplace -E "s:^($var)=/:\\1=${prefix}/:" \ diff --git a/scripts/rabbitmq-env b/scripts/rabbitmq-env index df4b24d8..3e173949 100755 --- a/scripts/rabbitmq-env +++ b/scripts/rabbitmq-env @@ -37,4 +37,8 @@ RABBITMQ_HOME="${SCRIPT_DIR}/.." NODENAME=rabbit@${HOSTNAME%%.*} # Load configuration from the rabbitmq.conf file -[ -f /etc/rabbitmq/rabbitmq.conf ] && . /etc/rabbitmq/rabbitmq.conf +if [ -f /etc/rabbitmq/rabbitmq.conf ]; then + echo -n "WARNING: ignoring /etc/rabbitmq/rabbitmq.conf -- " + echo "location has moved to /etc/rabbitmq/rabbitmq-env.conf" +fi +[ -f /etc/rabbitmq/rabbitmq-env.conf ] && . /etc/rabbitmq/rabbitmq-env.conf -- cgit v1.2.1 From 252f001977b42a1911575bbf3de76087ef3fe49d Mon Sep 17 00:00:00 2001 From: Emile Joubert Date: Thu, 3 Feb 2011 16:13:56 +0000 Subject: Rename rabbitmq.conf --- docs/rabbitmq-env.conf.5.xml | 84 ++++++++++++++++++++++++++++++++++++++++++ docs/rabbitmq-multi.1.xml | 2 +- docs/rabbitmq-server.1.xml | 2 +- docs/rabbitmq.conf.5.xml | 84 ------------------------------------------ packaging/macports/Portfile.in | 8 ++-- 5 files changed, 90 insertions(+), 90 deletions(-) create mode 100644 docs/rabbitmq-env.conf.5.xml delete mode 100644 docs/rabbitmq.conf.5.xml diff --git a/docs/rabbitmq-env.conf.5.xml b/docs/rabbitmq-env.conf.5.xml new file mode 100644 index 00000000..4c7340c2 --- /dev/null +++ b/docs/rabbitmq-env.conf.5.xml @@ -0,0 +1,84 @@ + + + + + RabbitMQ Server + + The RabbitMQ Team <info@rabbitmq.com> + + + + + rabbitmq-env.conf + 5 + RabbitMQ Server + + + + rabbitmq-env.conf + default settings for RabbitMQ AMQP server + + + + Description + +/etc/rabbitmq/rabbitmq-env.conf contains variable settings that override the +defaults built in to the RabbitMQ startup scripts. + + +The file is interpreted by the system shell, and so should consist of +a sequence of shell environment variable definitions. Normal shell +syntax is permitted (since the file is sourced using the shell "." +operator), including line comments starting with "#". + + +In order of preference, the startup scripts get their values from the +environment, from /etc/rabbitmq/rabbitmq-env.conf and finally from the +built-in default values. For example, for the RABBITMQ_NODENAME +setting, + + + RABBITMQ_NODENAME + + +from the environment is checked first. If it is absent or equal to the +empty string, then + + + NODENAME + + +from /etc/rabbitmq/rabbitmq-env.conf is checked. If it is also absent +or set equal to the empty string then the default value from the +startup script is used. + + +The variable names in /etc/rabbitmq/rabbitmq-env.conf are always equal to the +environment variable names, with the RABBITMQ_ prefix removed: +RABBITMQ_NODE_PORT from the environment becomes NODE_PORT in the +/etc/rabbitmq/rabbitmq-env.conf file, etc. + + For example: + +# I am a complete /etc/rabbitmq/rabbitmq-env.conf file. +# Comment lines start with a hash character. +# This is a /bin/sh script file - use ordinary envt var syntax +NODENAME=hare + + + This is an example of a complete + /etc/rabbitmq/rabbitmq-env.conf file that overrides the default Erlang + node name from "rabbit" to "hare". + + + + + + See also + + rabbitmq-multi1 + rabbitmq-server1 + rabbitmqctl1 + + + diff --git a/docs/rabbitmq-multi.1.xml b/docs/rabbitmq-multi.1.xml index 6586890a..5f5c6c2f 100644 --- a/docs/rabbitmq-multi.1.xml +++ b/docs/rabbitmq-multi.1.xml @@ -92,7 +92,7 @@ Rotate log files for all local and running RabbitMQ nodes. See also - rabbitmq.conf5 + rabbitmq-env.conf5 rabbitmq-server1 rabbitmqctl1 diff --git a/docs/rabbitmq-server.1.xml b/docs/rabbitmq-server.1.xml index f161a291..a0458c93 100644 --- a/docs/rabbitmq-server.1.xml +++ b/docs/rabbitmq-server.1.xml @@ -124,7 +124,7 @@ Defaults to 5672. See also - rabbitmq.conf5 + rabbitmq-env.conf5 rabbitmq-multi1 rabbitmqctl1 diff --git a/docs/rabbitmq.conf.5.xml b/docs/rabbitmq.conf.5.xml deleted file mode 100644 index 31de7164..00000000 --- a/docs/rabbitmq.conf.5.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - RabbitMQ Server - - The RabbitMQ Team <info@rabbitmq.com> - - - - - rabbitmq.conf - 5 - RabbitMQ Server - - - - rabbitmq.conf - default settings for RabbitMQ AMQP server - - - - Description - -/etc/rabbitmq/rabbitmq.conf contains variable settings that override the -defaults built in to the RabbitMQ startup scripts. - - -The file is interpreted by the system shell, and so should consist of -a sequence of shell environment variable definitions. Normal shell -syntax is permitted (since the file is sourced using the shell "." -operator), including line comments starting with "#". - - -In order of preference, the startup scripts get their values from the -environment, from /etc/rabbitmq/rabbitmq.conf and finally from the -built-in default values. For example, for the RABBITMQ_NODENAME -setting, - - - RABBITMQ_NODENAME - - -from the environment is checked first. If it is absent or equal to the -empty string, then - - - NODENAME - - -from /etc/rabbitmq/rabbitmq.conf is checked. If it is also absent -or set equal to the empty string then the default value from the -startup script is used. - - -The variable names in /etc/rabbitmq/rabbitmq.conf are always equal to the -environment variable names, with the RABBITMQ_ prefix removed: -RABBITMQ_NODE_PORT from the environment becomes NODE_PORT in the -/etc/rabbitmq/rabbitmq.conf file, etc. - - For example: - -# I am a complete /etc/rabbitmq/rabbitmq.conf file. -# Comment lines start with a hash character. -# This is a /bin/sh script file - use ordinary envt var syntax -NODENAME=hare - - - This is an example of a complete - /etc/rabbitmq/rabbitmq.conf file that overrides the default Erlang - node name from "rabbit" to "hare". - - - - - - See also - - rabbitmq-multi1 - rabbitmq-server1 - rabbitmqctl1 - - - diff --git a/packaging/macports/Portfile.in b/packaging/macports/Portfile.in index be8964b5..862a0d1a 100644 --- a/packaging/macports/Portfile.in +++ b/packaging/macports/Portfile.in @@ -102,10 +102,10 @@ post-destroot { file copy ${wrappersbin}/rabbitmq-multi ${wrappersbin}/rabbitmq-server file copy ${wrappersbin}/rabbitmq-multi ${wrappersbin}/rabbitmqctl - file copy ${mansrc}/man1/rabbitmq-multi.1.gz ${mandest}/man1/ - file copy ${mansrc}/man1/rabbitmq-server.1.gz ${mandest}/man1/ - file copy ${mansrc}/man1/rabbitmqctl.1.gz ${mandest}/man1/ - file copy ${mansrc}/man5/rabbitmq.conf.5.gz ${mandest}/man5/ + file copy ${mansrc}/man1/rabbitmq-multi.1.gz ${mandest}/man1/ + file copy ${mansrc}/man1/rabbitmq-server.1.gz ${mandest}/man1/ + file copy ${mansrc}/man1/rabbitmqctl.1.gz ${mandest}/man1/ + file copy ${mansrc}/man5/rabbitmq-env.conf.5.gz ${mandest}/man5/ } pre-install { -- cgit v1.2.1 From 4cd34e45f12e31ef0090b0033c55be419cf47d69 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Mon, 7 Feb 2011 16:09:06 +0000 Subject: Abstract out the rabbit from delegate (also improve robustness) --- src/delegate.erl | 18 ++++-------------- src/delegate_sup.erl | 32 +++++++++++++++++++++++++------- src/rabbit.erl | 3 +-- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/delegate.erl b/src/delegate.erl index 46bd8245..17046201 100644 --- a/src/delegate.erl +++ b/src/delegate.erl @@ -18,7 +18,7 @@ -behaviour(gen_server2). --export([start_link/1, invoke_no_result/2, invoke/2, delegate_count/1]). +-export([start_link/1, invoke_no_result/2, invoke/2]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). @@ -36,8 +36,6 @@ ([pid()], fun ((pid()) -> A)) -> {[{pid(), A}], [{pid(), term()}]}). --spec(delegate_count/1 :: ([node()]) -> non_neg_integer()). - -endif. %%---------------------------------------------------------------------------- @@ -111,22 +109,14 @@ group_pids_by_node(Pids) -> node(Pid), fun (List) -> [Pid | List] end, [Pid], Remote)} end, {[], orddict:new()}, Pids). -delegate_count([RemoteNode | _]) -> - {ok, Count} = case application:get_env(rabbit, delegate_count) of - undefined -> rpc:call(RemoteNode, application, get_env, - [rabbit, delegate_count]); - Result -> Result - end, - Count. - delegate_name(Hash) -> list_to_atom("delegate_" ++ integer_to_list(Hash)). delegate(RemoteNodes) -> case get(delegate) of - undefined -> Name = - delegate_name(erlang:phash2( - self(), delegate_count(RemoteNodes))), + undefined -> Name = delegate_name( + erlang:phash2(self(), + delegate_sup:count(RemoteNodes))), put(delegate, Name), Name; Name -> Name diff --git a/src/delegate_sup.erl b/src/delegate_sup.erl index e0ffa7c8..96515ff4 100644 --- a/src/delegate_sup.erl +++ b/src/delegate_sup.erl @@ -18,7 +18,8 @@ -behaviour(supervisor). --export([start_link/0]). +-export([start_link/1, count/1]). +-export([boot/0]). -export([init/1]). @@ -28,20 +29,37 @@ -ifdef(use_specs). --spec(start_link/0 :: () -> {'ok', pid()} | {'error', any()}). +-spec(start_link/1 :: (integer()) -> {'ok', pid()} | {'error', any()}). +-spec(count/1 :: ([node()]) -> integer()). + +-spec(boot/0 :: () -> 'ok'). -endif. %%---------------------------------------------------------------------------- -start_link() -> - supervisor:start_link({local, ?SERVER}, ?MODULE, []). +start_link(Count) -> + supervisor:start_link({local, ?SERVER}, ?MODULE, [Count]). + +count([]) -> + 1; +count([Node | Nodes]) -> + try + length(supervisor:which_children({?SERVER, Node})) + catch exit:{{R, _}, _} when R =:= nodedown; R =:= shutdown -> + count(Nodes); + exit:{R, _} when R =:= noproc; R =:= normal; R =:= shutdown -> + count(Nodes) + end. + +boot() -> + {ok, Count} = application:get_env(rabbit, delegate_count), + rabbit_sup:start_child(delegate_sup, [Count]). %%---------------------------------------------------------------------------- -init(_Args) -> - DCount = delegate:delegate_count([node()]), +init([Count]) -> {ok, {{one_for_one, 10, 10}, [{Num, {delegate, start_link, [Num]}, transient, 16#ffffffff, worker, [delegate]} || - Num <- lists:seq(0, DCount - 1)]}}. + Num <- lists:seq(0, Count - 1)]}}. diff --git a/src/rabbit.erl b/src/rabbit.erl index c6661d39..101c97f7 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -101,8 +101,7 @@ -rabbit_boot_step({delegate_sup, [{description, "cluster delegate"}, - {mfa, {rabbit_sup, start_child, - [delegate_sup]}}, + {mfa, {delegate_sup, boot, []}}, {requires, kernel_ready}, {enables, core_initialized}]}). -- cgit v1.2.1 From ca76cdd8e81559c0d48b672c8bf097e54a33477c Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Mon, 7 Feb 2011 16:35:05 +0000 Subject: use a plain cast, not delegate --- src/rabbit_amqqueue.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl index a6da551d..e32a21da 100644 --- a/src/rabbit_amqqueue.erl +++ b/src/rabbit_amqqueue.erl @@ -421,7 +421,7 @@ basic_cancel(#amqqueue{pid = QPid}, ChPid, ConsumerTag, OkMsg) -> infinity). notify_sent(QPid, ChPid) -> - delegate_cast(QPid, {notify_sent, ChPid}). + gen_server2:cast(QPid, {notify_sent, ChPid}). unblock(QPid, ChPid) -> delegate_cast(QPid, {unblock, ChPid}). -- cgit v1.2.1 From 592c42e10b0d2c1d90347eb3540eeda44382240a Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Mon, 7 Feb 2011 16:36:10 +0000 Subject: accomodate both forms of nodedown --- src/delegate_sup.erl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/delegate_sup.erl b/src/delegate_sup.erl index 96515ff4..78e8eadc 100644 --- a/src/delegate_sup.erl +++ b/src/delegate_sup.erl @@ -48,7 +48,8 @@ count([Node | Nodes]) -> length(supervisor:which_children({?SERVER, Node})) catch exit:{{R, _}, _} when R =:= nodedown; R =:= shutdown -> count(Nodes); - exit:{R, _} when R =:= noproc; R =:= normal; R =:= shutdown -> + exit:{R, _} when R =:= noproc; R =:= normal; R =:= shutdown; + R =:= nodedown -> count(Nodes) end. -- cgit v1.2.1 From b7a648a76bef315cae155b11b48baf0cc5dcd593 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Mon, 7 Feb 2011 17:10:35 +0000 Subject: remove non-rpc'd call to is_process_alive - now matches the rpc version in amqqueue_process --- src/rabbit_amqqueue.erl | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl index a6da551d..053b6c6f 100644 --- a/src/rabbit_amqqueue.erl +++ b/src/rabbit_amqqueue.erl @@ -218,10 +218,11 @@ internal_declare(Q = #amqqueue{name = QueueName}, false) -> rabbit_misc:const(not_found) end; [ExistingQ = #amqqueue{pid = QPid}] -> - case is_process_alive(QPid) of - true -> rabbit_misc:const(ExistingQ); - false -> TailFun = internal_delete(QueueName), - fun (Tx) -> TailFun(Tx), ExistingQ end + case rpc:call( + node(QPid), erlang, is_process_alive, [QPid]) of + true -> rabbit_misc:const(ExistingQ); + _ -> TailFun = internal_delete(QueueName), + fun (Tx) -> TailFun(Tx), ExistingQ end end end end). -- cgit v1.2.1 From 56f8d1efef89a27d990c101c7d3793c4b0339666 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Tue, 8 Feb 2011 12:37:13 +0000 Subject: abstract out is_process_alive --- src/rabbit_amqqueue.erl | 9 ++++----- src/rabbit_amqqueue_process.erl | 28 ++++++++++++++-------------- src/rabbit_misc.erl | 11 +++++++++++ 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl index 053b6c6f..4e039709 100644 --- a/src/rabbit_amqqueue.erl +++ b/src/rabbit_amqqueue.erl @@ -218,11 +218,10 @@ internal_declare(Q = #amqqueue{name = QueueName}, false) -> rabbit_misc:const(not_found) end; [ExistingQ = #amqqueue{pid = QPid}] -> - case rpc:call( - node(QPid), erlang, is_process_alive, [QPid]) of - true -> rabbit_misc:const(ExistingQ); - _ -> TailFun = internal_delete(QueueName), - fun (Tx) -> TailFun(Tx), ExistingQ end + case rabbit_misc:is_process_alive(QPid) of + true -> rabbit_misc:const(ExistingQ); + false -> TailFun = internal_delete(QueueName), + fun (Tx) -> TailFun(Tx), ExistingQ end end end end). diff --git a/src/rabbit_amqqueue_process.erl b/src/rabbit_amqqueue_process.erl index 7c7e28fe..496b2064 100644 --- a/src/rabbit_amqqueue_process.erl +++ b/src/rabbit_amqqueue_process.erl @@ -790,20 +790,20 @@ handle_call({init, Recover}, From, handle_call({init, Recover}, From, State = #q{q = #amqqueue{exclusive_owner = Owner}}) -> - case rpc:call(node(Owner), erlang, is_process_alive, [Owner]) of - true -> erlang:monitor(process, Owner), - declare(Recover, From, State); - _ -> #q{q = #amqqueue{name = QName, durable = IsDurable}, - backing_queue = BQ, backing_queue_state = undefined} = State, - gen_server2:reply(From, not_found), - case Recover of - true -> ok; - _ -> rabbit_log:warning( - "Queue ~p exclusive owner went away~n", [QName]) - end, - BQS = BQ:init(QName, IsDurable, Recover), - %% Rely on terminate to delete the queue. - {stop, normal, State#q{backing_queue_state = BQS}} + case rabbit_misc:is_process_alive(Owner) of + true -> erlang:monitor(process, Owner), + declare(Recover, From, State); + false -> #q{backing_queue = BQ, backing_queue_state = undefined, + q = #amqqueue{name = QName, durable = IsDurable}} = State, + gen_server2:reply(From, not_found), + case Recover of + true -> ok; + _ -> rabbit_log:warning( + "Queue ~p exclusive owner went away~n", [QName]) + end, + BQS = BQ:init(QName, IsDurable, Recover), + %% Rely on terminate to delete the queue. + {stop, normal, State#q{backing_queue_state = BQS}} end; handle_call(info, _From, State) -> diff --git a/src/rabbit_misc.erl b/src/rabbit_misc.erl index 7d916797..f2bef13c 100644 --- a/src/rabbit_misc.erl +++ b/src/rabbit_misc.erl @@ -56,6 +56,7 @@ -export([lock_file/1]). -export([const_ok/1, const/1]). -export([ntoa/1, ntoab/1]). +-export([is_process_alive/1]). %%---------------------------------------------------------------------------- @@ -194,6 +195,7 @@ -spec(const/1 :: (A) -> const(A)). -spec(ntoa/1 :: (inet:ip_address()) -> string()). -spec(ntoab/1 :: (inet:ip_address()) -> string()). +-spec(is_process_alive/1 :: (pid()) -> boolean()). -endif. @@ -858,3 +860,12 @@ ntoab(IP) -> 0 -> Str; _ -> "[" ++ Str ++ "]" end. + +is_process_alive(Pid) when node(Pid) =:= node() -> + erlang:is_process_alive(Pid); +is_process_alive(Pid) -> + case rpc:call(node(Pid), erlang, is_process_alive, [Pid]) of + true -> true; + _ -> false + end. + -- cgit v1.2.1 From fbc8e8a3be7671c02d73b7af0f9342fcf2757b5e Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Tue, 8 Feb 2011 13:17:00 +0000 Subject: Move the booting of the delegate to rabbit --- src/delegate_sup.erl | 7 ------- src/rabbit.erl | 11 +++++++++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/delegate_sup.erl b/src/delegate_sup.erl index 78e8eadc..fc693c7d 100644 --- a/src/delegate_sup.erl +++ b/src/delegate_sup.erl @@ -19,7 +19,6 @@ -behaviour(supervisor). -export([start_link/1, count/1]). --export([boot/0]). -export([init/1]). @@ -32,8 +31,6 @@ -spec(start_link/1 :: (integer()) -> {'ok', pid()} | {'error', any()}). -spec(count/1 :: ([node()]) -> integer()). --spec(boot/0 :: () -> 'ok'). - -endif. %%---------------------------------------------------------------------------- @@ -53,10 +50,6 @@ count([Node | Nodes]) -> count(Nodes) end. -boot() -> - {ok, Count} = application:get_env(rabbit, delegate_count), - rabbit_sup:start_child(delegate_sup, [Count]). - %%---------------------------------------------------------------------------- init([Count]) -> diff --git a/src/rabbit.erl b/src/rabbit.erl index 101c97f7..81e0e54b 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -27,7 +27,7 @@ %%--------------------------------------------------------------------------- %% Boot steps. --export([maybe_insert_default_data/0]). +-export([maybe_insert_default_data/0, boot_delegate/0]). -rabbit_boot_step({codec_correctness_check, [{description, "codec correctness check"}, @@ -101,7 +101,7 @@ -rabbit_boot_step({delegate_sup, [{description, "cluster delegate"}, - {mfa, {delegate_sup, boot, []}}, + {mfa, {rabbit, boot_delegate, []}}, {requires, kernel_ready}, {enables, core_initialized}]}). @@ -178,6 +178,9 @@ {running_nodes, [node()]}]). -spec(log_location/1 :: ('sasl' | 'kernel') -> log_location()). +-spec(maybe_insert_default_data/0 :: () -> 'ok'). +-spec(boot_delegate/0 :: () -> 'ok'). + -endif. %%---------------------------------------------------------------------------- @@ -447,6 +450,10 @@ ensure_working_log_handler(OldFHandler, NewFHandler, TTYHandler, end end. +boot_delegate() -> + {ok, Count} = application:get_env(rabbit, delegate_count), + rabbit_sup:start_child(delegate_sup, [Count]). + maybe_insert_default_data() -> case rabbit_mnesia:is_db_empty() of true -> insert_default_data(); -- cgit v1.2.1 From ed1473c26892d0ab07d7f704ca8afb91c6698c21 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Tue, 8 Feb 2011 16:06:35 +0000 Subject: I need a much longer timeout for these tests... --- src/rabbit_tests.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rabbit_tests.erl b/src/rabbit_tests.erl index ddb53b15..9beee4cb 100644 --- a/src/rabbit_tests.erl +++ b/src/rabbit_tests.erl @@ -96,7 +96,7 @@ run_cluster_dependent_tests(SecondaryNode) -> receive {Remote, Result} -> Result = [passed, passed, passed] - after 2000 -> + after 30000 -> throw(timeout) end, -- cgit v1.2.1 From a807bfe03cb685bcbb3c569a4c2951fe87985c88 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Tue, 8 Feb 2011 16:47:57 +0000 Subject: Added test which covers the mysteriously dead queue on queue declaration, and hence misc:is_process_alive --- src/rabbit_tests.erl | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/rabbit_tests.erl b/src/rabbit_tests.erl index 9beee4cb..58c369b5 100644 --- a/src/rabbit_tests.erl +++ b/src/rabbit_tests.erl @@ -82,6 +82,7 @@ run_cluster_dependent_tests(SecondaryNode) -> passed = test_delegates_async(SecondaryNode), passed = test_delegates_sync(SecondaryNode), passed = test_queue_cleanup(SecondaryNode), + passed = test_declare_on_dead_queue(SecondaryNode), %% we now run the tests remotely, so that code coverage on the %% local node picks up more of the delegate @@ -90,12 +91,13 @@ run_cluster_dependent_tests(SecondaryNode) -> Remote = spawn(SecondaryNode, fun () -> Rs = [ test_delegates_async(Node), test_delegates_sync(Node), - test_queue_cleanup(Node) ], + test_queue_cleanup(Node), + test_declare_on_dead_queue(Node) ], Self ! {self(), Rs} end), receive {Remote, Result} -> - Result = [passed, passed, passed] + Result = lists:duplicate(length(Result), passed) after 30000 -> throw(timeout) end, @@ -1310,6 +1312,32 @@ test_queue_cleanup(_SecondaryNode) -> end, passed. +test_declare_on_dead_queue(SecondaryNode) -> + QueueName = rabbit_misc:r(<<"/">>, queue, ?CLEANUP_QUEUE_NAME), + Self = self(), + Pid = spawn(SecondaryNode, + fun () -> + {new, #amqqueue{name = QueueName, pid = QPid}} = + rabbit_amqqueue:declare(QueueName, false, false, [], + none), + exit(QPid, kill), + Self ! {self(), killed, QPid} + end), + receive + {Pid, killed, QPid} -> + {existing, #amqqueue{name = QueueName, + pid = QPid}} = + rabbit_amqqueue:declare(QueueName, false, false, [], none), + false = rabbit_misc:is_process_alive(QPid), + {new, Q} = rabbit_amqqueue:declare(QueueName, false, false, [], + none), + true = rabbit_misc:is_process_alive(Q#amqqueue.pid), + {ok, 0} = rabbit_amqqueue:delete(Q, false, false), + passed + after 2000 -> + throw(failed_to_create_and_kill_queue) + end. + %--------------------------------------------------------------------- control_action(Command, Args) -> -- cgit v1.2.1 From 7f003e72158bff73080e23173d58b0290df30b0c Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Fri, 11 Feb 2011 14:30:02 +0000 Subject: Add ability to change backing module dynamically --- src/gen_server2.erl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/gen_server2.erl b/src/gen_server2.erl index a637dddd..75d7ee8c 100644 --- a/src/gen_server2.erl +++ b/src/gen_server2.erl @@ -880,6 +880,22 @@ handle_common_reply(Reply, Msg, GS2State = #gs2_state { name = Name, loop(GS2State #gs2_state { state = NState, time = Time1, debug = Debug1 }); + {become, Mod, NState} -> + Debug1 = common_debug(Debug, fun print_event/3, Name, + {become, Mod, NState}), + loop(find_prioritisers( + GS2State #gs2_state { mod = Mod, + state = NState, + time = infinity, + debug = Debug1 })); + {become, Mod, NState, Time1} -> + Debug1 = common_debug(Debug, fun print_event/3, Name, + {become, Mod, NState}), + loop(find_prioritisers( + GS2State #gs2_state { mod = Mod, + state = NState, + time = Time1, + debug = Debug1 })); _ -> handle_common_termination(Reply, Msg, GS2State) end. -- cgit v1.2.1 From 7ebe7c1d44053228c44fcad003ec90c1bd7b8eab Mon Sep 17 00:00:00 2001 From: Tim Fox Date: Fri, 11 Feb 2011 17:46:30 +0000 Subject: moved call for call deletion notification into Fun --- src/rabbit_amqqueue_process.erl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/rabbit_amqqueue_process.erl b/src/rabbit_amqqueue_process.erl index 496b2064..5788e7b3 100644 --- a/src/rabbit_amqqueue_process.erl +++ b/src/rabbit_amqqueue_process.erl @@ -122,6 +122,8 @@ terminate({shutdown, _}, State = #q{backing_queue = BQ}) -> terminate(_Reason, State = #q{backing_queue = BQ}) -> %% FIXME: How do we cancel active subscriptions? terminate_shutdown(fun (BQS) -> + rabbit_event:notify( + queue_deleted, [{pid, self()}]), BQS1 = BQ:delete_and_terminate(BQS), %% don't care if the internal delete %% doesn't return 'ok'. @@ -186,7 +188,6 @@ terminate_shutdown(Fun, State) -> end, BQS, all_ch_record()), [emit_consumer_deleted(Ch, CTag) || {Ch, CTag, _} <- consumers(State1)], - rabbit_event:notify(queue_deleted, [{pid, self()}]), State1#q{backing_queue_state = Fun(BQS1)} end. -- cgit v1.2.1 From b48aa9ab8154e87ab9b2f376b42e11fe7a6cf85e Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Sat, 12 Feb 2011 15:26:31 +0000 Subject: Added documentation --- src/gen_server2.erl | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/gen_server2.erl b/src/gen_server2.erl index 75d7ee8c..94296f97 100644 --- a/src/gen_server2.erl +++ b/src/gen_server2.erl @@ -58,6 +58,15 @@ %% hibernate the process immediately, as it would if backoff wasn't %% being used. Instead it'll wait for the current timeout as described %% above. +%% +%% 7) The callback module can return from any of the handle_* +%% functions, a {become, Module, State} triple, or a {become, Module, +%% State, Timeout} quadruple. This allows the gen_server to +%% dynamically change the callback module. The State is the new state +%% which will be passed into any of the callback functions in the new +%% module. Note there is no form also encompassing a reply, thus if +%% you wish to reply in handle_call/3 and change the callback module, +%% you need to use gen_server2:reply/2 to issue the reply manually. %% All modifications are (C) 2009-2011 VMware, Inc. -- cgit v1.2.1 From d1ef35f7e693a2a6e2340bbd02f244cc409cb555 Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Mon, 14 Feb 2011 14:46:41 +0000 Subject: Make server_properties a /1 --- src/rabbit_direct.erl | 9 +++++---- src/rabbit_reader.erl | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/rabbit_direct.erl b/src/rabbit_direct.erl index 3b8c9fba..bd41a8b9 100644 --- a/src/rabbit_direct.erl +++ b/src/rabbit_direct.erl @@ -16,7 +16,7 @@ -module(rabbit_direct). --export([boot/0, connect/3, start_channel/5]). +-export([boot/0, connect/4, start_channel/5]). -include("rabbit.hrl"). @@ -25,7 +25,7 @@ -ifdef(use_specs). -spec(boot/0 :: () -> 'ok'). --spec(connect/3 :: (binary(), binary(), binary()) -> +-spec(connect/4 :: (binary(), binary(), binary(), rabbit_types:protocol()) -> {'ok', {rabbit_types:user(), rabbit_framing:amqp_table()}}). -spec(start_channel/5 :: (rabbit_channel:channel_number(), pid(), @@ -49,13 +49,14 @@ boot() -> %%---------------------------------------------------------------------------- -connect(Username, Password, VHost) -> +connect(Username, Password, VHost, Protocol) -> case lists:keymember(rabbit, 1, application:which_applications()) of true -> try rabbit_access_control:user_pass_login(Username, Password) of #user{} = User -> try rabbit_access_control:check_vhost_access(User, VHost) of - ok -> {ok, {User, rabbit_reader:server_properties()}} + ok -> {ok, {User, + rabbit_reader:server_properties(Protocol)}} catch exit:#amqp_error{name = access_refused} -> {error, access_refused} diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index 1781469a..9908d56f 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -24,7 +24,7 @@ -export([init/4, mainloop/2]). --export([conserve_memory/2, server_properties/0]). +-export([conserve_memory/2, server_properties/1]). -export([process_channel_frame/5]). %% used by erlang-client @@ -160,7 +160,8 @@ -spec(emit_stats/1 :: (pid()) -> 'ok'). -spec(shutdown/2 :: (pid(), string()) -> 'ok'). -spec(conserve_memory/2 :: (pid(), boolean()) -> 'ok'). --spec(server_properties/0 :: () -> rabbit_framing:amqp_table()). +-spec(server_properties/1 :: (rabbit_types:protocol()) -> + rabbit_framing:amqp_table()). %% These specs only exists to add no_return() to keep dialyzer happy -spec(init/4 :: (pid(), pid(), pid(), rabbit_heartbeat:start_heartbeat_fun()) @@ -219,7 +220,7 @@ conserve_memory(Pid, Conserve) -> Pid ! {conserve_memory, Conserve}, ok. -server_properties() -> +server_properties(_Protocol) -> {ok, Product} = application:get_key(rabbit, id), {ok, Version} = application:get_key(rabbit, vsn), @@ -655,7 +656,7 @@ start_connection({ProtocolMajor, ProtocolMinor, _ProtocolRevision}, Start = #'connection.start'{ version_major = ProtocolMajor, version_minor = ProtocolMinor, - server_properties = server_properties(), + server_properties = server_properties(Protocol), mechanisms = auth_mechanisms_binary(), locales = <<"en_US">> }, ok = send_on_channel0(Sock, Start, Protocol), -- cgit v1.2.1 From 880238a2755ab6d5c97bb4f033a17b2a0e47d43f Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Mon, 14 Feb 2011 14:57:04 +0000 Subject: Supply server capabilites --- src/rabbit_reader.erl | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index 9908d56f..e8225316 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -220,7 +220,7 @@ conserve_memory(Pid, Conserve) -> Pid ! {conserve_memory, Conserve}, ok. -server_properties(_Protocol) -> +server_properties(Protocol) -> {ok, Product} = application:get_key(rabbit, id), {ok, Version} = application:get_key(rabbit, vsn), @@ -231,22 +231,30 @@ server_properties(_Protocol) -> %% Normalize the simplifed (2-tuple) and unsimplified (3-tuple) forms %% from the config and merge them with the generated built-in properties NormalizedConfigServerProps = - [case X of - {KeyAtom, Value} -> {list_to_binary(atom_to_list(KeyAtom)), - longstr, - list_to_binary(Value)}; - {BinKey, Type, Value} -> {BinKey, Type, Value} - end || X <- RawConfigServerProps ++ - [{product, Product}, - {version, Version}, - {platform, "Erlang/OTP"}, - {copyright, ?COPYRIGHT_MESSAGE}, - {information, ?INFORMATION_MESSAGE}]], + [{<<"capabilities">>, table, server_capabilities(Protocol)} | + [case X of + {KeyAtom, Value} -> {list_to_binary(atom_to_list(KeyAtom)), + longstr, + list_to_binary(Value)}; + {BinKey, Type, Value} -> {BinKey, Type, Value} + end || X <- RawConfigServerProps ++ + [{product, Product}, + {version, Version}, + {platform, "Erlang/OTP"}, + {copyright, ?COPYRIGHT_MESSAGE}, + {information, ?INFORMATION_MESSAGE}]]], %% Filter duplicated properties in favor of config file provided values lists:usort(fun ({K1,_,_}, {K2,_,_}) -> K1 =< K2 end, NormalizedConfigServerProps). +server_capabilities(rabbit_framing_amqp_0_9_1) -> + [{<<"publisher_confirms">>, bool, true}, + {<<"exchange_exchange_bindings">>, bool, true}, + {<<"basic.nack">>, bool, true}]; +server_capabilities(_) -> + []. + inet_op(F) -> rabbit_misc:throw_on_error(inet_error, F). socket_op(Sock, Fun) -> -- cgit v1.2.1 From d26153f1d14ac1dac9d523c93b2d9ebf4c54c0ed Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Mon, 14 Feb 2011 16:48:45 +0000 Subject: print usage message for all command line parsing errors --- src/rabbit_control.erl | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/rabbit_control.erl b/src/rabbit_control.erl index 80483097..3a18950f 100644 --- a/src/rabbit_control.erl +++ b/src/rabbit_control.erl @@ -44,22 +44,18 @@ start() -> {ok, [[NodeStr|_]|_]} = init:get_argument(nodename), - FullCommand = init:get_plain_arguments(), - case FullCommand of - [] -> usage(); - _ -> ok - end, {[Command0 | Args], Opts} = - rabbit_misc:get_options( - [{flag, ?QUIET_OPT}, {option, ?NODE_OPT, NodeStr}, - {option, ?VHOST_OPT, "/"}], - FullCommand), - Opts1 = lists:map(fun({K, V}) -> - case K of - ?NODE_OPT -> {?NODE_OPT, rabbit_misc:makenode(V)}; - _ -> {K, V} - end - end, Opts), + case rabbit_misc:get_options([{flag, ?QUIET_OPT}, + {option, ?NODE_OPT, NodeStr}, + {option, ?VHOST_OPT, "/"}], + init:get_plain_arguments()) of + {[], _Opts} -> usage(); + CmdArgsAndOpts -> CmdArgsAndOpts + end, + Opts1 = [case K of + ?NODE_OPT -> {?NODE_OPT, rabbit_misc:makenode(V)}; + _ -> {K, V} + end || {K, V} <- Opts], Command = list_to_atom(Command0), Quiet = proplists:get_bool(?QUIET_OPT, Opts1), Node = proplists:get_value(?NODE_OPT, Opts1), -- cgit v1.2.1 From 6b0b5feea8df8cce7b0725611eee29e0d97f053e Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Tue, 15 Feb 2011 12:16:10 +0000 Subject: simplified and better error reporting on queue declare arg checks --- src/rabbit_amqqueue.erl | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl index 6e5aae27..1c89539f 100644 --- a/src/rabbit_amqqueue.erl +++ b/src/rabbit_amqqueue.erl @@ -300,29 +300,19 @@ check_declare_arguments(QueueName, Args) -> "invalid arg '~s' for ~s: ~w", [Key, rabbit_misc:rs(QueueName), Error]) end || {Key, Fun} <- - [{<<"x-expires">>, fun check_expires_argument/1}, - {<<"x-message-ttl">>, fun check_message_ttl_argument/1}]], + [{<<"x-expires">>, fun check_integer_argument/1}, + {<<"x-message-ttl">>, fun check_integer_argument/1}]], ok. -check_expires_argument(Val) -> - check_integer_argument(Val, - expires_not_of_acceptable_type, - expires_zero_or_less). - -check_message_ttl_argument(Val) -> - check_integer_argument(Val, - ttl_not_of_acceptable_type, - ttl_zero_or_less). - -check_integer_argument(undefined, _, _) -> +check_integer_argument(undefined) -> ok; -check_integer_argument({Type, Val}, InvalidTypeError, _) when Val > 0 -> +check_integer_argument({Type, Val}) when Val > 0 -> case lists:member(Type, ?INTEGER_ARG_TYPES) of true -> ok; - false -> {error, {InvalidTypeError, Type, Val}} + false -> {error, {unacceptable_type, Type}} end; -check_integer_argument({_Type, _Val}, _, ZeroOrLessError) -> - {error, ZeroOrLessError}. +check_integer_argument({_Type, Val}) -> + {error, {value_zero_or_less, Val}}. list(VHostPath) -> mnesia:dirty_match_object( -- cgit v1.2.1 From 0b269f4d86c414e411b60ab08bf16cba2b54d30b Mon Sep 17 00:00:00 2001 From: Matthew Sackman Date: Tue, 15 Feb 2011 18:14:11 +0000 Subject: Whoops. Forgot these --- src/rabbit_tests.erl | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/rabbit_tests.erl b/src/rabbit_tests.erl index 58c369b5..bc9a84c8 100644 --- a/src/rabbit_tests.erl +++ b/src/rabbit_tests.erl @@ -2201,9 +2201,11 @@ test_configurable_server_properties() -> BuiltInPropNames = [<<"product">>, <<"version">>, <<"platform">>, <<"copyright">>, <<"information">>], + Protocol = rabbit_framing_amqp_0_9_1, + %% Verify that the built-in properties are initially present - ActualPropNames = [Key || - {Key, longstr, _} <- rabbit_reader:server_properties()], + ActualPropNames = [Key || {Key, longstr, _} <- + rabbit_reader:server_properties(Protocol)], true = lists:all(fun (X) -> lists:member(X, ActualPropNames) end, BuiltInPropNames), @@ -2214,9 +2216,10 @@ test_configurable_server_properties() -> ConsProp = fun (X) -> application:set_env(rabbit, server_properties, [X | ServerProperties]) end, - IsPropPresent = fun (X) -> lists:member(X, - rabbit_reader:server_properties()) - end, + IsPropPresent = + fun (X) -> + lists:member(X, rabbit_reader:server_properties(Protocol)) + end, %% Add a wholly new property of the simplified {KeyAtom, StringValue} form NewSimplifiedProperty = {NewHareKey, NewHareVal} = {hare, "soup"}, @@ -2239,7 +2242,7 @@ test_configurable_server_properties() -> {BinNewVerKey, BinNewVerVal} = {list_to_binary(atom_to_list(NewVerKey)), list_to_binary(NewVerVal)}, ConsProp(NewVersion), - ClobberedServerProps = rabbit_reader:server_properties(), + ClobberedServerProps = rabbit_reader:server_properties(Protocol), %% Is the clobbering insert present? true = IsPropPresent({BinNewVerKey, longstr, BinNewVerVal}), %% Is the clobbering insert the only thing with the clobbering key? -- cgit v1.2.1 From 9c35ddb67e49f4f2c146bc3d9ba30e18a4f67345 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 17 Feb 2011 08:52:12 +0000 Subject: s/now_millis/now_micros - so the name matches the function spotted by John --- src/rabbit_amqqueue_process.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rabbit_amqqueue_process.erl b/src/rabbit_amqqueue_process.erl index 0d8a4c92..e794b4aa 100644 --- a/src/rabbit_amqqueue_process.erl +++ b/src/rabbit_amqqueue_process.erl @@ -658,13 +658,13 @@ message_properties(#q{ttl=TTL}) -> #message_properties{expiry = calculate_msg_expiry(TTL)}. calculate_msg_expiry(undefined) -> undefined; -calculate_msg_expiry(TTL) -> now_millis() + (TTL * 1000). +calculate_msg_expiry(TTL) -> now_micros() + (TTL * 1000). drop_expired_messages(State = #q{ttl = undefined}) -> State; drop_expired_messages(State = #q{backing_queue_state = BQS, backing_queue = BQ}) -> - Now = now_millis(), + Now = now_micros(), BQS1 = BQ:dropwhile( fun (#message_properties{expiry = Expiry}) -> Now > Expiry @@ -685,7 +685,7 @@ ensure_ttl_timer(State = #q{backing_queue = BQ, ensure_ttl_timer(State) -> State. -now_millis() -> timer:now_diff(now(), {0,0,0}). +now_micros() -> timer:now_diff(now(), {0,0,0}). infos(Items, State) -> [{Item, i(Item, State)} || Item <- Items]. -- cgit v1.2.1