auto restore user's power for failure tasks

This commit is contained in:
RockYang 2024-11-11 18:12:35 +08:00
parent c39814ce2b
commit 4dbfdab50d
10 changed files with 105 additions and 90 deletions

View File

@ -8,7 +8,6 @@ package handler
// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import ( import (
"fmt"
"geekai/core" "geekai/core"
"geekai/core/types" "geekai/core/types"
"geekai/service" "geekai/service"
@ -182,25 +181,14 @@ func (h *DallJobHandler) Remove(c *gin.Context) {
} }
// 删除任务 // 删除任务
tx := h.DB.Begin() err := h.DB.Delete(&job).Error
tx.Delete(&job)
// 如果任务未完成,或者任务失败,则恢复用户算力
if job.Progress != 100 {
err := h.userService.IncreasePower(int(job.UserId), job.Power, model.PowerLog{
Type: types.PowerRefund,
Model: "dall-e-3",
Remark: fmt.Sprintf("任务失败退回算力。任务ID%dErr: %s", job.Id, job.ErrMsg),
})
if err != nil { if err != nil {
tx.Rollback()
resp.ERROR(c, err.Error()) resp.ERROR(c, err.Error())
return return
} }
}
tx.Commit()
// remove image // remove image
err := h.uploader.GetUploadHandler().Delete(job.ImgURL) err = h.uploader.GetUploadHandler().Delete(job.ImgURL)
if err != nil { if err != nil {
logger.Error("remove image failed: ", err) logger.Error("remove image failed: ", err)
} }

View File

@ -406,26 +406,15 @@ func (h *MidJourneyHandler) Remove(c *gin.Context) {
return return
} }
// remove job recode // remove job
tx := h.DB.Begin() err := h.DB.Delete(&job).Error
tx.Delete(&job)
// 如果任务未完成,或者任务失败,则恢复用户算力
if job.Progress != 100 {
err := h.userService.IncreasePower(job.UserId, job.Power, model.PowerLog{
Type: types.PowerRefund,
Model: "mid-journey",
Remark: fmt.Sprintf("任务失败退回算力。任务ID%dErr: %s", job.Id, job.ErrMsg),
})
if err != nil { if err != nil {
tx.Rollback()
resp.ERROR(c, err.Error()) resp.ERROR(c, err.Error())
return return
} }
}
tx.Commit()
// remove image // remove image
err := h.uploader.GetUploadHandler().Delete(job.ImgURL) err = h.uploader.GetUploadHandler().Delete(job.ImgURL)
if err != nil { if err != nil {
logger.Error("remove image failed: ", err) logger.Error("remove image failed: ", err)
} }

View File

@ -252,25 +252,14 @@ func (h *SdJobHandler) Remove(c *gin.Context) {
} }
// 删除任务 // 删除任务
tx := h.DB.Begin() err := h.DB.Delete(&job).Error
tx.Delete(&job)
// 如果任务未完成,或者任务失败,则恢复用户算力
if job.Progress != 100 {
err := h.userService.IncreasePower(job.UserId, job.Power, model.PowerLog{
Type: types.PowerRefund,
Model: "stable-diffusion",
Remark: fmt.Sprintf("任务失败退回算力。任务ID%d Err: %s", job.Id, job.ErrMsg),
})
if err != nil { if err != nil {
tx.Rollback()
resp.ERROR(c, err.Error()) resp.ERROR(c, err.Error())
return return
} }
}
tx.Commit()
// remove image // remove image
err := h.uploader.GetUploadHandler().Delete(job.ImgURL) err = h.uploader.GetUploadHandler().Delete(job.ImgURL)
if err != nil { if err != nil {
logger.Error("remove image failed: ", err) logger.Error("remove image failed: ", err)
} }

View File

@ -222,25 +222,11 @@ func (h *SunoHandler) Remove(c *gin.Context) {
} }
// 删除任务 // 删除任务
tx := h.DB.Begin() err = h.DB.Delete(&job).Error
if err := tx.Delete(&job).Error; err != nil {
tx.Rollback()
resp.ERROR(c, err.Error())
return
}
// 恢复用户算力
err = h.userService.IncreasePower(job.UserId, job.Power, model.PowerLog{
Type: types.PowerRefund,
Model: job.ModelName,
Remark: fmt.Sprintf("Suno 任务失败退回算力。任务ID%sErr:%s", job.TaskId, job.ErrMsg),
})
if err != nil { if err != nil {
tx.Rollback()
resp.ERROR(c, err.Error()) resp.ERROR(c, err.Error())
return return
} }
tx.Commit()
// 删除文件 // 删除文件
_ = h.uploader.GetUploadHandler().Delete(job.CoverURL) _ = h.uploader.GetUploadHandler().Delete(job.CoverURL)

View File

