runner/act
Mathieu Fenniak d79d043696
fix: allow GC & cache operations to operate concurrently (#1040)
Fixes #1039.

Rather than opening and closing the Bolt DB instance constantly, the cache now maintains one open `*bolthold.Store` for its lifetime, allowing GC, cache read, and cache write operations to occur concurrently.

The major risk is this change is, "is it safe to use one Bolt instance across goroutines concurrently?"  [Bolt does document its concurrency requirements](https://github.com/boltdb/bolt?tab=readme-ov-file#transactions), and an analysis of our DB interactions looks to me like it introduces very little risk.

Most of the cache operations perform multiple touches to the database; for example `useCache` performs a read to fetch a cache object, and then an update to set its `UsedAt` timestamp.  If we wanted to ensure consistency in these operations, they should use a Bolt ReadWrite transaction -- but concurrent access would just be setting the field to the same value anyway.

The `gcCache` is the complex operation where a transaction might be warranted -- but doing so would also cause the same bug that #1039 indicates.  I believe it is safe to run without a transaction because it is protected by an application-level mutex (to prevent multiple concurrent GCs), it is the only code that performs deletes from the database -- these should guarantee that all its delete attempts are successful.  In the event of unexpected failure to do the DB write, `gcCache` deletes from the storage before deleting from the DB, so it should just attempt to cleanup again next run.

<!--start release-notes-assistant-->
<!--URL:https://code.forgejo.org/forgejo/runner-->
- bug fixes
  - [PR](https://code.forgejo.org/forgejo/runner/pulls/1040): <!--number 1040 --><!--line 0 --><!--description Zml4OiBhbGxvdyBHQyAmIGNhY2hlIG9wZXJhdGlvbnMgdG8gb3BlcmF0ZSBjb25jdXJyZW50bHk=-->fix: allow GC & cache operations to operate concurrently<!--description-->
<!--end release-notes-assistant-->

Reviewed-on: https://code.forgejo.org/forgejo/runner/pulls/1040
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net>
Co-committed-by: Mathieu Fenniak <mathieu@fenniak.net>
2025-09-30 19:12:45 +00:00
..
artifactcache fix: allow GC & cache operations to operate concurrently (#1040) 2025-09-30 19:12:45 +00:00
cacheproxy fix: Correctly override the value of Forgejo-Cache-Host when ACTIONS_CACHE_URL is overridden. (#1027) 2025-09-26 07:02:45 +00:00
common chore: bump version to v11 (#940) 2025-09-05 07:29:38 +00:00
container fix: remove LXC working directory when it completes (#1003) 2025-09-16 19:42:04 +00:00
exprparser feat: the forgejo context is equivalent to the github context (#999) 2025-09-15 09:14:11 +00:00
filecollector chore: modernize code (#857) 2025-08-15 04:54:13 +00:00
jobparser feat: support evaluating workflow-level concurrency blocks in jobparser (#1026) 2025-09-27 04:37:36 +00:00
lookpath chore: use the same .golangci.yml as the runner & gofumpt over gofmt (#206) 2025-07-28 12:26:41 +00:00
model chore: bump version to v11 (#940) 2025-09-05 07:29:38 +00:00
runner fix: do not attempt to run the LXC stop script with self-hosted (#1037) 2025-09-28 14:49:45 +00:00
schema chore: test: exercise contexts in matrix when validating workflows (#1033) 2025-09-28 07:15:51 +00:00
workflowpattern chore: modernize code (#857) 2025-08-15 04:54:13 +00:00