From bd540ac94c6329afdd6ba1b81cc6c9748cc62ace Mon Sep 17 00:00:00 2001 From: Ryan Cole Date: Tue, 18 Jul 2017 11:01:08 -0400 Subject: [PATCH] Separate container state from sandbox state in server Move container state data to libkpod, separate from the sandbox data in server. However, the move was structured such that sandbox data could easily be moved over into libkpod in the future Signed-off-by: Ryan Cole --- libkpod/containerserver.go | 41 ++++++++++++++++++++++++++++++++++++++ server/container.go | 2 +- server/container_list.go | 4 ++-- server/server.go | 16 +++++++-------- 4 files changed, 51 insertions(+), 12 deletions(-) diff --git a/libkpod/containerserver.go b/libkpod/containerserver.go index 943e27cc..c9580b78 100644 --- a/libkpod/containerserver.go +++ b/libkpod/containerserver.go @@ -1,6 +1,8 @@ package libkpod import ( + "sync" + "github.com/containers/image/types" cstorage "github.com/containers/storage" "github.com/docker/docker/pkg/registrar" @@ -17,6 +19,8 @@ type ContainerServer struct { ctrNameIndex *registrar.Registrar ctrIDIndex *truncindex.TruncIndex imageContext *types.SystemContext + stateLock sync.Locker + state *containerServerState } // Runtime returns the oci runtime for the ContainerServer @@ -51,6 +55,7 @@ func (c *ContainerServer) ImageContext() *types.SystemContext { // New creates a new ContainerServer func New(runtime *oci.Runtime, store cstorage.Store, storageImageServer storage.ImageServer, ctrNameIndex *registrar.Registrar, ctrIDIndex *truncindex.TruncIndex, imageContext *types.SystemContext) *ContainerServer { + containers := oci.NewMemoryStore() return &ContainerServer{ runtime: runtime, store: store, @@ -58,5 +63,41 @@ func New(runtime *oci.Runtime, store cstorage.Store, storageImageServer storage. ctrNameIndex: ctrNameIndex, ctrIDIndex: ctrIDIndex, imageContext: imageContext, + stateLock: new(sync.Mutex), + state: &containerServerState{ + containers: containers, + }, } } + +type containerServerState struct { + containers oci.ContainerStorer +} + +// AddContainer adds a container to the container state store +func (c *ContainerServer) AddContainer(ctr *oci.Container) { + c.stateLock.Lock() + defer c.stateLock.Unlock() + c.state.containers.Add(ctr.ID(), ctr) +} + +// GetContainer returns a container by its ID +func (c *ContainerServer) GetContainer(id string) *oci.Container { + c.stateLock.Lock() + defer c.stateLock.Unlock() + return c.state.containers.Get(id) +} + +// RemoveContainer removes a container from the container state store +func (c *ContainerServer) RemoveContainer(ctr *oci.Container) { + c.stateLock.Lock() + defer c.stateLock.Unlock() + c.state.containers.Delete(ctr.ID()) +} + +// ListContainers returns a list of all containers stored by the server state +func (c *ContainerServer) ListContainers() []*oci.Container { + c.stateLock.Lock() + defer c.stateLock.Unlock() + return c.state.containers.List() +} diff --git a/server/container.go b/server/container.go index 36b05dc8..6a8f8957 100644 --- a/server/container.go +++ b/server/container.go @@ -16,7 +16,7 @@ func (s *Server) getContainerFromRequest(cid string) (*oci.Container, error) { return nil, fmt.Errorf("container with ID starting with %s not found: %v", cid, err) } - c := s.state.containers.Get(containerID) + c := s.ContainerServer.GetContainer(containerID) if c == nil { return nil, fmt.Errorf("specified container not found: %s", containerID) } diff --git a/server/container_list.go b/server/container_list.go index 0803c91a..10b93338 100644 --- a/server/container_list.go +++ b/server/container_list.go @@ -31,7 +31,7 @@ func (s *Server) ListContainers(ctx context.Context, req *pb.ListContainersReque logrus.Debugf("ListContainersRequest %+v", req) var ctrs []*pb.Container filter := req.Filter - ctrList := s.state.containers.List() + ctrList := s.ContainerServer.ListContainers() // Filter using container id and pod id first. if filter != nil { @@ -40,7 +40,7 @@ func (s *Server) ListContainers(ctx context.Context, req *pb.ListContainersReque if err != nil { return nil, err } - c := s.state.containers.Get(id) + c := s.ContainerServer.GetContainer(id) if c != nil { if filter.PodSandboxId != "" { if c.Sandbox() == filter.PodSandboxId { diff --git a/server/server.go b/server/server.go index c705a25d..d55564e9 100644 --- a/server/server.go +++ b/server/server.go @@ -568,8 +568,8 @@ func New(config *Config) (*Server, error) { if err != nil { return nil, err } + sandboxes := make(map[string]*Sandbox) - containers := oci.NewMemoryStore() netPlugin, err := ocicni.InitCNI(config.NetworkDir, config.PluginDir) if err != nil { return nil, err @@ -587,8 +587,7 @@ func New(config *Config) (*Server, error) { hostportManager: hostportManager, config: *config, state: &serverState{ - sandboxes: sandboxes, - containers: containers, + sandboxes: sandboxes, }, seccompEnabled: seccomp.IsEnabled(), appArmorEnabled: apparmor.IsEnabled(), @@ -646,13 +645,12 @@ func New(config *Config) (*Server, error) { }() logrus.Debugf("sandboxes: %v", s.state.sandboxes) - logrus.Debugf("containers: %v", s.state.containers) + logrus.Debugf("containers: %v", s.ContainerServer.ListContainers()) return s, nil } type serverState struct { - sandboxes map[string]*Sandbox - containers oci.ContainerStorer + sandboxes map[string]*Sandbox } func (s *Server) addSandbox(sb *Sandbox) { @@ -686,13 +684,13 @@ func (s *Server) addContainer(c *oci.Container) { sandbox := s.state.sandboxes[c.Sandbox()] // TODO(runcom): handle !ok above!!! otherwise it panics! sandbox.AddContainer(c) - s.state.containers.Add(c.ID(), c) + s.ContainerServer.AddContainer(c) s.stateLock.Unlock() } func (s *Server) getContainer(id string) *oci.Container { s.stateLock.Lock() - c := s.state.containers.Get(id) + c := s.ContainerServer.GetContainer(id) s.stateLock.Unlock() return c } @@ -712,6 +710,6 @@ func (s *Server) removeContainer(c *oci.Container) { s.stateLock.Lock() sandbox := s.state.sandboxes[c.Sandbox()] sandbox.RemoveContainer(c) - s.state.containers.Delete(c.ID()) + s.ContainerServer.RemoveContainer(c) s.stateLock.Unlock() }