satellite/overlay: remove unused KeyLock

Change-Id: Ie99f97772824ceafb3d97453545fc6e96be2fb6f
This commit is contained in:
Egon Elbre 2020-03-30 16:47:44 +03:00
parent de903a652d
commit a6540dc3ef
2 changed files with 0 additions and 116 deletions

View File

@ -1,64 +0,0 @@
// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information
package overlay
import (
"sync"
"storj.io/common/storj"
)
// KeyLock provides per-key RW locking. Locking is key-specific, meaning lock
// contention only exists for locking calls using the same key parameter. As
// with all locks, do not call Unlock() or RUnlock() before a corresponding
// Lock() or RLock() call.
//
// Note on memory usage: internally KeyLock lazily and atomically creates a
// separate sync.RWMutex for each key. To maintain synchronization guarantees,
// these interal mutexes are not freed until the entire KeyLock instance is
// freed.
type KeyLock struct {
locksMu sync.Mutex
locks map[storj.NodeID]*sync.RWMutex
}
// UnlockFunc is the function to unlock the associated successful lock
type UnlockFunc func()
// NewKeyLock create a new KeyLock
func NewKeyLock() *KeyLock {
return &KeyLock{
locks: make(map[storj.NodeID]*sync.RWMutex),
}
}
// Lock the provided key. Returns the unlock function.
func (l *KeyLock) Lock(nodeID storj.NodeID) UnlockFunc {
lock := l.getLock(nodeID)
lock.Lock()
return lock.Unlock
}
// RLock the provided key. Returns the unlock function.
func (l *KeyLock) RLock(nodeID storj.NodeID) UnlockFunc {
lock := l.getLock(nodeID)
lock.RLock()
return lock.RUnlock
}
// getLock will atomically load the RWMutex for this key. If one does not yet
// exist, it will be lazily and atomically created. The resulting RWMutex is
// returned.
func (l *KeyLock) getLock(nodeID storj.NodeID) *sync.RWMutex {
l.locksMu.Lock()
defer l.locksMu.Unlock()
lo, ok := l.locks[nodeID]
if ok {
return lo
}
mu := &sync.RWMutex{}
l.locks[nodeID] = mu
return mu
}

View File

@ -1,52 +0,0 @@
// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information
package overlay_test
import (
"testing"
"storj.io/common/storj"
"storj.io/common/testrand"
"storj.io/storj/private/teststorj"
"storj.io/storj/satellite/overlay"
)
func TestKeyLock(t *testing.T) {
ml := overlay.NewKeyLock()
key := teststorj.NodeIDFromString("hi")
unlockFunc := ml.Lock(key)
unlockFunc()
unlockFunc = ml.RLock(key)
unlockFunc()
}
func BenchmarkKeyLock(b *testing.B) {
b.ReportAllocs()
ml := overlay.NewKeyLock()
numNodes := 100
nodeIDs := make([]storj.NodeID, numNodes)
for i := 0; i < numNodes; i++ {
nodeIDs[i] = testrand.NodeID()
}
b.Run("lock all new nodes", func(b *testing.B) {
for i := 0; i < b.N; i++ {
unlockFunc := ml.Lock(testrand.NodeID())
unlockFunc()
}
})
b.Run("lock existing nodes", func(b *testing.B) {
for i := 0; i < b.N; i++ {
idx := i % numNodes
unlockFunc := ml.Lock(nodeIDs[idx])
unlockFunc()
}
})
b.Run("rlock existing nodes", func(b *testing.B) {
for i := 0; i < b.N; i++ {
idx := i % numNodes
unlockFunc := ml.RLock(nodeIDs[idx])
unlockFunc()
}
})
}