mirror of
https://github.com/CJackHwang/ds2api.git
synced 2026-05-04 00:15:28 +08:00
82 lines
1.8 KiB
Go
82 lines
1.8 KiB
Go
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
|
|
}
|