@@ -31,6 +31,7 @@ import (
3131	"go.podman.io/storage/pkg/ioutils" 
3232	"go.podman.io/storage/pkg/lockfile" 
3333	"go.podman.io/storage/pkg/mount" 
34+ 	"go.podman.io/storage/pkg/pools" 
3435	"go.podman.io/storage/pkg/stringid" 
3536	"go.podman.io/storage/pkg/system" 
3637	"go.podman.io/storage/pkg/tarlog" 
@@ -2452,95 +2453,90 @@ func (r *layerStore) ApplyDiff(to string, diff io.Reader) (size int64, err error
24522453	return  r .applyDiffWithOptions (layer , nil , diff )
24532454}
24542455
2455- type  diffApplyFunc  func (id  string , parent  string , options  drivers.ApplyDiffOpts ,  tsBytes   * bytes. Buffer ) error 
2456+ type  diffApplyFunc  func (id  string , parent  string , options  drivers.ApplyDiffOpts ) error 
24562457
24572458func  (r  * layerStore ) applyDiffUnlocked (dd  drivers.ApplyDiffStaging , layer  * Layer , layerOptions  * LayerOptions , diff  io.Reader ) ([]tempdir.CleanupTempDirFunc , func () error , int64 , error ) {
24582459	var  (
24592460		size            int64 
24602461		cleanFunctions  []tempdir.CleanupTempDirFunc 
2461- 		applyDiff       func ()  error 
2462+ 		commit          tempdir. CommitFunc 
24622463	)
24632464
2464- 	f  :=  func (id  string , parent  string , options  drivers.ApplyDiffOpts ,  tsBytes   * bytes. Buffer ) error  {
2465+ 	f  :=  func (id  string , parent  string , options  drivers.ApplyDiffOpts ) error  {
24652466		var  (
24662467			err      error 
24672468			cleanup  tempdir.CleanupTempDirFunc 
2468- 			commit   tempdir.CommitFunc 
24692469		)
24702470		cleanup , commit , size , err  =  dd .StartStagingDiffToApply (layer .ID , layer .Parent , options )
24712471		cleanFunctions  =  append (cleanFunctions , cleanup )
2472+ 		return  err 
2473+ 	}
2474+ 
2475+ 	td , err  :=  tempdir .NewTempDir (filepath .Join (r .layerdir , tempDirPath ))
2476+ 	cleanFunctions  =  append (cleanFunctions , td .Cleanup )
2477+ 	if  err  !=  nil  {
2478+ 		return  cleanFunctions , nil , 0 , err 
2479+ 	}
2480+ 
2481+ 	sa , err  :=  td .StageFileAddition (func (path  string ) error  {
2482+ 		tsFile , err  :=  os .OpenFile (path , os .O_CREATE | os .O_WRONLY , 0o600 )
24722483		if  err  !=  nil  {
24732484			return  err 
24742485		}
2486+ 		defer  tsFile .Close ()
2487+ 		return  r .applyDiffWithOptionsInner (layer , layerOptions , diff , f , tsFile )
2488+ 	})
2489+ 	if  err  !=  nil  {
2490+ 		return  cleanFunctions , nil , 0 , err 
2491+ 	}
24752492
2476- 		 td ,  err   :=  tempdir . NewTempDir ( filepath . Join ( r . layerdir ,  tempDirPath )) 
2477- 		cleanFunctions   =   append ( cleanFunctions ,  td . Cleanup )
2493+ 	applyDiff   :=  func ()  error  { 
2494+ 		err   :=   dd . CommitStagedLayer ( layer . ID ,  commit )
24782495		if  err  !=  nil  {
2479- 			return  err 
2496+ 			return  fmt . Errorf ( "commit temporary layer: %w" ,  err ) 
24802497		}
24812498
2482- 		sa , err  :=  td .StageFileAddition (func (path  string ) error  {
2483- 			return  os .WriteFile (path , tsBytes .Bytes (), 0o600 )
2484- 		})
2485- 		cleanFunctions  =  append (cleanFunctions , td .Cleanup )
2486- 		if  err  !=  nil  {
2499+ 		if  err  :=  os .MkdirAll (filepath .Dir (r .tspath (layer .ID )), 0o700 ); err  !=  nil  {
24872500			return  err 
24882501		}
24892502
2490- 		applyDiff  =  func () error  {
2491- 			err  :=  dd .CommitStagedLayer (layer .ID , commit )
2492- 			if  err  !=  nil  {
2493- 				return  fmt .Errorf ("commit temporary layer: %w" , err )
2494- 			}
2495- 
2496- 			if  err  :=  os .MkdirAll (filepath .Dir (r .tspath (layer .ID )), 0o700 ); err  !=  nil  {
2497- 				return  err 
2498- 			}
2499- 
2500- 			err  =  sa .Commit (r .tspath (layer .ID ))
2501- 			if  err  !=  nil  {
2502- 				return  fmt .Errorf ("commit tar split file: %w" , err )
2503- 			}
2504- 			return  nil 
2503+ 		err  =  sa .Commit (r .tspath (layer .ID ))
2504+ 		if  err  !=  nil  {
2505+ 			return  fmt .Errorf ("commit tar split file: %w" , err )
25052506		}
25062507		return  nil 
25072508	}
25082509
2509- 	err  :=  r .applyDiffWithOptionsInner (layer , layerOptions , diff , f )
2510- 	if  err  !=  nil  {
2511- 		return  cleanFunctions , nil , 0 , err 
2512- 	}
2513- 
25142510	return  cleanFunctions , applyDiff , size , nil 
25152511}
25162512
25172513// Requires startWriting. 
25182514func  (r  * layerStore ) applyDiffWithOptions (layer  * Layer , layerOptions  * LayerOptions , diff  io.Reader ) (int64 , error ) {
25192515	var  size  int64 
2520- 	f  :=  func (id  string , parent  string , options  drivers.ApplyDiffOpts ,  tsBytes   * bytes. Buffer ) error  {
2516+ 	f  :=  func (id  string , parent  string , options  drivers.ApplyDiffOpts ) error  {
25212517		var  err  error 
25222518		size , err  =  r .driver .ApplyDiff (layer .ID , layer .Parent , options )
2523- 		if  err  !=  nil  {
2524- 			return  err 
2525- 		}
2526- 		if  err  :=  os .MkdirAll (filepath .Dir (r .tspath (layer .ID )), 0o700 ); err  !=  nil  {
2527- 			return  err 
2528- 		}
2529- 		if  err  :=  ioutils .AtomicWriteFile (r .tspath (layer .ID ), tsBytes .Bytes (), 0o600 ); err  !=  nil  {
2530- 			return  err 
2531- 		}
2532- 		return  nil 
2519+ 		return  err 
25332520	}
25342521
2535- 	err  :=  r .applyDiffWithOptionsInner (layer , layerOptions , diff , f )
2522+ 	if  err  :=  os .MkdirAll (filepath .Dir (r .tspath (layer .ID )), 0o700 ); err  !=  nil  {
2523+ 		return  - 1 , err 
2524+ 	}
2525+ 	tsFile , err  :=  os .OpenFile (r .tspath (layer .ID ), os .O_CREATE | os .O_WRONLY , 0o600 )
2526+ 	if  err  !=  nil  {
2527+ 		return  - 1 , err 
2528+ 	}
2529+ 	defer  tsFile .Close ()
2530+ 
2531+ 	err  =  r .applyDiffWithOptionsInner (layer , layerOptions , diff , f , tsFile )
25362532	if  err  !=  nil  {
25372533		return  0 , err 
25382534	}
25392535
25402536	return  size , r .saveFor (layer )
25412537}
25422538
2543- func  (r  * layerStore ) applyDiffWithOptionsInner (layer  * Layer , layerOptions  * LayerOptions , diff  io.Reader , applyFunc  diffApplyFunc ) (err  error ) {
2539+ func  (r  * layerStore ) applyDiffWithOptionsInner (layer  * Layer , layerOptions  * LayerOptions , diff  io.Reader , applyFunc  diffApplyFunc ,  tsFile   * os. File ) (err  error ) {
25442540	if  ! r .lockfile .IsReadWrite () {
25452541		return  fmt .Errorf ("not allowed to modify layer contents at %q: %w" , r .layerdir , ErrStoreIsReadOnly )
25462542	}
@@ -2578,13 +2574,14 @@ func (r *layerStore) applyDiffWithOptionsInner(layer *Layer, layerOptions *Layer
25782574	compressedCounter  :=  ioutils .NewWriteCounter (compressedWriter )
25792575	defragmented  =  io .TeeReader (defragmented , compressedCounter )
25802576
2581- 	tsdata  :=  bytes.Buffer {}
2577+ 	tsdata  :=  pools .BufioWriter32KPool .Get (tsFile )
2578+ 	defer  tsdata .Flush ()
25822579	uidLog  :=  make (map [uint32 ]struct {})
25832580	gidLog  :=  make (map [uint32 ]struct {})
25842581	var  uncompressedCounter  * ioutils.WriteCounter 
25852582
25862583	err  =  func () error  { // A scope for defer 
2587- 		compressor , err  :=  pgzip .NewWriterLevel (& tsdata , pgzip .BestSpeed )
2584+ 		compressor , err  :=  pgzip .NewWriterLevel (tsdata , pgzip .BestSpeed )
25882585		if  err  !=  nil  {
25892586			return  err 
25902587		}
@@ -2622,7 +2619,7 @@ func (r *layerStore) applyDiffWithOptionsInner(layer *Layer, layerOptions *Layer
26222619			Mappings :   r .layerMappings (layer ),
26232620			MountLabel : layer .MountLabel ,
26242621		}
2625- 		return  applyFunc (layer .ID , layer .Parent , options ,  & tsdata )
2622+ 		return  applyFunc (layer .ID , layer .Parent , options )
26262623	}()
26272624	if  err  !=  nil  {
26282625		return  err 
0 commit comments