From 56c76adeb87edaafd48032ac2928d4ac439389df Mon Sep 17 00:00:00 2001 From: Adam Ploshay Date: Thu, 30 May 2024 08:55:29 -0400 Subject: [PATCH] cherry-pick ImportFileSetJob retry logic from 0de8ee06 --- app/jobs/bulkrax/import_file_set_job.rb | 35 +++++++++++++------------ 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/app/jobs/bulkrax/import_file_set_job.rb b/app/jobs/bulkrax/import_file_set_job.rb index b29c57bb..0cc62d61 100644 --- a/app/jobs/bulkrax/import_file_set_job.rb +++ b/app/jobs/bulkrax/import_file_set_job.rb @@ -16,7 +16,12 @@ def perform(entry_id, importer_run_id) # e.g. "parents" or "parents_1" parent_identifier = (entry.raw_metadata[entry.related_parents_raw_mapping] || entry.raw_metadata["#{entry.related_parents_raw_mapping}_1"])&.strip - validate_parent!(parent_identifier) + begin + validate_parent!(parent_identifier) + rescue MissingParentError => e + handle_retry(entry, importer_run_id, e) + return + end entry.build if entry.succeeded? @@ -32,17 +37,6 @@ def perform(entry_id, importer_run_id) entry.save! entry.importer.current_run = ImporterRun.find(importer_run_id) entry.importer.record_status - - rescue MissingParentError => e - # try waiting for the parent record to be created - entry.import_attempts += 1 - entry.save! - if entry.import_attempts < 5 - ImportFileSetJob.set(wait: (entry.import_attempts + 1).minutes).perform_later(entry_id, importer_run_id) - else - ImporterRun.decrement_counter(:enqueued_records, importer_run_id) # rubocop:disable Rails/SkipsModelValidations - entry.set_status_info(e) - end end private @@ -54,14 +48,9 @@ def validate_parent!(parent_identifier) return if parent_identifier.blank? find_parent_record(parent_identifier) - check_parent_exists!(parent_identifier) check_parent_is_a_work!(parent_identifier) end - def check_parent_exists!(parent_identifier) - raise MissingParentError, %(Unable to find a record with the identifier "#{parent_identifier}") if parent_record.nil? - end - def check_parent_is_a_work!(parent_identifier) error_msg = %(A record with the ID "#{parent_identifier}" was found, but it was a #{parent_record.class}, which is not an valid/available work type) raise ::StandardError, error_msg unless curation_concern?(parent_record) @@ -69,6 +58,18 @@ def check_parent_is_a_work!(parent_identifier) def find_parent_record(parent_identifier) _, @parent_record = find_record(parent_identifier, importer_run_id) + raise MissingParentError, %(Unable to find a record with the identifier "#{parent_identifier}") unless parent_record + end + + def handle_retry(entry, importer_run_id, e) + entry.import_attempts += 1 + entry.save! + if entry.import_attempts < 5 + ImportFileSetJob.set(wait: (entry.import_attempts + 1).minutes).perform_later(entry.id, importer_run_id) + else + ImporterRun.decrement_counter(:enqueued_records, importer_run_id) # rubocop:disable Rails/SkipsModelValidations + entry.set_status_info(e) + end end end end