@@ -133,6 +133,36 @@ class SupervisorTest < ActiveSupport::TestCase
133
133
end
134
134
end
135
135
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
+
136
166
test "prune processes with expired heartbeats" do
137
167
pruned = SolidQueue ::Process . register ( kind : "Worker" , pid : 42 , name : "worker-42" )
138
168
0 commit comments