From 13aba9b97fdf81bdc05969b7dfdf0a205b83b363 Mon Sep 17 00:00:00 2001 From: Alec Thomas Date: Sat, 27 Dec 2025 18:35:13 +1100 Subject: [PATCH] fix: don't reopen the temp file before closing during create --- .github/workflows/ci.yml | 19 +------------------ .github/workflows/release.yml | 21 +++++++++++++++++++++ internal/cache/disk.go | 19 +++++-------------- internal/cache/disk_test.go | 6 ++++-- 4 files changed, 31 insertions(+), 34 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8b04aff4..46602301 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,8 +2,6 @@ on: push: branches: - main - tags: - - "v*.*.*" pull_request: name: CI jobs: @@ -15,7 +13,7 @@ jobs: - uses: cashapp/activate-hermit@v1 - run: | just fmt - git diff + git diff --exit-code test: name: Test runs-on: ubuntu-latest @@ -27,22 +25,7 @@ jobs: lint: name: Lint runs-on: ubuntu-latest - env: - GOPROXY: direct steps: - uses: actions/checkout@v4 - uses: cashapp/activate-hermit@v1 - run: just lint - release: - if: startsWith(github.ref, 'refs/tags/v') - needs: ["test", "lint"] - name: Release - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - uses: cashapp/activate-hermit@v1 - - run: goreleaser release --fail-fast - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..506bdc2a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,21 @@ +on: + workflow_run: + workflows: ["CI"] + types: + - completed + branches: + - main +name: Release +jobs: + release: + if: github.event.workflow_run.conclusion == 'success' && startsWith(github.event.workflow_run.head_branch, 'refs/tags/v') + name: Release + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: cashapp/activate-hermit@v1 + - run: goreleaser release --fail-fast + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/internal/cache/disk.go b/internal/cache/disk.go index 0f7b3792..42e91e1d 100644 --- a/internal/cache/disk.go +++ b/internal/cache/disk.go @@ -363,26 +363,17 @@ func (w *diskWriter) Write(p []byte) (int, error) { } func (w *diskWriter) Close() error { - if err := w.file.Close(); err != nil { - return errors.Errorf("failed to close temp file: %w", err) - } - - f, err := w.disk.root.Open(w.tempPath) - if err != nil { - return errors.Errorf("failed to open temp file for setting xattr: %w", err) - } - expiresAtBytes, err := w.expiresAt.MarshalBinary() if err != nil { - return errors.Join(errors.Errorf("failed to marshal expiration time: %w", err), f.Close()) + return errors.Join(errors.Errorf("failed to marshal expiration time: %w", err), w.file.Close()) } - if err := xattr.FSet(f, expiresAtXAttr, expiresAtBytes); err != nil { - return errors.Join(errors.Errorf("failed to set expiration time: %w", err), f.Close()) + if err := xattr.FSet(w.file, expiresAtXAttr, expiresAtBytes); err != nil { + return errors.Join(errors.Errorf("failed to set expiration time: %w", err), w.file.Close()) } - if err := f.Close(); err != nil { - return errors.Errorf("failed to close temp file after setting xattr: %w", err) + if err := w.file.Close(); err != nil { + return errors.Errorf("failed to close file: %w", err) } if err := w.disk.root.Rename(w.tempPath, w.path); err != nil { diff --git a/internal/cache/disk_test.go b/internal/cache/disk_test.go index d4c0b65a..0bc50835 100644 --- a/internal/cache/disk_test.go +++ b/internal/cache/disk_test.go @@ -20,7 +20,7 @@ func TestDiskStorageExpiry(t *testing.T) { disk, err := cache.NewDisk(ctx, cache.DiskConfig{Root: dir}) assert.NoError(t, err) - assert.Equal(t, int64(0), disk.Size(), "initial size should be 0") + assert.Equal(t, int64(0), disk.Size()) w1, err := disk.Create(ctx, "/first", time.Second*3) assert.NoError(t, err) @@ -35,7 +35,7 @@ func TestDiskStorageExpiry(t *testing.T) { assert.NoError(t, w2.Close()) expectedSize := int64(len("first file data") + len("second file data")) - assert.Equal(t, expectedSize, disk.Size(), "size should match written data") + assert.Equal(t, expectedSize, disk.Size()) time.Sleep(time.Second * 2) @@ -45,6 +45,8 @@ func TestDiskStorageExpiry(t *testing.T) { _, err = disk.Open(ctx, "/second") assert.IsError(t, err, os.ErrNotExist) + + assert.Equal(t, int64(len("first file data")), disk.Size()) } func TestDiskAsyncEviction(t *testing.T) {