Skip to content

Commit 4f1834e

Browse files
committed
Handled safe channel closure
1 parent 8babf76 commit 4f1834e

2 files changed

Lines changed: 16 additions & 4 deletions

File tree

pkg/distribution/oci/remote/remote.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -743,8 +743,8 @@ func Write(ref reference.Reference, img oci.Image, w io.Writer, opts ...Option)
743743
safeWriter = &syncWriter{w: w}
744744
}
745745

746-
var completed int64
747746
for _, layer := range layers {
747+
var completed int64
748748
digest, err := layer.Digest()
749749
if err != nil {
750750
return fmt.Errorf("getting layer digest: %w", err)
@@ -790,10 +790,13 @@ func Write(ref reference.Reference, img oci.Image, w io.Writer, opts ...Option)
790790
Complete: completed,
791791
Total: size,
792792
}
793+
closeProgress(progressChan)
794+
closeReporter(pr)
793795
}
794796
continue
795797
}
796798
closeProgress(progressChan)
799+
closeReporter(pr)
797800
return fmt.Errorf("pushing layer: %w", err)
798801
}
799802

@@ -808,6 +811,7 @@ func Write(ref reference.Reference, img oci.Image, w io.Writer, opts ...Option)
808811
cw.Close()
809812
rc.Close()
810813
closeProgress(progressChan)
814+
closeReporter(pr)
811815
return fmt.Errorf("writing layer: %w", err)
812816
}
813817

@@ -816,6 +820,7 @@ func Write(ref reference.Reference, img oci.Image, w io.Writer, opts ...Option)
816820
rc.Close()
817821
if !errdefs.IsAlreadyExists(err) && !strings.Contains(err.Error(), "already exists") {
818822
closeProgress(progressChan)
823+
closeReporter(pr)
819824
return fmt.Errorf("committing layer: %w", err)
820825
}
821826
// If it already exists, we still want to update progress
@@ -837,6 +842,7 @@ func Write(ref reference.Reference, img oci.Image, w io.Writer, opts ...Option)
837842
}
838843
}
839844
closeProgress(progressChan)
845+
closeReporter(pr)
840846
cw.Close()
841847
rc.Close()
842848
}
@@ -933,6 +939,15 @@ func closeProgress(ch chan<- oci.Update) {
933939
}
934940
}
935941

942+
// closeReporter safely closes the progress reporter if not nil
943+
func closeReporter(pr *progress.Reporter) {
944+
if pr != nil {
945+
if waitErr := pr.Wait(); waitErr != nil {
946+
fmt.Printf("reporter finished with non-fatal error: %v\n", waitErr)
947+
}
948+
}
949+
}
950+
936951
// Ensure remoteImage is cleaned up properly
937952
func (i *remoteImage) Close() error {
938953
// The local content store doesn't expose its root path, so cleanup

pkg/distribution/registry/client.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,15 +263,12 @@ func (t *Target) Write(ctx context.Context, model types.ModelArtifact, progressW
263263
}
264264
imageSize += size
265265
}
266-
//pr := progress.NewProgressReporter(progressWriter, progress.PushMsg, imageSize, nil)
267-
//defer pr.Wait()
268266

269267
// Set up authentication options
270268
authOpts := []remote.Option{
271269
remote.WithContext(ctx),
272270
remote.WithTransport(t.transport),
273271
remote.WithUserAgent(t.userAgent),
274-
//remote.WithProgress(pr.Updates()),
275272
remote.WithPlainHTTP(t.plainHTTP),
276273
}
277274

0 commit comments

Comments
 (0)