@ -183,25 +183,11 @@ func (h *VideoHandler) Remove(c *gin.Context) {
} }
// 删除任务 // 删除任务
tx := h.DB.Begin() err = h.DB.Delete(&job).Error
if err := tx.Delete(&job).Error; err != nil {
tx.Rollback()
resp.ERROR(c, err.Error())
return
}
// 恢复算力
err = h.userService.IncreasePower(job.UserId, job.Power, model.PowerLog{
Type: types.PowerRefund,
Model: "luma",
Remark: fmt.Sprintf("Luma 任务失败退回算力。任务ID%sErr:%s", job.TaskId, job.ErrMsg),
})
if err != nil { if err != nil {
tx.Rollback()
resp.ERROR(c, err.Error()) resp.ERROR(c, err.Error())
return return
} }
tx.Commit()
// 删除文件 // 删除文件
_ = h.uploader.GetUploadHandler().Delete(job.CoverURL) _ = h.uploader.GetUploadHandler().Delete(job.CoverURL)

View File

@ -237,13 +237,9 @@ func (s *Service) CheckTaskStatus() {
go func() { go func() {
logger.Info("Running DALL-E task status checking ...") logger.Info("Running DALL-E task status checking ...")
for { for {
// 检查未完成任务进度
var jobs []model.DallJob var jobs []model.DallJob
res := s.db.Where("progress < ?", 100).Find(&jobs) s.db.Where("progress < ?", 100).Find(&jobs)
if res.Error != nil {
time.Sleep(5 * time.Second)
continue
}
for _, job := range jobs { for _, job := range jobs {
// 超时的任务标记为失败 // 超时的任务标记为失败
if time.Now().Sub(job.CreatedAt) > time.Minute*10 { if time.Now().Sub(job.CreatedAt) > time.Minute*10 {
@ -252,6 +248,21 @@ func (s *Service) CheckTaskStatus() {
s.db.Updates(&job) s.db.Updates(&job)
} }
} }
// 找出失败的任务,并恢复其扣减算力
s.db.Where("progress", service.FailTaskProgress).Where("power > ?", 0).Find(&jobs)
for _, job := range jobs {
err := s.userService.IncreasePower(int(job.UserId), job.Power, model.PowerLog{
Type: types.PowerRefund,
Model: "dall-e-3",
Remark: fmt.Sprintf("任务失败退回算力。任务ID%dErr: %s", job.Id, job.ErrMsg),
})
if err != nil {
continue
}
// 更新任务状态
s.db.Model(&job).UpdateColumn("power", 0)
}
time.Sleep(time.Second * 10) time.Sleep(time.Second * 10)
} }
}() }()

View File

@ -30,10 +30,11 @@ type Service struct {
db *gorm.DB db *gorm.DB
wsService *service.WebsocketService wsService *service.WebsocketService
uploaderManager *oss.UploaderManager uploaderManager *oss.UploaderManager
userService *service.UserService
clientIds map[uint]string clientIds map[uint]string
} }
func NewService(redisCli *redis.Client, db *gorm.DB, client *Client, manager *oss.UploaderManager, wsService *service.WebsocketService) *Service { func NewService(redisCli *redis.Client, db *gorm.DB, client *Client, manager *oss.UploaderManager, wsService *service.WebsocketService, userService *service.UserService) *Service {
return &Service{ return &Service{
db: db, db: db,
taskQueue: store.NewRedisQueue("MidJourney_Task_Queue", redisCli), taskQueue: store.NewRedisQueue("MidJourney_Task_Queue", redisCli),
@ -42,6 +43,7 @@ func NewService(redisCli *redis.Client, db *gorm.DB, client *Client, manager *os
wsService: wsService, wsService: wsService,
uploaderManager: manager, uploaderManager: manager,
clientIds: map[uint]string{}, clientIds: map[uint]string{},
userService: userService,
} }
} }
@ -313,6 +315,21 @@ func (s *Service) SyncTaskProgress() {
} }
} }
// 找出失败的任务,并恢复其扣减算力
s.db.Where("progress", service.FailTaskProgress).Where("power > ?", 0).Find(&jobs)
for _, job := range jobs {
err := s.userService.IncreasePower(job.UserId, job.Power, model.PowerLog{
Type: types.PowerRefund,
Model: "mid-journey",
Remark: fmt.Sprintf("任务失败退回算力。任务ID%dErr: %s", job.Id, job.ErrMsg),
})
if err != nil {
continue
}
// 更新任务状态
s.db.Model(&job).UpdateColumn("power", 0)
}
time.Sleep(time.Second * 5) time.Sleep(time.Second * 5)
} }
}() }()

View File

