瀏覽代碼

c8d/changes: Fix concurrents diffs

Use a unique parent view snapshot key for each diff request.

I considered using singleflight at first, but I realized it wouldn't
really be correct.
The diff can take some time, so there's a window of time between the
diff start and finish, where the file system can change.
These changes not always will be reflected in the running diff.
With singleflight, the second diff request which happened before the
previous diff was finished, would not include changes made to the
container filesystem after the first diff request has started.

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
Paweł Gronowski 1 年之前
父節點
當前提交
bb7408e851
共有 1 個文件被更改,包括 5 次插入2 次删除
  1. 5 2
      daemon/containerd/image_changes.go

+ 5 - 2
daemon/containerd/image_changes.go

@@ -7,6 +7,7 @@ import (
 	"github.com/containerd/log"
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/pkg/archive"
+	"github.com/docker/docker/pkg/stringid"
 )
 
 func (i *ImageService) Changes(ctx context.Context, container *container.Container) ([]archive.Change, error) {
@@ -16,10 +17,12 @@ func (i *ImageService) Changes(ctx context.Context, container *container.Contain
 		return nil, err
 	}
 
-	imageMounts, _ := snapshotter.View(ctx, container.ID+"-parent-view", info.Parent)
+	id := stringid.GenerateRandomID()
+	parentViewKey := container.ID + "-parent-view-" + id
+	imageMounts, _ := snapshotter.View(ctx, parentViewKey, info.Parent)
 
 	defer func() {
-		if err := snapshotter.Remove(ctx, container.ID+"-parent-view"); err != nil {
+		if err := snapshotter.Remove(ctx, parentViewKey); err != nil {
 			log.G(ctx).WithError(err).Warn("error removing the parent view snapshot")
 		}
 	}()