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.

distlock.go 1.8 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package cmdline
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/samber/lo"
  6. "gitlink.org.cn/cloudream/common/pkgs/distlock"
  7. "gitlink.org.cn/cloudream/common/pkgs/distlock/service"
  8. "gitlink.org.cn/cloudream/storage/common/pkgs/distlock/lockprovider"
  9. )
  10. func DistLockLock(ctx CommandContext, lockData []string) error {
  11. req := distlock.LockRequest{}
  12. for _, lock := range lockData {
  13. l, err := parseOneLock(lock)
  14. if err != nil {
  15. return fmt.Errorf("parse lock data %s failed, err: %w", lock, err)
  16. }
  17. req.Locks = append(req.Locks, l)
  18. }
  19. reqID, err := ctx.Cmdline.Svc.DistLock.Acquire(req, service.AcquireOption{
  20. RetryTimeMs: 5000,
  21. })
  22. if err != nil {
  23. return fmt.Errorf("acquire locks failed, err: %w", err)
  24. }
  25. fmt.Printf("%s\n", reqID)
  26. return nil
  27. }
  28. func parseOneLock(lockData string) (distlock.Lock, error) {
  29. var lock distlock.Lock
  30. fullPathAndTarget := strings.Split(lockData, "@")
  31. if len(fullPathAndTarget) != 2 {
  32. return lock, fmt.Errorf("lock data must contains lock path, name and target")
  33. }
  34. pathAndName := strings.Split(fullPathAndTarget[0], "/")
  35. if len(pathAndName) < 2 {
  36. return lock, fmt.Errorf("lock data must contains lock path, name and target")
  37. }
  38. lock.Path = pathAndName[0 : len(pathAndName)-1]
  39. lock.Name = pathAndName[len(pathAndName)-1]
  40. target := lockprovider.NewStringLockTarget()
  41. comps := strings.Split(fullPathAndTarget[1], "/")
  42. for _, comp := range comps {
  43. target.Add(lo.Map(strings.Split(comp, "."), func(str string, index int) any { return str })...)
  44. }
  45. lock.Target = *target
  46. return lock, nil
  47. }
  48. func DistLockUnlock(ctx CommandContext, reqID string) error {
  49. return ctx.Cmdline.Svc.DistLock.Release(reqID)
  50. }
  51. func init() {
  52. commands.MustAdd(DistLockLock, "distlock", "lock")
  53. commands.MustAdd(DistLockUnlock, "distlock", "unlock")
  54. }

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