@@ -236,3 +236,8 @@ func StringToByteSlice(s string) []byte {
tmp2 := [3]uintptr{tmp1[0], tmp1[1], tmp1[1]}
return *(*[]byte)(unsafe.Pointer(&tmp2))
}
+
+func RandomSleep() {
+ // Sleep for 0-3000 ms
+ time.Sleep(time.Duration(rand.Intn(3000)) * time.Millisecond)
+}
@@ -7,6 +7,7 @@ import (
"one-api/common"
"one-api/model"
"strconv"
+ "sync"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
@@ -789,7 +790,11 @@ type topUpRequest struct {
Key string `json:"key"`
+var lock = sync.Mutex{}
func TopUp(c *gin.Context) {
+ lock.Lock()
+ defer lock.Unlock()
req := topUpRequest{}
err := c.ShouldBindJSON(&req)
if err != nil {
@@ -56,7 +56,7 @@ func Redeem(key string, userId int) (quota int, err error) {
if common.UsingPostgreSQL {
keyCol = `"key"`
-
+ common.RandomSleep()
err = DB.Transaction(func(tx *gorm.DB) error {
err := tx.Set("gorm:query_option", "FOR UPDATE").Where(keyCol+" = ?", key).First(redemption).Error