0
Fork 0
mirror of https://github.com/project-zot/zot.git synced 2025-03-25 02:32:57 -05:00
zot/pkg/storage/imagestore/lock.go
Andrei Aaron a775dcabd8
refactor: switch back to using a syncmap for locking
Remove the logic to discard unused locks as it produced deadlocks

Signed-off-by: Andrei Aaron <aaaron@luxoft.com>
2024-08-17 19:43:29 +00:00

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()
}