feat(guardrails): context-aware flock slot — saturated calls give up instead of wedging (#28)

This commit is contained in:
Smokey committed 2026-10-28 06:46:15 -06:00
1 parent c957bdd3f6
commit acc09331b8
2 files changed
+36 -10

No files matched your search

+20 -8
View File
@@ -200,8 +200,11 @@ func (f *Flock) ClassifyMode(ctx context.Context, text string, budgets ...*Budge
return "", false
}
}
f.sem <- struct{}{}
defer func() { <-f.sem }()
release, slot := f.reserve(ctx)
if !slot {
return "", false
}
defer release()
cctx, cancel := context.WithTimeout(ctx, f.g.CrowTimeout)
defer cancel()
start := time.Now()
@@ -295,8 +298,11 @@ func (f *Flock) ClassifyDivergence(ctx context.Context, state any, budgets ...*B
return 0, false
}
}
f.sem <- struct{}{}
defer func() { <-f.sem }()
release, slot := f.reserve(ctx)
if !slot {
return 0, false
}
defer release()
cctx, cancel := context.WithTimeout(ctx, f.g.CrowTimeout)
defer cancel()
start := time.Now()
@@ -318,8 +324,11 @@ func (f *Flock) ClassifyKind(ctx context.Context, text string, budgets ...*Budge
return "", nil, false
}
}
f.sem <- struct{}{}
defer func() { <-f.sem }()
release, slot := f.reserve(ctx)
if !slot {
return "", nil, false
}
defer release()
cctx, cancel := context.WithTimeout(ctx, f.g.CrowTimeout)
defer cancel()
start := time.Now()
@@ -346,8 +355,11 @@ func (f *Flock) classify(ctx context.Context, w Watcher, item string, budgets ..
return JevCall{}, err
}
}
f.sem <- struct{}{}
defer func() { <-f.sem }()
release, slot := f.reserve(ctx)
if !slot {
return JevCall{}, fmt.Errorf("flock at cap: %w", ctx.Err())
}
defer release()
if w != nil {
w.Flying("Sentry")
}