mirror of
https://github.com/coder/coder.git
synced 2026-09-21 20:51:01 +08:00
Limits concurrent chat generation on capped deployments to 5 root chats and 10 delegated subagent chats. The pools are deployment-wide and independent, so delegated work can continue while root capacity is full. The default caps live in AGPL code. Enterprise contributes only a licensing unlock, so unlicensed deployments stay capped and cannot fail open. Licensed deployments are uncapped while Agent Hours usage stays below an explicit hard limit. Deployments without a hard limit remain uncapped, and reaching the Agent Hours allocation only triggers warnings. Admission happens before a worker takes chat ownership. Capped deployments serialize admission across replicas with a transaction-scoped advisory lock and derive active and queued state from current ownership plus fresh runner heartbeats, rather than persisted queue markers or per-replica state. The acquisition query returns a bounded, pool-interleaved candidate set instead of ranking the whole backlog; a migration replaces the acquisition index with a pool-aware one. Refused chats stay running but unowned, and interrupt requests bypass admission so users can stop queued or over-cap chats. The single-chat API derives `queued_for_capacity` from live pool state; list endpoints do not report it. The UI polls that value every 5 seconds while a chat is running and shows a callout when the chat is waiting for capacity. Updates the administrator documentation and deployment-wide Prometheus gauges for active and queued agents. Replica-level values must be aggregated with `max`, not `sum`. > Mux updated this PR on Mike's behalf.
30 lines
884 B
Go
30 lines
884 B
Go
package database
|
|
|
|
import "hash/fnv"
|
|
|
|
// Well-known lock IDs for lock functions in the database. These should not
|
|
// change. If locks are deprecated, they should be kept in this list to avoid
|
|
// reusing the same ID.
|
|
const (
|
|
LockIDDeploymentSetup = iota + 1
|
|
LockIDEnterpriseDeploymentSetup
|
|
LockIDDBRollup
|
|
LockIDDBPurge
|
|
LockIDNotificationsReportGenerator
|
|
LockIDCryptoKeyRotation
|
|
LockIDReconcilePrebuilds
|
|
LockIDReconcileSystemRoles
|
|
LockIDBoundaryUsageStats
|
|
LockIDAIProvidersEnvSeed
|
|
LockIDChatModelConfigWrites
|
|
LockIDChatCapacityAdmission
|
|
)
|
|
|
|
// GenLockID generates a unique and consistent lock ID from a given string.
|
|
func GenLockID(name string) int64 {
|
|
hash := fnv.New64()
|
|
_, _ = hash.Write([]byte(name))
|
|
// #nosec G115 - Safe conversion as FNV hash should be treated as random value and both uint64/int64 have the same range of unique values
|
|
return int64(hash.Sum64())
|
|
}
|