diff --git a/node_heap.go b/node_heap.go index c0566fa..0cce5f6 100644 --- a/node_heap.go +++ b/node_heap.go @@ -53,14 +53,9 @@ func (nh *NodeHeap) TopN(n int) []*Node { m := make([]*Node, 0, n) nh.lk.RLock() defer nh.lk.RUnlock() - for i := 0; i < n; i++ { - node := heap.Pop(nh) - if n, ok := node.(*Node); ok { - m = append(m, n) - } - } - for _, n := range m { - heap.Push(nh, n) + for i := 0; i < n && i < len(nh.Nodes); i++ { + node := nh.Nodes[i] + m = append(m, node) } return m } diff --git a/pool_dynamics_test.go b/pool_dynamics_test.go index 3edb2bd..f0ac675 100644 --- a/pool_dynamics_test.go +++ b/pool_dynamics_test.go @@ -16,8 +16,7 @@ import ( ) const ( - nodesSize = 6 - nodesPoolSize = caboose.PoolConsiderationCount + nodesSize = 6 ) /* @@ -41,7 +40,7 @@ func TestPoolDynamics(t *testing.T) { // This test ensures that when the pool is intialized, it should converge to a set // of nodes that have stats vs a set of nodes that don't have any stats. t.Run("pool converges to good nodes vs nodes with no stats", func(t *testing.T) { - ch, controlGroup := getHarnessAndControlGroup(t, nodesSize, nodesPoolSize) + ch, controlGroup := getHarnessAndControlGroup(t, nodesSize, nodesSize/2) ch.FetchAndAssertSuccess(t, ctx, testCid) goodNodes := make([]*caboose.Node, 0) @@ -96,13 +95,13 @@ func TestPoolDynamics(t *testing.T) { fmt.Println("Final Node Pool", np) for _, n := range ch.CabooseAllNodes.Nodes { - fmt.Println("Node", n.URL, "Priority", n.Priority(), "Rate", n.Rate()) + fmt.Println("Node", n.URL, "Priority", n.Priority(), "Rate", n.Rate(), "samples ", len(n.Samples.PeekAll())) } }) t.Run("pool converges to good nodes vs nodes with worse stats", func(t *testing.T) { - ch, controlGroup := getHarnessAndControlGroup(t, nodesSize, nodesPoolSize) + ch, controlGroup := getHarnessAndControlGroup(t, nodesSize, nodesSize/2) goodNodes := make([]*caboose.Node, 0) badNodes := make([]*caboose.Node, 0) @@ -142,7 +141,7 @@ func TestPoolDynamics(t *testing.T) { // When new nodes join, if they start consistently performing better than the nodes in the current pool, // then those nodes should replace the nodes in the current pool. t.Run("pool converges to new nodes that are better than the current pool", func(t *testing.T) { - ch, controlGroup := getHarnessAndControlGroup(t, nodesSize, nodesPoolSize) + ch, controlGroup := getHarnessAndControlGroup(t, nodesSize, nodesSize/2) goodNodes := make([]*caboose.Node, 0) badNodes := make([]*caboose.Node, 0) @@ -188,7 +187,7 @@ func TestPoolDynamics(t *testing.T) { // If the current active main pool starts failing, the pool should converge to // to nodes that are not failing. t.Run("pool converges to other nodes if the current ones start failing", func(t *testing.T) { - ch, controlGroup := getHarnessAndControlGroup(t, nodesSize, nodesPoolSize) + ch, controlGroup := getHarnessAndControlGroup(t, nodesSize, nodesSize/2) goodNodes := make([]*caboose.Node, 0) badNodes := make([]*caboose.Node, 0) diff --git a/pool_tier_promotion.go b/pool_tier_promotion.go index 4ed770c..e0be6f6 100644 --- a/pool_tier_promotion.go +++ b/pool_tier_promotion.go @@ -1,17 +1,12 @@ package caboose -import "fmt" - const ( - PoolConsiderationCount = 3 + PoolConsiderationCount = 30 activationThreshold = 0 ) func updateActiveNodes(active *NodeRing, all *NodeHeap) error { candidates := all.TopN(PoolConsiderationCount) - for _, c := range(candidates) { - fmt.Println("Candidates", c.URL, c.PredictedThroughput) - } added := 0 for _, c := range candidates { if active.Contains(c) {