Bladeren bron

c8d/progress: Update progress when finished

After the context is cancelled, update the progress for the last time.
This makes sure that the progress also includes finishing updates.

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
Paweł Gronowski 2 jaren geleden
bovenliggende
commit
1776f72c96
1 gewijzigde bestanden met toevoegingen van 12 en 2 verwijderingen
  1. 12 2
      daemon/containerd/progress.go

+ 12 - 2
daemon/containerd/progress.go

@@ -36,6 +36,7 @@ func (j *jobs) showProgress(ctx context.Context, out progress.Output, updater pr
 	ctx, cancelProgress := context.WithCancel(ctx)
 
 	start := time.Now()
+	lastUpdate := make(chan struct{})
 
 	go func() {
 		ticker := time.NewTicker(100 * time.Millisecond)
@@ -48,15 +49,24 @@ func (j *jobs) showProgress(ctx context.Context, out progress.Output, updater pr
 					if !errors.Is(err, context.Canceled) && !errors.Is(err, context.DeadlineExceeded) {
 						logrus.WithError(err).Error("Updating progress failed")
 					}
-					return
 				}
 			case <-ctx.Done():
+				ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*500)
+				defer cancel()
+				updater.UpdateProgress(ctx, j, out, start)
+				close(lastUpdate)
 				return
 			}
 		}
 	}()
 
-	return cancelProgress
+	return func() {
+		cancelProgress()
+		// Wait for the last update to finish.
+		// UpdateProgress may still write progress to output and we need
+		// to keep the caller from closing it before we finish.
+		<-lastUpdate
+	}
 }
 
 // Add adds a descriptor to be tracked