Browse Source

fix 2 corner cases in container create cleanup and container removal

  - avoid empty Names in container list API when fails to remove
    a container
  - avoid dead containers when fails to create a container

Signed-off-by: Shijiang Wei <mountkin@gmail.com>
Shijiang Wei 9 years ago
parent
commit
4953ea1eae
2 changed files with 9 additions and 15 deletions
  1. 1 1
      daemon/create.go
  2. 8 14
      daemon/delete.go

+ 1 - 1
daemon/create.go

@@ -76,7 +76,7 @@ func (daemon *Daemon) create(params *ContainerCreateConfig) (retC *Container, re
 	}
 	}
 	defer func() {
 	defer func() {
 		if retErr != nil {
 		if retErr != nil {
-			if err := daemon.rm(container, false); err != nil {
+			if err := daemon.rm(container, true); err != nil {
 				logrus.Errorf("Clean up Error! Cannot destroy container %s: %v", container.ID, err)
 				logrus.Errorf("Clean up Error! Cannot destroy container %s: %v", container.ID, err)
 			}
 			}
 		}
 		}

+ 8 - 14
daemon/delete.go

@@ -107,37 +107,31 @@ func (daemon *Daemon) rm(container *Container, forceRemove bool) (err error) {
 	// If force removal is required, delete container from various
 	// If force removal is required, delete container from various
 	// indexes even if removal failed.
 	// indexes even if removal failed.
 	defer func() {
 	defer func() {
-		if err != nil && forceRemove {
+		if err == nil || forceRemove {
+			if _, err := daemon.containerGraphDB.Purge(container.ID); err != nil {
+				logrus.Debugf("Unable to remove container from link graph: %s", err)
+			}
+			selinuxFreeLxcContexts(container.ProcessLabel)
 			daemon.idIndex.Delete(container.ID)
 			daemon.idIndex.Delete(container.ID)
 			daemon.containers.Delete(container.ID)
 			daemon.containers.Delete(container.ID)
-			os.RemoveAll(container.root)
 			daemon.LogContainerEvent(container, "destroy")
 			daemon.LogContainerEvent(container, "destroy")
 		}
 		}
 	}()
 	}()
 
 
-	if _, err := daemon.containerGraphDB.Purge(container.ID); err != nil {
-		logrus.Debugf("Unable to remove container from link graph: %s", err)
+	if err = os.RemoveAll(container.root); err != nil {
+		return derr.ErrorCodeRmFS.WithArgs(container.ID, err)
 	}
 	}
 
 
 	metadata, err := daemon.layerStore.DeleteMount(container.ID)
 	metadata, err := daemon.layerStore.DeleteMount(container.ID)
 	layer.LogReleaseMetadata(metadata)
 	layer.LogReleaseMetadata(metadata)
-	if err != nil {
+	if err != nil && err != layer.ErrMountDoesNotExist {
 		return derr.ErrorCodeRmDriverFS.WithArgs(daemon.driver, container.ID, err)
 		return derr.ErrorCodeRmDriverFS.WithArgs(daemon.driver, container.ID, err)
 	}
 	}
 
 
-	if err = os.RemoveAll(container.root); err != nil {
-		return derr.ErrorCodeRmFS.WithArgs(container.ID, err)
-	}
-
 	if err = daemon.execDriver.Clean(container.ID); err != nil {
 	if err = daemon.execDriver.Clean(container.ID); err != nil {
 		return derr.ErrorCodeRmExecDriver.WithArgs(container.ID, err)
 		return derr.ErrorCodeRmExecDriver.WithArgs(container.ID, err)
 	}
 	}
 
 
-	selinuxFreeLxcContexts(container.ProcessLabel)
-	daemon.idIndex.Delete(container.ID)
-	daemon.containers.Delete(container.ID)
-
-	daemon.LogContainerEvent(container, "destroy")
 	return nil
 	return nil
 }
 }