瀏覽代碼

Merge pull request #34004 from yummypeng/fix-docker-stats-hang

Return an empty stats if "container not found"
Tibor Vass 8 年之前
父節點
當前提交
c8a2596d67
共有 4 個文件被更改,包括 36 次插入12 次删除
  1. 3 0
      daemon/daemon_unix.go
  2. 3 0
      daemon/daemon_windows.go
  3. 12 0
      daemon/errors.go
  4. 18 12
      daemon/stats/collector.go

+ 3 - 0
daemon/daemon_unix.go

@@ -1165,6 +1165,9 @@ func (daemon *Daemon) stats(c *container.Container) (*types.StatsJSON, error) {
 	}
 	stats, err := daemon.containerd.Stats(c.ID)
 	if err != nil {
+		if strings.Contains(err.Error(), "container not found") {
+			return nil, errNotFound{c.ID}
+		}
 		return nil, err
 	}
 	s := &types.StatsJSON{}

+ 3 - 0
daemon/daemon_windows.go

@@ -525,6 +525,9 @@ func (daemon *Daemon) stats(c *container.Container) (*types.StatsJSON, error) {
 	// Obtain the stats from HCS via libcontainerd
 	stats, err := daemon.containerd.Stats(c.ID)
 	if err != nil {
+		if strings.Contains(err.Error(), "container not found") {
+			return nil, errNotFound{c.ID}
+		}
 		return nil, err
 	}
 

+ 12 - 0
daemon/errors.go

@@ -39,3 +39,15 @@ func errExecPaused(id string) error {
 	err := fmt.Errorf("Container %s is paused, unpause the container before exec", id)
 	return errors.NewRequestConflictError(err)
 }
+
+type errNotFound struct {
+	containerID string
+}
+
+func (e errNotFound) Error() string {
+	return fmt.Sprintf("Container %s is not found", e.containerID)
+}
+
+func (e errNotFound) ContainerNotFound() bool {
+	return true
+}

+ 18 - 12
daemon/stats/collector.go

@@ -88,24 +88,25 @@ func (s *Collector) Run() {
 
 		for _, pair := range pairs {
 			stats, err := s.supervisor.GetContainerStats(pair.container)
-			if err != nil {
-				if _, ok := err.(notRunningErr); !ok {
-					logrus.Errorf("collecting stats for %s: %v", pair.container.ID, err)
-					continue
-				}
 
-				// publish empty stats containing only name and ID if not running
+			switch err.(type) {
+			case nil:
+				// FIXME: move to containerd on Linux (not Windows)
+				stats.CPUStats.SystemUsage = systemUsage
+				stats.CPUStats.OnlineCPUs = onlineCPUs
+
+				pair.publisher.Publish(*stats)
+
+			case notRunningErr, notFoundErr:
+				// publish empty stats containing only name and ID if not running or not found
 				pair.publisher.Publish(types.StatsJSON{
 					Name: pair.container.Name,
 					ID:   pair.container.ID,
 				})
-				continue
-			}
-			// FIXME: move to containerd on Linux (not Windows)
-			stats.CPUStats.SystemUsage = systemUsage
-			stats.CPUStats.OnlineCPUs = onlineCPUs
 
-			pair.publisher.Publish(*stats)
+			default:
+				logrus.Errorf("collecting stats for %s: %v", pair.container.ID, err)
+			}
 		}
 	}
 }
@@ -114,3 +115,8 @@ type notRunningErr interface {
 	error
 	ContainerIsRunning() bool
 }
+
+type notFoundErr interface {
+	error
+	ContainerNotFound() bool
+}