Skip to content

Commit 7418c95

Browse files
committed
storage: rework applyDiffWithOptions()
MAke it so the apply logic can be provided as argument which should help the future work to call this function unlocked and let it extract to a temp dir instead. Signed-off-by: Paul Holzinger <[email protected]>
1 parent 8dc579e commit 7418c95

File tree

1 file changed

+33
-21
lines changed

1 file changed

+33
-21
lines changed

storage/layers.go

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2402,16 +2402,38 @@ func (r *layerStore) ApplyDiff(to string, diff io.Reader) (size int64, err error
24022402
return r.applyDiffWithOptions(layer, nil, diff)
24032403
}
24042404

2405+
type diffApplyFunc func(id string, parent string, options drivers.ApplyDiffOpts, tsBytes *bytes.Buffer) error
2406+
24052407
// Requires startWriting.
2406-
func (r *layerStore) applyDiffWithOptions(layer *Layer, layerOptions *LayerOptions, diff io.Reader) (size int64, err error) {
2408+
func (r *layerStore) applyDiffWithOptions(layer *Layer, layerOptions *LayerOptions, diff io.Reader) (int64, error) {
2409+
var size int64
2410+
f := func(id string, parent string, options drivers.ApplyDiffOpts, tsBytes *bytes.Buffer) error {
2411+
var err error
2412+
size, err = r.driver.ApplyDiff(layer.ID, layer.Parent, options)
2413+
if err != nil {
2414+
return err
2415+
}
2416+
if err := os.MkdirAll(filepath.Dir(r.tspath(layer.ID)), 0o700); err != nil {
2417+
return err
2418+
}
2419+
if err := ioutils.AtomicWriteFile(r.tspath(layer.ID), tsBytes.Bytes(), 0o600); err != nil {
2420+
return err
2421+
}
2422+
return nil
2423+
}
2424+
2425+
return size, r.applyDiffWithOptionsInner(layer, layerOptions, diff, f)
2426+
}
2427+
2428+
func (r *layerStore) applyDiffWithOptionsInner(layer *Layer, layerOptions *LayerOptions, diff io.Reader, applyFunc diffApplyFunc) (err error) {
24072429
if !r.lockfile.IsReadWrite() {
2408-
return -1, fmt.Errorf("not allowed to modify layer contents at %q: %w", r.layerdir, ErrStoreIsReadOnly)
2430+
return fmt.Errorf("not allowed to modify layer contents at %q: %w", r.layerdir, ErrStoreIsReadOnly)
24092431
}
24102432

24112433
header := make([]byte, 10240)
24122434
n, err := diff.Read(header)
24132435
if err != nil && err != io.EOF {
2414-
return -1, err
2436+
return err
24152437
}
24162438
compression := archive.DetectCompression(header[:n])
24172439
defragmented := io.MultiReader(bytes.NewReader(header[:n]), diff)
@@ -2446,10 +2468,10 @@ func (r *layerStore) applyDiffWithOptions(layer *Layer, layerOptions *LayerOptio
24462468
gidLog := make(map[uint32]struct{})
24472469
var uncompressedCounter *ioutils.WriteCounter
24482470

2449-
size, err = func() (int64, error) { // A scope for defer
2471+
err = func() error { // A scope for defer
24502472
compressor, err := pgzip.NewWriterLevel(&tsdata, pgzip.BestSpeed)
24512473
if err != nil {
2452-
return -1, err
2474+
return err
24532475
}
24542476
defer compressor.Close() // This must happen before tsdata is consumed.
24552477
if err := compressor.SetConcurrency(1024*1024, 1); err != nil { // 1024*1024 is the hard-coded default; we're not changing that
@@ -2458,7 +2480,7 @@ func (r *layerStore) applyDiffWithOptions(layer *Layer, layerOptions *LayerOptio
24582480
metadata := storage.NewJSONPacker(compressor)
24592481
uncompressed, err := archive.DecompressStream(defragmented)
24602482
if err != nil {
2461-
return -1, err
2483+
return err
24622484
}
24632485
defer uncompressed.Close()
24642486
idLogger, err := tarlog.NewLogger(func(h *tar.Header) {
@@ -2468,7 +2490,7 @@ func (r *layerStore) applyDiffWithOptions(layer *Layer, layerOptions *LayerOptio
24682490
}
24692491
})
24702492
if err != nil {
2471-
return -1, err
2493+
return err
24722494
}
24732495
defer idLogger.Close() // This must happen before uidLog and gidLog is consumed.
24742496
uncompressedCounter = ioutils.NewWriteCounter(idLogger)
@@ -2478,29 +2500,19 @@ func (r *layerStore) applyDiffWithOptions(layer *Layer, layerOptions *LayerOptio
24782500
}
24792501
payload, err := asm.NewInputTarStream(io.TeeReader(uncompressed, uncompressedWriter), metadata, storage.NewDiscardFilePutter())
24802502
if err != nil {
2481-
return -1, err
2503+
return err
24822504
}
24832505
options := drivers.ApplyDiffOpts{
24842506
Diff: payload,
24852507
Mappings: r.layerMappings(layer),
24862508
MountLabel: layer.MountLabel,
24872509
}
2488-
size, err := r.driver.ApplyDiff(layer.ID, layer.Parent, options)
2489-
if err != nil {
2490-
return -1, err
2491-
}
2492-
return size, err
2510+
return applyFunc(layer.ID, layer.Parent, options, &tsdata)
24932511
}()
24942512
if err != nil {
2495-
return -1, err
2513+
return err
24962514
}
24972515

2498-
if err := os.MkdirAll(filepath.Dir(r.tspath(layer.ID)), 0o700); err != nil {
2499-
return -1, err
2500-
}
2501-
if err := ioutils.AtomicWriteFile(r.tspath(layer.ID), tsdata.Bytes(), 0o600); err != nil {
2502-
return -1, err
2503-
}
25042516
if compressedDigester != nil {
25052517
compressedDigest = compressedDigester.Digest()
25062518
}
@@ -2535,7 +2547,7 @@ func (r *layerStore) applyDiffWithOptions(layer *Layer, layerOptions *LayerOptio
25352547

25362548
err = r.saveFor(layer)
25372549

2538-
return size, err
2550+
return err
25392551
}
25402552

25412553
// Requires (startReading or?) startWriting.

0 commit comments

Comments
 (0)