diff options
| author | chrislu <chris.lu@gmail.com> | 2023-06-25 00:58:21 -0700 |
|---|---|---|
| committer | chrislu <chris.lu@gmail.com> | 2023-06-25 00:58:21 -0700 |
| commit | 3fd659df2a35c42d6a30ce251413f219ea24d1c2 (patch) | |
| tree | 4fe33062833c3340d618e5c0ea2e7968f446baf5 /weed/cluster/lock_manager/lock_ring.go | |
| parent | 051501414928baeef4a7bba7f62b08f96bcb75f7 (diff) | |
| download | seaweedfs-3fd659df2a35c42d6a30ce251413f219ea24d1c2.tar.xz seaweedfs-3fd659df2a35c42d6a30ce251413f219ea24d1c2.zip | |
add distributed lock manager
Diffstat (limited to 'weed/cluster/lock_manager/lock_ring.go')
| -rw-r--r-- | weed/cluster/lock_manager/lock_ring.go | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/weed/cluster/lock_manager/lock_ring.go b/weed/cluster/lock_manager/lock_ring.go index df5ebebac..eca86618a 100644 --- a/weed/cluster/lock_manager/lock_ring.go +++ b/weed/cluster/lock_manager/lock_ring.go @@ -2,6 +2,7 @@ package lock_manager import ( "github.com/seaweedfs/seaweedfs/weed/pb" + "github.com/seaweedfs/seaweedfs/weed/util" "sort" "sync" "time" @@ -22,14 +23,19 @@ type LockRing struct { onTakeSnapshot func(snapshot []pb.ServerAddress) } -func NewLockRing(snapshotInterval time.Duration, onTakeSnapshot func(snapshot []pb.ServerAddress)) *LockRing { +func NewLockRing(snapshotInterval time.Duration) *LockRing { return &LockRing{ snapshotInterval: snapshotInterval, candidateServers: make(map[pb.ServerAddress]struct{}), - onTakeSnapshot: onTakeSnapshot, } } +func (r *LockRing) SetTakeSnapshotCallback(onTakeSnapshot func(snapshot []pb.ServerAddress)) { + r.Lock() + defer r.Unlock() + r.onTakeSnapshot = onTakeSnapshot +} + // AddServer adds a server to the ring // if the previous snapshot passed the snapshot interval, create a new snapshot func (r *LockRing) AddServer(server pb.ServerAddress) { @@ -144,3 +150,25 @@ func (r *LockRing) getSortedServers() []pb.ServerAddress { }) return sortedServers } + +func (r *LockRing) GetSnapshot() (servers []pb.ServerAddress) { + r.RLock() + defer r.RUnlock() + + if len(r.snapshots) == 0 { + return + } + return r.snapshots[0].servers +} + +func HashKeyToServer(key string, servers []pb.ServerAddress) pb.ServerAddress { + if len(servers) == 0 { + return "" + } + x := util.HashStringToLong(key) + if x < 0 { + x = -x + } + x = x % int64(len(servers)) + return servers[x] +} |
