From 8e71a92976094538822a1c9b10583008c604ed80 Mon Sep 17 00:00:00 2001 From: Winfried Plappert Date: Wed, 5 Mar 2025 22:09:58 +0000 Subject: [PATCH] repository/repository: fixed race condition i by having a global lock attached to the Repository structure --- internal/repository/repository.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/internal/repository/repository.go b/internal/repository/repository.go index 270c64e72..c7850c29d 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -52,7 +52,9 @@ type Repository struct { enc *zstd.Encoder dec *zstd.Decoder - MaxRepoCapReached bool + maxRepoCapReached bool + maxRepoMutex sync.Mutex + } // internalRepository allows using SaveUnpacked and RemoveUnpacked with all FileTypes @@ -400,14 +402,14 @@ func (r *Repository) saveAndEncrypt(ctx context.Context, t restic.BlobType, data var m sync.Mutex // maximum repository capacity exceeded? - m.Lock() - defer m.Unlock() + r.maxRepoMutex.Lock() + defer r.maxRepoMutex.Unlock() if r.opts.RepoSizeMax > 0 { r.opts.repoCurSize += uint64(length) if r.opts.repoCurSize > r.opts.RepoSizeMax { - if !r.MaxRepoCapReached { + if !r.maxRepoCapReached { debug.Log("MaxCapacityExceeded") - r.MaxRepoCapReached = true + r.maxRepoCapReached = true } return length, errors.New("MaxCapacityExceeded") } @@ -440,7 +442,7 @@ func (r *Repository) MaxCapacityExceeded() bool { if r.opts.RepoSizeMax == 0 { return false } - return r.MaxRepoCapReached + return r.maxRepoCapReached } // CapacityChecker has to satisfy restic.Repository interface needs