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.

schedule.go 3.2 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package urchin
  2. import (
  3. "code.gitea.io/gitea/modules/labelmsg"
  4. "code.gitea.io/gitea/modules/setting"
  5. "encoding/json"
  6. "fmt"
  7. "strings"
  8. "code.gitea.io/gitea/models"
  9. "code.gitea.io/gitea/modules/log"
  10. )
  11. type DecompressReq struct {
  12. SourceFile string `json:"source_file"`
  13. DestPath string `json:"dest_path"`
  14. }
  15. const (
  16. modelSuffix = "models.zip"
  17. )
  18. var urfsClient Urchinfs
  19. func getUrfsClient() {
  20. if urfsClient != nil {
  21. return
  22. }
  23. urfsClient = New()
  24. }
  25. func GetBackNpuModel(cloudbrainID int64, endpoint, bucket, objectKey, destPeerHost string) error {
  26. getUrfsClient()
  27. res, err := urfsClient.ScheduleDataToPeerByKey(endpoint, bucket, objectKey, destPeerHost)
  28. if err != nil {
  29. log.Error("ScheduleDataToPeerByKey failed:%v", err)
  30. return err
  31. }
  32. _, err = models.InsertScheduleRecord(&models.ScheduleRecord{
  33. CloudbrainID: cloudbrainID,
  34. EndPoint: res.DataEndpoint,
  35. Bucket: res.DataRoot,
  36. ObjectKey: res.DataPath,
  37. ProxyServer: destPeerHost,
  38. Status: res.StatusCode,
  39. })
  40. if err != nil {
  41. log.Error("InsertScheduleRecord failed:%v", err)
  42. return err
  43. }
  44. switch res.StatusCode {
  45. case models.StorageScheduleSucceed:
  46. log.Info("ScheduleDataToPeerByKey succeed")
  47. decompress(res.DataRoot+"/"+res.DataPath, setting.Bucket+"/"+strings.TrimSuffix(res.DataPath, modelSuffix))
  48. case models.StorageScheduleProcessing:
  49. log.Info("ScheduleDataToPeerByKey processing")
  50. case models.StorageScheduleFailed:
  51. log.Error("ScheduleDataToPeerByKey failed:%s", res.StatusMsg)
  52. return fmt.Errorf("GetBackNpuModel failed:%s", res.StatusMsg)
  53. default:
  54. log.Info("ScheduleDataToPeerByKey failed, unknown StatusCode:%d", res.StatusCode)
  55. return fmt.Errorf("GetBackNpuModel failed, unknow StatusCode:%d", res.StatusCode)
  56. }
  57. return nil
  58. }
  59. func HandleScheduleRecords() error {
  60. getUrfsClient()
  61. records, err := models.GetSchedulingRecord()
  62. if err != nil {
  63. log.Error("GetSchedulingRecord failed:%v", err)
  64. return err
  65. }
  66. for _, record := range records {
  67. res, err := urfsClient.CheckScheduleTaskStatusByKey(record.EndPoint, record.Bucket, record.ObjectKey, record.ProxyServer)
  68. if err != nil {
  69. log.Error("CheckScheduleTaskStatusByKey(%d) failed:%v", record.ID, err)
  70. continue
  71. }
  72. record.Status = res.StatusCode
  73. models.UpdateScheduleCols(record, "status")
  74. switch res.StatusCode {
  75. case models.StorageScheduleSucceed:
  76. log.Info("ScheduleDataToPeerByKey(%s) succeed", record.ObjectKey)
  77. decompress(record.Bucket+"/"+record.ObjectKey, setting.Bucket+"/"+strings.TrimSuffix(record.ObjectKey, modelSuffix))
  78. case models.StorageScheduleProcessing:
  79. log.Info("ScheduleDataToPeerByKey(%s) processing", record.ObjectKey)
  80. case models.StorageScheduleFailed:
  81. log.Error("ScheduleDataToPeerByKey(%s) failed:%s", record.ObjectKey, res.StatusMsg)
  82. default:
  83. log.Info("ScheduleDataToPeerByKey(%s) failed, unknown StatusCode:%d", record.ObjectKey, res.StatusCode)
  84. }
  85. }
  86. return nil
  87. }
  88. func decompress(sourceFile, destPath string) {
  89. req, _ := json.Marshal(DecompressReq{
  90. SourceFile: sourceFile,
  91. DestPath: destPath,
  92. })
  93. err := labelmsg.SendDecompressAttachToLabelOBS(string(req))
  94. if err != nil {
  95. log.Error("SendDecompressTask to labelsystem (%s) failed:%s", sourceFile, err.Error())
  96. }
  97. }