pico

created pr with 59.1 on 2025-04-06T03:01:44Z · by c8ef7d19
added 59.2 on 2025-04-06T03:03:49Z · by c8ef7d19
1: 2cf56f0 ! 1: 26daea4 feat(pgs): lru cache for object info and special files
2: caace51 ! 2: b004b64 chore(pgs): use http cache clear event to rm lru cache for special files
added 59.3 on 2025-04-06T19:08:31Z · by c8ef7d19
1: 26daea4 = 1: 26daea4 feat(pgs): lru cache for object info and special files
2: b004b64 = 2: b004b64 chore(pgs): use http cache clear event to rm lru cache for special files
-: ------- > 3: 59f5618 refactor(pgs): store lru cache on web router
added 59.4 on 2025-04-06T19:41:38Z · by c8ef7d19
1: 26daea4 = 1: 26daea4 feat(pgs): lru cache for object info and special files
2: b004b64 = 2: b004b64 chore(pgs): use http cache clear event to rm lru cache for special files
3: 59f5618 = 3: 59f5618 refactor(pgs): store lru cache on web router
-: ------- > 4: ee12290 refactor(pgs): update minio lru and remove object info cache
cmds
checkout latest patchset:
ssh pr.pico.sh print 59 | git am -3
checkout any patchset in a patch request:
ssh pr.pico.sh print 59.[rev] | git am -3
add changes to patch request:
git format-patch main --stdout | ssh pr.pico.sh pr add 59
+11 -9 pkg/apps/pgs/web.go #
......@@ -109,9 +109,20 @@ func NewWebRouter(cfg *PgsConfig) *WebRouter {
109109 HeadersCache: expirable.NewLRU[string, []*HeaderRule](2048, nil, cache.CacheTimeout),
110110 }
111111 router.initRouters()
112+ go router.watchCacheClear()
112113 return router
113114 }
114115
116+func (web *WebRouter) watchCacheClear() {
117+ for key := range web.Cfg.CacheClearingQueue {
118+ web.Cfg.Logger.Info("lru cache clear request", "key", key)
119+ rKey := filepath.Join(key, "_redirects")
120+ web.RedirectsCache.Remove(rKey)
121+ hKey := filepath.Join(key, "_headers")
122+ web.HeadersCache.Remove(hKey)
123+ }
124+}
125+
115126 func (web *WebRouter) initRouters() {
116127 // ensure legacy router is disabled
117128 // GODEBUG=httpmuxgo121=0
......@@ -516,15 +527,6 @@ func (web *WebRouter) ServeAsset(fname string, opts *storage.ImgProcessOpts, fro
516527 }
517528 }
518529
519- go func() {
520- for key := range web.Cfg.CacheClearingQueue {
521- rKey := filepath.Join(key, "_redirects")
522- web.RedirectsCache.Remove(rKey)
523- hKey := filepath.Join(key, "_headers")
524- web.HeadersCache.Remove(hKey)
525- }
526- }()
527-
528530 asset := &ApiAssetHandler{
529531 WebRouter: web,
530532 Logger: logger,
+6 -1 pkg/apps/pgs/web_asset_handler.go #
......@@ -43,10 +43,12 @@ func (h *ApiAssetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
4343 var redirects []*RedirectRule
4444
4545 redirectsCacheKey := filepath.Join(getSurrogateKey(h.UserID, h.ProjectDir), "_redirects")
46+ logger.Info("looking for _redirects in lru cache", "key", redirectsCacheKey)
4647 if cachedRedirects, found := h.RedirectsCache.Get(redirectsCacheKey); found {
47- fmt.Println(cachedRedirects)
48+ logger.Info("_redirects found in lru cache", "key", redirectsCacheKey)
4849 redirects = cachedRedirects
4950 } else {
51+ logger.Info("_redirects not found in lru cache", "key", redirectsCacheKey)
5052 redirectFp, redirectInfo, err := h.Cfg.Storage.GetObject(h.Bucket, filepath.Join(h.ProjectDir, "_redirects"))
5153 if err == nil {
5254 defer redirectFp.Close()
......@@ -174,9 +176,12 @@ func (h *ApiAssetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
174176 var headers []*HeaderRule
175177
176178 headersCacheKey := filepath.Join(getSurrogateKey(h.UserID, h.ProjectDir), "_headers")
179+ logger.Info("looking for _headers in lru cache", "key", headersCacheKey)
177180 if cachedHeaders, found := h.HeadersCache.Get(headersCacheKey); found {
181+ logger.Info("_headers found in lru", "key", headersCacheKey)
178182 headers = cachedHeaders
179183 } else {
184+ logger.Info("_headers not found in lru cache", "key", headersCacheKey)
180185 headersFp, headersInfo, err := h.Cfg.Storage.GetObject(h.Bucket, filepath.Join(h.ProjectDir, "_headers"))
181186 if err == nil {
182187 defer headersFp.Close()
+29 -36 pkg/pobj/storage/minio.go #
......@@ -5,6 +5,7 @@ import (
55 "errors"
66 "fmt"
77 "io"
8+ "log/slog"
89 "net/url"
910 "os"
1011 "path/filepath"
......@@ -21,8 +22,10 @@ import (
2122 )
2223
2324 type StorageMinio struct {
24- Client *minio.Client
25- Admin *madmin.AdminClient
25+ Client *minio.Client
26+ Admin *madmin.AdminClient
27+ BucketCache *expirable.LRU[string, CachedBucket]
28+ Logger *slog.Logger
2629 }
2730
2831 type CachedBucket struct {
......@@ -38,12 +41,9 @@ type CachedObjectInfo struct {
3841 var (
3942 _ ObjectStorage = &StorageMinio{}
4043 _ ObjectStorage = (*StorageMinio)(nil)
41-
42- bucketCache = expirable.NewLRU[string, CachedBucket](2048, nil, cache.CacheTimeout)
43- objectInfoCache = expirable.NewLRU[string, CachedObjectInfo](2048, nil, cache.CacheTimeout)
4444 )
4545
46-func NewStorageMinio(address, user, pass string) (*StorageMinio, error) {
46+func NewStorageMinio(logger *slog.Logger, address, user, pass string) (*StorageMinio, error) {
4747 endpoint, err := url.Parse(address)
4848 if err != nil {
4949 return nil, err
......@@ -70,16 +70,20 @@ func NewStorageMinio(address, user, pass string) (*StorageMinio, error) {
7070 }
7171
7272 mini := &StorageMinio{
73- Client: mClient,
74- Admin: aClient,
73+ Client: mClient,
74+ Admin: aClient,
75+ BucketCache: expirable.NewLRU[string, CachedBucket](2048, nil, cache.CacheTimeout),
76+ Logger: logger,
7577 }
7678 return mini, err
7779 }
7880
7981 func (s *StorageMinio) GetBucket(name string) (Bucket, error) {
80- if cachedBucket, found := bucketCache.Get(name); found {
82+ if cachedBucket, found := s.BucketCache.Get(name); found {
83+ s.Logger.Info("bucket found in lru cache", "name", name)
8184 return cachedBucket.Bucket, cachedBucket.Error
8285 }
86+ s.Logger.Info("bucket not found in lru cache", "name", name)
8387
8488 bucket := Bucket{
8589 Name: name,
......@@ -91,11 +95,11 @@ func (s *StorageMinio) GetBucket(name string) (Bucket, error) {
9195 err = errors.New("bucket does not exist")
9296 }
9397
94- bucketCache.Add(name, CachedBucket{bucket, err})
98+ s.BucketCache.Add(name, CachedBucket{bucket, err})
9599 return bucket, err
96100 }
97101
98- bucketCache.Add(name, CachedBucket{bucket, nil})
102+ s.BucketCache.Add(name, CachedBucket{bucket, nil})
99103
100104 return bucket, nil
101105 }
......@@ -188,34 +192,23 @@ func (s *StorageMinio) GetObject(bucket Bucket, fpath string) (utils.ReadAndRead
188192
189193 cacheKey := filepath.Join(bucket.Name, fpath)
190194
191- cachedInfo, found := objectInfoCache.Get(cacheKey)
192- if found {
193- objInfo = cachedInfo.ObjectInfo
194-
195- if cachedInfo.Error != nil {
196- return nil, objInfo, cachedInfo.Error
197- }
198- } else {
199- info, err := s.Client.StatObject(context.Background(), bucket.Name, fpath, minio.StatObjectOptions{})
200- if err != nil {
201- objectInfoCache.Add(cacheKey, CachedObjectInfo{objInfo, err})
202- return nil, objInfo, err
203- }
195+ s.Logger.Info("object info not found in lru cache", "key", cacheKey)
196+ info, err := s.Client.StatObject(context.Background(), bucket.Name, fpath, minio.StatObjectOptions{})
197+ if err != nil {
198+ return nil, objInfo, err
199+ }
204200
205- objInfo.LastModified = info.LastModified
206- objInfo.ETag = info.ETag
207- objInfo.Metadata = info.Metadata
208- objInfo.UserMetadata = info.UserMetadata
209- objInfo.Size = info.Size
201+ objInfo.LastModified = info.LastModified
202+ objInfo.ETag = info.ETag
203+ objInfo.Metadata = info.Metadata
204+ objInfo.UserMetadata = info.UserMetadata
205+ objInfo.Size = info.Size
210206
211- if mtime, ok := info.UserMetadata["Mtime"]; ok {
212- mtimeUnix, err := strconv.Atoi(mtime)
213- if err == nil {
214- objInfo.LastModified = time.Unix(int64(mtimeUnix), 0)
215- }
207+ if mtime, ok := info.UserMetadata["Mtime"]; ok {
208+ mtimeUnix, err := strconv.Atoi(mtime)
209+ if err == nil {
210+ objInfo.LastModified = time.Unix(int64(mtimeUnix), 0)
216211 }
217-
218- objectInfoCache.Add(cacheKey, CachedObjectInfo{objInfo, nil})
219212 }
220213
221214 obj, err := s.Client.GetObject(context.Background(), bucket.Name, fpath, minio.GetObjectOptions{})
+1 -1 pkg/pobj/util.go #
......@@ -29,7 +29,7 @@ func EnvDriverDetector(logger *slog.Logger) (storage.ObjectStorage, error) {
2929 "url", url,
3030 "user", user,
3131 )
32- return storage.NewStorageMinio(url, user, pass)
32+ return storage.NewStorageMinio(logger, url, user, pass)
3333 }
3434
3535 // implied driver == "fs"
+2 -3 pkg/shared/storage/minio.go #
......@@ -13,15 +13,14 @@ import (
1313
1414 type StorageMinio struct {
1515 *sst.StorageMinio
16- Logger *slog.Logger
1716 }
1817
1918 func NewStorageMinio(logger *slog.Logger, address, user, pass string) (*StorageMinio, error) {
20- st, err := sst.NewStorageMinio(address, user, pass)
19+ st, err := sst.NewStorageMinio(logger, address, user, pass)
2120 if err != nil {
2221 return nil, err
2322 }
24- return &StorageMinio{st, logger}, nil
23+ return &StorageMinio{st}, nil
2524 }
2625
2726 func (s *StorageMinio) ServeObject(bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error) {
Back to top