mirror of
https://github.com/j3ssie/osmedeus.git
synced 2026-08-24 16:42:28 +02:00
- Add lock-free ResultCollector for parallel execution with atomic operations, eliminating mutex contention for pre-allocated slices - Implement circuit breaker pattern (internal/retry/circuit_breaker) with configurable thresholds and half-open recovery state for fault tolerance - Introduce json-iterator replacement (internal/json) for 2-6x faster JSON operations while maintaining stdlib compatibility - Add lazy template rendering (RenderLazy) with variable reference caching for 50-80% faster rendering on large contexts - Implement memory-efficient buffer pooling (bufpool) with 10MB pre-allocated reusable buffers for reduced GC pressure - Add LoadFlowWithModules for parallel module pre-loading using errgroup, improving startup time for complex flows - Add VarRefCache with LRU eviction for variable extraction caching - Add streaming output support for foreach loops to process large datasets without memory accumulation - Fix json import compatibility in llm_executor and db_functions - Update test fixtures with correct YAML field names (call→function, run→command)
57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package template
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
// VarRefCache caches variable references extracted from template strings.
|
|
// This avoids repeated regex parsing for the same template patterns.
|
|
type VarRefCache struct {
|
|
cache map[string]map[string]struct{}
|
|
mu sync.RWMutex
|
|
size int
|
|
}
|
|
|
|
// NewVarRefCache creates a cache with the specified maximum size
|
|
func NewVarRefCache(maxSize int) *VarRefCache {
|
|
if maxSize <= 0 {
|
|
maxSize = 1024
|
|
}
|
|
return &VarRefCache{
|
|
cache: make(map[string]map[string]struct{}, maxSize),
|
|
size: maxSize,
|
|
}
|
|
}
|
|
|
|
// Get returns cached variable references for a template, or nil if not cached
|
|
func (c *VarRefCache) Get(template string) (map[string]struct{}, bool) {
|
|
c.mu.RLock()
|
|
defer c.mu.RUnlock()
|
|
refs, ok := c.cache[template]
|
|
return refs, ok
|
|
}
|
|
|
|
// Set caches variable references for a template
|
|
func (c *VarRefCache) Set(template string, refs map[string]struct{}) {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
|
|
// Simple eviction: clear when at capacity
|
|
if len(c.cache) >= c.size {
|
|
c.cache = make(map[string]map[string]struct{}, c.size)
|
|
}
|
|
|
|
c.cache[template] = refs
|
|
}
|
|
|
|
// GetOrExtract returns cached refs or extracts and caches them
|
|
func (c *VarRefCache) GetOrExtract(template string, extractor func(string) map[string]struct{}) map[string]struct{} {
|
|
if refs, ok := c.Get(template); ok {
|
|
return refs
|
|
}
|
|
|
|
refs := extractor(template)
|
|
c.Set(template, refs)
|
|
return refs
|
|
}
|