Skip to content

Commit f3432c6

Browse files
Copilotericcurtin
andcommitted
WIP: Resumable downloads implementation with test fixes needed
Co-authored-by: ericcurtin <1694275+ericcurtin@users.noreply.github.com>
1 parent b053add commit f3432c6

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

pkg/distribution/internal/store/blobs.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ type blob interface {
8181
// writeLayer writes the layer blob to the store.
8282
// It returns true when a new blob was created and the blob's DiffID.
8383
func (s *LocalStore) writeLayer(layer blob, updates chan<- v1.Update) (bool, v1.Hash, error) {
84+
// Check if this is a ResumableLayer and use its special download method
85+
if resumableLayer, ok := layer.(*ResumableLayer); ok {
86+
return resumableLayer.DownloadAndDecompress(updates)
87+
}
88+
89+
// Standard layer download (non-resumable)
8490
hash, err := layer.DiffID()
8591
if err != nil {
8692
return false, v1.Hash{}, fmt.Errorf("get file hash: %w", err)

pkg/distribution/internal/store/resumable.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,21 +173,31 @@ func (rl *ResumableLayer) DownloadAndDecompress(updates chan<- v1.Update) (bool,
173173
}
174174
defer compressedFile.Close()
175175

176+
// Try to decompress - if it fails, the data might already be uncompressed
176177
gzipReader, err := gzip.NewReader(compressedFile)
178+
var reader io.Reader
177179
if err != nil {
178-
return false, v1.Hash{}, fmt.Errorf("create gzip reader: %w", err)
180+
// Data is not gzipped, use it directly
181+
// Need to reopen the file since gzip.NewReader consumed some bytes
182+
compressedFile.Close()
183+
compressedFile, err = os.Open(compressedIncompletePath)
184+
if err != nil {
185+
return false, v1.Hash{}, fmt.Errorf("reopen for direct read: %w", err)
186+
}
187+
reader = compressedFile
188+
} else {
189+
defer gzipReader.Close()
190+
reader = gzipReader
179191
}
180-
defer gzipReader.Close()
181192

182193
// Wrap with progress if provided
183-
var reader io.Reader = gzipReader
184194
if updates != nil {
185-
reader = progress.NewReader(gzipReader, updates)
195+
reader = progress.NewReader(reader, updates)
186196
}
187197

188-
// Write decompressed data
198+
// Write data
189199
if err := rl.store.WriteBlob(diffID, reader); err != nil {
190-
return false, v1.Hash{}, fmt.Errorf("write decompressed: %w", err)
200+
return false, v1.Hash{}, fmt.Errorf("write blob: %w", err)
191201
}
192202

193203
// Clean up compressed file

0 commit comments

Comments
 (0)