@@ -567,7 +567,6 @@ def check_harvester_available(self, harvester_id: int):
567567@app .task (
568568 bind = True ,
569569 queue = "geonode" ,
570- expires = 30 ,
571570 time_limit = 600 ,
572571 acks_late = False ,
573572 ignore_result = False ,
@@ -578,49 +577,75 @@ def update_harvestable_resources(self, refresh_session_id: int):
578577 # of resources because these have potentially been individually selected by the
579578 # user, which means we are not interested in all of them
580579 session = models .AsynchronousHarvestingSession .objects .get (pk = refresh_session_id )
581- if session .status != session .STATUS_ABORTED :
582- session .status = session .STATUS_ON_GOING
583- session .save ()
584- harvester = session .harvester
585- if harvester .update_availability ():
586- harvester .status = harvester .STATUS_UPDATING_HARVESTABLE_RESOURCES
587- harvester .save ()
588- worker = harvester .get_harvester_worker ()
589- try :
590- num_resources = worker .get_num_available_resources ()
591- except (NotImplementedError , base .HarvestingException ) as exc :
592- _handle_harvestable_resources_update_error (
593- self .request .id , refresh_session_id = refresh_session_id , raised_exception = exc
594- )
595- else :
596- harvester .num_harvestable_resources = num_resources
597- harvester .save ()
598- session .total_records_to_process = num_resources
599- session .save ()
600- page_size = 10
601- total_pages = math .ceil (num_resources / page_size )
602- batches = []
603- for page in range (total_pages ):
604- batches .append (
605- _update_harvestable_resources_batch .signature (
606- args = (refresh_session_id , page , page_size ),
607- )
608- )
609- update_finalizer = _finish_harvestable_resources_update .signature (
610- args = (refresh_session_id ,), immutable = True
611- ).on_error (
612- _handle_harvestable_resources_update_error .signature (
613- kwargs = {"refresh_session_id" : refresh_session_id }
614- )
615- )
616- update_workflow = chord (batches , body = update_finalizer )
617- update_workflow .apply_async (args = (), expiration = 30 )
618- else :
580+
581+ if session .status == session .STATUS_ABORTED :
582+ logger .debug ("Session has been aborted, skipping..." )
583+ return
584+
585+ session .status = session .STATUS_ON_GOING
586+ session .save ()
587+
588+ harvester = session .harvester
589+
590+ try :
591+
592+ if not harvester .update_availability ():
619593 finish_asynchronous_session (
620594 refresh_session_id , session .STATUS_FINISHED_ALL_FAILED , final_details = "Harvester is not available"
621595 )
622- else :
623- logger .debug ("Session has been aborted, skipping..." )
596+ return
597+
598+ harvester .status = harvester .STATUS_UPDATING_HARVESTABLE_RESOURCES
599+ harvester .save ()
600+
601+ worker = harvester .get_harvester_worker ()
602+ try :
603+ num_resources = worker .get_num_available_resources ()
604+ # definition of the dynamic expiration time
605+ task_expiration_time = calculate_dynamic_expiration (num_resources )
606+ except (NotImplementedError , base .HarvestingException ) as exc :
607+ logger .exception ("Failed to get number of available resources for harvester %s" , harvester .id )
608+ details = f"Failed to get number of available resources: { exc } "
609+ finish_asynchronous_session (
610+ refresh_session_id ,
611+ models .AsynchronousHarvestingSession .STATUS_FINISHED_ALL_FAILED ,
612+ final_details = details ,
613+ )
614+ return
615+
616+ harvester .num_harvestable_resources = num_resources
617+ harvester .save ()
618+ session .total_records_to_process = num_resources
619+ session .save ()
620+ page_size = 10
621+ total_pages = math .ceil (num_resources / page_size )
622+ batches = []
623+ for page in range (total_pages ):
624+ batches .append (
625+ _update_harvestable_resources_batch .signature (
626+ args = (refresh_session_id , page , page_size ),
627+ ).set (expires = task_expiration_time )
628+ )
629+ update_finalizer = (
630+ _finish_harvestable_resources_update .signature (args = (refresh_session_id ,), immutable = True )
631+ .on_error (
632+ _handle_harvestable_resources_update_error .signature (kwargs = {"refresh_session_id" : refresh_session_id })
633+ )
634+ .set (expires = task_expiration_time )
635+ )
636+
637+ update_workflow = chord (batches , body = update_finalizer )
638+ update_workflow .apply_async (args = (), expires = task_expiration_time )
639+ logger .info (f"Applying harvesting chord with expiration in { task_expiration_time } seconds" )
640+
641+ except Exception as exc :
642+ logger .exception ("Unexpected error during update_harvestable_resources for harvester %s" , harvester .id )
643+ details = f"Unexpected error: { exc } "
644+ finish_asynchronous_session (
645+ refresh_session_id ,
646+ models .AsynchronousHarvestingSession .STATUS_FINISHED_ALL_FAILED ,
647+ final_details = details ,
648+ )
624649
625650
626651@app .task (
0 commit comments