Skip to content
This repository was archived by the owner on Jun 2, 2021. It is now read-only.

Commit 41f0bbe

Browse files
v3(services): update the platform broker poll interval while an async job is enqueued
[#174398272](https://www.pivotaltracker.com/story/show/174398272)
1 parent e5fcac4 commit 41f0bbe

2 files changed

Lines changed: 96 additions & 7 deletions

File tree

app/jobs/reoccurring_job.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ def maximum_duration_seconds=(duration)
3030
end
3131

3232
def polling_interval_seconds
33-
@polling_interval || default_polling_interval_seconds
33+
[@polling_interval || 0, default_polling_interval_seconds].max
34+
3435
end
3536

3637
def polling_interval_seconds=(interval)
@@ -51,7 +52,7 @@ def initialize
5152
end
5253

5354
def default_maximum_duration_seconds
54-
VCAP::CloudController::Config.config.get(:broker_client_max_async_poll_duration_minutes).minutes
55+
Config.config.get(:broker_client_max_async_poll_duration_minutes).minutes
5556
end
5657

5758
def default_polling_interval_seconds

spec/unit/jobs/reoccurring_job_spec.rb

Lines changed: 93 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ module CloudController
66
class FakeJob < Jobs::ReoccurringJob
77
attr_reader :calls, :expired, :expiry_time, :iterations, :warnings
88

9-
def initialize(iterations: 10)
9+
def initialize(iterations: 10, retry_after: [])
1010
@iterations = iterations
1111
@calls = 0
12+
@retry_after = retry_after
1213
super()
1314
end
1415

@@ -25,6 +26,7 @@ def resource_type
2526
end
2627

2728
def perform
29+
self.polling_interval_seconds = @retry_after[@calls] if @retry_after.length > @calls
2830
@calls += 1
2931
finish if @calls == iterations
3032
end
@@ -78,11 +80,11 @@ def perform
7880
Jobs::Enqueuer.new(job, queue: Jobs::Queues.generic).enqueue_pollable
7981
execute_all_jobs(expected_successes: 1, expected_failures: 0)
8082

81-
Timecop.freeze(enqueued_time + 94.second) do
83+
Timecop.freeze(94.seconds.after enqueued_time) do
8284
execute_all_jobs(expected_successes: 0, expected_failures: 0)
8385
end
8486

85-
Timecop.freeze(enqueued_time + 96.seconds) do
87+
Timecop.freeze(96.seconds.after enqueued_time) do
8688
execute_all_jobs(expected_successes: 1, expected_failures: 0)
8789
end
8890
end
@@ -96,6 +98,92 @@ def perform
9698
expect(job.polling_interval_seconds).to eq(24.hours)
9799
end
98100

101+
context 'updates the polling interval if config changes' do
102+
it 'when changed from the job only' do
103+
job = FakeJob.new(retry_after: [20, 30])
104+
TestConfig.config[:broker_client_default_async_poll_interval_seconds] = 10
105+
106+
enqueued_time = Time.now
107+
108+
Jobs::Enqueuer.new(job, queue: Jobs::Queues.generic).enqueue_pollable
109+
execute_all_jobs(expected_successes: 1, expected_failures: 0)
110+
111+
Timecop.freeze(19.seconds.after enqueued_time) do
112+
execute_all_jobs(expected_successes: 0, expected_failures: 0)
113+
end
114+
115+
Timecop.freeze(22.seconds.after enqueued_time) do
116+
enqueued_time = Time.now
117+
execute_all_jobs(expected_successes: 1, expected_failures: 0)
118+
end
119+
120+
Timecop.freeze(29.seconds.after enqueued_time) do
121+
execute_all_jobs(expected_successes: 0, expected_failures: 0)
122+
end
123+
124+
Timecop.freeze(32.seconds.after enqueued_time) do
125+
execute_all_jobs(expected_successes: 1, expected_failures: 0)
126+
end
127+
128+
end
129+
130+
it 'when default changed after changing from the job' do
131+
job = FakeJob.new(retry_after: [20])
132+
TestConfig.config[:broker_client_default_async_poll_interval_seconds] = 10
133+
134+
enqueued_time = Time.now
135+
136+
Jobs::Enqueuer.new(job, queue: Jobs::Queues.generic).enqueue_pollable
137+
execute_all_jobs(expected_successes: 1, expected_failures: 0)
138+
139+
Timecop.freeze(19.seconds.after enqueued_time) do
140+
execute_all_jobs(expected_successes: 0, expected_failures: 0)
141+
end
142+
143+
Timecop.freeze(21.seconds.after enqueued_time) do
144+
TestConfig.config[:broker_client_default_async_poll_interval_seconds] = 30
145+
enqueued_time = Time.now
146+
execute_all_jobs(expected_successes: 1, expected_failures: 0)
147+
end
148+
149+
Timecop.freeze(29.seconds.after enqueued_time) do
150+
execute_all_jobs(expected_successes: 0, expected_failures: 0)
151+
end
152+
153+
Timecop.freeze(31.seconds.after enqueued_time) do
154+
execute_all_jobs(expected_successes: 1, expected_failures: 0)
155+
end
156+
end
157+
158+
it 'when changing default only' do
159+
job = FakeJob.new
160+
TestConfig.config[:broker_client_default_async_poll_interval_seconds] = 10
161+
162+
enqueued_time = Time.now
163+
164+
Jobs::Enqueuer.new(job, queue: Jobs::Queues.generic).enqueue_pollable
165+
execute_all_jobs(expected_successes: 1, expected_failures: 0)
166+
167+
Timecop.freeze(9.seconds.after enqueued_time) do
168+
execute_all_jobs(expected_successes: 0, expected_failures: 0)
169+
end
170+
171+
Timecop.freeze(11.seconds.after enqueued_time) do
172+
TestConfig.config[:broker_client_default_async_poll_interval_seconds] = 30
173+
enqueued_time = Time.now
174+
execute_all_jobs(expected_successes: 1, expected_failures: 0)
175+
end
176+
177+
Timecop.freeze(29.seconds.after enqueued_time) do
178+
execute_all_jobs(expected_successes: 0, expected_failures: 0)
179+
end
180+
181+
Timecop.freeze(31.seconds.after enqueued_time) do
182+
execute_all_jobs(expected_successes: 1, expected_failures: 0)
183+
end
184+
end
185+
end
186+
99187
it 'continues to run until finished' do
100188
Jobs::Enqueuer.new(FakeJob.new, queue: Jobs::Queues.generic).enqueue_pollable
101189

@@ -120,7 +208,7 @@ def perform
120208
execute_all_jobs(expected_successes: 0, expected_failures: 1)
121209
expect(PollableJobModel.first.state).to eq('FAILED')
122210

123-
Timecop.freeze(Time.now + 61.seconds) do
211+
Timecop.freeze(61.seconds.after Time.now) do
124212
execute_all_jobs(expected_successes: 0, expected_failures: 0)
125213
end
126214
end
@@ -163,7 +251,7 @@ def handle_timeout
163251

164252
Jobs::Enqueuer.new(job, queue: Jobs::Queues.generic).enqueue_pollable
165253

166-
Timecop.freeze(Time.now + 61.seconds) do
254+
Timecop.freeze(61.seconds.after Time.now) do
167255
execute_all_jobs(expected_successes: 0, expected_failures: 1, jobs_to_execute: 1)
168256
expect(PollableJobModel.first.state).to eq('FAILED')
169257
end

0 commit comments

Comments
 (0)