good_pipeline 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a040b8756c4c84156db272e92f9749f5b35a14b02bea313dc2ab16ae783daf8
4
- data.tar.gz: 0616f1b5b8cbbacb95e97b10ff92cdaa834c45cb9fd61d6ed60e5e5206bb15e6
3
+ metadata.gz: e52af813bd86f0de3d905a3f591209e0a155e0b5c28e3a76f963f1c2cdbd8232
4
+ data.tar.gz: 3a48213db593949e7f9afff0f341cf29dfdb90d4972b20b4c5e48091cb86bab1
5
5
  SHA512:
6
- metadata.gz: 35f5545add3d81b4c0f0795cfb2252b1e232aa930da24d1764b00e6446090396e0a510beae3df565e87d886f60773cf7642d082441c4a2965466c13f7680ea59
7
- data.tar.gz: 8d65939c7be85e81bd16d551fd6235cffbabb57c2a919b1dbd7a4e2a7288e12757577bec1449e16659e2bd79f8be21753eefd7be65289e6c98e862fcf8e30faf
6
+ metadata.gz: 7bc3d7e1181b852bbc795f1e65ef9b2764645ffc13d7d860f444074158c741202ddae188253c50cb12a44da9958fe6403b2435fef6ec71d9172a35b46816da55
7
+ data.tar.gz: 22b59ba7dba841a6d55559c27a7427032bad94ed1fd3e336f2d53997ee4a24bf2f8c193d77e743095e4c5c73b948975b0f85228d63839eba367af1dc441f8456
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.2.2] - 2026-03-24
4
+
5
+ ### Fixed
6
+
7
+ - **Fan-in step race condition** — replaced `FOR UPDATE SKIP LOCKED` with `FOR UPDATE` in `Coordinator.try_enqueue_step`. When multiple upstreams of a fan-in step completed simultaneously, `SKIP LOCKED` caused concurrent callers to silently give up, leaving the downstream step stranded in `pending` forever. Blocking locks ensure the last caller always sees all upstreams satisfied and enqueues the step. Existing `pending?` and `good_job_id` guards provide idempotency.
8
+
3
9
  ## [0.2.1] - 2026-03-24
4
10
 
5
11
  ### Fixed
@@ -17,7 +17,7 @@ module GoodPipeline
17
17
  recompute_pipeline = nil
18
18
 
19
19
  StepRecord.transaction do
20
- locked_step = StepRecord.lock("FOR UPDATE SKIP LOCKED").find_by(id: step_id)
20
+ locked_step = StepRecord.lock("FOR UPDATE").find_by(id: step_id)
21
21
  return unless locked_step&.pending?
22
22
  return if locked_step.good_job_id.present?
23
23
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GoodPipeline
4
- VERSION = "0.2.1"
4
+ VERSION = "0.2.2"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: good_pipeline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ali Hamdi Ali Fadel