Merge pull request #3512 from MichaelEischer/cleaner-lock-refresh

Prevent lock refresh from leaving behind lots of stale locks
This commit is contained in:
Alexander Neumann
2022-03-21 11:10:37 +01:00
committed by GitHub
4 changed files with 22 additions and 10 deletions
+2
View File
@@ -98,6 +98,8 @@ func init() {
var cancel context.CancelFunc
globalOptions.ctx, cancel = context.WithCancel(context.Background())
AddCleanupHandler(func() error {
// Must be called before the unlock cleanup handler to ensure that the latter is
// not blocked due to limited number of backend connections, see #1434
cancel()
return nil
})
+7 -4
View File
@@ -16,6 +16,7 @@ var globalLocks struct {
cancelRefresh chan struct{}
refreshWG sync.WaitGroup
sync.Mutex
sync.Once
}
func lockRepo(ctx context.Context, repo *repository.Repository) (*restic.Lock, error) {
@@ -27,6 +28,12 @@ func lockRepoExclusive(ctx context.Context, repo *repository.Repository) (*resti
}
func lockRepository(ctx context.Context, repo *repository.Repository, exclusive bool) (*restic.Lock, error) {
// make sure that a repository is unlocked properly and after cancel() was
// called by the cleanup handler in global.go
globalLocks.Do(func() {
AddCleanupHandler(unlockAll)
})
lockFn := restic.NewLock
if exclusive {
lockFn = restic.NewExclusiveLock
@@ -128,7 +135,3 @@ func unlockAll() error {
return nil
}
func init() {
AddCleanupHandler(unlockAll)
}