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>
This commit is contained in:
Paweł Gronowski 2023-01-17 15:14:51 +01:00
parent 65c371ed6e
commit 1776f72c96
No known key found for this signature in database
GPG key ID: B85EFCFE26DEF92A

View file

@ -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