diff --git a/satellite/overlay/keylock.go b/satellite/overlay/keylock.go deleted file mode 100644 index ae267c824..000000000 --- a/satellite/overlay/keylock.go +++ /dev/null @@ -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 -} diff --git a/satellite/overlay/keylock_test.go b/satellite/overlay/keylock_test.go deleted file mode 100644 index 3c5115236..000000000 --- a/satellite/overlay/keylock_test.go +++ /dev/null @@ -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() - } - }) -}