mirror of
https://github.com/project-zot/zot.git
synced 2025-03-25 02:32:57 -05:00
Remove the logic to discard unused locks as it produced deadlocks Signed-off-by: Andrei Aaron <aaaron@luxoft.com>
56 lines
1.1 KiB
Go
56 lines
1.1 KiB
Go
package imagestore
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
type ImageStoreLock struct {
|
|
// locks per repository paths
|
|
repoLocks sync.Map
|
|
}
|
|
|
|
func NewImageStoreLock() *ImageStoreLock {
|
|
return &ImageStoreLock{
|
|
repoLocks: sync.Map{},
|
|
}
|
|
}
|
|
|
|
func (sl *ImageStoreLock) RLockRepo(repo string) {
|
|
val, _ := sl.repoLocks.LoadOrStore(repo, &sync.RWMutex{})
|
|
|
|
// lock individual repo
|
|
repoLock, _ := val.(*sync.RWMutex)
|
|
repoLock.RLock()
|
|
}
|
|
|
|
func (sl *ImageStoreLock) RUnlockRepo(repo string) {
|
|
val, ok := sl.repoLocks.Load(repo)
|
|
if !ok {
|
|
// somehow the unlock is called for repo that was not locked
|
|
return
|
|
}
|
|
|
|
// read-unlock individual repo
|
|
repoLock, _ := val.(*sync.RWMutex)
|
|
repoLock.RUnlock()
|
|
}
|
|
|
|
func (sl *ImageStoreLock) LockRepo(repo string) {
|
|
val, _ := sl.repoLocks.LoadOrStore(repo, &sync.RWMutex{})
|
|
|
|
// write-lock individual repo
|
|
repoLock, _ := val.(*sync.RWMutex)
|
|
repoLock.Lock()
|
|
}
|
|
|
|
func (sl *ImageStoreLock) UnlockRepo(repo string) {
|
|
val, ok := sl.repoLocks.Load(repo)
|
|
if !ok {
|
|
// somehow the unlock is called for a repo that was not locked
|
|
return
|
|
}
|
|
|
|
// write-unlock individual repo
|
|
repoLock, _ := val.(*sync.RWMutex)
|
|
repoLock.Unlock()
|
|
}
|