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.

bucket.go 3.6 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package services
  2. import (
  3. "fmt"
  4. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  5. stgglb "gitlink.org.cn/cloudream/storage/common/globals"
  6. "gitlink.org.cn/cloudream/storage/common/pkgs/db/model"
  7. "gitlink.org.cn/cloudream/storage/common/pkgs/distlock/reqbuilder"
  8. coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator"
  9. )
  10. type BucketService struct {
  11. *Service
  12. }
  13. func (svc *Service) BucketSvc() *BucketService {
  14. return &BucketService{Service: svc}
  15. }
  16. func (svc *BucketService) GetBucket(userID cdssdk.UserID, bucketID cdssdk.BucketID) (model.Bucket, error) {
  17. // TODO
  18. panic("not implement yet")
  19. }
  20. func (svc *BucketService) GetUserBuckets(userID cdssdk.UserID) ([]model.Bucket, error) {
  21. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  22. if err != nil {
  23. return nil, fmt.Errorf("new coordinator client: %w", err)
  24. }
  25. defer stgglb.CoordinatorMQPool.Release(coorCli)
  26. resp, err := coorCli.GetUserBuckets(coormq.NewGetUserBuckets(userID))
  27. if err != nil {
  28. return nil, fmt.Errorf("get user buckets failed, err: %w", err)
  29. }
  30. return resp.Buckets, nil
  31. }
  32. func (svc *BucketService) GetBucketPackages(userID cdssdk.UserID, bucketID cdssdk.BucketID) ([]model.Package, error) {
  33. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  34. if err != nil {
  35. return nil, fmt.Errorf("new coordinator client: %w", err)
  36. }
  37. defer stgglb.CoordinatorMQPool.Release(coorCli)
  38. resp, err := coorCli.GetBucketPackages(coormq.NewGetBucketPackages(userID, bucketID))
  39. if err != nil {
  40. return nil, fmt.Errorf("get bucket packages failed, err: %w", err)
  41. }
  42. return resp.Packages, nil
  43. }
  44. func (svc *BucketService) CreateBucket(userID cdssdk.UserID, bucketName string) (cdssdk.BucketID, error) {
  45. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  46. if err != nil {
  47. return 0, fmt.Errorf("new coordinator client: %w", err)
  48. }
  49. defer stgglb.CoordinatorMQPool.Release(coorCli)
  50. // TODO 只有阅读了系统操作的源码,才能知道要加哪些锁,但用户的命令可能会调用不止一个系统操作。
  51. // 因此加锁的操作还是必须在用户命令里完成,但具体加锁的内容,则需要被封装起来与系统操作放到一起,方便管理,避免分散改动。
  52. mutex, err := reqbuilder.NewBuilder().
  53. Metadata().Bucket().CreateOne(userID, bucketName).
  54. // TODO 可以考虑二次加锁,加的更精确
  55. UserBucket().CreateAny().
  56. MutexLock(svc.DistLock)
  57. if err != nil {
  58. return 0, fmt.Errorf("acquire locks failed, err: %w", err)
  59. }
  60. defer mutex.Unlock()
  61. resp, err := coorCli.CreateBucket(coormq.NewCreateBucket(userID, bucketName))
  62. if err != nil {
  63. return 0, fmt.Errorf("creating bucket: %w", err)
  64. }
  65. return resp.BucketID, nil
  66. }
  67. func (svc *BucketService) DeleteBucket(userID cdssdk.UserID, bucketID cdssdk.BucketID) error {
  68. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  69. if err != nil {
  70. return fmt.Errorf("new coordinator client: %w", err)
  71. }
  72. defer stgglb.CoordinatorMQPool.Release(coorCli)
  73. // TODO 检查用户是否有删除这个Bucket的权限。检查的时候可以只上UserBucket的Read锁
  74. mutex, err := reqbuilder.NewBuilder().
  75. Metadata().
  76. UserBucket().WriteAny().
  77. Bucket().WriteOne(bucketID).
  78. Package().WriteAny().
  79. Object().WriteAny().
  80. ObjectRep().WriteAny().
  81. ObjectBlock().WriteAny().
  82. StoragePackage().WriteAny().
  83. MutexLock(svc.DistLock)
  84. if err != nil {
  85. return fmt.Errorf("acquire locks failed, err: %w", err)
  86. }
  87. defer mutex.Unlock()
  88. _, err = coorCli.DeleteBucket(coormq.NewDeleteBucket(userID, bucketID))
  89. if err != nil {
  90. return fmt.Errorf("request to coordinator failed, err: %w", err)
  91. }
  92. return nil
  93. }

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