Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <psteinhardt@gitlab.com>2021-09-23 13:28:17 +0300
committerPatrick Steinhardt <psteinhardt@gitlab.com>2021-11-23 16:11:00 +0300
commitc91fe35c0dc2d296f70ba735cf8be992ba532fbc (patch)
tree0d0bd914d18a41a965de23a083e25d55b5212dcd
parent5eb94b765d5a3f4a98697929de2efc551c1a4f26 (diff)
safe: Introduce `ErrFileAlreadyLocked` error
We've started to check for locking failures in multiple packages' tests by doing a string comparison. Introduce a new `ErrFileAlreadyLocked` error which we can return and test for instead.
-rw-r--r--internal/git/localrepo/config_test.go5
-rw-r--r--internal/safe/locking_file_writer.go7
-rw-r--r--internal/safe/locking_file_writer_test.go4
3 files changed, 10 insertions, 6 deletions
diff --git a/internal/git/localrepo/config_test.go b/internal/git/localrepo/config_test.go
index a4b5ce26a..e0d188cf4 100644
--- a/internal/git/localrepo/config_test.go
+++ b/internal/git/localrepo/config_test.go
@@ -2,7 +2,6 @@ package localrepo
import (
"context"
- "errors"
"fmt"
"path/filepath"
"runtime"
@@ -86,7 +85,7 @@ func TestRepo_SetConfig(t *testing.T) {
value: "value",
locked: true,
expectedEntries: standardEntries,
- expectedErr: fmt.Errorf("committing config: %w", fmt.Errorf("locking file: %w", errors.New("file already locked"))),
+ expectedErr: fmt.Errorf("committing config: %w", fmt.Errorf("locking file: %w", safe.ErrFileAlreadyLocked)),
},
} {
t.Run(tc.desc, func(t *testing.T) {
@@ -224,7 +223,7 @@ func TestRepo_UnsetMatchingConfig(t *testing.T) {
desc: "locked",
regex: ".*",
locked: true,
- expectedErr: fmt.Errorf("committing config: %w", fmt.Errorf("locking file: %w", errors.New("file already locked"))),
+ expectedErr: fmt.Errorf("committing config: %w", fmt.Errorf("locking file: %w", safe.ErrFileAlreadyLocked)),
expectedKeys: standardKeys,
},
} {
diff --git a/internal/safe/locking_file_writer.go b/internal/safe/locking_file_writer.go
index b7e8405c2..c43720cbe 100644
--- a/internal/safe/locking_file_writer.go
+++ b/internal/safe/locking_file_writer.go
@@ -1,6 +1,7 @@
package safe
import (
+ "errors"
"fmt"
"io"
"os"
@@ -14,6 +15,10 @@ const (
lockingFileWriterStateClosed
)
+// ErrFileAlreadyLocked is returned when trying to lock a file which has already been locked by
+// another concurrent process.
+var ErrFileAlreadyLocked = errors.New("file already locked")
+
// LockingFileWriter is a FileWriter which locks the target file on commit and checks whether it
// has been modified since the LockingFileWriter has been created. The user must first create a new
// LockingFileWriter via `NewLockingFileWriter()`, at which point it is open for writes. The writer
@@ -134,7 +139,7 @@ func (fw *LockingFileWriter) Lock() error {
lock, err := os.OpenFile(fw.lockPath(), os.O_CREATE|os.O_EXCL|os.O_RDONLY, 0o400)
if err != nil {
if os.IsExist(err) {
- return fmt.Errorf("file already locked")
+ return ErrFileAlreadyLocked
}
return fmt.Errorf("creating lock file: %w", err)
diff --git a/internal/safe/locking_file_writer_test.go b/internal/safe/locking_file_writer_test.go
index 152c63d94..7632a9d69 100644
--- a/internal/safe/locking_file_writer_test.go
+++ b/internal/safe/locking_file_writer_test.go
@@ -261,7 +261,7 @@ func TestLockingFileWriter_concurrentLocking(t *testing.T) {
require.NoError(t, err)
require.NoError(t, first.Lock())
- require.Equal(t, fmt.Errorf("file already locked"), second.Lock())
+ require.Equal(t, safe.ErrFileAlreadyLocked, second.Lock())
require.NoError(t, first.Commit())
require.Equal(t, []byte("first"), testhelper.MustReadFile(t, file))
@@ -279,7 +279,7 @@ func TestLockingFileWriter_locked(t *testing.T) {
// Concurrently lock the file.
require.NoError(t, os.WriteFile(target+".lock", nil, 0o644))
- require.Equal(t, fmt.Errorf("file already locked"), writer.Lock())
+ require.Equal(t, safe.ErrFileAlreadyLocked, writer.Lock())
require.Equal(t, []byte("base"), testhelper.MustReadFile(t, target))
}