feat: Add concurrency control to group ratio management with mutexes

This commit is contained in:
CaIon
2025-04-07 21:55:54 +08:00
parent f6e8887482
commit fb9f595044

View File

@@ -4,6 +4,7 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"one-api/common" "one-api/common"
"sync"
) )
var groupRatio = map[string]float64{ var groupRatio = map[string]float64{
@@ -11,8 +12,12 @@ var groupRatio = map[string]float64{
"vip": 1, "vip": 1,
"svip": 1, "svip": 1,
} }
var groupRatioMutex sync.RWMutex
func GetGroupRatioCopy() map[string]float64 { func GetGroupRatioCopy() map[string]float64 {
groupRatioMutex.RLock()
defer groupRatioMutex.RUnlock()
groupRatioCopy := make(map[string]float64) groupRatioCopy := make(map[string]float64)
for k, v := range groupRatio { for k, v := range groupRatio {
groupRatioCopy[k] = v groupRatioCopy[k] = v
@@ -21,11 +26,17 @@ func GetGroupRatioCopy() map[string]float64 {
} }
func ContainsGroupRatio(name string) bool { func ContainsGroupRatio(name string) bool {
groupRatioMutex.RLock()
defer groupRatioMutex.RUnlock()
_, ok := groupRatio[name] _, ok := groupRatio[name]
return ok return ok
} }
func GroupRatio2JSONString() string { func GroupRatio2JSONString() string {
groupRatioMutex.RLock()
defer groupRatioMutex.RUnlock()
jsonBytes, err := json.Marshal(groupRatio) jsonBytes, err := json.Marshal(groupRatio)
if err != nil { if err != nil {
common.SysError("error marshalling model ratio: " + err.Error()) common.SysError("error marshalling model ratio: " + err.Error())
@@ -34,11 +45,17 @@ func GroupRatio2JSONString() string {
} }
func UpdateGroupRatioByJSONString(jsonStr string) error { func UpdateGroupRatioByJSONString(jsonStr string) error {
groupRatioMutex.Lock()
defer groupRatioMutex.Unlock()
groupRatio = make(map[string]float64) groupRatio = make(map[string]float64)
return json.Unmarshal([]byte(jsonStr), &groupRatio) return json.Unmarshal([]byte(jsonStr), &groupRatio)
} }
func GetGroupRatio(name string) float64 { func GetGroupRatio(name string) float64 {
groupRatioMutex.RLock()
defer groupRatioMutex.RUnlock()
ratio, ok := groupRatio[name] ratio, ok := groupRatio[name]
if !ok { if !ok {
common.SysError("group ratio not found: " + name) common.SysError("group ratio not found: " + name)