Skip to content

Commit f7d8d43

Browse files
author
Matthew Sackman
committed
multi is a convenience. It should blow up when starting > 1 nodes when we have multiple tcp listeners. When starting > 1 nodes, make sure we export the discovered node ip address and port. When starting just 1 node, don't export anything - either rabbit-server will rediscover it in the env, or it's all configured in the config file.
1 parent b930ba4 commit f7d8d43

File tree

5 files changed

+59
-19
lines changed

5 files changed

+59
-19
lines changed

scripts/rabbitmq-multi

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ SCRIPT_HOME=$(dirname $0)
3636
PIDS_FILE=/var/lib/rabbitmq/pids
3737
MULTI_ERL_ARGS=
3838
MULTI_START_ARGS=
39+
CONFIG_FILE=/etc/rabbitmq/rabbitmq
3940

4041
. `dirname $0`/rabbitmq-env
4142

@@ -54,13 +55,18 @@ fi
5455
[ "x" = "x$RABBITMQ_PIDS_FILE" ] && RABBITMQ_PIDS_FILE=${PIDS_FILE}
5556
[ "x" = "x$RABBITMQ_MULTI_ERL_ARGS" ] && RABBITMQ_MULTI_ERL_ARGS=${MULTI_ERL_ARGS}
5657
[ "x" = "x$RABBITMQ_MULTI_START_ARGS" ] && RABBITMQ_MULTI_START_ARGS=${MULTI_START_ARGS}
58+
[ "x" = "x$RABBITMQ_CONFIG_FILE" ] && RABBITMQ_CONFIG_FILE=${CONFIG_FILE}
5759

5860
export \
5961
RABBITMQ_NODENAME \
6062
RABBITMQ_NODE_IP_ADDRESS \
6163
RABBITMQ_NODE_PORT \
6264
RABBITMQ_SCRIPT_HOME \
63-
RABBITMQ_PIDS_FILE
65+
RABBITMQ_PIDS_FILE \
66+
RABBITMQ_CONFIG_FILE
67+
68+
RABBITMQ_CONFIG_ARG=
69+
[ -f "${RABBITMQ_CONFIG_FILE}.config" ] && RABBITMQ_CONFIG_ARG="-config ${RABBITMQ_CONFIG_FILE}"
6470

6571
# we need to turn off path expansion because some of the vars, notably
6672
# RABBITMQ_MULTI_ERL_ARGS, may contain terms that look like globs and
@@ -73,6 +79,7 @@ exec erl \
7379
-hidden \
7480
${RABBITMQ_MULTI_ERL_ARGS} \
7581
-sname rabbitmq_multi$$ \
82+
${RABBITMQ_CONFIG_ARG} \
7683
-s rabbit_multi \
7784
${RABBITMQ_MULTI_START_ARGS} \
7885
-extra "$@"

