浏览代码

don't run "removeContainers" in parallel as we follow dependency order

Signed-off-by: Nicolas De Loof <[email protected]>
Nicolas De Loof 4 年之前
父节点
当前提交
163f3b9a89
共有 3 个文件被更改,包括 14 次插入32 次删除
  1. 1 6
      local/compose/create.go
  2. 10 15
      local/compose/down.go
  3. 3 11
      local/compose/stop.go

+ 1 - 6
local/compose/create.go

@@ -35,7 +35,6 @@ import (
 	"github.com/docker/go-connections/nat"
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
-	"golang.org/x/sync/errgroup"
 
 	"github.com/docker/compose-cli/api/compose"
 	"github.com/docker/compose-cli/api/progress"
@@ -77,15 +76,11 @@ func (s *composeService) Create(ctx context.Context, project *types.Project, opt
 	orphans := observedState.filter(isNotService(project.ServiceNames()...))
 	if len(orphans) > 0 {
 		if opts.RemoveOrphans {
-			eg, _ := errgroup.WithContext(ctx)
 			w := progress.ContextWriter(ctx)
-			err := s.removeContainers(ctx, w, eg, orphans)
+			err := s.removeContainers(ctx, w, orphans)
 			if err != nil {
 				return err
 			}
-			if eg.Wait() != nil {
-				return err
-			}
 		} else {
 			logrus.Warnf("Found orphan containers (%s) for this project. If "+
 				"you removed or renamed this service in your compose "+

+ 10 - 15
local/compose/down.go

@@ -33,7 +33,6 @@ import (
 )
 
 func (s *composeService) Down(ctx context.Context, projectName string, options compose.DownOptions) error {
-	eg, _ := errgroup.WithContext(ctx)
 	w := progress.ContextWriter(ctx)
 
 	if options.Project == nil {
@@ -55,25 +54,21 @@ func (s *composeService) Down(ctx context.Context, projectName string, options c
 
 	err = InReverseDependencyOrder(ctx, options.Project, func(c context.Context, service types.ServiceConfig) error {
 		serviceContainers, others := containers.split(isService(service.Name))
-		err := s.removeContainers(ctx, w, eg, serviceContainers)
+		err := s.removeContainers(ctx, w, serviceContainers)
 		containers = others
 		return err
 	})
+	if err != nil {
+		return err
+	}
 
-	if options.RemoveOrphans {
-		err := s.removeContainers(ctx, w, eg, containers)
+	if options.RemoveOrphans && len(containers) > 0 {
+		err := s.removeContainers(ctx, w, containers)
 		if err != nil {
 			return err
 		}
 	}
 
-	if err != nil {
-		return err
-	}
-	err = eg.Wait()
-	if err != nil {
-		return err
-	}
 	networks, err := s.apiClient.NetworkList(ctx, moby.NetworkListOptions{
 		Filters: filters.NewArgs(
 			projectFilter(projectName),
@@ -82,6 +77,8 @@ func (s *composeService) Down(ctx context.Context, projectName string, options c
 	if err != nil {
 		return err
 	}
+
+	eg, _ := errgroup.WithContext(ctx)
 	for _, n := range networks {
 		networkID := n.ID
 		networkName := n.Name
@@ -89,7 +86,6 @@ func (s *composeService) Down(ctx context.Context, projectName string, options c
 			return s.ensureNetworkDown(ctx, networkID, networkName)
 		})
 	}
-
 	return eg.Wait()
 }
 
@@ -108,15 +104,14 @@ func (s *composeService) stopContainers(ctx context.Context, w progress.Writer,
 	return nil
 }
 
-func (s *composeService) removeContainers(ctx context.Context, w progress.Writer, eg *errgroup.Group, containers []moby.Container) error {
+func (s *composeService) removeContainers(ctx context.Context, w progress.Writer, containers []moby.Container) error {
+	eg, _ := errgroup.WithContext(ctx)
 	for _, container := range containers {
 		toDelete := container
 		eg.Go(func() error {
 			eventName := "Container " + getCanonicalContainerName(toDelete)
-			w.Event(progress.StoppingEvent(eventName))
 			err := s.stopContainers(ctx, w, []moby.Container{container})
 			if err != nil {
-				w.Event(progress.ErrorMessageEvent(eventName, "Error while Stopping"))
 				return err
 			}
 			w.Event(progress.RemovingEvent(eventName))

+ 3 - 11
local/compose/stop.go

@@ -19,17 +19,14 @@ package compose
 import (
 	"context"
 
+	"github.com/compose-spec/compose-go/types"
 	moby "github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types/filters"
 
 	"github.com/docker/compose-cli/api/progress"
-
-	"github.com/compose-spec/compose-go/types"
-	"golang.org/x/sync/errgroup"
 )
 
-func (s *composeService) Stop(ctx context.Context, project *types.Project) error {
-	eg, _ := errgroup.WithContext(ctx)
+func (s *composeService) Stop(ctx context.Context, project *types.Project, consumer compose.LogConsumer) error {
 	w := progress.ContextWriter(ctx)
 
 	var containers Containers
@@ -41,15 +38,10 @@ func (s *composeService) Stop(ctx context.Context, project *types.Project) error
 		return err
 	}
 
-	err = InReverseDependencyOrder(ctx, project, func(c context.Context, service types.ServiceConfig) error {
+	return InReverseDependencyOrder(ctx, project, func(c context.Context, service types.ServiceConfig) error {
 		serviceContainers, others := containers.split(isService(service.Name))
 		err := s.stopContainers(ctx, w, serviceContainers)
 		containers = others
 		return err
 	})
-	if err != nil {
-		return err
-	}
-
-	return eg.Wait()
 }