diff options
| author | Matthew Sackman <matthew@lshift.net> | 2009-11-25 18:14:26 +0000 |
|---|---|---|
| committer | Matthew Sackman <matthew@lshift.net> | 2009-11-25 18:14:26 +0000 |
| commit | f7d8d4323243de29d9b3fad55c9a17acffa02316 (patch) | |
| tree | 13d3fc110cc8897fa8f3461bf830e0b82120d8c1 /src | |
| parent | b930ba473c7799c631be5df0d7fe9b597ebfbd7a (diff) | |
| download | rabbitmq-server-git-f7d8d4323243de29d9b3fad55c9a17acffa02316.tar.gz | |
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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_multi.erl | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/src/rabbit_multi.erl b/src/rabbit_multi.erl index f364872eca..7f53e2df03 100644 --- a/src/rabbit_multi.erl +++ b/src/rabbit_multi.erl @@ -99,12 +99,13 @@ Available commands: action(start_all, [NodeCount], RpcTimeout) -> io:format("Starting all nodes...~n", []), + application:load(rabbit), N = list_to_integer(NodeCount), {NodePids, Running} = start_nodes(N, N, [], true, rabbit_misc:nodeparts( getenv("RABBITMQ_NODENAME")), - list_to_integer(getenv("RABBITMQ_NODE_PORT")), + get_node_tcp_listener(1 == N), RpcTimeout), write_pids_file(NodePids), case Running of @@ -158,26 +159,30 @@ action(rotate_logs, [Suffix], RpcTimeout) -> %% Running is a boolean exhibiting success at some moment start_nodes(0, _, PNodePid, Running, _, _, _) -> {PNodePid, Running}; +start_nodes(1, 1, [], true, NodeName, NodeListen, RpcTimeout) -> + {NodePid, Started} = start_single_node(rabbit_misc:makenode(NodeName), + RpcTimeout), + start_nodes(0, 1, [NodePid], Started, NodeName, NodeListen, RpcTimeout); + start_nodes(N, Total, PNodePid, Running, - NodeNameBase, NodePortBase, RpcTimeout) -> + NodeNameBase, {NodeIpAddress, NodePortBase}, RpcTimeout) -> {NodePre, NodeSuff} = NodeNameBase, NodeNumber = Total - N, - NodePre1 = if NodeNumber == 0 -> - %% For compatibility with running a single node - NodePre; - true -> - NodePre ++ "_" ++ integer_to_list(NodeNumber) - end, + NodePre1 = NodePre ++ "_" ++ integer_to_list(NodeNumber), {NodePid, Started} = start_node(rabbit_misc:makenode({NodePre1, NodeSuff}), - NodePortBase + NodeNumber, + {NodeIpAddress, NodePortBase + NodeNumber}, RpcTimeout), start_nodes(N - 1, Total, [NodePid | PNodePid], - Started and Running, - NodeNameBase, NodePortBase, RpcTimeout). + Started and Running, NodeNameBase, + {NodeIpAddress, NodePortBase}, RpcTimeout). -start_node(Node, NodePort, RpcTimeout) -> +start_node(Node, {NodeIpAddress, NodePort}, RpcTimeout) -> os:putenv("RABBITMQ_NODENAME", atom_to_list(Node)), os:putenv("RABBITMQ_NODE_PORT", integer_to_list(NodePort)), + os:putenv("RABBITMQ_NODE_IP_ADDRESS", atom_to_list(NodeIpAddress)), + start_single_node(Node, RpcTimeout). + +start_single_node(Node, RpcTimeout) -> io:format("Starting node ~s...~n", [Node]), case rpc:call(Node, os, getpid, []) of {badrpc, _} -> @@ -321,3 +326,21 @@ getenv(Var) -> false -> throw({missing_env_var, Var}); Value -> Value end. + +get_node_tcp_listener(OneNode) -> + try + {list_to_atom(getenv("RABBITMQ_NODE_IP_ADDRESS")), + list_to_integer(getenv("RABBITMQ_NODE_PORT"))} + catch _ -> + case application:get_env(rabbit, tcp_listeners) of + {ok, [{_IpAddy, _Port} = Listener]} -> + Listener; + {ok, _Other} when OneNode -> + it_matters_not; + {ok, Other} -> + throw({cannot_start_multiple_nodes, multiple_tcp_listeners, + Other}); + undefined -> + throw({missing_configuration, tcp_listeners}) + end + end. |
