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.

storagemeta.go 2.3 kB

7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package metacache
  2. import (
  3. "time"
  4. "gitlink.org.cn/cloudream/common/pkgs/logger"
  5. "gitlink.org.cn/cloudream/jcs-pub/client/types"
  6. stgglb "gitlink.org.cn/cloudream/jcs-pub/common/globals"
  7. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/mq/coordinator"
  8. cortypes "gitlink.org.cn/cloudream/jcs-pub/coordinator/types"
  9. )
  10. func (m *MetaCacheHost) AddStorageMeta() *UserSpaceMeta {
  11. meta := &UserSpaceMeta{
  12. host: m,
  13. }
  14. meta.cache = NewSimpleMetaCache(SimpleMetaCacheConfig[types.UserSpaceID, types.UserSpaceDetail]{
  15. Getter: meta.load,
  16. Expire: time.Minute * 5,
  17. })
  18. m.caches = append(m.caches, meta)
  19. return meta
  20. }
  21. type UserSpaceMeta struct {
  22. host *MetaCacheHost
  23. cache *SimpleMetaCache[types.UserSpaceID, types.UserSpaceDetail]
  24. }
  25. func (s *UserSpaceMeta) Get(spaceID types.UserSpaceID) *types.UserSpaceDetail {
  26. v, ok := s.cache.Get(spaceID)
  27. if ok {
  28. return &v
  29. }
  30. return nil
  31. }
  32. func (s *UserSpaceMeta) GetMany(spaceIDs []types.UserSpaceID) []*types.UserSpaceDetail {
  33. vs, oks := s.cache.GetMany(spaceIDs)
  34. ret := make([]*types.UserSpaceDetail, len(vs))
  35. for i := range vs {
  36. if oks[i] {
  37. ret[i] = &vs[i]
  38. }
  39. }
  40. return ret
  41. }
  42. func (s *UserSpaceMeta) ClearOutdated() {
  43. s.cache.ClearOutdated()
  44. }
  45. func (s *UserSpaceMeta) load(keys []types.UserSpaceID) ([]types.UserSpaceDetail, []bool) {
  46. vs := make([]types.UserSpaceDetail, len(keys))
  47. oks := make([]bool, len(keys))
  48. spaces, err := s.host.db.UserSpace().BatchGetByID(s.host.db.DefCtx(), keys)
  49. if err != nil {
  50. logger.Warnf("batch get user space by id: %v", err)
  51. return vs, oks
  52. }
  53. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  54. if err != nil {
  55. logger.Warnf("new coordinator client: %v", err)
  56. return vs, oks
  57. }
  58. defer stgglb.CoordinatorMQPool.Release(coorCli)
  59. stgIDs := make([]cortypes.StorageID, len(spaces))
  60. for i := range spaces {
  61. stgIDs[i] = spaces[i].StorageID
  62. }
  63. getStgs, err := coorCli.GetStorageDetails(coordinator.ReqGetStorageDetails(stgIDs))
  64. if err != nil {
  65. logger.Warnf("get storage details: %v", err)
  66. return vs, oks
  67. }
  68. for i := range spaces {
  69. if getStgs.Storage[i] != nil {
  70. vs[i] = types.UserSpaceDetail{
  71. UserID: stgglb.Local.UserID,
  72. UserSpace: spaces[i],
  73. Storage: getStgs.Storage[i].Storage,
  74. MasterHub: getStgs.Storage[i].MasterHub,
  75. }
  76. oks[i] = true
  77. }
  78. }
  79. return vs, oks
  80. }

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