internal/pkg: lock on-filesystem cache
All checks were successful
Test / Create distribution (push) Successful in 47s
Test / Sandbox (push) Successful in 2m55s
Test / ShareFS (push) Successful in 4m52s
Test / Hpkg (push) Successful in 5m11s
Test / Sandbox (race detector) (push) Successful in 5m17s
Test / Hakurei (race detector) (push) Successful in 7m53s
Test / Hakurei (push) Successful in 4m6s
Test / Flake checks (push) Successful in 1m41s
All checks were successful
Test / Create distribution (push) Successful in 47s
Test / Sandbox (push) Successful in 2m55s
Test / ShareFS (push) Successful in 4m52s
Test / Hpkg (push) Successful in 5m11s
Test / Sandbox (race detector) (push) Successful in 5m17s
Test / Hakurei (race detector) (push) Successful in 7m53s
Test / Hakurei (push) Successful in 4m6s
Test / Flake checks (push) Successful in 1m41s
Any fine-grained file-based locking here significantly hurts performance and is not part of the use case of the package. This change guarantees exclusive access to prevent inconsistent state on the filesystem. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
@@ -28,6 +28,15 @@ import (
|
||||
"hakurei.app/message"
|
||||
)
|
||||
|
||||
//go:linkname unsafeOpen hakurei.app/internal/pkg.open
|
||||
func unsafeOpen(
|
||||
ctx context.Context,
|
||||
msg message.Msg,
|
||||
cures int,
|
||||
base *check.Absolute,
|
||||
lock bool,
|
||||
) (*pkg.Cache, error)
|
||||
|
||||
func TestMain(m *testing.M) { container.TryArgv0(nil); os.Exit(m.Run()) }
|
||||
|
||||
// overrideIdent overrides the ID method of [Artifact].
|
||||
@@ -213,7 +222,7 @@ func TestIdent(t *testing.T) {
|
||||
var cache *pkg.Cache
|
||||
if a, err := check.NewAbs(t.TempDir()); err != nil {
|
||||
t.Fatal(err)
|
||||
} else if cache, err = pkg.New(t.Context(), msg, 0, a); err != nil {
|
||||
} else if cache, err = pkg.Open(t.Context(), msg, 0, a); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(cache.Close)
|
||||
@@ -274,8 +283,8 @@ func checkWithCache(t *testing.T, testCases []cacheTestCase) {
|
||||
msg.SwapVerbose(testing.Verbose())
|
||||
|
||||
var scrubFunc func() error // scrub after hashing
|
||||
if c, err := pkg.New(t.Context(), msg, 0, base); err != nil {
|
||||
t.Fatalf("New: error = %v", err)
|
||||
if c, err := pkg.Open(t.Context(), msg, 0, base); err != nil {
|
||||
t.Fatalf("Open: error = %v", err)
|
||||
} else {
|
||||
t.Cleanup(c.Close)
|
||||
if tc.early != nil {
|
||||
@@ -294,6 +303,11 @@ func checkWithCache(t *testing.T, testCases []cacheTestCase) {
|
||||
restoreTemp = true
|
||||
}
|
||||
|
||||
// destroy lock file to avoid changing cache checksums
|
||||
if err := os.Remove(base.Append("lock").String()); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
var checksum pkg.Checksum
|
||||
if err := pkg.HashDir(&checksum, base); err != nil {
|
||||
t.Fatalf("HashDir: error = %v", err)
|
||||
@@ -522,12 +536,12 @@ func TestCache(t *testing.T) {
|
||||
)},
|
||||
})
|
||||
|
||||
if c0, err := pkg.New(
|
||||
if c0, err := unsafeOpen(
|
||||
t.Context(),
|
||||
message.New(nil),
|
||||
0, base,
|
||||
0, base, false,
|
||||
); err != nil {
|
||||
t.Fatalf("New: error = %v", err)
|
||||
t.Fatalf("open: error = %v", err)
|
||||
} else {
|
||||
t.Cleanup(c.Close) // check doubled cancel
|
||||
cureMany(t, c0, []cureStep{
|
||||
@@ -1017,12 +1031,12 @@ func TestNew(t *testing.T) {
|
||||
Path: container.Nonexistent,
|
||||
Err: syscall.ENOENT,
|
||||
}
|
||||
if _, err := pkg.New(
|
||||
if _, err := pkg.Open(
|
||||
t.Context(),
|
||||
message.New(nil),
|
||||
0, check.MustAbs(container.Nonexistent),
|
||||
); !reflect.DeepEqual(err, wantErr) {
|
||||
t.Errorf("New: error = %#v, want %#v", err, wantErr)
|
||||
t.Errorf("Open: error = %#v, want %#v", err, wantErr)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1045,12 +1059,12 @@ func TestNew(t *testing.T) {
|
||||
Path: tempDir.Append("cache").String(),
|
||||
Err: syscall.EACCES,
|
||||
}
|
||||
if _, err := pkg.New(
|
||||
if _, err := pkg.Open(
|
||||
t.Context(),
|
||||
message.New(nil),
|
||||
0, tempDir.Append("cache"),
|
||||
); !reflect.DeepEqual(err, wantErr) {
|
||||
t.Errorf("New: error = %#v, want %#v", err, wantErr)
|
||||
t.Errorf("Open: error = %#v, want %#v", err, wantErr)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user