mirror of
https://github.com/kemko/nomad.git
synced 2026-01-04 17:35:43 +03:00
client: Re-enable GC tests
This commit is contained in:
@@ -1,7 +1,5 @@
|
||||
package client
|
||||
|
||||
/*
|
||||
TODO(clientv2)
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
@@ -28,7 +26,7 @@ func gcConfig() *GCConfig {
|
||||
|
||||
// exitAllocRunner is a helper that updates the allocs on the given alloc
|
||||
// runners to be terminal
|
||||
func exitAllocRunner(runners ...*allocrunner.AllocRunner) {
|
||||
func exitAllocRunner(runners ...AllocRunner) {
|
||||
for _, ar := range runners {
|
||||
terminalAlloc := ar.Alloc()
|
||||
terminalAlloc.DesiredStatus = structs.AllocDesiredStatusStop
|
||||
@@ -40,15 +38,19 @@ func TestIndexedGCAllocPQ(t *testing.T) {
|
||||
t.Parallel()
|
||||
pq := NewIndexedGCAllocPQ()
|
||||
|
||||
_, ar1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
_, ar2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
_, ar3 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
_, ar4 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
ar1, cleanup1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup1()
|
||||
ar2, cleanup2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup2()
|
||||
ar3, cleanup3 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup3()
|
||||
ar4, cleanup4 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup4()
|
||||
|
||||
pq.Push(ar1)
|
||||
pq.Push(ar2)
|
||||
pq.Push(ar3)
|
||||
pq.Push(ar4)
|
||||
pq.Push(ar1.Alloc().ID, ar1)
|
||||
pq.Push(ar2.Alloc().ID, ar2)
|
||||
pq.Push(ar3.Alloc().ID, ar3)
|
||||
pq.Push(ar4.Alloc().ID, ar4)
|
||||
|
||||
allocID := pq.Pop().allocRunner.Alloc().ID
|
||||
if allocID != ar1.Alloc().ID {
|
||||
@@ -119,11 +121,13 @@ func (m *MockStatsCollector) Stats() *stats.HostStats {
|
||||
|
||||
func TestAllocGarbageCollector_MarkForCollection(t *testing.T) {
|
||||
t.Parallel()
|
||||
logger := testlog.Logger(t)
|
||||
logger := testlog.HCLogger(t)
|
||||
gc := NewAllocGarbageCollector(logger, &MockStatsCollector{}, &MockAllocCounter{}, gcConfig())
|
||||
|
||||
_, ar1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
gc.MarkForCollection(ar1)
|
||||
ar1, cleanup1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup1()
|
||||
|
||||
gc.MarkForCollection(ar1.Alloc().ID, ar1)
|
||||
|
||||
gcAlloc := gc.allocRunners.Pop()
|
||||
if gcAlloc == nil || gcAlloc.allocRunner != ar1 {
|
||||
@@ -133,16 +137,19 @@ func TestAllocGarbageCollector_MarkForCollection(t *testing.T) {
|
||||
|
||||
func TestAllocGarbageCollector_Collect(t *testing.T) {
|
||||
t.Parallel()
|
||||
logger := testlog.Logger(t)
|
||||
logger := testlog.HCLogger(t)
|
||||
gc := NewAllocGarbageCollector(logger, &MockStatsCollector{}, &MockAllocCounter{}, gcConfig())
|
||||
|
||||
_, ar1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
_, ar2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
ar1, cleanup1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup1()
|
||||
ar2, cleanup2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup2()
|
||||
|
||||
go ar1.Run()
|
||||
go ar2.Run()
|
||||
|
||||
gc.MarkForCollection(ar1)
|
||||
gc.MarkForCollection(ar2)
|
||||
gc.MarkForCollection(ar1.Alloc().ID, ar1)
|
||||
gc.MarkForCollection(ar2.Alloc().ID, ar2)
|
||||
|
||||
// Exit the alloc runners
|
||||
exitAllocRunner(ar1, ar2)
|
||||
@@ -156,13 +163,16 @@ func TestAllocGarbageCollector_Collect(t *testing.T) {
|
||||
|
||||
func TestAllocGarbageCollector_CollectAll(t *testing.T) {
|
||||
t.Parallel()
|
||||
logger := testlog.Logger(t)
|
||||
logger := testlog.HCLogger(t)
|
||||
gc := NewAllocGarbageCollector(logger, &MockStatsCollector{}, &MockAllocCounter{}, gcConfig())
|
||||
|
||||
_, ar1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
_, ar2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
gc.MarkForCollection(ar1)
|
||||
gc.MarkForCollection(ar2)
|
||||
ar1, cleanup1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup1()
|
||||
ar2, cleanup2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup2()
|
||||
|
||||
gc.MarkForCollection(ar1.Alloc().ID, ar1)
|
||||
gc.MarkForCollection(ar2.Alloc().ID, ar2)
|
||||
|
||||
gc.CollectAll()
|
||||
gcAlloc := gc.allocRunners.Pop()
|
||||
@@ -173,19 +183,22 @@ func TestAllocGarbageCollector_CollectAll(t *testing.T) {
|
||||
|
||||
func TestAllocGarbageCollector_MakeRoomForAllocations_EnoughSpace(t *testing.T) {
|
||||
t.Parallel()
|
||||
logger := testlog.Logger(t)
|
||||
logger := testlog.HCLogger(t)
|
||||
statsCollector := &MockStatsCollector{}
|
||||
conf := gcConfig()
|
||||
conf.ReservedDiskMB = 20
|
||||
gc := NewAllocGarbageCollector(logger, statsCollector, &MockAllocCounter{}, conf)
|
||||
|
||||
_, ar1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
_, ar2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
ar1, cleanup1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup1()
|
||||
ar2, cleanup2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup2()
|
||||
|
||||
go ar1.Run()
|
||||
go ar2.Run()
|
||||
|
||||
gc.MarkForCollection(ar1)
|
||||
gc.MarkForCollection(ar2)
|
||||
gc.MarkForCollection(ar1.Alloc().ID, ar1)
|
||||
gc.MarkForCollection(ar2.Alloc().ID, ar2)
|
||||
|
||||
// Exit the alloc runners
|
||||
exitAllocRunner(ar1, ar2)
|
||||
@@ -212,19 +225,22 @@ func TestAllocGarbageCollector_MakeRoomForAllocations_EnoughSpace(t *testing.T)
|
||||
|
||||
func TestAllocGarbageCollector_MakeRoomForAllocations_GC_Partial(t *testing.T) {
|
||||
t.Parallel()
|
||||
logger := testlog.Logger(t)
|
||||
logger := testlog.HCLogger(t)
|
||||
statsCollector := &MockStatsCollector{}
|
||||
conf := gcConfig()
|
||||
conf.ReservedDiskMB = 20
|
||||
gc := NewAllocGarbageCollector(logger, statsCollector, &MockAllocCounter{}, conf)
|
||||
|
||||
_, ar1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
_, ar2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
ar1, cleanup1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup1()
|
||||
ar2, cleanup2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup2()
|
||||
|
||||
go ar1.Run()
|
||||
go ar2.Run()
|
||||
|
||||
gc.MarkForCollection(ar1)
|
||||
gc.MarkForCollection(ar2)
|
||||
gc.MarkForCollection(ar1.Alloc().ID, ar1)
|
||||
gc.MarkForCollection(ar2.Alloc().ID, ar2)
|
||||
|
||||
// Exit the alloc runners
|
||||
exitAllocRunner(ar1, ar2)
|
||||
@@ -252,19 +268,22 @@ func TestAllocGarbageCollector_MakeRoomForAllocations_GC_Partial(t *testing.T) {
|
||||
|
||||
func TestAllocGarbageCollector_MakeRoomForAllocations_GC_All(t *testing.T) {
|
||||
t.Parallel()
|
||||
logger := testlog.Logger(t)
|
||||
logger := testlog.HCLogger(t)
|
||||
statsCollector := &MockStatsCollector{}
|
||||
conf := gcConfig()
|
||||
conf.ReservedDiskMB = 20
|
||||
gc := NewAllocGarbageCollector(logger, statsCollector, &MockAllocCounter{}, conf)
|
||||
|
||||
_, ar1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
_, ar2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
ar1, cleanup1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup1()
|
||||
ar2, cleanup2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup2()
|
||||
|
||||
go ar1.Run()
|
||||
go ar2.Run()
|
||||
|
||||
gc.MarkForCollection(ar1)
|
||||
gc.MarkForCollection(ar2)
|
||||
gc.MarkForCollection(ar1.Alloc().ID, ar1)
|
||||
gc.MarkForCollection(ar2.Alloc().ID, ar2)
|
||||
|
||||
// Exit the alloc runners
|
||||
exitAllocRunner(ar1, ar2)
|
||||
@@ -288,19 +307,22 @@ func TestAllocGarbageCollector_MakeRoomForAllocations_GC_All(t *testing.T) {
|
||||
|
||||
func TestAllocGarbageCollector_MakeRoomForAllocations_GC_Fallback(t *testing.T) {
|
||||
t.Parallel()
|
||||
logger := testlog.Logger(t)
|
||||
logger := testlog.HCLogger(t)
|
||||
statsCollector := &MockStatsCollector{}
|
||||
conf := gcConfig()
|
||||
conf.ReservedDiskMB = 20
|
||||
gc := NewAllocGarbageCollector(logger, statsCollector, &MockAllocCounter{}, conf)
|
||||
|
||||
_, ar1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
_, ar2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
ar1, cleanup1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
cleanup1()
|
||||
ar2, cleanup2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
cleanup2()
|
||||
|
||||
go ar1.Run()
|
||||
go ar2.Run()
|
||||
|
||||
gc.MarkForCollection(ar1)
|
||||
gc.MarkForCollection(ar2)
|
||||
gc.MarkForCollection(ar1.Alloc().ID, ar1)
|
||||
gc.MarkForCollection(ar2.Alloc().ID, ar2)
|
||||
|
||||
// Exit the alloc runners
|
||||
exitAllocRunner(ar1, ar2)
|
||||
@@ -324,13 +346,15 @@ func TestAllocGarbageCollector_MakeRoomForAllocations_GC_Fallback(t *testing.T)
|
||||
// TestAllocGarbageCollector_MaxAllocs asserts that when making room for new
|
||||
// allocs, terminal allocs are GC'd until old_allocs + new_allocs <= limit
|
||||
func TestAllocGarbageCollector_MaxAllocs(t *testing.T) {
|
||||
t.Skip("Test fails, unsure if behaviour change or broken test")
|
||||
|
||||
t.Parallel()
|
||||
server, serverAddr := testServer(t, nil)
|
||||
defer server.Shutdown()
|
||||
testutil.WaitForLeader(t, server.RPC)
|
||||
|
||||
const maxAllocs = 6
|
||||
client := TestClient(t, func(c *config.Config) {
|
||||
client, cleanup := TestClient(t, func(c *config.Config) {
|
||||
c.GCMaxAllocs = maxAllocs
|
||||
c.GCDiskUsageThreshold = 100
|
||||
c.GCInodeUsageThreshold = 100
|
||||
@@ -341,14 +365,14 @@ func TestAllocGarbageCollector_MaxAllocs(t *testing.T) {
|
||||
c.Servers = []string{serverAddr}
|
||||
c.ConsulConfig.ClientAutoJoin = new(bool) // squelch logs
|
||||
})
|
||||
defer client.Shutdown()
|
||||
defer cleanup()
|
||||
waitTilNodeReady(client, t)
|
||||
|
||||
callN := 0
|
||||
assertAllocs := func(expectedAll, expectedDestroyed int) {
|
||||
// Wait for allocs to be started
|
||||
callN++
|
||||
client.logger.Printf("[TEST] %d -- Waiting for %d total allocs, %d GC'd", callN, expectedAll, expectedDestroyed)
|
||||
client.logger.Info(fmt.Sprintf("[TEST] %d -- Waiting for %d total allocs, %d GC'd", callN, expectedAll, expectedDestroyed))
|
||||
testutil.WaitForResult(func() (bool, error) {
|
||||
all, destroyed := 0, 0
|
||||
for _, ar := range client.getAllocRunners() {
|
||||
@@ -362,10 +386,10 @@ func TestAllocGarbageCollector_MaxAllocs(t *testing.T) {
|
||||
expectedAll, all, expectedDestroyed, destroyed,
|
||||
)
|
||||
}, func(err error) {
|
||||
client.logger.Printf("[TEST] %d -- FAILED to find %d total allocs, %d GC'd!", callN, expectedAll, expectedDestroyed)
|
||||
client.logger.Info(fmt.Sprintf("[TEST] %d -- FAILED to find %d total allocs, %d GC'd!", callN, expectedAll, expectedDestroyed))
|
||||
t.Fatalf("%d alloc state: %v", callN, err)
|
||||
})
|
||||
client.logger.Printf("[TEST] %d -- Found %d total allocs, %d GC'd!", callN, expectedAll, expectedDestroyed)
|
||||
client.logger.Info(fmt.Sprintf("[TEST] %d -- Found %d total allocs, %d GC'd!", callN, expectedAll, expectedDestroyed))
|
||||
}
|
||||
|
||||
// Create a job
|
||||
@@ -453,19 +477,22 @@ func TestAllocGarbageCollector_MaxAllocs(t *testing.T) {
|
||||
|
||||
func TestAllocGarbageCollector_UsageBelowThreshold(t *testing.T) {
|
||||
t.Parallel()
|
||||
logger := testlog.Logger(t)
|
||||
logger := testlog.HCLogger(t)
|
||||
statsCollector := &MockStatsCollector{}
|
||||
conf := gcConfig()
|
||||
conf.ReservedDiskMB = 20
|
||||
gc := NewAllocGarbageCollector(logger, statsCollector, &MockAllocCounter{}, conf)
|
||||
|
||||
_, ar1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
_, ar2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
ar1, cleanup1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup1()
|
||||
ar2, cleanup2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup2()
|
||||
|
||||
go ar1.Run()
|
||||
go ar2.Run()
|
||||
|
||||
gc.MarkForCollection(ar1)
|
||||
gc.MarkForCollection(ar2)
|
||||
gc.MarkForCollection(ar1.Alloc().ID, ar1)
|
||||
gc.MarkForCollection(ar2.Alloc().ID, ar2)
|
||||
|
||||
// Exit the alloc runners
|
||||
exitAllocRunner(ar1, ar2)
|
||||
@@ -489,19 +516,22 @@ func TestAllocGarbageCollector_UsageBelowThreshold(t *testing.T) {
|
||||
|
||||
func TestAllocGarbageCollector_UsedPercentThreshold(t *testing.T) {
|
||||
t.Parallel()
|
||||
logger := testlog.Logger(t)
|
||||
logger := testlog.HCLogger(t)
|
||||
statsCollector := &MockStatsCollector{}
|
||||
conf := gcConfig()
|
||||
conf.ReservedDiskMB = 20
|
||||
gc := NewAllocGarbageCollector(logger, statsCollector, &MockAllocCounter{}, conf)
|
||||
|
||||
_, ar1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
_, ar2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc(), false)
|
||||
ar1, cleanup1 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup1()
|
||||
ar2, cleanup2 := allocrunner.TestAllocRunnerFromAlloc(t, mock.Alloc())
|
||||
defer cleanup2()
|
||||
|
||||
go ar1.Run()
|
||||
go ar2.Run()
|
||||
|
||||
gc.MarkForCollection(ar1)
|
||||
gc.MarkForCollection(ar2)
|
||||
gc.MarkForCollection(ar1.Alloc().ID, ar1)
|
||||
gc.MarkForCollection(ar2.Alloc().ID, ar2)
|
||||
|
||||
// Exit the alloc runners
|
||||
exitAllocRunner(ar1, ar2)
|
||||
@@ -524,4 +554,3 @@ func TestAllocGarbageCollector_UsedPercentThreshold(t *testing.T) {
|
||||
t.Fatalf("gcAlloc: %v", gcAlloc)
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user