Files
xinmi/internal/container/cleanup.go
T
yawan f7fc992f57
Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
WeKnora deployment source with the reviewed wiki identity, summary and recovery fixes
2026-09-22 16:19:06 +08:00

87 lines
2.0 KiB
Go

package container
import (
"context"
"log"
"sync"
"github.com/Tencent/WeKnora/internal/types"
"github.com/Tencent/WeKnora/internal/types/interfaces"
)
// ResourceCleaner is a resource cleaner that can be used to clean up resources
type ResourceCleaner struct {
mu sync.Mutex
cleanups []types.CleanupFunc
}
// NewResourceCleaner creates a new resource cleaner
func NewResourceCleaner() interfaces.ResourceCleaner {
return &ResourceCleaner{
cleanups: make([]types.CleanupFunc, 0),
}
}
// Register registers a cleanup function
// Note: the cleanup function will be executed in reverse order (the last registered will be executed first)
func (c *ResourceCleaner) Register(cleanup types.CleanupFunc) {
if cleanup == nil {
return
}
c.mu.Lock()
defer c.mu.Unlock()
c.cleanups = append(c.cleanups, cleanup)
}
// RegisterWithName registers a cleanup function with a name, for logging tracking
func (c *ResourceCleaner) RegisterWithName(name string, cleanup types.CleanupFunc) {
if cleanup == nil {
return
}
wrappedCleanup := func() error {
log.Printf("Cleaning up resource: %s", name)
err := cleanup()
if err != nil {
log.Printf("Error cleaning up resource %s: %v", name, err)
} else {
log.Printf("Successfully cleaned up resource: %s", name)
}
return err
}
c.Register(wrappedCleanup)
}
// Cleanup executes all cleanup functions
// Even if a cleanup function fails, other cleanup functions will still be executed
func (c *ResourceCleaner) Cleanup(ctx context.Context) (errs []error) {
c.mu.Lock()
defer c.mu.Unlock()
// Execute cleanup functions in reverse order (the last registered will be executed first)
for i := len(c.cleanups) - 1; i >= 0; i-- {
select {
case <-ctx.Done():
errs = append(errs, ctx.Err())
return errs
default:
if err := c.cleanups[i](); err != nil {
errs = append(errs, err)
}
}
}
return errs
}
// Reset clears all registered cleanup functions
func (c *ResourceCleaner) Reset() {
c.mu.Lock()
defer c.mu.Unlock()
c.cleanups = make([]types.CleanupFunc, 0)
}