From 928914f82151c0881405fbbf567be3a78dd12924 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sun, 31 Oct 2021 23:19:27 +0100 Subject: [PATCH] Prepare for context bound to lock lifetime --- cmd/restic/cmd_backup.go | 2 +- cmd/restic/cmd_cat.go | 6 +++--- cmd/restic/cmd_check.go | 3 ++- cmd/restic/cmd_copy.go | 5 +++-- cmd/restic/cmd_debug.go | 6 ++++-- cmd/restic/cmd_diff.go | 3 ++- cmd/restic/cmd_dump.go | 3 ++- cmd/restic/cmd_find.go | 3 ++- cmd/restic/cmd_forget.go | 3 ++- cmd/restic/cmd_key.go | 8 ++++---- cmd/restic/cmd_list.go | 3 ++- cmd/restic/cmd_migrate.go | 2 +- cmd/restic/cmd_mount.go | 4 +++- cmd/restic/cmd_prune.go | 2 +- cmd/restic/cmd_rebuild_index.go | 2 +- cmd/restic/cmd_recover.go | 2 +- cmd/restic/cmd_restore.go | 3 ++- cmd/restic/cmd_snapshots.go | 3 ++- cmd/restic/cmd_stats.go | 3 ++- cmd/restic/cmd_tag.go | 3 ++- cmd/restic/lock.go | 10 +++++----- 21 files changed, 47 insertions(+), 32 deletions(-) diff --git a/cmd/restic/cmd_backup.go b/cmd/restic/cmd_backup.go index 1bd86ceeb..cb4c25141 100644 --- a/cmd/restic/cmd_backup.go +++ b/cmd/restic/cmd_backup.go @@ -586,7 +586,7 @@ func runBackup(ctx context.Context, opts BackupOptions, gopts GlobalOptions, ter if !gopts.JSON { progressPrinter.V("lock repository") } - lock, err := lockRepo(ctx, repo) + lock, ctx, err := lockRepo(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_cat.go b/cmd/restic/cmd_cat.go index dcdfc6e8c..c2fedfcd4 100644 --- a/cmd/restic/cmd_cat.go +++ b/cmd/restic/cmd_cat.go @@ -44,12 +44,12 @@ func runCat(ctx context.Context, gopts GlobalOptions, args []string) error { } if !gopts.NoLock { - lock, err := lockRepo(ctx, repo) + var lock *restic.Lock + lock, ctx, err = lockRepo(ctx, repo) + defer unlockRepo(lock) if err != nil { return err } - - defer unlockRepo(lock) } tpe := args[0] diff --git a/cmd/restic/cmd_check.go b/cmd/restic/cmd_check.go index 899a6a232..0b20a5061 100644 --- a/cmd/restic/cmd_check.go +++ b/cmd/restic/cmd_check.go @@ -210,7 +210,8 @@ func runCheck(ctx context.Context, opts CheckOptions, gopts GlobalOptions, args if !gopts.NoLock { Verbosef("create exclusive lock for repository\n") - lock, err := lockRepoExclusive(ctx, repo) + var lock *restic.Lock + lock, ctx, err = lockRepoExclusive(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_copy.go b/cmd/restic/cmd_copy.go index 3aae94b13..8acbfc288 100644 --- a/cmd/restic/cmd_copy.go +++ b/cmd/restic/cmd_copy.go @@ -73,14 +73,15 @@ func runCopy(ctx context.Context, opts CopyOptions, gopts GlobalOptions, args [] } if !gopts.NoLock { - srcLock, err := lockRepo(ctx, srcRepo) + var srcLock *restic.Lock + srcLock, ctx, err = lockRepo(ctx, srcRepo) defer unlockRepo(srcLock) if err != nil { return err } } - dstLock, err := lockRepo(ctx, dstRepo) + dstLock, ctx, err := lockRepo(ctx, dstRepo) defer unlockRepo(dstLock) if err != nil { return err diff --git a/cmd/restic/cmd_debug.go b/cmd/restic/cmd_debug.go index f7cb30381..71bad2dac 100644 --- a/cmd/restic/cmd_debug.go +++ b/cmd/restic/cmd_debug.go @@ -152,7 +152,8 @@ func runDebugDump(ctx context.Context, gopts GlobalOptions, args []string) error } if !gopts.NoLock { - lock, err := lockRepo(ctx, repo) + var lock *restic.Lock + lock, ctx, err = lockRepo(ctx, repo) defer unlockRepo(lock) if err != nil { return err @@ -453,7 +454,8 @@ func runDebugExamine(ctx context.Context, gopts GlobalOptions, args []string) er } if !gopts.NoLock { - lock, err := lockRepo(ctx, repo) + var lock *restic.Lock + lock, ctx, err = lockRepo(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_diff.go b/cmd/restic/cmd_diff.go index e5fd95915..967995072 100644 --- a/cmd/restic/cmd_diff.go +++ b/cmd/restic/cmd_diff.go @@ -332,7 +332,8 @@ func runDiff(ctx context.Context, opts DiffOptions, gopts GlobalOptions, args [] } if !gopts.NoLock { - lock, err := lockRepo(ctx, repo) + var lock *restic.Lock + lock, ctx, err = lockRepo(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_dump.go b/cmd/restic/cmd_dump.go index d0c795969..f892225cf 100644 --- a/cmd/restic/cmd_dump.go +++ b/cmd/restic/cmd_dump.go @@ -131,7 +131,8 @@ func runDump(ctx context.Context, opts DumpOptions, gopts GlobalOptions, args [] } if !gopts.NoLock { - lock, err := lockRepo(ctx, repo) + var lock *restic.Lock + lock, ctx, err = lockRepo(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_find.go b/cmd/restic/cmd_find.go index 5b4cf503f..d47495ed5 100644 --- a/cmd/restic/cmd_find.go +++ b/cmd/restic/cmd_find.go @@ -574,7 +574,8 @@ func runFind(ctx context.Context, opts FindOptions, gopts GlobalOptions, args [] } if !gopts.NoLock { - lock, err := lockRepo(ctx, repo) + var lock *restic.Lock + lock, ctx, err = lockRepo(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_forget.go b/cmd/restic/cmd_forget.go index 112618bd1..60f454e69 100644 --- a/cmd/restic/cmd_forget.go +++ b/cmd/restic/cmd_forget.go @@ -115,7 +115,8 @@ func runForget(ctx context.Context, opts ForgetOptions, gopts GlobalOptions, arg } if !opts.DryRun || !gopts.NoLock { - lock, err := lockRepoExclusive(ctx, repo) + var lock *restic.Lock + lock, ctx, err = lockRepoExclusive(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_key.go b/cmd/restic/cmd_key.go index c8588eb59..b497343e4 100644 --- a/cmd/restic/cmd_key.go +++ b/cmd/restic/cmd_key.go @@ -209,7 +209,7 @@ func runKey(ctx context.Context, gopts GlobalOptions, args []string) error { switch args[0] { case "list": - lock, err := lockRepo(ctx, repo) + lock, ctx, err := lockRepo(ctx, repo) defer unlockRepo(lock) if err != nil { return err @@ -217,7 +217,7 @@ func runKey(ctx context.Context, gopts GlobalOptions, args []string) error { return listKeys(ctx, repo, gopts) case "add": - lock, err := lockRepo(ctx, repo) + lock, ctx, err := lockRepo(ctx, repo) defer unlockRepo(lock) if err != nil { return err @@ -225,7 +225,7 @@ func runKey(ctx context.Context, gopts GlobalOptions, args []string) error { return addKey(ctx, repo, gopts) case "remove": - lock, err := lockRepoExclusive(ctx, repo) + lock, ctx, err := lockRepoExclusive(ctx, repo) defer unlockRepo(lock) if err != nil { return err @@ -238,7 +238,7 @@ func runKey(ctx context.Context, gopts GlobalOptions, args []string) error { return deleteKey(ctx, repo, id) case "passwd": - lock, err := lockRepoExclusive(ctx, repo) + lock, ctx, err := lockRepoExclusive(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_list.go b/cmd/restic/cmd_list.go index 819c1de4b..9aa713879 100644 --- a/cmd/restic/cmd_list.go +++ b/cmd/restic/cmd_list.go @@ -42,7 +42,8 @@ func runList(ctx context.Context, cmd *cobra.Command, opts GlobalOptions, args [ } if !opts.NoLock && args[0] != "locks" { - lock, err := lockRepo(ctx, repo) + var lock *restic.Lock + lock, ctx, err = lockRepo(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_migrate.go b/cmd/restic/cmd_migrate.go index 7a48051c7..ffd855b48 100644 --- a/cmd/restic/cmd_migrate.go +++ b/cmd/restic/cmd_migrate.go @@ -122,7 +122,7 @@ func runMigrate(ctx context.Context, opts MigrateOptions, gopts GlobalOptions, a return err } - lock, err := lockRepoExclusive(ctx, repo) + lock, ctx, err := lockRepoExclusive(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_mount.go b/cmd/restic/cmd_mount.go index ef4d9a32b..0bbd1e6d5 100644 --- a/cmd/restic/cmd_mount.go +++ b/cmd/restic/cmd_mount.go @@ -13,6 +13,7 @@ import ( "github.com/restic/restic/internal/debug" "github.com/restic/restic/internal/errors" + "github.com/restic/restic/internal/restic" resticfs "github.com/restic/restic/internal/fs" "github.com/restic/restic/internal/fuse" @@ -121,7 +122,8 @@ func runMount(ctx context.Context, opts MountOptions, gopts GlobalOptions, args } if !gopts.NoLock { - lock, err := lockRepo(ctx, repo) + var lock *restic.Lock + lock, ctx, err = lockRepo(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_prune.go b/cmd/restic/cmd_prune.go index 2bfd2fc42..01ce0da26 100644 --- a/cmd/restic/cmd_prune.go +++ b/cmd/restic/cmd_prune.go @@ -165,7 +165,7 @@ func runPrune(ctx context.Context, opts PruneOptions, gopts GlobalOptions) error opts.unsafeRecovery = true } - lock, err := lockRepoExclusive(ctx, repo) + lock, ctx, err := lockRepoExclusive(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_rebuild_index.go b/cmd/restic/cmd_rebuild_index.go index 6fd9eac24..cb2917183 100644 --- a/cmd/restic/cmd_rebuild_index.go +++ b/cmd/restic/cmd_rebuild_index.go @@ -48,7 +48,7 @@ func runRebuildIndex(ctx context.Context, opts RebuildIndexOptions, gopts Global return err } - lock, err := lockRepoExclusive(ctx, repo) + lock, ctx, err := lockRepoExclusive(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_recover.go b/cmd/restic/cmd_recover.go index b78a527ab..b296f7b9b 100644 --- a/cmd/restic/cmd_recover.go +++ b/cmd/restic/cmd_recover.go @@ -46,7 +46,7 @@ func runRecover(ctx context.Context, gopts GlobalOptions) error { return err } - lock, err := lockRepo(ctx, repo) + lock, ctx, err := lockRepo(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_restore.go b/cmd/restic/cmd_restore.go index a66d1e633..6ddec5233 100644 --- a/cmd/restic/cmd_restore.go +++ b/cmd/restic/cmd_restore.go @@ -123,7 +123,8 @@ func runRestore(ctx context.Context, opts RestoreOptions, gopts GlobalOptions, a } if !gopts.NoLock { - lock, err := lockRepo(ctx, repo) + var lock *restic.Lock + lock, ctx, err = lockRepo(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_snapshots.go b/cmd/restic/cmd_snapshots.go index 6810be7a0..82561722c 100644 --- a/cmd/restic/cmd_snapshots.go +++ b/cmd/restic/cmd_snapshots.go @@ -64,7 +64,8 @@ func runSnapshots(ctx context.Context, opts SnapshotOptions, gopts GlobalOptions } if !gopts.NoLock { - lock, err := lockRepo(ctx, repo) + var lock *restic.Lock + lock, ctx, err = lockRepo(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_stats.go b/cmd/restic/cmd_stats.go index 67a5ab542..f03026574 100644 --- a/cmd/restic/cmd_stats.go +++ b/cmd/restic/cmd_stats.go @@ -80,7 +80,8 @@ func runStats(ctx context.Context, gopts GlobalOptions, args []string) error { } if !gopts.NoLock { - lock, err := lockRepo(ctx, repo) + var lock *restic.Lock + lock, ctx, err = lockRepo(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/cmd_tag.go b/cmd/restic/cmd_tag.go index a27eb5d7b..bf880dafb 100644 --- a/cmd/restic/cmd_tag.go +++ b/cmd/restic/cmd_tag.go @@ -110,7 +110,8 @@ func runTag(ctx context.Context, opts TagOptions, gopts GlobalOptions, args []st if !gopts.NoLock { Verbosef("create exclusive lock for repository\n") - lock, err := lockRepoExclusive(ctx, repo) + var lock *restic.Lock + lock, ctx, err = lockRepoExclusive(ctx, repo) defer unlockRepo(lock) if err != nil { return err diff --git a/cmd/restic/lock.go b/cmd/restic/lock.go index 89acb0aef..0cea02cfd 100644 --- a/cmd/restic/lock.go +++ b/cmd/restic/lock.go @@ -19,15 +19,15 @@ var globalLocks struct { sync.Once } -func lockRepo(ctx context.Context, repo *repository.Repository) (*restic.Lock, error) { +func lockRepo(ctx context.Context, repo *repository.Repository) (*restic.Lock, context.Context, error) { return lockRepository(ctx, repo, false) } -func lockRepoExclusive(ctx context.Context, repo *repository.Repository) (*restic.Lock, error) { +func lockRepoExclusive(ctx context.Context, repo *repository.Repository) (*restic.Lock, context.Context, error) { return lockRepository(ctx, repo, true) } -func lockRepository(ctx context.Context, repo *repository.Repository, exclusive bool) (*restic.Lock, error) { +func lockRepository(ctx context.Context, repo *repository.Repository, exclusive bool) (*restic.Lock, context.Context, error) { // make sure that a repository is unlocked properly and after cancel() was // called by the cleanup handler in global.go globalLocks.Do(func() { @@ -41,7 +41,7 @@ func lockRepository(ctx context.Context, repo *repository.Repository, exclusive lock, err := lockFn(ctx, repo) if err != nil { - return nil, errors.WithMessage(err, "unable to create lock in backend") + return nil, ctx, errors.WithMessage(err, "unable to create lock in backend") } debug.Log("create lock %p (exclusive %v)", lock, exclusive) @@ -57,7 +57,7 @@ func lockRepository(ctx context.Context, repo *repository.Repository, exclusive globalLocks.locks = append(globalLocks.locks, lock) globalLocks.Unlock() - return lock, err + return lock, ctx, err } var refreshInterval = 5 * time.Minute