From 91492e57c44448dddc8edf5eec030bf94b60b114 Mon Sep 17 00:00:00 2001 From: Iustin Pop <iustin@google.com> Date: Fri, 23 Jul 2010 15:29:31 -0400 Subject: [PATCH] Change the meaning of call_node_start_master MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, backend.StartMaster (the function behind this RPC call) will activate the master IP and then, if the start_daemons parameter is true, it will also activate the master role. While this works, it has two issues: - first, it will activate the master IP unconditionally, even if this node will not start the master daemon due to missing votes - second, the activation of the IP is done twice if start_daemons is true, because the master daemon does its own activation too This behaviour seems to be unmodified since Summer 2008, so probably any rationale on why this is done in two places is forgotten. The patch changes so that this function does *either* IP activation or master role activation but not both. So the IP will be activated only once (from the master daemon or from LURenameCluster), and it will only be done if the masterd got enough votes for startup. I can see only one downside to this change: if masterd won't actually start (due to missing votes), RAPI will still start, and without the master IP activated. But this is no worse than before, when both RAPI was running and the IP was activated. Note that the behaviour of StopMaster remains the same, as noone else does the IP removal. Signed-off-by: Iustin Pop <iustin@google.com> Reviewed-by: RenΓ© Nussbaumer <rn@google.com> --- lib/backend.py | 56 ++++++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/lib/backend.py b/lib/backend.py index f3c2fcf13..311c984bd 100644 --- a/lib/backend.py +++ b/lib/backend.py @@ -242,13 +242,14 @@ def GetMasterInfo(): def StartMaster(start_daemons, no_voting): """Activate local node as master node. - The function will always try activate the IP address of the master - (unless someone else has it). It will also start the master daemons, - based on the start_daemons parameter. + The function will either try activate the IP address of the master + (unless someone else has it) or also start the master daemons, based + on the start_daemons parameter. @type start_daemons: boolean - @param start_daemons: whether to also start the master - daemons (ganeti-masterd and ganeti-rapi) + @param start_daemons: whether to start the master daemons + (ganeti-masterd and ganeti-rapi), or (if false) activate the + master ip @type no_voting: boolean @param no_voting: whether to start ganeti-masterd without a node vote (if start_daemons is True), but still non-interactively @@ -259,28 +260,7 @@ def StartMaster(start_daemons, no_voting): master_netdev, master_ip, _ = GetMasterInfo() err_msgs = [] - if netutils.TcpPing(master_ip, constants.DEFAULT_NODED_PORT): - if netutils.OwnIpAddress(master_ip): - # we already have the ip: - logging.debug("Master IP already configured, doing nothing") - else: - msg = "Someone else has the master ip, not activating" - logging.error(msg) - err_msgs.append(msg) - else: - result = utils.RunCmd(["ip", "address", "add", "%s/32" % master_ip, - "dev", master_netdev, "label", - "%s:0" % master_netdev]) - if result.failed: - msg = "Can't activate master IP: %s" % result.output - logging.error(msg) - err_msgs.append(msg) - - result = utils.RunCmd(["arping", "-q", "-U", "-c 3", "-I", master_netdev, - "-s", master_ip, master_ip]) - # we'll ignore the exit code of arping - - # and now start the master and rapi daemons + # either start the master and rapi daemons if start_daemons: if no_voting: masterd_args = "--no-voting --yes-do-it" @@ -296,6 +276,28 @@ def StartMaster(start_daemons, no_voting): msg = "Can't start Ganeti master: %s" % result.output logging.error(msg) err_msgs.append(msg) + # or activate the IP + else: + if netutils.TcpPing(master_ip, constants.DEFAULT_NODED_PORT): + if netutils.OwnIpAddress(master_ip): + # we already have the ip: + logging.debug("Master IP already configured, doing nothing") + else: + msg = "Someone else has the master ip, not activating" + logging.error(msg) + err_msgs.append(msg) + else: + result = utils.RunCmd(["ip", "address", "add", "%s/32" % master_ip, + "dev", master_netdev, "label", + "%s:0" % master_netdev]) + if result.failed: + msg = "Can't activate master IP: %s" % result.output + logging.error(msg) + err_msgs.append(msg) + + result = utils.RunCmd(["arping", "-q", "-U", "-c 3", "-I", master_netdev, + "-s", master_ip, master_ip]) + # we'll ignore the exit code of arping if err_msgs: _Fail("; ".join(err_msgs)) -- GitLab