| @@ -22,6 +22,7 @@ func StartAndGetCloudBrainPointDeductTask(task models.Cloudbrain) (*models.Rewar | |||
| spec := models.GetResourceSpec(task.JobType, task.ResourceSpecId) | |||
| if spec == nil || spec.UnitPrice == 0 { | |||
| log.Debug("GetResourceSpec failed,spec is nil or UnitPrice = 0") | |||
| return nil, nil | |||
| } | |||
| @@ -2,6 +2,7 @@ package reward | |||
| import ( | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/redis/redis_client" | |||
| "code.gitea.io/gitea/modules/redis/redis_key" | |||
| "code.gitea.io/gitea/modules/timeutil" | |||
| @@ -24,6 +25,7 @@ func NotifyRewardOperation(userId, amount int64, rewardType models.RewardType, o | |||
| func GetRewardOperation(since, until timeutil.TimeStamp) []models.UserRewardOperation { | |||
| list, err := redis_client.ZRangeByScore(redis_key.RewardOperateNotification(), float64(since), float64(until)) | |||
| if err != nil { | |||
| log.Error("GetRewardOperation ZRangeByScore error. %v", err) | |||
| return nil | |||
| } | |||
| if len(list) == 0 { | |||
| @@ -57,6 +57,7 @@ func Operate(ctx *models.RewardOperateContext) error { | |||
| //get operator | |||
| operator := GetOperator(ctx.Reward.Type) | |||
| if operator == nil { | |||
| log.Error("operator of reward type is not exist,ctx=%v", ctx) | |||
| return errors.New("operator of reward type is not exist") | |||
| } | |||
| @@ -71,6 +72,7 @@ func Operate(ctx *models.RewardOperateContext) error { | |||
| //new reward operate record | |||
| recordId, err := initRewardOperateRecord(ctx) | |||
| if err != nil { | |||
| log.Error("initRewardOperateRecord error,err=%v", err) | |||
| return err | |||
| } | |||
| @@ -78,6 +80,7 @@ func Operate(ctx *models.RewardOperateContext) error { | |||
| //operate | |||
| if err := operator.Operate(ctx); err != nil { | |||
| log.Error("operator Operate error,err=%v", err) | |||
| UpdateRewardRecordToFinalStatus(ctx.SourceType.Name(), ctx.RequestId, models.OperateStatusFailed) | |||
| return err | |||
| } | |||
| @@ -101,9 +104,11 @@ func GetOperator(rewardType models.RewardType) RewardOperator { | |||
| func isHandled(sourceType string, requestId string, operateType string) (bool, error) { | |||
| _, err := models.GetPointOperateRecordBySourceTypeAndRequestId(sourceType, requestId, operateType) | |||
| if err != nil { | |||
| log.Error("operator isHandled error. %v", err) | |||
| if models.IsErrRecordNotExist(err) { | |||
| return false, nil | |||
| } | |||
| log.Error("GetPointOperateRecordBySourceTypeAndRequestId ZRangeByScore error. %v", err) | |||
| return false, err | |||
| } | |||
| return true, nil | |||
| @@ -113,6 +118,7 @@ func isHandled(sourceType string, requestId string, operateType string) (bool, e | |||
| func initRewardOperateRecord(ctx *models.RewardOperateContext) (string, error) { | |||
| sn, err := generateOperateSerialNo(ctx.OperateType, ctx.Reward.Type) | |||
| if err != nil { | |||
| log.Error("generateOperateSerialNo error. %v", err) | |||
| return "", err | |||
| } | |||
| record := &models.RewardOperateRecord{ | |||
| @@ -131,6 +137,7 @@ func initRewardOperateRecord(ctx *models.RewardOperateContext) (string, error) { | |||
| } | |||
| _, err = models.InsertRewardOperateRecord(record) | |||
| if err != nil { | |||
| log.Error("InsertRewardOperateRecord error. %v", err) | |||
| return "", err | |||
| } | |||
| return record.SerialNo, nil | |||
| @@ -139,6 +146,7 @@ func initRewardOperateRecord(ctx *models.RewardOperateContext) (string, error) { | |||
| func createPeriodicRewardOperateRecord(ctx *models.StartPeriodicTaskOpts) (string, error) { | |||
| sn, err := generateOperateSerialNo(ctx.OperateType, ctx.RewardType) | |||
| if err != nil { | |||
| log.Error("createPeriodic generateOperateSerialNo error. %v", err) | |||
| return "", err | |||
| } | |||
| record := &models.RewardOperateRecord{ | |||
| @@ -156,6 +164,7 @@ func createPeriodicRewardOperateRecord(ctx *models.StartPeriodicTaskOpts) (strin | |||
| } | |||
| _, err = models.InsertRewardOperateRecord(record) | |||
| if err != nil { | |||
| log.Error("createPeriodic InsertRewardOperateRecord error. %v", err) | |||
| return "", err | |||
| } | |||
| return record.SerialNo, nil | |||
| @@ -164,6 +173,7 @@ func createPeriodicRewardOperateRecord(ctx *models.StartPeriodicTaskOpts) (strin | |||
| func UpdateRewardRecordToFinalStatus(sourceType, requestId, newStatus string) error { | |||
| _, err := models.UpdateRewardRecordToFinalStatus(sourceType, requestId, newStatus) | |||
| if err != nil { | |||
| log.Error("UpdateRewardRecord UpdateRewardRecordToFinalStatus error. %v", err) | |||
| return err | |||
| } | |||
| return nil | |||
| @@ -184,6 +194,7 @@ func StartAndGetPeriodicTask(opts *models.StartPeriodicTaskOpts) (*models.Reward | |||
| var rewardLock = redis_lock.NewDistributeLock(redis_key.RewardOperateLock(opts.RequestId, opts.SourceType.Name(), opts.OperateType.Name())) | |||
| isOk, err := rewardLock.Lock(3 * time.Second) | |||
| if err != nil { | |||
| log.Error("StartAndGetPeriodicTask RewardOperateLock error. %v", err) | |||
| return nil, err | |||
| } | |||
| if !isOk { | |||
| @@ -210,10 +221,12 @@ func StartAndGetPeriodicTask(opts *models.StartPeriodicTaskOpts) (*models.Reward | |||
| //new reward operate record | |||
| recordId, err := createPeriodicRewardOperateRecord(opts) | |||
| if err != nil { | |||
| log.Error("StartAndGetPeriodicTask createPeriodicRewardOperateRecord error. %v", err) | |||
| return nil, err | |||
| } | |||
| if err = NewRewardPeriodicTask(recordId, opts); err != nil { | |||
| log.Error("StartAndGetPeriodicTask NewRewardPeriodicTask error. %v", err) | |||
| UpdateRewardRecordToFinalStatus(opts.SourceType.Name(), opts.RequestId, models.OperateStatusFailed) | |||
| return nil, err | |||
| } | |||
| @@ -258,6 +271,8 @@ func StopPeriodicTask(sourceType models.SourceType, sourceId string, operateType | |||
| func generateOperateSerialNo(operateType models.RewardOperateType, rewardType models.RewardType) (string, error) { | |||
| s, err := GetSerialNoByRedis() | |||
| if err != nil { | |||
| log.Error("generateOperateSerialNo error. %v", err) | |||
| return "", err | |||
| } | |||
| @@ -67,6 +67,7 @@ func RunRewardTask(t models.RewardPeriodicTask, now time.Time) error { | |||
| } | |||
| n, _ := countExecuteTimes(t, now) | |||
| if n == 0 { | |||
| log.Info("countExecuteTimes result is 0") | |||
| return nil | |||
| } | |||
| @@ -2,6 +2,7 @@ package account | |||
| import ( | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/redis/redis_client" | |||
| "code.gitea.io/gitea/modules/redis/redis_key" | |||
| "code.gitea.io/gitea/modules/redis/redis_lock" | |||
| @@ -24,10 +25,12 @@ func GetAccount(userId int64) (*models.PointAccount, error) { | |||
| if models.IsErrRecordNotExist(err) { | |||
| a, err := InitAccount(userId) | |||
| if err != nil { | |||
| log.Error("InitAccount error,err=%v", err) | |||
| return nil, err | |||
| } | |||
| return a, nil | |||
| } | |||
| log.Error("GetAccountByUserId error,err=%v", err) | |||
| return nil, err | |||
| } | |||
| jsonStr, _ := json.Marshal(account) | |||
| @@ -39,6 +42,7 @@ func InitAccount(userId int64) (*models.PointAccount, error) { | |||
| lock := redis_lock.NewDistributeLock(redis_key.PointAccountInitLock(userId)) | |||
| isOk, err := lock.LockWithWait(3*time.Second, 3*time.Second) | |||
| if err != nil { | |||
| log.Error("PointAccountInitLock error,err=%v", err) | |||
| return nil, err | |||
| } | |||
| if isOk { | |||
| @@ -71,8 +75,9 @@ func IsPointBalanceEnough(targetUserId int64, jobType string, resourceSpecId int | |||
| if spec == nil { | |||
| return true | |||
| } | |||
| a, error := GetAccount(targetUserId) | |||
| if error != nil { | |||
| a, err := GetAccount(targetUserId) | |||
| if err != nil { | |||
| log.Error("IsPointBalanceEnough GetAccount error,err=%v", err) | |||
| return false | |||
| } | |||
| return a.Balance >= spec.UnitPrice | |||
| @@ -18,6 +18,7 @@ type PointOperator struct { | |||
| func (operator *PointOperator) IsLimited(ctx *models.RewardOperateContext) error { | |||
| realAmount, err := limiter.CheckLimit(ctx.SourceType.Name(), models.LimitTypeRewardPoint, ctx.TargetUserId, ctx.Reward.Amount, ctx.RejectPolicy) | |||
| if err != nil { | |||
| log.Error("PointOperator IsLimited error,err=%v", err) | |||
| return err | |||
| } | |||
| if realAmount < ctx.Reward.Amount { | |||
| @@ -30,12 +31,14 @@ func (operator *PointOperator) IsLimited(ctx *models.RewardOperateContext) error | |||
| func (operator *PointOperator) Operate(ctx *models.RewardOperateContext) error { | |||
| a, err := account.GetAccount(ctx.TargetUserId) | |||
| if err != nil || a == nil { | |||
| log.Error("operator get account error error,err=%v", err) | |||
| return errors.New("get account error") | |||
| } | |||
| lock := redis_lock.NewDistributeLock(redis_key.PointAccountOperateLock(a.AccountCode)) | |||
| isOk, err := lock.LockWithWait(3*time.Second, 3*time.Second) | |||
| if err != nil { | |||
| log.Error("Get PointAccountOperateLock error,err=%v", err) | |||
| return err | |||
| } | |||
| if isOk { | |||
| @@ -51,11 +54,13 @@ func (operator *PointOperator) Operate(ctx *models.RewardOperateContext) error { | |||
| err = na.Decrease(ctx.Reward.Amount, ctx.SourceId) | |||
| } | |||
| if err != nil { | |||
| log.Error("operate account balance error,err=%v", err) | |||
| return err | |||
| } | |||
| redis_client.Del(redis_key.PointAccountInfo(ctx.TargetUserId)) | |||
| } else { | |||
| log.Error("Get account operate lock failed,ctx=%v", ctx) | |||
| return errors.New("Get account operate lock failed") | |||
| } | |||
| return nil | |||
| @@ -2,6 +2,7 @@ package reward | |||
| import ( | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/log" | |||
| ) | |||
| type RecordResponse struct { | |||
| @@ -14,6 +15,8 @@ type RecordResponse struct { | |||
| func GetRewardRecordList(opts models.RewardRecordListOpts) (*RecordResponse, error) { | |||
| l, n, err := models.GetRewardRecordList(opts) | |||
| if err != nil { | |||
| log.Error("GetRewardRecordList error. %v", err) | |||
| return nil, err | |||
| } | |||
| if len(l) == 0 { | |||
| @@ -21,6 +24,7 @@ func GetRewardRecordList(opts models.RewardRecordListOpts) (*RecordResponse, err | |||
| } | |||
| result, err := l.ToShow() | |||
| if err != nil { | |||
| log.Error("GetRewardRecordList ToShow error. %v", err) | |||
| return nil, err | |||
| } | |||
| @@ -1,6 +1,7 @@ | |||
| package reward | |||
| import ( | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/redis/redis_client" | |||
| "code.gitea.io/gitea/modules/redis/redis_key" | |||
| "fmt" | |||
| @@ -12,6 +13,7 @@ func GetSerialNoByRedis() (string, error) { | |||
| now := time.Now() | |||
| n, err := redis_client.IncrBy(redis_key.RewardSerialCounter(now), 1) | |||
| if err != nil { | |||
| log.Error("GetSerialNoByRedis RewardSerialCounter error. %v", err) | |||
| return "", err | |||
| } | |||
| if n == 1 { | |||
| @@ -61,6 +61,7 @@ func accomplish(action models.Action) error { | |||
| ActionId: action.ID, | |||
| }) | |||
| if err != nil { | |||
| log.Error("InsertTaskAccomplishLog error,%v", err) | |||
| return err | |||
| } | |||
| @@ -78,12 +79,13 @@ func accomplish(action models.Action) error { | |||
| OperateType: models.OperateTypeIncrease, | |||
| RejectPolicy: models.FillUp, | |||
| }) | |||
| log.Debug("accomplish success,action=%v", action) | |||
| return nil | |||
| } | |||
| func isLimited(userId int64, config *models.TaskConfig, rejectPolicy models.LimiterRejectPolicy) bool { | |||
| if _, err := limiter.CheckLimit(config.TaskCode, models.LimitTypeTask, userId, 1, rejectPolicy); err != nil { | |||
| log.Error(" isLimited CheckLimit error. %v", err) | |||
| return true | |||
| } | |||
| return false | |||
| @@ -16,6 +16,7 @@ import ( | |||
| func GetTaskConfig(taskType string) (*models.TaskConfig, error) { | |||
| list, err := GetTaskConfigList() | |||
| if err != nil { | |||
| log.Error(" GetTaskConfigList error. %v", err) | |||
| return nil, err | |||
| } | |||
| for _, v := range list { | |||
| @@ -39,6 +40,7 @@ func GetTaskConfigList() ([]*models.TaskConfig, error) { | |||
| } | |||
| config, err := models.GetTaskConfigList() | |||
| if err != nil { | |||
| log.Error(" GetTaskConfigList from model error. %v", err) | |||
| if models.IsErrRecordNotExist(err) { | |||
| redis_client.Setex(redisKey, redis_key.EMPTY_REDIS_VAL, 5*time.Second) | |||
| return nil, nil | |||
| @@ -61,6 +63,7 @@ func GetTaskConfigWithLimitList() ([]*models.TaskConfigWithLimit, error) { | |||
| r := make([]*models.TaskConfigWithLimit, 0) | |||
| l, err := limiter.GetLimitersByLimitType(models.LimitTypeTask) | |||
| if err != nil { | |||
| log.Error(" GetLimitersByLimitType from redis error. %v", err) | |||
| return nil, err | |||
| } | |||
| for i := 0; i < len(list); i++ { | |||
| @@ -88,6 +91,7 @@ func GetTaskConfigWithLimitList() ([]*models.TaskConfigWithLimit, error) { | |||
| func AddTaskConfig(config models.TaskConfigWithLimit, doer *models.User) error { | |||
| if config.TaskCode == "" || config.AwardType == "" { | |||
| log.Error(" AddTaskConfig param error") | |||
| return errors.New("param error") | |||
| } | |||
| err := models.AddTaskConfig(config, doer) | |||