From 7d95adca7811f9805450c8a5737a62300db099f6 Mon Sep 17 00:00:00 2001 From: David Genord II Date: Wed, 14 Aug 2024 16:21:21 -0400 Subject: [PATCH 1/3] Fixup reserve_with_scope_using_optimized_postgres A touch of re-arranging after rubocop complaints --- lib/delayed/backend/active_record.rb | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/delayed/backend/active_record.rb b/lib/delayed/backend/active_record.rb index 770c54d1..35b2aa6c 100644 --- a/lib/delayed/backend/active_record.rb +++ b/lib/delayed/backend/active_record.rb @@ -133,19 +133,23 @@ def self.reserve_with_scope_using_optimized_postgres(ready_scope, worker, now) # Note: active_record would attempt to generate UPDATE...LIMIT like # SQL for Postgres if we use a .limit() filter, but it would not # use 'FOR UPDATE' and we would have many locking conflicts + subquery = ready_scope.limit(1).lock(true).select("id").to_sql + # On PostgreSQL >= 9.5 we leverage SKIP LOCK to avoid multiple workers blocking each other # when attempting to get the next available job # https://www.postgresql.org/docs/9.5/sql-select.html#SQL-FOR-UPDATE-SHARE - skip_locked = "" - if connection.respond_to?(:postgresql_version) && connection.postgresql_version >= 90500 - skip_locked = " SKIP LOCKED" + if connection.respond_to?(:postgresql_version) && connection.postgresql_version >= 9_05_00 # rubocop:disable Style/NumericLiterals + subquery += " SKIP LOCKED" end quoted_name = connection.quote_table_name(table_name) - subquery = ready_scope.limit(1).lock(true).select("id").to_sql - sql = "UPDATE #{quoted_name} SET locked_at = ?, locked_by = ? WHERE id IN (#{subquery}#{skip_locked}) RETURNING *" - reserved = find_by_sql([sql, now, worker.name]) - reserved[0] + find_by_sql( + [ + "UPDATE #{quoted_name} SET locked_at = ?, locked_by = ? WHERE id IN (#{subquery}) RETURNING *", + now, + worker.name + ] + ).first end def self.reserve_with_scope_using_optimized_mysql(ready_scope, worker, now) From e5e7366afaa5f25f5668d707a5e14820fcb73ba2 Mon Sep 17 00:00:00 2001 From: David Genord II Date: Wed, 14 Aug 2024 16:43:57 -0400 Subject: [PATCH 2/3] postgresql_version was a protected method in AR 3 --- lib/delayed/backend/active_record.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/delayed/backend/active_record.rb b/lib/delayed/backend/active_record.rb index 35b2aa6c..45f1a5fc 100644 --- a/lib/delayed/backend/active_record.rb +++ b/lib/delayed/backend/active_record.rb @@ -138,7 +138,7 @@ def self.reserve_with_scope_using_optimized_postgres(ready_scope, worker, now) # On PostgreSQL >= 9.5 we leverage SKIP LOCK to avoid multiple workers blocking each other # when attempting to get the next available job # https://www.postgresql.org/docs/9.5/sql-select.html#SQL-FOR-UPDATE-SHARE - if connection.respond_to?(:postgresql_version) && connection.postgresql_version >= 9_05_00 # rubocop:disable Style/NumericLiterals + if connection.send(:postgresql_version) >= 9_05_00 # rubocop:disable Style/NumericLiterals subquery += " SKIP LOCKED" end From 507e553f6f97b957a5afc88e251aaf15add7c740 Mon Sep 17 00:00:00 2001 From: David Genord II Date: Wed, 14 Aug 2024 16:50:07 -0400 Subject: [PATCH 3/3] Fix bad bundler cache --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index effd85d2..d89e27e9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -216,6 +216,7 @@ jobs: with: ruby-version: ${{ matrix.ruby }} bundler-cache: true # runs 'bundle install' and caches installed gems automatically + cache-version: 2 - name: Run tests env: BUNDLE_GEMFILE: ${{ matrix.gemfile }}