repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

commit
28603ad
parent
59c9f21
author
Eric Bower
date
2025-06-29 08:59:23 -0400 EDT
fix(pgs): fs adapter make sure files are closed properly
1 files changed,  +33, -11
M pkg/pobj/storage/fs.go
+33, -11
 1@@ -102,8 +102,10 @@ func (s *StorageFS) DeleteBucket(bucket Bucket) error {
 2 
 3 func (s *StorageFS) GetObject(bucket Bucket, fpath string) (utils.ReadAndReaderAtCloser, *ObjectInfo, error) {
 4 	objInfo := &ObjectInfo{
 5+		Size:         0,
 6 		LastModified: time.Time{},
 7 		Metadata:     make(http.Header),
 8+		ETag:         "",
 9 	}
10 
11 	dat, err := os.Open(filepath.Join(bucket.Path, fpath))
12@@ -113,6 +115,7 @@ func (s *StorageFS) GetObject(bucket Bucket, fpath string) (utils.ReadAndReaderA
13 
14 	info, err := dat.Stat()
15 	if err != nil {
16+		_ = dat.Close()
17 		return nil, objInfo, err
18 	}
19 
20@@ -122,16 +125,18 @@ func (s *StorageFS) GetObject(bucket Bucket, fpath string) (utils.ReadAndReaderA
21 		// calculate etag
22 		h := md5.New()
23 		if _, err := io.Copy(h, dat); err != nil {
24+			_ = dat.Close()
25 			return nil, objInfo, err
26 		}
27 		md5Sum := h.Sum(nil)
28 		etag = hex.EncodeToString(md5Sum)
29-	}
30 
31-	// reset os.File reader
32-	_, err = dat.Seek(0, io.SeekStart)
33-	if err != nil {
34-		return nil, objInfo, err
35+		// reset os.File reader
36+		_, err = dat.Seek(0, io.SeekStart)
37+		if err != nil {
38+			_ = dat.Close()
39+			return nil, objInfo, err
40+		}
41 	}
42 
43 	objInfo.ETag = etag
44@@ -151,17 +156,15 @@ func (s *StorageFS) PutObject(bucket Bucket, fpath string, contents io.Reader, e
45 	if err != nil {
46 		return "", 0, err
47 	}
48+	defer func() {
49+		_ = f.Close()
50+	}()
51 
52 	size, err := io.Copy(f, contents)
53 	if err != nil {
54 		return "", 0, err
55 	}
56 
57-	err = f.Close()
58-	if err != nil {
59-		return "", 0, err
60-	}
61-
62 	if entry.Mtime > 0 {
63 		uTime := time.Unix(entry.Mtime, 0)
64 		_ = os.Chtimes(loc, uTime, uTime)
65@@ -183,9 +186,28 @@ func (s *StorageFS) DeleteObject(bucket Bucket, fpath string) error {
66 	// traverse up the folder tree and remove all empty folders
67 	dir := filepath.Dir(loc)
68 	for dir != "" {
69+		f, err := os.Open(dir)
70+		if err != nil {
71+			s.Logger.Info("open dir", "dir", dir, "err", err)
72+			break
73+		}
74+		defer func() {
75+			_ = f.Close()
76+		}()
77+
78+		// https://stackoverflow.com/a/30708914
79+		contents, err := f.Readdirnames(-1)
80+		if err != nil {
81+			s.Logger.Info("read dir", "dir", dir, "err", err)
82+			break
83+		}
84+		if len(contents) > 0 {
85+			break
86+		}
87+
88 		err = os.Remove(dir)
89 		if err != nil {
90-			s.Logger.Info("removing dir", "dir", dir, "err", err)
91+			s.Logger.Info("remove dir", "dir", dir, "err", err)
92 			break
93 		}
94 		fp := strings.Split(dir, "/")