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.

shardstore_gc.go 2.8 kB

6 months ago
6 months ago
6 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package ticktock
  2. import (
  3. "fmt"
  4. "time"
  5. "gitlink.org.cn/cloudream/common/pkgs/logger"
  6. "gitlink.org.cn/cloudream/common/utils/reflect2"
  7. "gitlink.org.cn/cloudream/jcs-pub/client/internal/db"
  8. "gitlink.org.cn/cloudream/jcs-pub/client/types"
  9. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/distlock/reqbuilder"
  10. )
  11. type UserSpaceGC struct {
  12. }
  13. func (j *UserSpaceGC) Name() string {
  14. return reflect2.TypeNameOf[UserSpaceGC]()
  15. }
  16. // Execute 执行垃圾回收操作。
  17. func (j *UserSpaceGC) Execute(t *TickTock) {
  18. log := logger.WithType[UserSpaceGC]("Event")
  19. startTime := time.Now()
  20. log.Infof("job start")
  21. defer func() {
  22. log.Infof("job end, time: %v", time.Since(startTime))
  23. }()
  24. spaceIDs, err := t.db.UserSpace().GetAllIDs(t.db.DefCtx())
  25. if err != nil {
  26. log.Warnf("getting user space ids: %v", err)
  27. return
  28. }
  29. for _, spaceID := range spaceIDs {
  30. detail := t.spaceMeta.Get(spaceID)
  31. if detail == nil {
  32. continue
  33. }
  34. j.gcOne(t, detail)
  35. }
  36. }
  37. func (j *UserSpaceGC) gcOne(t *TickTock, space *types.UserSpaceDetail) {
  38. log := logger.WithType[UserSpaceGC]("Event")
  39. mutex, err := reqbuilder.NewBuilder().UserSpace().GC(space.UserSpace.UserSpaceID).MutexLock(t.pubLock)
  40. if err != nil {
  41. log.Warnf("acquire lock: %v", err)
  42. return
  43. }
  44. defer mutex.Unlock()
  45. if err := j.gcShards(t, space); err != nil {
  46. log.Warnf("gc shard store of %v: %v", space.UserSpace.UserSpaceID, err)
  47. }
  48. if err := j.gcTemps(t, space); err != nil {
  49. log.Warnf("gc base store of %v: %v", space.UserSpace.UserSpaceID, err)
  50. }
  51. }
  52. func (j *UserSpaceGC) gcShards(t *TickTock, space *types.UserSpaceDetail) error {
  53. db2 := t.db
  54. // 收集需要进行垃圾回收的文件哈希值
  55. var allFileHashes []types.FileHash
  56. err := db2.DoTx(func(tx db.SQLContext) error {
  57. blocks, err := db2.ObjectBlock().GetByUserSpaceID(tx, space.UserSpace.UserSpaceID)
  58. if err != nil {
  59. return fmt.Errorf("getting object blocks by hub id: %w", err)
  60. }
  61. for _, c := range blocks {
  62. allFileHashes = append(allFileHashes, c.FileHash)
  63. }
  64. objs, err := db2.PinnedObject().GetObjectsByUserSpaceID(tx, space.UserSpace.UserSpaceID)
  65. if err != nil {
  66. return fmt.Errorf("getting pinned objects by hub id: %w", err)
  67. }
  68. for _, o := range objs {
  69. allFileHashes = append(allFileHashes, o.FileHash)
  70. }
  71. return nil
  72. })
  73. if err != nil {
  74. return err
  75. }
  76. store, err := t.stgPool.GetShardStore(space)
  77. if err != nil {
  78. return fmt.Errorf("getting shard store: %w", err)
  79. }
  80. err = store.GC(allFileHashes)
  81. if err != nil {
  82. return fmt.Errorf("gc shard store: %w", err)
  83. }
  84. return nil
  85. }
  86. func (j *UserSpaceGC) gcTemps(t *TickTock, space *types.UserSpaceDetail) error {
  87. store, err := t.stgPool.GetBaseStore(space)
  88. if err != nil {
  89. return fmt.Errorf("getting base store: %w", err)
  90. }
  91. store.CleanTemps()
  92. return nil
  93. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。