From 8b720ffaeb249cd5cc767571b6838f12a7b31a22 Mon Sep 17 00:00:00 2001 From: jianhuiz Date: Wed, 21 Sep 2016 14:10:51 -0700 Subject: [PATCH] fix planner loop ends before finishing replica assignments --- .../replicaset/planner/planner.go | 5 +-- .../replicaset/planner/planner_test.go | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/federation/pkg/federation-controller/replicaset/planner/planner.go b/federation/pkg/federation-controller/replicaset/planner/planner.go index 38204c23f0d..2da7c0d74b1 100644 --- a/federation/pkg/federation-controller/replicaset/planner/planner.go +++ b/federation/pkg/federation-controller/replicaset/planner/planner.go @@ -18,7 +18,6 @@ package planer import ( "hash/fnv" - "math" "sort" fed_api "k8s.io/kubernetes/federation/apis/federation" @@ -152,9 +151,7 @@ func (p *Planner) Plan(replicasToDistribute int64, availableClusters []string, c // TODO: Prove that clusterCount * log(replicas) iterations solves the problem or adjust the number. // TODO: This algorithm is O(clusterCount^2 * log(replicas)) which is good for up to 100 clusters. // Find something faster. - replicasAtStart := remainingReplicas - for trial := 0; trial < int(2*(1+math.Log(float64(replicasAtStart)))*float64(len(availableClusters))) && - modified && remainingReplicas > 0; trial++ { + for trial := 0; modified && remainingReplicas > 0; trial++ { modified = false weightSum := int64(0) diff --git a/federation/pkg/federation-controller/replicaset/planner/planner_test.go b/federation/pkg/federation-controller/replicaset/planner/planner_test.go index cab7865774e..34b21f74dc9 100644 --- a/federation/pkg/federation-controller/replicaset/planner/planner_test.go +++ b/federation/pkg/federation-controller/replicaset/planner/planner_test.go @@ -109,6 +109,42 @@ func TestEqualWithExisting(t *testing.T) { map[string]int64{"A": 30}, map[string]int64{"A": 30, "B": 20}) + doCheckWithExisting(t, map[string]fed_api.ClusterReplicaSetPreferences{ + "*": {Weight: 1}}, + 15, []string{"A", "B"}, + map[string]int64{"A": 0, "B": 8}, + map[string]int64{"A": 7, "B": 8}) + + doCheckWithExisting(t, map[string]fed_api.ClusterReplicaSetPreferences{ + "*": {Weight: 1}}, + 15, []string{"A", "B"}, + map[string]int64{"A": 1, "B": 8}, + map[string]int64{"A": 7, "B": 8}) + + doCheckWithExisting(t, map[string]fed_api.ClusterReplicaSetPreferences{ + "*": {Weight: 1}}, + 15, []string{"A", "B"}, + map[string]int64{"A": 4, "B": 8}, + map[string]int64{"A": 7, "B": 8}) + + doCheckWithExisting(t, map[string]fed_api.ClusterReplicaSetPreferences{ + "*": {Weight: 1}}, + 15, []string{"A", "B"}, + map[string]int64{"A": 5, "B": 8}, + map[string]int64{"A": 7, "B": 8}) + + doCheckWithExisting(t, map[string]fed_api.ClusterReplicaSetPreferences{ + "*": {Weight: 1}}, + 15, []string{"A", "B"}, + map[string]int64{"A": 6, "B": 8}, + map[string]int64{"A": 7, "B": 8}) + + doCheckWithExisting(t, map[string]fed_api.ClusterReplicaSetPreferences{ + "*": {Weight: 1}}, + 15, []string{"A", "B"}, + map[string]int64{"A": 7, "B": 8}, + map[string]int64{"A": 7, "B": 8}) + doCheckWithExisting(t, map[string]fed_api.ClusterReplicaSetPreferences{ "*": {Weight: 1}}, 500000, []string{"A", "B"},