You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

182 lines
5.1 KiB

2 years ago
2 years ago
Squashed commit of the following: commit 482742514656e9b5a652acf7406740fbc55db13d Author: chrislu <chris.lu@gmail.com> Date: Sat Sep 16 15:05:38 2023 -0700 balancer works commit 3b50139f68d5f59961113cf8fd0b903a7294a6ca Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 15 22:22:32 2023 -0700 comments commit 7f685ce7ba8853775e7c02c5b5c242d7920d62d3 Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 15 22:20:05 2023 -0700 adjust APIs commit 436d99443b399082f75f4ceb7595e8b5ac0a8ba3 Author: chrislu <chris.lu@gmail.com> Date: Thu Sep 14 23:49:05 2023 -0700 receive broker stats commit b771fefa374fe237ff1317bbd03a9297a52191e3 Merge: 0a851ec00 890881037 Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 13 00:03:47 2023 -0700 Merge branch 'master' into sub commit 0a851ec00b455c72b405503f6f1f41728b15962e Author: chrislu <chris.lu@gmail.com> Date: Sun Sep 10 22:01:25 2023 -0700 Create balancer.go commit 39941edc0bae3b9a4a2c3344caf494f7ab80a82a Author: chrislu <chris.lu@gmail.com> Date: Thu Sep 7 23:55:19 2023 -0700 add publisher shutdown commit 875f562779f239a140d1008732b5375c0e511e61 Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 23:16:41 2023 -0700 server side send response at least once per second commit 984b6c54cf6b0defaa6e727ab5e36809411fe92c Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 23:15:29 2023 -0700 ack interval 128 commit 2492a454997a59ffe00405e365290addc460078a Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 22:39:46 2023 -0700 ack interval commit ba67e6ca2998e82eb23abf5c431bdf9a92e966ea Author: chrislu <chris.lu@gmail.com> Date: Mon Sep 4 21:43:50 2023 -0700 api for sub commit 9e4f98569898985ed285d8bb8a39b4ea5f095a98 Author: chrislu <chris.lu@gmail.com> Date: Mon Sep 4 21:43:30 2023 -0700 publish, benchmark commit cb470d44df2fed94ad8fd370b1c281cb126d373b Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 1 00:36:51 2023 -0700 can pub and sub commit 1eb2da46d5d5a52c1012aa19ef31c1c8ed568d9e Author: chrislu <chris.lu@gmail.com> Date: Mon Aug 28 09:02:12 2023 -0700 connect and publish commit 504ae8383ac3a0838d31d04b31623872b5734b31 Author: chrislu <chris.lu@gmail.com> Date: Mon Aug 28 09:01:25 2023 -0700 protoc version commit dbcba75271a4617b5931c4779ca0f7c924369a8f Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 18:59:04 2023 -0700 rename to lookup commit c9caf3311995290c36ed369b48fbbab23d6bc7b5 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 18:33:46 2023 -0700 move functions commit 4d6c18d86f07ee35625f207c94539727944a8776 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 17:50:59 2023 -0700 pub sub initial tests commit 4eb8e8624d8280d8aa4a227afc06bcacbfe732a7 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 13:14:39 2023 -0700 rename commit 19904566706e9dba502f1ffd1f6fdf0bf876e99c Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 13:13:14 2023 -0700 sub commit 905911853dd5103496e8fc9b47934fa3a48da214 Author: chrislu <chris.lu@gmail.com> Date: Sat Aug 26 13:39:21 2023 -0700 adjust proto
1 year ago
Squashed commit of the following: commit 482742514656e9b5a652acf7406740fbc55db13d Author: chrislu <chris.lu@gmail.com> Date: Sat Sep 16 15:05:38 2023 -0700 balancer works commit 3b50139f68d5f59961113cf8fd0b903a7294a6ca Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 15 22:22:32 2023 -0700 comments commit 7f685ce7ba8853775e7c02c5b5c242d7920d62d3 Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 15 22:20:05 2023 -0700 adjust APIs commit 436d99443b399082f75f4ceb7595e8b5ac0a8ba3 Author: chrislu <chris.lu@gmail.com> Date: Thu Sep 14 23:49:05 2023 -0700 receive broker stats commit b771fefa374fe237ff1317bbd03a9297a52191e3 Merge: 0a851ec00 890881037 Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 13 00:03:47 2023 -0700 Merge branch 'master' into sub commit 0a851ec00b455c72b405503f6f1f41728b15962e Author: chrislu <chris.lu@gmail.com> Date: Sun Sep 10 22:01:25 2023 -0700 Create balancer.go commit 39941edc0bae3b9a4a2c3344caf494f7ab80a82a Author: chrislu <chris.lu@gmail.com> Date: Thu Sep 7 23:55:19 2023 -0700 add publisher shutdown commit 875f562779f239a140d1008732b5375c0e511e61 Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 23:16:41 2023 -0700 server side send response at least once per second commit 984b6c54cf6b0defaa6e727ab5e36809411fe92c Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 23:15:29 2023 -0700 ack interval 128 commit 2492a454997a59ffe00405e365290addc460078a Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 22:39:46 2023 -0700 ack interval commit ba67e6ca2998e82eb23abf5c431bdf9a92e966ea Author: chrislu <chris.lu@gmail.com> Date: Mon Sep 4 21:43:50 2023 -0700 api for sub commit 9e4f98569898985ed285d8bb8a39b4ea5f095a98 Author: chrislu <chris.lu@gmail.com> Date: Mon Sep 4 21:43:30 2023 -0700 publish, benchmark commit cb470d44df2fed94ad8fd370b1c281cb126d373b Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 1 00:36:51 2023 -0700 can pub and sub commit 1eb2da46d5d5a52c1012aa19ef31c1c8ed568d9e Author: chrislu <chris.lu@gmail.com> Date: Mon Aug 28 09:02:12 2023 -0700 connect and publish commit 504ae8383ac3a0838d31d04b31623872b5734b31 Author: chrislu <chris.lu@gmail.com> Date: Mon Aug 28 09:01:25 2023 -0700 protoc version commit dbcba75271a4617b5931c4779ca0f7c924369a8f Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 18:59:04 2023 -0700 rename to lookup commit c9caf3311995290c36ed369b48fbbab23d6bc7b5 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 18:33:46 2023 -0700 move functions commit 4d6c18d86f07ee35625f207c94539727944a8776 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 17:50:59 2023 -0700 pub sub initial tests commit 4eb8e8624d8280d8aa4a227afc06bcacbfe732a7 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 13:14:39 2023 -0700 rename commit 19904566706e9dba502f1ffd1f6fdf0bf876e99c Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 13:13:14 2023 -0700 sub commit 905911853dd5103496e8fc9b47934fa3a48da214 Author: chrislu <chris.lu@gmail.com> Date: Sat Aug 26 13:39:21 2023 -0700 adjust proto
1 year ago
Squashed commit of the following: commit 482742514656e9b5a652acf7406740fbc55db13d Author: chrislu <chris.lu@gmail.com> Date: Sat Sep 16 15:05:38 2023 -0700 balancer works commit 3b50139f68d5f59961113cf8fd0b903a7294a6ca Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 15 22:22:32 2023 -0700 comments commit 7f685ce7ba8853775e7c02c5b5c242d7920d62d3 Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 15 22:20:05 2023 -0700 adjust APIs commit 436d99443b399082f75f4ceb7595e8b5ac0a8ba3 Author: chrislu <chris.lu@gmail.com> Date: Thu Sep 14 23:49:05 2023 -0700 receive broker stats commit b771fefa374fe237ff1317bbd03a9297a52191e3 Merge: 0a851ec00 890881037 Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 13 00:03:47 2023 -0700 Merge branch 'master' into sub commit 0a851ec00b455c72b405503f6f1f41728b15962e Author: chrislu <chris.lu@gmail.com> Date: Sun Sep 10 22:01:25 2023 -0700 Create balancer.go commit 39941edc0bae3b9a4a2c3344caf494f7ab80a82a Author: chrislu <chris.lu@gmail.com> Date: Thu Sep 7 23:55:19 2023 -0700 add publisher shutdown commit 875f562779f239a140d1008732b5375c0e511e61 Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 23:16:41 2023 -0700 server side send response at least once per second commit 984b6c54cf6b0defaa6e727ab5e36809411fe92c Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 23:15:29 2023 -0700 ack interval 128 commit 2492a454997a59ffe00405e365290addc460078a Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 22:39:46 2023 -0700 ack interval commit ba67e6ca2998e82eb23abf5c431bdf9a92e966ea Author: chrislu <chris.lu@gmail.com> Date: Mon Sep 4 21:43:50 2023 -0700 api for sub commit 9e4f98569898985ed285d8bb8a39b4ea5f095a98 Author: chrislu <chris.lu@gmail.com> Date: Mon Sep 4 21:43:30 2023 -0700 publish, benchmark commit cb470d44df2fed94ad8fd370b1c281cb126d373b Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 1 00:36:51 2023 -0700 can pub and sub commit 1eb2da46d5d5a52c1012aa19ef31c1c8ed568d9e Author: chrislu <chris.lu@gmail.com> Date: Mon Aug 28 09:02:12 2023 -0700 connect and publish commit 504ae8383ac3a0838d31d04b31623872b5734b31 Author: chrislu <chris.lu@gmail.com> Date: Mon Aug 28 09:01:25 2023 -0700 protoc version commit dbcba75271a4617b5931c4779ca0f7c924369a8f Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 18:59:04 2023 -0700 rename to lookup commit c9caf3311995290c36ed369b48fbbab23d6bc7b5 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 18:33:46 2023 -0700 move functions commit 4d6c18d86f07ee35625f207c94539727944a8776 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 17:50:59 2023 -0700 pub sub initial tests commit 4eb8e8624d8280d8aa4a227afc06bcacbfe732a7 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 13:14:39 2023 -0700 rename commit 19904566706e9dba502f1ffd1f6fdf0bf876e99c Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 13:13:14 2023 -0700 sub commit 905911853dd5103496e8fc9b47934fa3a48da214 Author: chrislu <chris.lu@gmail.com> Date: Sat Aug 26 13:39:21 2023 -0700 adjust proto
1 year ago
Squashed commit of the following: commit 482742514656e9b5a652acf7406740fbc55db13d Author: chrislu <chris.lu@gmail.com> Date: Sat Sep 16 15:05:38 2023 -0700 balancer works commit 3b50139f68d5f59961113cf8fd0b903a7294a6ca Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 15 22:22:32 2023 -0700 comments commit 7f685ce7ba8853775e7c02c5b5c242d7920d62d3 Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 15 22:20:05 2023 -0700 adjust APIs commit 436d99443b399082f75f4ceb7595e8b5ac0a8ba3 Author: chrislu <chris.lu@gmail.com> Date: Thu Sep 14 23:49:05 2023 -0700 receive broker stats commit b771fefa374fe237ff1317bbd03a9297a52191e3 Merge: 0a851ec00 890881037 Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 13 00:03:47 2023 -0700 Merge branch 'master' into sub commit 0a851ec00b455c72b405503f6f1f41728b15962e Author: chrislu <chris.lu@gmail.com> Date: Sun Sep 10 22:01:25 2023 -0700 Create balancer.go commit 39941edc0bae3b9a4a2c3344caf494f7ab80a82a Author: chrislu <chris.lu@gmail.com> Date: Thu Sep 7 23:55:19 2023 -0700 add publisher shutdown commit 875f562779f239a140d1008732b5375c0e511e61 Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 23:16:41 2023 -0700 server side send response at least once per second commit 984b6c54cf6b0defaa6e727ab5e36809411fe92c Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 23:15:29 2023 -0700 ack interval 128 commit 2492a454997a59ffe00405e365290addc460078a Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 22:39:46 2023 -0700 ack interval commit ba67e6ca2998e82eb23abf5c431bdf9a92e966ea Author: chrislu <chris.lu@gmail.com> Date: Mon Sep 4 21:43:50 2023 -0700 api for sub commit 9e4f98569898985ed285d8bb8a39b4ea5f095a98 Author: chrislu <chris.lu@gmail.com> Date: Mon Sep 4 21:43:30 2023 -0700 publish, benchmark commit cb470d44df2fed94ad8fd370b1c281cb126d373b Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 1 00:36:51 2023 -0700 can pub and sub commit 1eb2da46d5d5a52c1012aa19ef31c1c8ed568d9e Author: chrislu <chris.lu@gmail.com> Date: Mon Aug 28 09:02:12 2023 -0700 connect and publish commit 504ae8383ac3a0838d31d04b31623872b5734b31 Author: chrislu <chris.lu@gmail.com> Date: Mon Aug 28 09:01:25 2023 -0700 protoc version commit dbcba75271a4617b5931c4779ca0f7c924369a8f Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 18:59:04 2023 -0700 rename to lookup commit c9caf3311995290c36ed369b48fbbab23d6bc7b5 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 18:33:46 2023 -0700 move functions commit 4d6c18d86f07ee35625f207c94539727944a8776 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 17:50:59 2023 -0700 pub sub initial tests commit 4eb8e8624d8280d8aa4a227afc06bcacbfe732a7 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 13:14:39 2023 -0700 rename commit 19904566706e9dba502f1ffd1f6fdf0bf876e99c Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 13:13:14 2023 -0700 sub commit 905911853dd5103496e8fc9b47934fa3a48da214 Author: chrislu <chris.lu@gmail.com> Date: Sat Aug 26 13:39:21 2023 -0700 adjust proto
1 year ago
Squashed commit of the following: commit 482742514656e9b5a652acf7406740fbc55db13d Author: chrislu <chris.lu@gmail.com> Date: Sat Sep 16 15:05:38 2023 -0700 balancer works commit 3b50139f68d5f59961113cf8fd0b903a7294a6ca Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 15 22:22:32 2023 -0700 comments commit 7f685ce7ba8853775e7c02c5b5c242d7920d62d3 Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 15 22:20:05 2023 -0700 adjust APIs commit 436d99443b399082f75f4ceb7595e8b5ac0a8ba3 Author: chrislu <chris.lu@gmail.com> Date: Thu Sep 14 23:49:05 2023 -0700 receive broker stats commit b771fefa374fe237ff1317bbd03a9297a52191e3 Merge: 0a851ec00 890881037 Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 13 00:03:47 2023 -0700 Merge branch 'master' into sub commit 0a851ec00b455c72b405503f6f1f41728b15962e Author: chrislu <chris.lu@gmail.com> Date: Sun Sep 10 22:01:25 2023 -0700 Create balancer.go commit 39941edc0bae3b9a4a2c3344caf494f7ab80a82a Author: chrislu <chris.lu@gmail.com> Date: Thu Sep 7 23:55:19 2023 -0700 add publisher shutdown commit 875f562779f239a140d1008732b5375c0e511e61 Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 23:16:41 2023 -0700 server side send response at least once per second commit 984b6c54cf6b0defaa6e727ab5e36809411fe92c Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 23:15:29 2023 -0700 ack interval 128 commit 2492a454997a59ffe00405e365290addc460078a Author: chrislu <chris.lu@gmail.com> Date: Wed Sep 6 22:39:46 2023 -0700 ack interval commit ba67e6ca2998e82eb23abf5c431bdf9a92e966ea Author: chrislu <chris.lu@gmail.com> Date: Mon Sep 4 21:43:50 2023 -0700 api for sub commit 9e4f98569898985ed285d8bb8a39b4ea5f095a98 Author: chrislu <chris.lu@gmail.com> Date: Mon Sep 4 21:43:30 2023 -0700 publish, benchmark commit cb470d44df2fed94ad8fd370b1c281cb126d373b Author: chrislu <chris.lu@gmail.com> Date: Fri Sep 1 00:36:51 2023 -0700 can pub and sub commit 1eb2da46d5d5a52c1012aa19ef31c1c8ed568d9e Author: chrislu <chris.lu@gmail.com> Date: Mon Aug 28 09:02:12 2023 -0700 connect and publish commit 504ae8383ac3a0838d31d04b31623872b5734b31 Author: chrislu <chris.lu@gmail.com> Date: Mon Aug 28 09:01:25 2023 -0700 protoc version commit dbcba75271a4617b5931c4779ca0f7c924369a8f Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 18:59:04 2023 -0700 rename to lookup commit c9caf3311995290c36ed369b48fbbab23d6bc7b5 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 18:33:46 2023 -0700 move functions commit 4d6c18d86f07ee35625f207c94539727944a8776 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 17:50:59 2023 -0700 pub sub initial tests commit 4eb8e8624d8280d8aa4a227afc06bcacbfe732a7 Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 13:14:39 2023 -0700 rename commit 19904566706e9dba502f1ffd1f6fdf0bf876e99c Author: chrislu <chris.lu@gmail.com> Date: Sun Aug 27 13:13:14 2023 -0700 sub commit 905911853dd5103496e8fc9b47934fa3a48da214 Author: chrislu <chris.lu@gmail.com> Date: Sat Aug 26 13:39:21 2023 -0700 adjust proto
1 year ago
  1. package lock_manager
  2. import (
  3. "fmt"
  4. "github.com/google/uuid"
  5. "github.com/seaweedfs/seaweedfs/weed/glog"
  6. "sync"
  7. "time"
  8. )
  9. var LockErrorNonEmptyTokenOnNewLock = fmt.Errorf("lock: non-empty token on a new lock")
  10. var LockErrorNonEmptyTokenOnExpiredLock = fmt.Errorf("lock: non-empty token on an expired lock")
  11. var LockErrorTokenMismatch = fmt.Errorf("lock: token mismatch")
  12. var UnlockErrorTokenMismatch = fmt.Errorf("unlock: token mismatch")
  13. var LockNotFound = fmt.Errorf("lock not found")
  14. // LockManager local lock manager, used by distributed lock manager
  15. type LockManager struct {
  16. locks map[string]*Lock
  17. accessLock sync.RWMutex
  18. }
  19. type Lock struct {
  20. Token string
  21. ExpiredAtNs int64
  22. Key string // only used for moving locks
  23. Owner string
  24. }
  25. func NewLockManager() *LockManager {
  26. t := &LockManager{
  27. locks: make(map[string]*Lock),
  28. }
  29. go t.CleanUp()
  30. return t
  31. }
  32. func (lm *LockManager) Lock(path string, expiredAtNs int64, token string, owner string) (lockOwner, renewToken string, err error) {
  33. lm.accessLock.Lock()
  34. defer lm.accessLock.Unlock()
  35. glog.V(4).Infof("lock %s %v %v %v", path, time.Unix(0, expiredAtNs), token, owner)
  36. if oldValue, found := lm.locks[path]; found {
  37. if oldValue.ExpiredAtNs > 0 && oldValue.ExpiredAtNs < time.Now().UnixNano() {
  38. // lock is expired, set to a new lock
  39. if token != "" {
  40. glog.V(4).Infof("lock expired key %s non-empty token %v owner %v ts %s", path, token, owner, time.Unix(0, oldValue.ExpiredAtNs))
  41. err = LockErrorNonEmptyTokenOnExpiredLock
  42. return
  43. } else {
  44. // new lock
  45. renewToken = uuid.New().String()
  46. glog.V(4).Infof("key %s new token %v owner %v", path, renewToken, owner)
  47. lm.locks[path] = &Lock{Token: renewToken, ExpiredAtNs: expiredAtNs, Owner: owner}
  48. return
  49. }
  50. }
  51. // not expired
  52. lockOwner = oldValue.Owner
  53. if oldValue.Token == token {
  54. // token matches, renew the lock
  55. renewToken = uuid.New().String()
  56. glog.V(4).Infof("key %s old token %v owner %v => %v owner %v", path, oldValue.Token, oldValue.Owner, renewToken, owner)
  57. lm.locks[path] = &Lock{Token: renewToken, ExpiredAtNs: expiredAtNs, Owner: owner}
  58. return
  59. } else {
  60. if token == "" {
  61. // new lock
  62. glog.V(4).Infof("key %s locked by %v", path, oldValue.Owner)
  63. err = fmt.Errorf("lock already owned by %v", oldValue.Owner)
  64. return
  65. }
  66. glog.V(4).Infof("key %s expected token %v owner %v received %v from %v", path, oldValue.Token, oldValue.Owner, token, owner)
  67. err = fmt.Errorf("lock: token mismatch")
  68. return
  69. }
  70. } else {
  71. glog.V(4).Infof("key %s no lock owner %v", path, owner)
  72. if token == "" {
  73. // new lock
  74. glog.V(4).Infof("key %s new token %v owner %v", path, token, owner)
  75. renewToken = uuid.New().String()
  76. lm.locks[path] = &Lock{Token: renewToken, ExpiredAtNs: expiredAtNs, Owner: owner}
  77. return
  78. } else {
  79. glog.V(4).Infof("key %s non-empty token %v owner %v", path, token, owner)
  80. err = LockErrorNonEmptyTokenOnNewLock
  81. return
  82. }
  83. }
  84. }
  85. func (lm *LockManager) Unlock(path string, token string) (isUnlocked bool, err error) {
  86. lm.accessLock.Lock()
  87. defer lm.accessLock.Unlock()
  88. if oldValue, found := lm.locks[path]; found {
  89. now := time.Now()
  90. if oldValue.ExpiredAtNs > 0 && oldValue.ExpiredAtNs < now.UnixNano() {
  91. // lock is expired, delete it
  92. isUnlocked = true
  93. glog.V(4).Infof("key %s expired at %v", path, time.Unix(0, oldValue.ExpiredAtNs))
  94. delete(lm.locks, path)
  95. return
  96. }
  97. if oldValue.Token == token {
  98. isUnlocked = true
  99. glog.V(4).Infof("key %s unlocked with %v", path, token)
  100. delete(lm.locks, path)
  101. return
  102. } else {
  103. isUnlocked = false
  104. err = UnlockErrorTokenMismatch
  105. return
  106. }
  107. }
  108. err = LockNotFound
  109. return
  110. }
  111. func (lm *LockManager) CleanUp() {
  112. for {
  113. time.Sleep(1 * time.Minute)
  114. now := time.Now().UnixNano()
  115. lm.accessLock.Lock()
  116. for key, value := range lm.locks {
  117. if value == nil {
  118. continue
  119. }
  120. if now > value.ExpiredAtNs {
  121. glog.V(4).Infof("key %s expired at %v", key, time.Unix(0, value.ExpiredAtNs))
  122. delete(lm.locks, key)
  123. }
  124. }
  125. lm.accessLock.Unlock()
  126. }
  127. }
  128. // SelectLocks takes out locks by key
  129. // if keyFn return true, the lock will be taken out
  130. func (lm *LockManager) SelectLocks(selectFn func(key string) bool) (locks []*Lock) {
  131. lm.accessLock.RLock()
  132. defer lm.accessLock.RUnlock()
  133. now := time.Now().UnixNano()
  134. for key, lock := range lm.locks {
  135. if now > lock.ExpiredAtNs {
  136. glog.V(4).Infof("key %s expired at %v", key, time.Unix(0, lock.ExpiredAtNs))
  137. delete(lm.locks, key)
  138. continue
  139. }
  140. if selectFn(key) {
  141. glog.V(4).Infof("key %s selected and deleted", key)
  142. delete(lm.locks, key)
  143. lock.Key = key
  144. locks = append(locks, lock)
  145. }
  146. }
  147. return
  148. }
  149. // InsertLock inserts a lock unconditionally
  150. func (lm *LockManager) InsertLock(path string, expiredAtNs int64, token string, owner string) {
  151. lm.accessLock.Lock()
  152. defer lm.accessLock.Unlock()
  153. lm.locks[path] = &Lock{Token: token, ExpiredAtNs: expiredAtNs, Owner: owner}
  154. }
  155. func (lm *LockManager) GetLockOwner(key string) (owner string, err error) {
  156. lm.accessLock.RLock()
  157. defer lm.accessLock.RUnlock()
  158. if lock, found := lm.locks[key]; found {
  159. return lock.Owner, nil
  160. }
  161. err = LockNotFound
  162. return
  163. }