scripts/rabbitmq-multi.bat

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,20 @@ if "%RABBITMQ_NODE_IP_ADDRESS%"=="" (
5353
set RABBITMQ_PIDS_FILE=%RABBITMQ_BASE%\rabbitmq.pids
5454
set RABBITMQ_SCRIPT_HOME=%~sdp0%
5555

56+
if "%RABBITMQ_CONFIG_FILE%"=="" (
57+
set RABBITMQ_CONFIG_FILE=%RABBITMQ_BASE%\rabbitmq
58+
)
59+
60+
if exist "%RABBITMQ_CONFIG_FILE%.config" (
61+
set RABBITMQ_CONFIG_ARG=-config "%RABBITMQ_CONFIG_FILE%"
62+
) else (
63+
set RABBITMQ_CONFIG_ARG=
64+
)
65+
5666
if not exist "%ERLANG_HOME%\bin\erl.exe" (
5767
echo.
5868
echo ******************************
59-
echo ERLANG_HOME not set correctly.
69+
echo ERLANG_HOME not set correctly.
6070
echo ******************************
6171
echo.
6272
echo Please either set ERLANG_HOME to point to your Erlang installation or place the
@@ -70,6 +80,7 @@ if not exist "%ERLANG_HOME%\bin\erl.exe" (
7080
-noinput -hidden ^
7181
%RABBITMQ_MULTI_ERL_ARGS% ^
7282
-sname rabbitmq_multi ^
83+
%RABBITMQ_CONFIG_ARG% ^
7384
-s rabbit_multi ^
7485
%RABBITMQ_MULTI_START_ARGS% ^
7586
-extra %*

scripts/rabbitmq-server

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ SERVER_START_ARGS=
4444

4545
. `dirname $0`/rabbitmq-env
4646

47-
4847
if [ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ]
4948
then
5049
if [ "x" != "x$RABBITMQ_NODE_PORT" ]
@@ -99,7 +98,7 @@ RABBITMQ_CONFIG_ARG=
9998
[ -f "${RABBITMQ_CONFIG_FILE}.config" ] && RABBITMQ_CONFIG_ARG="-config ${RABBITMQ_CONFIG_FILE}"
10099

101100
RABBITMQ_LISTEN_ARG=
102-
[ "x" != "x$RABBITMQ_NODE_PORT" ] && [ "x" != "x$RABBITMQ_NODE_IP_ADDRESS" ] && RABBITMQ_LISTEN_ARG="-rabbit tcp_listeners '[{"'${RABBITMQ_NODE_IP_ADDRESS}'", '${RABBITMQ_NODE_PORT}'}]'"
101+
[ "x" != "x$RABBITMQ_NODE_PORT" ] && [ "x" != "x$RABBITMQ_NODE_IP_ADDRESS" ] && RABBITMQ_LISTEN_ARG="-rabbit tcp_listeners [{\""${RABBITMQ_NODE_IP_ADDRESS}"\","${RABBITMQ_NODE_PORT}"}]"
103102

104103
# we need to turn off path expansion because some of the vars, notably
105104
# RABBITMQ_SERVER_ERL_ARGS, contain terms that look like globs and

scripts/rabbitmq-server.bat

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ if "%RABBITMQ_NODE_IP_ADDRESS%"=="" (
5353
if not exist "%ERLANG_HOME%\bin\erl.exe" (
5454
echo.
5555
echo ******************************
56-
echo ERLANG_HOME not set correctly.
56+
echo ERLANG_HOME not set correctly.
5757
echo ******************************
5858
echo.
5959
echo Please either set ERLANG_HOME to point to your Erlang installation or place the
@@ -116,7 +116,7 @@ if exist "%RABBITMQ_EBIN_ROOT%\rabbit.boot" (
116116
if "%RABBITMQ_CONFIG_FILE%"=="" (
117117
set RABBITMQ_CONFIG_FILE=%RABBITMQ_BASE%\rabbitmq
118118
)
119-
119+
120120
if exist "%RABBITMQ_CONFIG_FILE%.config" (
121121
set RABBITMQ_CONFIG_ARG=-config "%RABBITMQ_CONFIG_FILE%"
122122
) else (
@@ -126,7 +126,7 @@ if exist "%RABBITMQ_CONFIG_FILE%.config" (
126126
set RABBITMQ_LISTEN_ARG=
127127
if not "%RABBITMQ_NODE_IP_ADDRESS%"=="" (
128128
if not "%RABBITMQ_NODE_PORT%"=="" (
129-
set RABBITMQ_LISTEN_ARG=-rabbit tcp_listeners "[{\"%RABBITMQ_NODE_IP_ADDRESS%\", %RABBITMQ_NODE_PORT%}]"
129+
set RABBITMQ_LISTEN_ARG=-rabbit tcp_listeners [{\""%RABBITMQ_NODE_IP_ADDRESS%"\","%RABBITMQ_NODE_PORT%"}]
130130
)
131131
)
132132

src/rabbit_multi.erl

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,13 @@ Available commands:
9999

100100
action(start_all, [NodeCount], RpcTimeout) ->
101101
io:format("Starting all nodes...~n", []),
102+
application:load(rabbit),
102103
N = list_to_integer(NodeCount),
103104
{NodePids, Running} =
104105
start_nodes(N, N, [], true,
105106
rabbit_misc:nodeparts(
106107
getenv("RABBITMQ_NODENAME")),
107-
list_to_integer(getenv("RABBITMQ_NODE_PORT")),
108+
get_node_tcp_listener(1 == N),
108109
RpcTimeout),
109110
write_pids_file(NodePids),
110111
case Running of
@@ -158,26 +159,30 @@ action(rotate_logs, [Suffix], RpcTimeout) ->
158159
%% Running is a boolean exhibiting success at some moment
159160
start_nodes(0, _, PNodePid, Running, _, _, _) -> {PNodePid, Running};
160161

162+
start_nodes(1, 1, [], true, NodeName, NodeListen, RpcTimeout) ->
163+
{NodePid, Started} = start_single_node(rabbit_misc:makenode(NodeName),
164+
RpcTimeout),
165+
start_nodes(0, 1, [NodePid], Started, NodeName, NodeListen, RpcTimeout);
166+
161167
start_nodes(N, Total, PNodePid, Running,
162-
NodeNameBase, NodePortBase, RpcTimeout) ->
168+
NodeNameBase, {NodeIpAddress, NodePortBase}, RpcTimeout) ->
163169
{NodePre, NodeSuff} = NodeNameBase,
164170
NodeNumber = Total - N,
165-
NodePre1 = if NodeNumber == 0 ->
166-
%% For compatibility with running a single node
167-
NodePre;
168-
true ->
169-
NodePre ++ "_" ++ integer_to_list(NodeNumber)
170-
end,
171+
NodePre1 = NodePre ++ "_" ++ integer_to_list(NodeNumber),
171172
{NodePid, Started} = start_node(rabbit_misc:makenode({NodePre1, NodeSuff}),
172-
NodePortBase + NodeNumber,
173+
{NodeIpAddress, NodePortBase + NodeNumber},
173174
RpcTimeout),
174175
start_nodes(N - 1, Total, [NodePid | PNodePid],
175-
Started and Running,
176-
NodeNameBase, NodePortBase, RpcTimeout).
176+
Started and Running, NodeNameBase,
177+
{NodeIpAddress, NodePortBase}, RpcTimeout).
177178

178-
start_node(Node, NodePort, RpcTimeout) ->
179+
start_node(Node, {NodeIpAddress, NodePort}, RpcTimeout) ->
179180
os:putenv("RABBITMQ_NODENAME", atom_to_list(Node)),
180181
os:putenv("RABBITMQ_NODE_PORT", integer_to_list(NodePort)),
182+
os:putenv("RABBITMQ_NODE_IP_ADDRESS", atom_to_list(NodeIpAddress)),
183+
start_single_node(Node, RpcTimeout).
184+
185+
start_single_node(Node, RpcTimeout) ->
181186
io:format("Starting node ~s...~n", [Node]),
182187
case rpc:call(Node, os, getpid, []) of
183188
{badrpc, _} ->
@@ -321,3 +326,21 @@ getenv(Var) ->
321326
false -> throw({missing_env_var, Var});
322327
Value -> Value
323328
end.
329+
330+
get_node_tcp_listener(OneNode) ->
331+
try
332+
{list_to_atom(getenv("RABBITMQ_NODE_IP_ADDRESS")),
333+
list_to_integer(getenv("RABBITMQ_NODE_PORT"))}
334+
catch _ ->
335+
case application:get_env(rabbit, tcp_listeners) of
336+
{ok, [{_IpAddy, _Port} = Listener]} ->
337+
Listener;
338+
{ok, _Other} when OneNode ->
339+
it_matters_not;
340+
{ok, Other} ->
341+
throw({cannot_start_multiple_nodes, multiple_tcp_listeners,
342+
Other});
343+
undefined ->
344+
throw({missing_configuration, tcp_listeners})
345+
end
346+
end.

0 commit comments

Comments
 (0)