Skip to content

Commit 9ad01eb

Browse files
Ensure cache files are properly closed before being deleted.
1 parent 0838ca6 commit 9ad01eb

1 file changed

Lines changed: 80 additions & 62 deletions

File tree

internal/cache/backends/gob.go

Lines changed: 80 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -51,84 +51,27 @@ func (b *GobBackend) compressedPath() string {
5151
return b.Path + ".gz"
5252
}
5353

54-
func (b *GobBackend) Open() (err error) {
54+
func (b *GobBackend) Open() error {
5555
b.wasOpened = true
5656

57-
// Uncompress gzipped file to regular location if it exists
58-
f, err := os.Open(b.compressedPath())
59-
if errors.Is(err, fs.ErrNotExist) {
60-
return nil
61-
} else if err != nil {
62-
return err
63-
}
64-
defer f.Close()
65-
66-
fout, err := os.OpenFile(b.Path, os.O_WRONLY|os.O_CREATE, 0644)
67-
if err != nil {
68-
return err
69-
}
70-
defer fout.Close()
71-
72-
zr, err := gzip.NewReader(f)
73-
if err != nil {
74-
return err
75-
}
76-
77-
w := bufio.NewWriter(fout)
78-
_, err = io.Copy(w, zr)
79-
if err != nil {
80-
return err
81-
}
82-
83-
err = zr.Close()
84-
if err != nil {
85-
return err
86-
}
87-
88-
err = w.Flush()
57+
err := uncompress(b.compressedPath(), b.Path)
8958
if err != nil {
9059
return err
9160
}
9261

9362
return nil
9463
}
9564

96-
func (b *GobBackend) Close() (err error) {
65+
func (b *GobBackend) Close() error {
9766
if b.isDirty {
98-
// Compress file and save to gzipped location
99-
f, err := os.Open(b.Path)
100-
if errors.Is(err, fs.ErrNotExist) {
101-
return nil
102-
} else if err != nil {
103-
return err
104-
}
105-
defer f.Close()
106-
107-
fout, err := os.OpenFile(b.compressedPath(), os.O_WRONLY|os.O_CREATE, 0644)
108-
if err != nil {
109-
return err
110-
}
111-
defer fout.Close()
112-
113-
r := bufio.NewReader(f)
114-
zw, err := gzip.NewWriterLevel(fout, gzip.BestSpeed)
115-
if err != nil {
116-
return err
117-
}
118-
119-
_, err = io.Copy(zw, r)
120-
if err != nil {
121-
return err
122-
}
123-
124-
err = zw.Close()
67+
err := compress(b.Path, b.compressedPath())
12568
if err != nil {
12669
return err
12770
}
12871
}
12972

13073
// Remove uncompressed file
131-
err = os.RemoveAll(b.Path)
74+
err := os.RemoveAll(b.Path)
13275
if err != nil {
13376
return err
13477
}
@@ -320,3 +263,78 @@ func GobCacheDir(prefix string, gitRootPath string) string {
320263
func GobCacheFilename(stateHash string) string {
321264
return fmt.Sprintf("%s.gobs", stateHash)
322265
}
266+
267+
// Uncompress gzipped file to regular location if it exists
268+
func uncompress(sourcePath string, targetPath string) error {
269+
f, err := os.Open(sourcePath)
270+
if errors.Is(err, fs.ErrNotExist) {
271+
return nil
272+
} else if err != nil {
273+
return err
274+
}
275+
defer f.Close()
276+
277+
fout, err := os.OpenFile(targetPath, os.O_WRONLY|os.O_CREATE, 0644)
278+
if err != nil {
279+
return err
280+
}
281+
defer fout.Close()
282+
283+
zr, err := gzip.NewReader(f)
284+
if err != nil {
285+
return err
286+
}
287+
288+
w := bufio.NewWriter(fout)
289+
_, err = io.Copy(w, zr)
290+
if err != nil {
291+
return err
292+
}
293+
294+
err = zr.Close()
295+
if err != nil {
296+
return err
297+
}
298+
299+
err = w.Flush()
300+
if err != nil {
301+
return err
302+
}
303+
304+
return nil
305+
}
306+
307+
// Compress file and save to gzipped location
308+
func compress(sourcePath string, targetPath string) error {
309+
f, err := os.Open(sourcePath)
310+
if errors.Is(err, fs.ErrNotExist) {
311+
return nil
312+
} else if err != nil {
313+
return err
314+
}
315+
defer f.Close()
316+
317+
fout, err := os.OpenFile(targetPath, os.O_WRONLY|os.O_CREATE, 0644)
318+
if err != nil {
319+
return err
320+
}
321+
defer fout.Close()
322+
323+
r := bufio.NewReader(f)
324+
zw, err := gzip.NewWriterLevel(fout, gzip.BestSpeed)
325+
if err != nil {
326+
return err
327+
}
328+
329+
_, err = io.Copy(zw, r)
330+
if err != nil {
331+
return err
332+
}
333+
334+
err = zw.Close()
335+
if err != nil {
336+
return err
337+
}
338+
339+
return nil
340+
}

0 commit comments

Comments
 (0)