diff --git a/libkpod/containerserver.go b/libkpod/containerserver.go index f2abfe2f..c13cd36f 100644 --- a/libkpod/containerserver.go +++ b/libkpod/containerserver.go @@ -2,8 +2,10 @@ package libkpod import ( "encoding/json" + "fmt" "sync" + "github.com/Sirupsen/logrus" "github.com/containers/image/types" cstorage "github.com/containers/storage" "github.com/docker/docker/pkg/registrar" @@ -101,6 +103,28 @@ func (c *ContainerServer) ContainerStateToDisk(ctr *oci.Container) error { return enc.Encode(c.runtime.ContainerStatus(ctr)) } +// ReserveContainerName holds a name for a container that is being created +func (c *ContainerServer) ReserveContainerName(id, name string) (string, error) { + if err := c.ctrNameIndex.Reserve(name, id); err != nil { + if err == registrar.ErrNameReserved { + id, err := c.ctrNameIndex.Get(name) + if err != nil { + logrus.Warnf("conflict, ctr name %q already reserved", name) + return "", err + } + return "", fmt.Errorf("conflict, name %q already reserved for ctr %q", name, id) + } + return "", fmt.Errorf("error reserving ctr name %s", name) + } + return name, nil +} + +// ReleaseContainerName releases a container name from the index so that it can +// be used by other containers +func (c *ContainerServer) ReleaseContainerName(name string) { + c.ctrNameIndex.Release(name) +} + type containerServerState struct { containers oci.ContainerStorer } diff --git a/server/container_create.go b/server/container_create.go index c2d4abc7..fafd5940 100644 --- a/server/container_create.go +++ b/server/container_create.go @@ -303,7 +303,7 @@ func (s *Server) CreateContainer(ctx context.Context, req *pb.CreateContainerReq defer func() { if err != nil { - s.releaseContainerName(containerName) + s.ReleaseContainerName(containerName) } }() diff --git a/server/container_remove.go b/server/container_remove.go index c32e4fa0..8e330e60 100644 --- a/server/container_remove.go +++ b/server/container_remove.go @@ -42,7 +42,7 @@ func (s *Server) RemoveContainer(ctx context.Context, req *pb.RemoveContainerReq return nil, fmt.Errorf("failed to delete storage for container %s: %v", c.ID(), err) } - s.releaseContainerName(c.Name()) + s.ReleaseContainerName(c.Name()) if err := s.CtrIDIndex().Delete(c.ID()); err != nil { return nil, err diff --git a/server/naming.go b/server/naming.go index 0175158b..881b2510 100644 --- a/server/naming.go +++ b/server/naming.go @@ -66,7 +66,7 @@ func (s *Server) generateContainerIDandNameForSandbox(sandboxConfig *pb.PodSandb err error id = stringid.GenerateNonCryptoID() ) - name, err := s.reserveContainerName(id, makeSandboxContainerName(sandboxConfig)) + name, err := s.ReserveContainerName(id, makeSandboxContainerName(sandboxConfig)) if err != nil { return "", "", err } @@ -78,7 +78,7 @@ func (s *Server) generateContainerIDandName(sandboxMetadata *pb.PodSandboxMetada err error id = stringid.GenerateNonCryptoID() ) - name, err := s.reserveContainerName(id, makeContainerName(sandboxMetadata, containerConfig)) + name, err := s.ReserveContainerName(id, makeContainerName(sandboxMetadata, containerConfig)) if err != nil { return "", "", err } diff --git a/server/sandbox_remove.go b/server/sandbox_remove.go index d9efe7e6..0b22629b 100644 --- a/server/sandbox_remove.go +++ b/server/sandbox_remove.go @@ -65,7 +65,7 @@ func (s *Server) RemovePodSandbox(ctx context.Context, req *pb.RemovePodSandboxR return nil, fmt.Errorf("failed to delete container %s in pod sandbox %s: %v", c.Name(), sb.ID(), err) } - s.releaseContainerName(c.Name()) + s.ReleaseContainerName(c.Name()) s.removeContainer(c) if err := s.CtrIDIndex().Delete(c.ID()); err != nil { return nil, fmt.Errorf("failed to delete container %s in pod sandbox %s from index: %v", c.Name(), sb.ID(), err) @@ -82,7 +82,7 @@ func (s *Server) RemovePodSandbox(ctx context.Context, req *pb.RemovePodSandboxR return nil, fmt.Errorf("failed to remove pod sandbox %s: %v", sb.ID(), err) } - s.releaseContainerName(podInfraContainer.Name()) + s.ReleaseContainerName(podInfraContainer.Name()) if err := s.CtrIDIndex().Delete(podInfraContainer.ID()); err != nil { return nil, fmt.Errorf("failed to delete infra container %s in pod sandbox %s from index: %v", podInfraContainer.ID(), sb.ID(), err) } diff --git a/server/sandbox_run.go b/server/sandbox_run.go index 8f8abe8b..ab04cf2a 100644 --- a/server/sandbox_run.go +++ b/server/sandbox_run.go @@ -149,7 +149,7 @@ func (s *Server) RunPodSandbox(ctx context.Context, req *pb.RunPodSandboxRequest defer func() { if err != nil { - s.releaseContainerName(containerName) + s.ReleaseContainerName(containerName) } }() diff --git a/server/server.go b/server/server.go index 28ce262f..4e9dbef1 100644 --- a/server/server.go +++ b/server/server.go @@ -103,14 +103,14 @@ func (s *Server) loadContainer(id string) error { return err } name := m.Annotations[annotations.Name] - name, err = s.reserveContainerName(id, name) + name, err = s.ReserveContainerName(id, name) if err != nil { return err } defer func() { if err != nil { - s.releaseContainerName(name) + s.ReleaseContainerName(name) } }() @@ -256,13 +256,13 @@ func (s *Server) loadSandbox(id string) error { return err } - cname, err := s.reserveContainerName(m.Annotations[annotations.ContainerID], m.Annotations[annotations.ContainerName]) + cname, err := s.ReserveContainerName(m.Annotations[annotations.ContainerID], m.Annotations[annotations.ContainerName]) if err != nil { return err } defer func() { if err != nil { - s.releaseContainerName(cname) + s.ReleaseContainerName(cname) } }() @@ -384,7 +384,7 @@ func (s *Server) update() error { logrus.Warnf("bad state when getting container removed %+v", removedPodContainer) continue } - s.releaseContainerName(c.Name()) + s.ReleaseContainerName(c.Name()) s.removeContainer(c) if err = s.CtrIDIndex().Delete(c.ID()); err != nil { return err @@ -405,7 +405,7 @@ func (s *Server) update() error { continue } podInfraContainer := sb.InfraContainer() - s.releaseContainerName(podInfraContainer.Name()) + s.ReleaseContainerName(podInfraContainer.Name()) s.removeContainer(podInfraContainer) if err = s.CtrIDIndex().Delete(podInfraContainer.ID()); err != nil { return err @@ -456,25 +456,6 @@ func (s *Server) releasePodName(name string) { s.podNameIndex.Release(name) } -func (s *Server) reserveContainerName(id, name string) (string, error) { - if err := s.CtrNameIndex().Reserve(name, id); err != nil { - if err == registrar.ErrNameReserved { - id, err := s.CtrNameIndex().Get(name) - if err != nil { - logrus.Warnf("conflict, ctr name %q already reserved", name) - return "", err - } - return "", fmt.Errorf("conflict, name %q already reserved for ctr %q", name, id) - } - return "", fmt.Errorf("error reserving ctr name %s", name) - } - return name, nil -} - -func (s *Server) releaseContainerName(name string) { - s.CtrNameIndex().Release(name) -} - // cleanupSandboxesOnShutdown Remove all running Sandboxes on system shutdown func (s *Server) cleanupSandboxesOnShutdown() { _, err := os.Stat(shutdownFile)