From 3ba4699c12a9d78f1ef98e7e089334bfe555d8ca Mon Sep 17 00:00:00 2001 From: Seth Jennings Date: Thu, 17 Aug 2017 12:15:22 -0500 Subject: [PATCH] skip subcontainer update on v2 calls --- manager/container.go | 10 +++++---- manager/container_test.go | 2 +- manager/manager.go | 6 +++--- manager/manager_test.go | 44 ++++++++++++++++++++++++++++++++++++++- 4 files changed, 53 insertions(+), 9 deletions(-) diff --git a/manager/container.go b/manager/container.go index 53d8cad3..4924db5b 100644 --- a/manager/container.go +++ b/manager/container.go @@ -113,16 +113,18 @@ func (c *containerData) allowErrorLogging() bool { return false } -func (c *containerData) GetInfo() (*containerInfo, error) { +func (c *containerData) GetInfo(shouldUpdateSubcontainers bool) (*containerInfo, error) { // Get spec and subcontainers. if time.Since(c.lastUpdatedTime) > 5*time.Second { err := c.updateSpec() if err != nil { return nil, err } - err = c.updateSubcontainers() - if err != nil { - return nil, err + if shouldUpdateSubcontainers { + err = c.updateSubcontainers() + if err != nil { + return nil, err + } } c.lastUpdatedTime = time.Now() } diff --git a/manager/container_test.go b/manager/container_test.go index 7a056981..32411256 100644 --- a/manager/container_test.go +++ b/manager/container_test.go @@ -174,7 +174,7 @@ func TestGetInfo(t *testing.T) { ) mockHandler.Aliases = []string{"a1", "a2"} - info, err := cd.GetInfo() + info, err := cd.GetInfo(true) if err != nil { t.Fatal(err) } diff --git a/manager/manager.go b/manager/manager.go index 6e4a02be..39fc85b7 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -400,7 +400,7 @@ func (self *manager) GetContainerSpec(containerName string, options v2.RequestOp var errs partialFailure specs := make(map[string]v2.ContainerSpec) for name, cont := range conts { - cinfo, err := cont.GetInfo() + cinfo, err := cont.GetInfo(false) if err != nil { errs.append(name, "GetInfo", err) } @@ -449,7 +449,7 @@ func (self *manager) GetContainerInfoV2(containerName string, options v2.Request infos := make(map[string]v2.ContainerInfo, len(containers)) for name, container := range containers { result := v2.ContainerInfo{} - cinfo, err := container.GetInfo() + cinfo, err := container.GetInfo(false) if err != nil { errs.append(name, "GetInfo", err) infos[name] = result @@ -473,7 +473,7 @@ func (self *manager) GetContainerInfoV2(containerName string, options v2.Request func (self *manager) containerDataToContainerInfo(cont *containerData, query *info.ContainerInfoRequest) (*info.ContainerInfo, error) { // Get the info from the container. - cinfo, err := cont.GetInfo() + cinfo, err := cont.GetInfo(true) if err != nil { return nil, err } diff --git a/manager/manager_test.go b/manager/manager_test.go index 880ae5a0..88e16106 100644 --- a/manager/manager_test.go +++ b/manager/manager_test.go @@ -124,6 +124,48 @@ func expectManagerWithContainers(containers []string, query *info.ContainerInfoR return m, infosMap, handlerMap } +// Expect a manager with the specified containers and query. Returns the manager, map of ContainerInfo objects, +// and map of MockContainerHandler objects.} +func expectManagerWithContainersV2(containers []string, query *info.ContainerInfoRequest, t *testing.T) (*manager, map[string]*info.ContainerInfo, map[string]*containertest.MockContainerHandler) { + infosMap := make(map[string]*info.ContainerInfo, len(containers)) + handlerMap := make(map[string]*containertest.MockContainerHandler, len(containers)) + + for _, container := range containers { + infosMap[container] = itest.GenerateRandomContainerInfo(container, 4, query, 1*time.Second) + } + + memoryCache := memory.New(time.Duration(query.NumStats)*time.Second, nil) + sysfs := &fakesysfs.FakeSysFs{} + m := createManagerAndAddContainers( + memoryCache, + sysfs, + containers, + func(h *containertest.MockContainerHandler) { + cinfo := infosMap[h.Name] + ref, err := h.ContainerReference() + if err != nil { + t.Error(err) + } + for _, stat := range cinfo.Stats { + err = memoryCache.AddStats(ref, stat) + if err != nil { + t.Error(err) + } + } + spec := cinfo.Spec + + h.On("GetSpec").Return( + spec, + nil, + ).Once() + handlerMap[h.Name] = h + }, + t, + ) + + return m, infosMap, handlerMap +} + func TestGetContainerInfo(t *testing.T) { containers := []string{ "/c1", @@ -173,7 +215,7 @@ func TestGetContainerInfoV2(t *testing.T) { NumStats: 2, } - m, _, handlerMap := expectManagerWithContainers(containers, query, t) + m, _, handlerMap := expectManagerWithContainersV2(containers, query, t) infos, err := m.GetContainerInfoV2("/", options) if err != nil {