@@ -133,6 +133,36 @@ class SupervisorTest < ActiveSupport::TestCase
133133 end
134134 end
135135
136+ test "fail orphaned executions by releasing their concurrency locks" do
137+ result = JobResult . create! ( queue_name : "default" , status : "seq: " )
138+ 4 . times { |i | ThrottledUpdateResultJob . set ( queue : :new_queue ) . perform_later ( result ) }
139+ process = SolidQueue ::Process . register ( kind : "Worker" , pid : 42 , name : "worker-123" )
140+
141+ SolidQueue ::ReadyExecution . claim ( "*" , 5 , process . id )
142+
143+ assert_equal 3 , SolidQueue ::ClaimedExecution . count
144+ assert_equal 0 , SolidQueue ::ReadyExecution . count
145+ assert_equal 1 , SolidQueue ::BlockedExecution . count
146+
147+ assert_equal [ process . id ] , SolidQueue ::ClaimedExecution . last ( 3 ) . pluck ( :process_id ) . uniq
148+
149+ # Simnulate orphaned executions by just wiping the claiming process
150+ process . delete
151+
152+ pid = run_supervisor_as_fork ( workers : [ { queues : "background" , polling_interval : 10 , processes : 2 } ] )
153+ wait_for_registered_processes ( 3 )
154+ assert_registered_supervisor ( pid )
155+
156+ terminate_process ( pid )
157+
158+ skip_active_record_query_cache do
159+ assert_equal 0 , SolidQueue ::ClaimedExecution . count
160+ assert_equal 3 , SolidQueue ::FailedExecution . count
161+ assert_equal 0 , SolidQueue ::BlockedExecution . count
162+ assert_equal 1 , SolidQueue ::ReadyExecution . count
163+ end
164+ end
165+
136166 test "prune processes with expired heartbeats" do
137167 pruned = SolidQueue ::Process . register ( kind : "Worker" , pid : 42 , name : "worker-42" )
138168
0 commit comments