From 3a26773ffa1a1d7c8f292281d943702d0acd3791 Mon Sep 17 00:00:00 2001
From: Iustin Pop <iustin@google.com>
Date: Wed, 3 Dec 2008 09:57:22 +0000
Subject: [PATCH] A few fixes related to master candidates

This patch:
  - fixes cluster verify when all nodes are master candidates, but the
    candidate_pool_size is higher
  - warn when the master node is not marked as candidate
  - disable setting master node to regular node
  - don't pass the master node to context.ReaddNode since the job queue
    doesn't like getting our own node name

Reviewed-by: ultrotter
---
 lib/cmdlib.py | 6 +++++-
 lib/config.py | 9 ++++++---
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 3b95fd37a..f59f5b3f4 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -2100,6 +2100,9 @@ class LUSetNodeParams(LogicalUnit):
     force = self.force = self.op.force
 
     if self.op.master_candidate == False:
+      if self.op.node_name == self.cfg.GetMasterNode():
+        raise errors.OpPrereqError("The master node has to be a"
+                                   " master candidate")
       cp_size = self.cfg.GetClusterInfo().candidate_pool_size
       node_info = self.cfg.GetAllNodesInfo().values()
       num_candidates = len([node for node in node_info
@@ -2129,7 +2132,8 @@ class LUSetNodeParams(LogicalUnit):
     # this will trigger configuration file update, if needed
     self.cfg.Update(node)
     # this will trigger job queue propagation or cleanup
-    self.context.ReaddNode(node)
+    if self.op.node_name != self.cfg.GetMasterNode():
+      self.context.ReaddNode(node)
 
     return result
 
diff --git a/lib/config.py b/lib/config.py
index 9d04231d3..67c5e06bb 100644
--- a/lib/config.py
+++ b/lib/config.py
@@ -272,14 +272,17 @@ class ConfigWriter:
         result.append("Highest used port mismatch, saved %s, computed %s" %
                       (data.cluster.highest_used_port, keys[-1]))
 
+    if not data.nodes[data.cluster.master_node].master_candidate:
+      result.append("Master node is not a master candidate")
+
     cp_size = data.cluster.candidate_pool_size
     num_c = 0
     for node in data.nodes.values():
       if node.master_candidate:
         num_c += 1
-    if cp_size > num_c:
-      result.append("Not enough master candidates: actual %d, desired %d" %
-                    (num_c, cp_size))
+    if cp_size > num_c and num_c < len(data.nodes):
+      result.append("Not enough master candidates: actual %d, desired %d,"
+                    " %d total nodes" % (num_c, cp_size, len(data.nodes)))
 
     return result
 
-- 
GitLab