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