Selaa lähdekoodia

Merge pull request #1507 from QuantumNous/multi-key-manage

feat: implement channel-specific locking for thread-safe polling
Calcium-Ion 7 kuukautta sitten
vanhempi
commit
306a1a3f57
2 muutettua tiedostoa jossa 7 lisäystä ja 3 poistoa
  1. 4 0
      controller/channel.go
  2. 3 3
      model/channel.go

+ 4 - 0
controller/channel.go

@@ -1107,6 +1107,10 @@ func ManageMultiKeys(c *gin.Context) {
 		return
 	}
 
+	lock := model.GetChannelPollingLock(channel.Id)
+	lock.Lock()
+	defer lock.Unlock()
+
 	switch request.Action {
 	case "get_key_status":
 		keys := channel.GetKeys()

+ 3 - 3
model/channel.go

@@ -141,7 +141,7 @@ func (channel *Channel) GetNextEnabledKey() (string, int, *types.NewAPIError) {
 		return keys[selectedIdx], selectedIdx, nil
 	case constant.MultiKeyModePolling:
 		// Use channel-specific lock to ensure thread-safe polling
-		lock := getChannelPollingLock(channel.Id)
+		lock := GetChannelPollingLock(channel.Id)
 		lock.Lock()
 		defer lock.Unlock()
 
@@ -500,8 +500,8 @@ var channelStatusLock sync.Mutex
 // channelPollingLocks stores locks for each channel.id to ensure thread-safe polling
 var channelPollingLocks sync.Map
 
-// getChannelPollingLock returns or creates a mutex for the given channel ID
-func getChannelPollingLock(channelId int) *sync.Mutex {
+// GetChannelPollingLock returns or creates a mutex for the given channel ID
+func GetChannelPollingLock(channelId int) *sync.Mutex {
 	if lock, exists := channelPollingLocks.Load(channelId); exists {
 		return lock.(*sync.Mutex)
 	}