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.7 kB

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

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