Skip to content

Commit d06466a

Browse files
authored
Merge pull request #334 from Shopify/shioyama/parallel_ci_queue
Remove rate limit on reserved tests
2 parents 29ad54d + aaf2f7e commit d06466a

3 files changed

Lines changed: 22 additions & 18 deletions

File tree

ruby/lib/ci/queue/redis/worker.rb

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class Worker < Base
1616
attr_reader :total
1717

1818
def initialize(redis, config)
19-
@reserved_test = nil
19+
@reserved_tests = Set.new
2020
@shutdown_required = false
2121
super(redis, config)
2222
end
@@ -135,7 +135,7 @@ def requeue(test, offset: Redis.requeue_offset)
135135
argv: [config.max_requeues, global_max_requeues, test_key, offset],
136136
) == 1
137137

138-
@reserved_test = test_key unless requeued
138+
reserved_tests << test_key unless requeued
139139
requeued
140140
end
141141

@@ -152,25 +152,24 @@ def release!
152152

153153
attr_reader :index
154154

155+
def reserved_tests
156+
@reserved_tests ||= Set.new
157+
end
158+
155159
def worker_id
156160
config.worker_id
157161
end
158162

159-
def raise_on_mismatching_test(test_key)
160-
if @reserved_test == test_key
161-
@reserved_test = nil
162-
else
163-
raise ReservationError, "Acknowledged #{test_key.inspect} but #{@reserved_test.inspect} was reserved"
163+
def raise_on_mismatching_test(test)
164+
unless reserved_tests.delete?(test)
165+
raise ReservationError, "Acknowledged #{test.inspect} but only #{reserved_tests.map(&:inspect).join(", ")} reserved"
164166
end
165167
end
166168

167169
def reserve
168-
if @reserved_test
169-
raise ReservationError, "#{@reserved_test.inspect} is already reserved. " \
170-
"You have to acknowledge it before you can reserve another one"
171-
end
172-
173-
@reserved_test = (try_to_reserve_lost_test || try_to_reserve_test)
170+
test = (try_to_reserve_lost_test || try_to_reserve_test)
171+
reserved_tests << test
172+
test
174173
end
175174

176175
def try_to_reserve_test

ruby/lib/ci/queue/static.rb

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,15 @@ def remaining
8989
end
9090

9191
def running
92-
@reserved_test ? 1 : 0
92+
reserved_tests.empty? ? 0 : 1
9393
end
9494

9595
def poll
96-
while !@shutdown && config.circuit_breakers.none?(&:open?) && !max_test_failed? && @reserved_test = @queue.shift
97-
yield index.fetch(@reserved_test)
96+
while !@shutdown && config.circuit_breakers.none?(&:open?) && !max_test_failed? && reserved_test = @queue.shift
97+
reserved_tests << reserved_test
98+
yield index.fetch(reserved_test)
9899
end
99-
@reserved_test = nil
100+
reserved_tests.clear
100101
end
101102

102103
def exhausted?
@@ -142,6 +143,10 @@ def should_requeue?(key)
142143
def requeues
143144
@requeues ||= Hash.new(0)
144145
end
146+
147+
def reserved_tests
148+
@reserved_tests ||= Set.new
149+
end
145150
end
146151
end
147152
end

ruby/test/minitest/queue/build_status_recorder_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def test_retrying_test
7979
private
8080

8181
def reserve(queue, method_name)
82-
queue.instance_variable_set(:@reserved_test, Minitest::Queue::SingleExample.new("Minitest::Test", method_name).id)
82+
queue.instance_variable_set(:@reserved_tests, Set.new([Minitest::Queue::SingleExample.new("Minitest::Test", method_name).id]))
8383
end
8484

8585
def worker(id)

0 commit comments

Comments
 (0)