-
Notifications
You must be signed in to change notification settings - Fork 0
Automated Test: asset-loading-optimized #331
Conversation
📝 WalkthroughWalkthroughThe change introduces thread-safe caching for web assets in the webassets package by adding a RWMutex and cache variable. Read locks retrieve cached assets in non-development environments, while write locks guard cache population and updates. Asset loading behavior remains unchanged. Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~15 minutes Poem
🚥 Pre-merge checks | ✅ 1 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@pkg/api/webassets/webassets.go`:
- Around line 40-50: GetWebAssets has a TOCTOU: after releasing the read lock
and before loading assets you must re-check the cache under the write lock to
avoid redundant loads; after entryPointAssetsCacheMu.Lock() (inside
GetWebAssets) add a second check of entryPointAssetsCache (and return it if
non-nil) before performing the expensive asset loading logic, keeping the
existing cfg.Env / setting.Dev behavior and using the same entryPointAssetsCache
and entryPointAssetsCacheMu symbols.
| func GetWebAssets(ctx context.Context, cfg *setting.Cfg, license licensing.Licensing) (*dtos.EntryPointAssets, error) { | ||
| if cfg.Env != setting.Dev && entryPointAssetsCache != nil { | ||
| return entryPointAssetsCache, nil | ||
| entryPointAssetsCacheMu.RLock() | ||
| ret := entryPointAssetsCache | ||
| entryPointAssetsCacheMu.RUnlock() | ||
|
|
||
| if cfg.Env != setting.Dev && ret != nil { | ||
| return ret, nil | ||
| } | ||
| entryPointAssetsCacheMu.Lock() | ||
| defer entryPointAssetsCacheMu.Unlock() | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing double-check after acquiring write lock causes redundant asset loading.
The current implementation has a TOCTOU (time-of-check to time-of-use) issue. Between releasing the read lock (line 43) and acquiring the write lock (line 48), another goroutine may have already populated the cache. Without a re-check, multiple concurrent requests at startup will all perform redundant file/CDN reads.
🔧 Proposed fix: Add double-check after acquiring write lock
func GetWebAssets(ctx context.Context, cfg *setting.Cfg, license licensing.Licensing) (*dtos.EntryPointAssets, error) {
entryPointAssetsCacheMu.RLock()
ret := entryPointAssetsCache
entryPointAssetsCacheMu.RUnlock()
if cfg.Env != setting.Dev && ret != nil {
return ret, nil
}
entryPointAssetsCacheMu.Lock()
defer entryPointAssetsCacheMu.Unlock()
+ // Double-check after acquiring write lock
+ if cfg.Env != setting.Dev && entryPointAssetsCache != nil {
+ return entryPointAssetsCache, nil
+ }
+
var err error
var result *dtos.EntryPointAssets📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| func GetWebAssets(ctx context.Context, cfg *setting.Cfg, license licensing.Licensing) (*dtos.EntryPointAssets, error) { | |
| if cfg.Env != setting.Dev && entryPointAssetsCache != nil { | |
| return entryPointAssetsCache, nil | |
| entryPointAssetsCacheMu.RLock() | |
| ret := entryPointAssetsCache | |
| entryPointAssetsCacheMu.RUnlock() | |
| if cfg.Env != setting.Dev && ret != nil { | |
| return ret, nil | |
| } | |
| entryPointAssetsCacheMu.Lock() | |
| defer entryPointAssetsCacheMu.Unlock() | |
| func GetWebAssets(ctx context.Context, cfg *setting.Cfg, license licensing.Licensing) (*dtos.EntryPointAssets, error) { | |
| entryPointAssetsCacheMu.RLock() | |
| ret := entryPointAssetsCache | |
| entryPointAssetsCacheMu.RUnlock() | |
| if cfg.Env != setting.Dev && ret != nil { | |
| return ret, nil | |
| } | |
| entryPointAssetsCacheMu.Lock() | |
| defer entryPointAssetsCacheMu.Unlock() | |
| // Double-check after acquiring write lock | |
| if cfg.Env != setting.Dev && entryPointAssetsCache != nil { | |
| return entryPointAssetsCache, nil | |
| } | |
🤖 Prompt for AI Agents
In `@pkg/api/webassets/webassets.go` around lines 40 - 50, GetWebAssets has a
TOCTOU: after releasing the read lock and before loading assets you must
re-check the cache under the write lock to avoid redundant loads; after
entryPointAssetsCacheMu.Lock() (inside GetWebAssets) add a second check of
entryPointAssetsCache (and return it if non-nil) before performing the expensive
asset loading logic, keeping the existing cfg.Env / setting.Dev behavior and
using the same entryPointAssetsCache and entryPointAssetsCacheMu symbols.
This pull request was automatically created by
@coderabbitai/e2e-reviewer.Batch created pull request.
Summary by CodeRabbit