@ -34,9 +34,10 @@ type Service struct {
db *gorm.DB db *gorm.DB
uploadManager *oss.UploaderManager uploadManager *oss.UploaderManager
wsService *service.WebsocketService wsService *service.WebsocketService
userService *service.UserService
} }
func NewService(db *gorm.DB, manager *oss.UploaderManager, levelDB *store.LevelDB, redisCli *redis.Client, wsService *service.WebsocketService) *Service { func NewService(db *gorm.DB, manager *oss.UploaderManager, levelDB *store.LevelDB, redisCli *redis.Client, wsService *service.WebsocketService, userService *service.UserService) *Service {
return &Service{ return &Service{
httpClient: req.C(), httpClient: req.C(),
taskQueue: store.NewRedisQueue("StableDiffusion_Task_Queue", redisCli), taskQueue: store.NewRedisQueue("StableDiffusion_Task_Queue", redisCli),
@ -44,6 +45,7 @@ func NewService(db *gorm.DB, manager *oss.UploaderManager, levelDB *store.LevelD
db: db, db: db,
wsService: wsService, wsService: wsService,
uploadManager: manager, uploadManager: manager,
userService: userService,
} }
} }
@ -301,6 +303,21 @@ func (s *Service) CheckTaskStatus() {
s.db.Updates(&job) s.db.Updates(&job)
} }
} }
// 找出失败的任务,并恢复其扣减算力
s.db.Where("progress", service.FailTaskProgress).Where("power > ?", 0).Find(&jobs)
for _, job := range jobs {
err := s.userService.IncreasePower(job.UserId, job.Power, model.PowerLog{
Type: types.PowerRefund,
Model: "stable-diffusion",
Remark: fmt.Sprintf("任务失败退回算力。任务ID%d Err: %s", job.Id, job.ErrMsg),
})
if err != nil {
continue
}
// 更新任务状态
s.db.Model(&job).UpdateColumn("power", 0)
}
time.Sleep(time.Second * 5) time.Sleep(time.Second * 5)
} }
}() }()

View File

@ -36,9 +36,10 @@ type Service struct {
notifyQueue *store.RedisQueue notifyQueue *store.RedisQueue
wsService *service.WebsocketService wsService *service.WebsocketService
clientIds map[string]string clientIds map[string]string
userService *service.UserService
} }
func NewService(db *gorm.DB, manager *oss.UploaderManager, redisCli *redis.Client, wsService *service.WebsocketService) *Service { func NewService(db *gorm.DB, manager *oss.UploaderManager, redisCli *redis.Client, wsService *service.WebsocketService, userService *service.UserService) *Service {
return &Service{ return &Service{
httpClient: req.C().SetTimeout(time.Minute * 3), httpClient: req.C().SetTimeout(time.Minute * 3),
db: db, db: db,
@ -47,6 +48,7 @@ func NewService(db *gorm.DB, manager *oss.UploaderManager, redisCli *redis.Clien
uploadManager: manager, uploadManager: manager,
wsService: wsService, wsService: wsService,
clientIds: map[string]string{}, clientIds: map[string]string{},
userService: userService,
} }
} }
@ -384,6 +386,20 @@ func (s *Service) SyncTaskProgress() {
} }
} }
// 找出失败的任务,并恢复其扣减算力
s.db.Where("progress", service.FailTaskProgress).Where("power > ?", 0).Find(&jobs)
for _, job := range jobs {
err := s.userService.IncreasePower(job.UserId, job.Power, model.PowerLog{
Type: types.PowerRefund,
Model: job.ModelName,
Remark: fmt.Sprintf("Suno 任务失败退回算力。任务ID%sErr:%s", job.TaskId, job.ErrMsg),
})
if err != nil {
continue
}
// 更新任务状态
s.db.Model(&job).UpdateColumn("power", 0)
}
time.Sleep(time.Second * 10) time.Sleep(time.Second * 10)
} }
}() }()

View File

@ -36,9 +36,10 @@ type Service struct {
notifyQueue *store.RedisQueue notifyQueue *store.RedisQueue
wsService *service.WebsocketService wsService *service.WebsocketService
clientIds map[uint]string clientIds map[uint]string
userService *service.UserService
} }
func NewService(db *gorm.DB, manager *oss.UploaderManager, redisCli *redis.Client, wsService *service.WebsocketService) *Service { func NewService(db *gorm.DB, manager *oss.UploaderManager, redisCli *redis.Client, wsService *service.WebsocketService, userService *service.UserService) *Service {
return &Service{ return &Service{
httpClient: req.C().SetTimeout(time.Minute * 3), httpClient: req.C().SetTimeout(time.Minute * 3),
db: db, db: db,
@ -47,6 +48,7 @@ func NewService(db *gorm.DB, manager *oss.UploaderManager, redisCli *redis.Clien
wsService: wsService, wsService: wsService,
uploadManager: manager, uploadManager: manager,
clientIds: map[uint]string{}, clientIds: map[uint]string{},
userService: userService,
} }
} }
@ -286,6 +288,20 @@ func (s *Service) SyncTaskProgress() {
} }
// 找出失败的任务,并恢复其扣减算力
s.db.Where("progress", service.FailTaskProgress).Where("power > ?", 0).Find(&jobs)
for _, job := range jobs {
err := s.userService.IncreasePower(job.UserId, job.Power, model.PowerLog{
Type: types.PowerRefund,
Model: "luma",
Remark: fmt.Sprintf("Luma 任务失败退回算力。任务ID%sErr:%s", job.TaskId, job.ErrMsg),
})
if err != nil {
continue
}
// 更新任务状态
s.db.Model(&job).UpdateColumn("power", 0)
}
time.Sleep(time.Second * 10) time.Sleep(time.Second * 10)
} }
}() }()