Skip to content

Commit 9e2d219

Browse files
authored
Add a retry mechanism for recording ready notifier (#1129)
* Add a retry mechanism for recording ready notifier * rubo * Rubo again
1 parent f8680b9 commit 9e2d219

File tree

2 files changed

+52
-20
lines changed

2 files changed

+52
-20
lines changed

app/services/recording_ready_notifier_service.rb

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ def execute(recording_id)
2121
notify(callback_url, meeting_id, recording.record_id, tenant_name) if callback_url
2222
end
2323

24-
def encoded_payload(meeting_id, record_id, tenant_name)
25-
secret = fetch_secrets(tenant_name: tenant_name)[0]
24+
def encoded_payload(meeting_id, record_id, secret)
2625
payload = { meeting_id: meeting_id, record_id: record_id }
2726
JWT.encode(payload, secret)
2827
end
@@ -31,27 +30,38 @@ def notify(callback_url, meeting_id, record_id, tenant_name)
3130
logger.info("Recording Ready Notify for [#{meeting_id}] starts")
3231
logger.info('Making callback for recording ready notification')
3332

34-
payload = encoded_payload(meeting_id, record_id, tenant_name)
35-
uri = URI.parse(callback_url)
36-
http = Net::HTTP.new(uri.host, uri.port)
37-
http.use_ssl = (uri.scheme == 'https')
38-
logger.info("Sending request to #{uri.scheme}://#{uri.host}#{uri.request_uri}")
39-
request = Net::HTTP::Post.new(uri.request_uri)
40-
request.set_form_data(signed_parameters: payload)
33+
secrets = fetch_secrets(tenant_name: tenant_name)
34+
success = false
4135

42-
response = http.request(request)
43-
code = response.code.to_i
36+
secrets.each do |secret|
37+
payload = encoded_payload(meeting_id, record_id, secret)
4438

45-
if code == 410
46-
logger.info("Notified for deleted meeting: #{meeting_id}")
47-
elsif code == 404
48-
logger.info("404 error when notifying for recording: #{meeting_id}, ignoring")
49-
elsif code < 200 || code >= 300
50-
logger.info("Callback HTTP request failed: #{response.code} #{response.message} (code #{code})")
51-
else
52-
logger.info("Recording notifier successful: #{meeting_id} (code #{code})")
39+
uri = URI.parse(callback_url)
40+
http = Net::HTTP.new(uri.host, uri.port)
41+
http.use_ssl = (uri.scheme == 'https')
42+
logger.info("Sending request to #{uri.scheme}://#{uri.host}#{uri.request_uri}")
43+
request = Net::HTTP::Post.new(uri.request_uri)
44+
request.set_form_data(signed_parameters: payload)
45+
46+
response = http.request(request)
47+
code = response.code.to_i
48+
49+
if code == 410
50+
logger.info("Notified for deleted meeting: #{meeting_id}")
51+
break
52+
elsif code == 404
53+
logger.info("404 error when notifying for recording: #{meeting_id}, ignoring")
54+
break
55+
elsif code < 200 || code >= 300
56+
logger.info("Callback HTTP request failed: #{response.code} #{response.message} (code #{code})")
57+
else
58+
logger.info("Recording notifier successful: #{meeting_id} (code #{code})")
59+
success = true
60+
break
61+
end
5362
end
54-
true
63+
64+
success
5565
rescue StandardError => e
5666
logger.info('Rescued')
5767
logger.info(e.to_s)

spec/services/recording_ready_notifier_service_spec.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,28 @@
2626
expect(return_val).to be true
2727
end
2828

29+
it 'retries with different secrets if multiple secrets are set' do
30+
stub_request(:post, url)
31+
.to_return(
32+
{ status: 401, body: '', headers: {} }, # First secret fails
33+
{ status: 401, body: '', headers: {} }, # Second secret fails
34+
{ status: 200, body: '', headers: {} } # Third secret succeeds
35+
)
36+
37+
allow_any_instance_of(ApiHelper).to receive(:fetch_secrets).and_return(%w[secret1 secret2 secret3])
38+
39+
allow(JWT).to receive(:encode).and_return('eyJhbGciOiJIUzI1NiJ9.eyJtZWV0aW5nX2lkIjoibWVldGluZzE5In0')
40+
41+
allow(Rails.logger).to receive(:info).and_call_original # Allow all other logger calls to pass through
42+
43+
expect(Rails.logger).to receive(:info).with("Callback HTTP request failed: 401 (code 401)").twice
44+
expect(Rails.logger).to receive(:info).with("Recording notifier successful: #{recording.meeting_id} (code #{200})").once
45+
46+
return_val = described_class.execute(recording.id)
47+
48+
expect(return_val).to be true
49+
end
50+
2951
it 'returns false if recording ready notification fails' do
3052
stub_request(:post, url).to_timeout
3153

0 commit comments

Comments
 (0)