Time out if manifest loading takes too long

This hasn't been causing issues as far as I know, I just noticed
*months ago* that I forgot to do this, and have had a sticky note about
it on my desk since then lol.

I tested this by temporarily setting the timeout to `0.5`, and watching
it fail!
This commit is contained in:
Emi Matchu 2024-04-16 16:18:51 -07:00
parent f8e4e83723
commit fa202af26d

View file

@ -78,9 +78,18 @@ class SwfAsset < ApplicationRecord
end end
end end
# Try loading the manifest. If we fail, record that we failed and return.
begin begin
NeopetsMediaArchive.load_file(manifest_url, return_content:) => Sync do |task|
{content:, source:} task.with_timeout(5) do
NeopetsMediaArchive.load_file(manifest_url, return_content:)
end
end => {content:, source:}
rescue Async::TimeoutError
# If the request times out, record nothing and return nothing! We'll try
# again sometime, on the assumption that this is intermittent.
Rails.logger.warn("Timed out loading manifest for asset #{id}")
return nil
rescue NeopetsMediaArchive::ResponseNotOK => error rescue NeopetsMediaArchive::ResponseNotOK => error
Rails.logger.warn "Failed to load manifest for asset #{id}: " + Rails.logger.warn "Failed to load manifest for asset #{id}: " +
error.message error.message
@ -90,14 +99,17 @@ class SwfAsset < ApplicationRecord
return nil return nil
end end
# If this was a fresh load over the network (or for some reason we're
# missing the timestamp), record that we succeeded.
if source == "network" || manifest_loaded_at.blank? if source == "network" || manifest_loaded_at.blank?
self.manifest_loaded_at = Time.now self.manifest_loaded_at = Time.now
self.manifest_status_code = 200 self.manifest_status_code = 200
save! if save_changes save! if save_changes
end end
return nil unless return_content return nil unless return_content # skip parsing if not needed!
# Parse the manifest as JSON, and return it!
begin begin
JSON.parse(content) JSON.parse(content)
rescue JSON::ParserError => error rescue JSON::ParserError => error