Skip to content

Commit 83dd0eb

Browse files
committed
storage: check for close error on the tar split file
Also add a missing sync when we stage to ensure the content was flushed to disk. Signed-off-by: Paul Holzinger <[email protected]>
1 parent e58297d commit 83dd0eb

File tree

1 file changed

+28
-6
lines changed

1 file changed

+28
-6
lines changed

storage/layers.go

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2500,7 +2500,7 @@ func (sl *maybeStagedLayerExtraction) cleanup() error {
25002500
// If the driver does not support stage addition then this is a NOP and does nothing.
25012501
// This should be done without holding the storage lock, if a parent is given the caller
25022502
// must check for existence beforehand while holding a lock.
2503-
func (r *layerStore) stageWithUnlockedStore(sl *maybeStagedLayerExtraction, parent string, layerOptions *LayerOptions) error {
2503+
func (r *layerStore) stageWithUnlockedStore(sl *maybeStagedLayerExtraction, parent string, layerOptions *LayerOptions) (retErr error) {
25042504
if sl.staging == nil {
25052505
return nil
25062506
}
@@ -2520,7 +2520,13 @@ func (r *layerStore) stageWithUnlockedStore(sl *maybeStagedLayerExtraction, pare
25202520
if err != nil {
25212521
return err
25222522
}
2523-
defer f.Close()
2523+
// make sure to check for errors on close and return that one.
2524+
defer func() {
2525+
closeErr := f.Close()
2526+
if retErr == nil {
2527+
retErr = closeErr
2528+
}
2529+
}()
25242530

25252531
result, err := applyDiff(layerOptions, sl.diff, f, func(payload io.Reader) (int64, error) {
25262532
cleanup, stagedLayer, size, err := sl.staging.StartStagingDiffToApply(parent, drivers.ApplyDiffOpts{
@@ -2537,6 +2543,10 @@ func (r *layerStore) stageWithUnlockedStore(sl *maybeStagedLayerExtraction, pare
25372543
return err
25382544
}
25392545

2546+
if err := f.Sync(); err != nil {
2547+
return fmt.Errorf("sync staged tar-split file: %w", err)
2548+
}
2549+
25402550
sl.result = result
25412551
return nil
25422552
}
@@ -2675,7 +2685,7 @@ func applyDiff(layerOptions *LayerOptions, diff io.Reader, tarSplitFile *os.File
26752685
}
26762686

26772687
// Requires startWriting.
2678-
func (r *layerStore) applyDiffWithOptions(to string, layerOptions *LayerOptions, diff io.Reader) (int64, error) {
2688+
func (r *layerStore) applyDiffWithOptions(to string, layerOptions *LayerOptions, diff io.Reader) (_ int64, retErr error) {
26792689
if !r.lockfile.IsReadWrite() {
26802690
return -1, fmt.Errorf("not allowed to modify layer contents at %q: %w", r.layerdir, ErrStoreIsReadOnly)
26812691
}
@@ -2689,7 +2699,13 @@ func (r *layerStore) applyDiffWithOptions(to string, layerOptions *LayerOptions,
26892699
if err != nil {
26902700
return -1, err
26912701
}
2692-
defer tarSplitFile.Close()
2702+
// make sure to check for errors on close and return that one.
2703+
defer func() {
2704+
closeErr := tarSplitFile.Close()
2705+
if retErr == nil {
2706+
retErr = closeErr
2707+
}
2708+
}()
26932709

26942710
result, err := applyDiff(layerOptions, diff, tarSplitFile, func(payload io.Reader) (int64, error) {
26952711
options := drivers.ApplyDiffOpts{
@@ -2741,7 +2757,7 @@ func (r *layerStore) DifferTarget(id string) (string, error) {
27412757
}
27422758

27432759
// Requires startWriting.
2744-
func (r *layerStore) applyDiffFromStagingDirectory(id string, diffOutput *drivers.DriverWithDifferOutput, options *drivers.ApplyDiffWithDifferOpts) error {
2760+
func (r *layerStore) applyDiffFromStagingDirectory(id string, diffOutput *drivers.DriverWithDifferOutput, options *drivers.ApplyDiffWithDifferOpts) (retErr error) {
27452761
ddriver, ok := r.driver.(drivers.DriverWithDiffer)
27462762
if !ok {
27472763
return ErrNotSupported
@@ -2789,7 +2805,13 @@ func (r *layerStore) applyDiffFromStagingDirectory(id string, diffOutput *driver
27892805
if err != nil {
27902806
return err
27912807
}
2792-
defer tarSplitFile.Close()
2808+
// make sure to check for errors on close and return that one.
2809+
defer func() {
2810+
closeErr := tarSplitFile.Close()
2811+
if retErr == nil {
2812+
retErr = closeErr
2813+
}
2814+
}()
27932815
tarSplitWriter := pools.BufioWriter32KPool.Get(tarSplitFile)
27942816
defer pools.BufioWriter32KPool.Put(tarSplitWriter)
27952817

0 commit comments

Comments
 (0)