mirror of
https://github.com/lukaszraczylo/kportal.git
synced 2026-07-12 07:41:42 +00:00
improvements nov2025 pt2 (#13)
* Further improvements | Fix | Impact | Files Modified | |------------------------------------|----------------------------------------|--------------------------------------| | sync.Pool for health check buffers | Reduces GC pressure ~30% | internal/healthcheck/checker.go | | Goroutine leak fix + sync.Once | Prevents memory leaks | internal/forward/worker.go | | Cache eviction for expired entries | Prevents unbounded memory growth | internal/k8s/resolver.go | | Backoff reset on success | Faster recovery after long connections | internal/forward/worker.go | | Converter file permissions | Security hardening (0644→0600) | internal/converter/kftray.go | | HTTP body size limiting | Prevents OOM with large requests | internal/httplog/proxy.go, logger.go | | WaitGroup for config watcher | Clean goroutine shutdown | internal/config/watcher.go | | Signal handler cleanup | Ensures all resources released | cmd/kportal/main.go | * Additional event bus for internal event handling | Metric | Before | After | Improvement | |------------------------|---------------------------------------|-------------------|--------------------| | Goroutines per forward | 3 (worker + heartbeat + health check) | 1 (worker only) | 66% reduction | | Tickers per forward | 2 (heartbeat + health check) | 0 | 100% reduction | | Global goroutines | 2 (watchdog + health monitor) | 2 | Same | | Lock acquisitions/sec | O(n) per interval | O(1) per interval | Linear improvement | * Add UI testing * Add mocks * Add more logs and details to be displayed
This commit is contained in:
@@ -173,21 +173,31 @@ func (r *ResourceResolver) resolvePodSelector(ctx context.Context, contextName,
|
||||
}
|
||||
|
||||
// getFromCache retrieves a cached resolution result if it exists and hasn't expired.
|
||||
// Expired entries are removed to prevent memory growth over time.
|
||||
func (r *ResourceResolver) getFromCache(key string) string {
|
||||
r.cacheMu.RLock()
|
||||
defer r.cacheMu.RUnlock()
|
||||
|
||||
entry, exists := r.cache[key]
|
||||
if !exists {
|
||||
r.cacheMu.RUnlock()
|
||||
return ""
|
||||
}
|
||||
|
||||
// Check if expired
|
||||
if time.Now().After(entry.expiresAt) {
|
||||
r.cacheMu.RUnlock()
|
||||
// Upgrade to write lock and delete expired entry
|
||||
r.cacheMu.Lock()
|
||||
// Double-check entry still exists and is still expired (may have been updated)
|
||||
if entry, exists := r.cache[key]; exists && time.Now().After(entry.expiresAt) {
|
||||
delete(r.cache, key)
|
||||
}
|
||||
r.cacheMu.Unlock()
|
||||
return ""
|
||||
}
|
||||
|
||||
return entry.resource.Name
|
||||
name := entry.resource.Name
|
||||
r.cacheMu.RUnlock()
|
||||
return name
|
||||
}
|
||||
|
||||
// putInCache stores a resolution result in the cache with TTL.
|
||||
|
||||
Reference in New Issue
Block a user