[lxc-devel] [lxd/master] Silence rebalance warning not leader

freeekanayaka on Github lxc-bot at linuxcontainers.org
Thu Jan 16 16:10:52 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200116/e836c92c/attachment.bin>
-------------- next part --------------
From fd4617adaa58ca9e347cb748071e66cf11f25864 Mon Sep 17 00:00:00 2001
From: Free Ekanayaka <free.ekanayaka at canonical.com>
Date: Thu, 16 Jan 2020 16:05:40 +0000
Subject: [PATCH 1/3] Make cluster.Rebalance fail immediately if not leader

Signed-off-by: Free Ekanayaka <free.ekanayaka at canonical.com>
---
 lxd/cluster/membership.go | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/lxd/cluster/membership.go b/lxd/cluster/membership.go
index 996a1c64d5..ed08b127da 100644
--- a/lxd/cluster/membership.go
+++ b/lxd/cluster/membership.go
@@ -479,11 +479,18 @@ func notifyNodesUpdate(raftNodes []db.RaftNode, id uint64, cert *shared.CertInfo
 // If there's such spare node, return its address as well as the new list of
 // raft nodes.
 func Rebalance(state *state.State, gateway *Gateway) (string, []db.RaftNode, error) {
+	// First get the current raft members, since this method should be
+	// called after a node has left.
+	currentRaftNodes, err := gateway.currentRaftNodes()
+	if err != nil {
+		return "", nil, errors.Wrap(err, "failed to get current raft nodes")
+	}
+
 	// Fetch the nodes from the database, to get their last heartbeat
 	// timestamp and check whether they are offline.
 	nodesByAddress := map[string]db.NodeInfo{}
 	var offlineThreshold time.Duration
-	err := state.Cluster.Transaction(func(tx *db.ClusterTx) error {
+	err = state.Cluster.Transaction(func(tx *db.ClusterTx) error {
 		config, err := ConfigLoad(tx)
 		if err != nil {
 			return errors.Wrap(err, "failed load cluster configuration")
@@ -502,13 +509,6 @@ func Rebalance(state *state.State, gateway *Gateway) (string, []db.RaftNode, err
 		return "", nil, err
 	}
 
-	// First get the current raft members, since this method should be
-	// called after a node has left.
-	currentRaftNodes, err := gateway.currentRaftNodes()
-	if err != nil {
-		return "", nil, errors.Wrap(err, "failed to get current raft nodes")
-	}
-
 	// Group by role. If a node is offline, we'll try to demote it right
 	// away.
 	voters := make([]string, 0)

From e6e584d64acab30174fbb1f72bf84e7b9e30f3fc Mon Sep 17 00:00:00 2001
From: Free Ekanayaka <free.ekanayaka at canonical.com>
Date: Thu, 16 Jan 2020 16:06:19 +0000
Subject: [PATCH 2/3] Export cluster.ErrNotLeader

Signed-off-by: Free Ekanayaka <free.ekanayaka at canonical.com>
---
 lxd/cluster/gateway.go   | 8 ++++----
 lxd/cluster/heartbeat.go | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/lxd/cluster/gateway.go b/lxd/cluster/gateway.go
index 023593247f..194e9da661 100644
--- a/lxd/cluster/gateway.go
+++ b/lxd/cluster/gateway.go
@@ -723,8 +723,8 @@ func (g *Gateway) isLeader() (bool, error) {
 	return leader != nil && leader.ID == g.info.ID, nil
 }
 
-// Internal error signalling that a node not the leader.
-var errNotLeader = fmt.Errorf("Not leader")
+// ErrNotLeader signals that a node not the leader.
+var ErrNotLeader = fmt.Errorf("Not leader")
 
 // Return information about the LXD nodes that a currently part of the raft
 // cluster, as configured in the raft log. It returns an error if this node is
@@ -734,7 +734,7 @@ func (g *Gateway) currentRaftNodes() ([]db.RaftNode, error) {
 	defer g.lock.RUnlock()
 
 	if g.info == nil || g.info.Role != db.RaftVoter {
-		return nil, errNotLeader
+		return nil, ErrNotLeader
 	}
 
 	isLeader, err := g.isLeader()
@@ -742,7 +742,7 @@ func (g *Gateway) currentRaftNodes() ([]db.RaftNode, error) {
 		return nil, err
 	}
 	if !isLeader {
-		return nil, errNotLeader
+		return nil, ErrNotLeader
 	}
 	client, err := g.getClient()
 	if err != nil {
diff --git a/lxd/cluster/heartbeat.go b/lxd/cluster/heartbeat.go
index e00a7e1764..27aeb80767 100644
--- a/lxd/cluster/heartbeat.go
+++ b/lxd/cluster/heartbeat.go
@@ -194,7 +194,7 @@ func (g *Gateway) heartbeat(ctx context.Context, initialHeartbeat bool) {
 	}
 
 	raftNodes, err := g.currentRaftNodes()
-	if err == errNotLeader {
+	if err == ErrNotLeader {
 		return
 	}
 

From 1bebfb93cfab723d28433fd86b3bcbf7710b74f8 Mon Sep 17 00:00:00 2001
From: Free Ekanayaka <free.ekanayaka at canonical.com>
Date: Thu, 16 Jan 2020 16:10:06 +0000
Subject: [PATCH 3/3] Silence warning about failing to rebalance when not
 leader

Signed-off-by: Free Ekanayaka <free.ekanayaka at canonical.com>
---
 lxd/daemon.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/daemon.go b/lxd/daemon.go
index 88b2c1142d..646f1d82df 100644
--- a/lxd/daemon.go
+++ b/lxd/daemon.go
@@ -1482,7 +1482,7 @@ func (d *Daemon) NodeRefreshTask(heartbeatData *cluster.APIHeartbeat) {
 				d.clusterMembershipMutex.Lock()
 				defer d.clusterMembershipMutex.Unlock()
 				err := rebalanceMemberRoles(d)
-				if err != nil {
+				if err != nil && errors.Cause(err) != cluster.ErrNotLeader {
 					logger.Warnf("Could not rebalance cluster member roles: %v", err)
 				}
 			}()


More information about the lxc-devel mailing list