You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

getcentertasklistlogic.go 2.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package ai
  2. import (
  3. "context"
  4. "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/constants"
  5. "strconv"
  6. "sync"
  7. "time"
  8. "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/svc"
  9. "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/types"
  10. "github.com/zeromicro/go-zero/core/logx"
  11. )
  12. type GetCenterTaskListLogic struct {
  13. logx.Logger
  14. ctx context.Context
  15. svcCtx *svc.ServiceContext
  16. }
  17. func NewGetCenterTaskListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetCenterTaskListLogic {
  18. return &GetCenterTaskListLogic{
  19. Logger: logx.WithContext(ctx),
  20. ctx: ctx,
  21. svcCtx: svcCtx,
  22. }
  23. }
  24. func (l *GetCenterTaskListLogic) GetCenterTaskList() (resp *types.CenterTaskListResp, err error) {
  25. resp = &types.CenterTaskListResp{}
  26. var mu sync.RWMutex
  27. ch := make(chan struct{})
  28. adapterList, err := l.svcCtx.Scheduler.AiStorages.GetAdaptersByType("1")
  29. if err != nil {
  30. return nil, err
  31. }
  32. go l.updateAiTaskStatus(&mu, ch, adapterList)
  33. for _, adapter := range adapterList {
  34. mu.RLock()
  35. taskList, err := l.svcCtx.Scheduler.AiStorages.GetAiTasksByAdapterId(adapter.Id)
  36. mu.RUnlock()
  37. if err != nil {
  38. continue
  39. }
  40. for _, task := range taskList {
  41. var elapsed time.Duration
  42. switch task.Status {
  43. case constants.Completed:
  44. end, err := time.ParseInLocation(constants.Layout, task.EndTime, time.Local)
  45. if err != nil {
  46. elapsed = time.Duration(0)
  47. }
  48. start, err := time.ParseInLocation(constants.Layout, task.StartTime, time.Local)
  49. if err != nil {
  50. elapsed = time.Duration(0)
  51. }
  52. elapsed = end.Sub(start)
  53. case constants.Running:
  54. elapsed = time.Now().Sub(task.CommitTime)
  55. default:
  56. elapsed = 0
  57. }
  58. t := &types.AiTask{
  59. Name: task.Name,
  60. Status: task.Status,
  61. TimeElapsed: int32(elapsed.Seconds()),
  62. }
  63. resp.List = append(resp.List, t)
  64. }
  65. }
  66. select {
  67. case _ = <-ch:
  68. return resp, nil
  69. case <-time.After(2 * time.Second):
  70. return resp, nil
  71. }
  72. }
  73. func (l *GetCenterTaskListLogic) updateAiTaskStatus(mu *sync.RWMutex, ch chan<- struct{}, list []*types.AdapterInfo) {
  74. var wg sync.WaitGroup
  75. for _, adapter := range list {
  76. taskList, err := l.svcCtx.Scheduler.AiStorages.GetAiTasksByAdapterId(adapter.Id)
  77. if err != nil {
  78. continue
  79. }
  80. for _, task := range taskList {
  81. t := task
  82. if t.Status == constants.Completed || t.JobId == "" {
  83. continue
  84. }
  85. wg.Add(1)
  86. go func() {
  87. trainingTask, err := l.svcCtx.Scheduler.AiService.AiCollectorAdapterMap[adapter.Id][strconv.FormatInt(t.ClusterId, 10)].GetTrainingTask(l.ctx, t.JobId)
  88. if err != nil {
  89. wg.Done()
  90. return
  91. }
  92. t.Status = trainingTask.Status
  93. t.StartTime = trainingTask.Start
  94. t.EndTime = trainingTask.End
  95. mu.Lock()
  96. err = l.svcCtx.Scheduler.AiStorages.UpdateAiTask(t)
  97. mu.Unlock()
  98. if err != nil {
  99. wg.Done()
  100. return
  101. }
  102. wg.Done()
  103. }()
  104. }
  105. }
  106. wg.Wait()
  107. ch <- struct{}{}
  108. }

PCM is positioned as Software stack over Cloud, aiming to build the standards and ecology of heterogeneous cloud collaboration for JCC in a non intrusive and autonomous peer-to-peer manner.