| package account |
|
|
| import ( |
| "os" |
| "strconv" |
| "strings" |
| ) |
|
|
| func (p *Pool) ApplyRuntimeLimits(maxInflightPerAccount, maxQueueSize, globalMaxInflight int) { |
| if maxInflightPerAccount <= 0 { |
| maxInflightPerAccount = 1 |
| } |
| if maxQueueSize < 0 { |
| maxQueueSize = 0 |
| } |
| if globalMaxInflight <= 0 { |
| globalMaxInflight = maxInflightPerAccount * len(p.store.Accounts()) |
| if globalMaxInflight <= 0 { |
| globalMaxInflight = maxInflightPerAccount |
| } |
| } |
| p.mu.Lock() |
| defer p.mu.Unlock() |
| p.maxInflightPerAccount = maxInflightPerAccount |
| p.maxQueueSize = maxQueueSize |
| p.globalMaxInflight = globalMaxInflight |
| p.recommendedConcurrency = defaultRecommendedConcurrency(len(p.queue), p.maxInflightPerAccount) |
| p.notifyWaiterLocked() |
| } |
|
|
| func maxInflightFromEnv() int { |
| if raw := strings.TrimSpace(os.Getenv("DS2API_ACCOUNT_MAX_INFLIGHT")); raw != "" { |
| if n, err := strconv.Atoi(raw); err == nil && n > 0 { |
| return n |
| } |
| } |
| return 2 |
| } |
|
|
| func defaultRecommendedConcurrency(accountCount, maxInflightPerAccount int) int { |
| if accountCount <= 0 { |
| return 0 |
| } |
| if maxInflightPerAccount <= 0 { |
| maxInflightPerAccount = 2 |
| } |
| return accountCount * maxInflightPerAccount |
| } |
|
|
| func maxQueueFromEnv(defaultSize int) int { |
| if raw := strings.TrimSpace(os.Getenv("DS2API_ACCOUNT_MAX_QUEUE")); raw != "" { |
| if n, err := strconv.Atoi(raw); err == nil && n >= 0 { |
| return n |
| } |
| } |
| if defaultSize < 0 { |
| return 0 |
| } |
| return defaultSize |
| } |
|
|
| func (p *Pool) canAcquireIDLocked(accountID string) bool { |
| if accountID == "" { |
| return false |
| } |
| if p.inUse[accountID] >= p.maxInflightPerAccount { |
| return false |
| } |
| if p.globalMaxInflight > 0 && p.currentInUseLocked() >= p.globalMaxInflight { |
| return false |
| } |
| return true |
| } |
|
|
| func (p *Pool) currentInUseLocked() int { |
| total := 0 |
| for _, n := range p.inUse { |
| total += n |
| } |
| return total |
| } |
|
|