diff --git a/storage/memory/memory.go b/storage/memory/memory.go index dd353cc4..500ec3e0 100644 --- a/storage/memory/memory.go +++ b/storage/memory/memory.go @@ -75,9 +75,9 @@ func (self *containerStorage) AddStats(stats *info.ContainerStats) error { } } if self.recentStats.Len() >= self.maxNumStats { - self.recentStats.Remove(self.recentStats.Front()) + self.recentStats.Remove(self.recentStats.Back()) } - self.recentStats.PushBack(stats) + self.recentStats.PushFront(stats) self.updatePrevStats(stats) return nil } diff --git a/storage/memory/memory_test.go b/storage/memory/memory_test.go index ab75ad38..32809ce0 100644 --- a/storage/memory/memory_test.go +++ b/storage/memory/memory_test.go @@ -53,3 +53,7 @@ func TestPercentiles(t *testing.T) { driver := New(N, N) test.StorageDriverTestPercentiles(driver, t) } + +func TestRetrievePartialRecentStats(t *testing.T) { + runStorageTest(test.StorageDriverTestRetrievePartialRecentStats, t) +} diff --git a/storage/test/storagetests.go b/storage/test/storagetests.go index 6253c482..60985e67 100644 --- a/storage/test/storagetests.go +++ b/storage/test/storagetests.go @@ -16,6 +16,7 @@ package test import ( "math/rand" + "reflect" "testing" "time" @@ -171,6 +172,7 @@ func StorageDriverTestPercentilesWithoutSample(driver storage.StorageDriver, t * // The driver must be able to hold more than 100 samples func StorageDriverTestPercentiles(driver storage.StorageDriver, t *testing.T) { + defer driver.Close() N := 100 cpuTrace := make([]uint64, N) memTrace := make([]uint64, N) @@ -209,3 +211,46 @@ func StorageDriverTestPercentiles(driver storage.StorageDriver, t *testing.T) { } } } + +// The driver must be albe to hold more than 10 stats +func StorageDriverTestRetrievePartialRecentStats(driver storage.StorageDriver, t *testing.T) { + defer driver.Close() + N := 100 + memTrace := make([]uint64, N) + cpuTrace := make([]uint64, N) + for i := 0; i < N; i++ { + memTrace[i] = uint64(i + 1) + cpuTrace[i] = uint64(1) + } + + ref := info.ContainerReference{ + Name: "container", + } + + trace := buildTrace(cpuTrace, memTrace, 1*time.Second) + + for _, stats := range trace { + driver.AddStats(ref, stats) + } + + recentStats, err := driver.RecentStats(ref.Name, 10) + if err != nil { + t.Fatal(err) + } + + if len(recentStats) != 10 { + t.Fatalf("returned %v stats, not 10.", len(recentStats)) + } + + for _, r := range recentStats { + found := false + for _, s := range trace[len(trace)-10:] { + if reflect.DeepEqual(s, r) { + found = true + } + } + if !found { + t.Errorf("returned unexpected stats: %+v; %v", r, r.Memory.Usage) + } + } +}