(keyID uint, keyHashKey, activeKeysListKey string)
| 140 | } |
| 141 | |
| 142 | func (p *KeyProvider) handleSuccess(keyID uint, keyHashKey, activeKeysListKey string) error { |
| 143 | keyDetails, err := p.store.HGetAll(keyHashKey) |
| 144 | if err != nil { |
| 145 | return fmt.Errorf("failed to get key details from store: %w", err) |
| 146 | } |
| 147 | |
| 148 | failureCount, _ := strconv.ParseInt(keyDetails["failure_count"], 10, 64) |
| 149 | isActive := keyDetails["status"] == models.KeyStatusActive |
| 150 | |
| 151 | if failureCount == 0 && isActive { |
| 152 | return nil |
| 153 | } |
| 154 | |
| 155 | return p.executeTransactionWithRetry(func(tx *gorm.DB) error { |
| 156 | var key models.APIKey |
| 157 | if err := tx.Set("gorm:query_option", "FOR UPDATE").First(&key, keyID).Error; err != nil { |
| 158 | return fmt.Errorf("failed to lock key %d for update: %w", keyID, err) |
| 159 | } |
| 160 | |
| 161 | updates := map[string]any{"failure_count": 0} |
| 162 | if !isActive { |
| 163 | updates["status"] = models.KeyStatusActive |
| 164 | } |
| 165 | |
| 166 | if err := tx.Model(&key).Updates(updates).Error; err != nil { |
| 167 | return fmt.Errorf("failed to update key in DB: %w", err) |
| 168 | } |
| 169 | |
| 170 | if err := p.store.HSet(keyHashKey, updates); err != nil { |
| 171 | return fmt.Errorf("failed to update key details in store: %w", err) |
| 172 | } |
| 173 | |
| 174 | if !isActive { |
| 175 | logrus.WithField("keyID", keyID).Debug("Key has recovered and is being restored to active pool.") |
| 176 | if err := p.store.LRem(activeKeysListKey, 0, keyID); err != nil { |
| 177 | return fmt.Errorf("failed to LRem key before LPush on recovery: %w", err) |
| 178 | } |
| 179 | if err := p.store.LPush(activeKeysListKey, keyID); err != nil { |
| 180 | return fmt.Errorf("failed to LPush key back to active list: %w", err) |
| 181 | } |
| 182 | } |
| 183 | |
| 184 | return nil |
| 185 | }) |
| 186 | } |
| 187 | |
| 188 | func (p *KeyProvider) handleFailure(apiKey *models.APIKey, group *models.Group, keyHashKey, activeKeysListKey string) error { |
| 189 | keyDetails, err := p.store.HGetAll(keyHashKey) |
no test coverage detected