99from boto3 import Session
1010from flask import current_app
1111
12+ from app import job_cache , job_cache_lock
1213from app .clients import AWS_CLIENT_CONFIG
1314from notifications_utils import aware_utcnow
1415
@@ -32,30 +33,25 @@ def get_service_id_from_key(key):
3233
3334
3435def set_job_cache (key , value ):
35- current_app .logger .debug (f"Setting { key } in the job_cache to { value } ." )
36- job_cache = current_app .config ["job_cache" ]
37- job_cache [key ] = (value , time .time () + 8 * 24 * 60 * 60 )
36+ # current_app.logger.debug(f"Setting {key} in the job_cache to {value}.")
37+
38+ with job_cache_lock :
39+ job_cache [key ] = (value , time .time () + 8 * 24 * 60 * 60 )
3840
3941
4042def get_job_cache (key ):
41- job_cache = current_app . config [ "job_cache" ]
43+
4244 ret = job_cache .get (key )
43- if ret is None :
44- current_app .logger .warning (f"Could not find { key } in the job_cache." )
45- else :
46- current_app .logger .debug (f"Got { key } from job_cache with value { ret } ." )
4745 return ret
4846
4947
5048def len_job_cache ():
51- job_cache = current_app .config ["job_cache" ]
5249 ret = len (job_cache )
5350 current_app .logger .debug (f"Length of job_cache is { ret } " )
5451 return ret
5552
5653
5754def clean_cache ():
58- job_cache = current_app .config ["job_cache" ]
5955 current_time = time .time ()
6056 keys_to_delete = []
6157 for key , (_ , expiry_time ) in job_cache .items ():
@@ -65,8 +61,9 @@ def clean_cache():
6561 current_app .logger .debug (
6662 f"Deleting the following keys from the job_cache: { keys_to_delete } "
6763 )
68- for key in keys_to_delete :
69- del job_cache [key ]
64+ with job_cache_lock :
65+ for key in keys_to_delete :
66+ del job_cache [key ]
7067
7168
7269def get_s3_client ():
@@ -207,9 +204,8 @@ def read_s3_file(bucket_name, object_key, s3res):
207204 extract_personalisation (job ),
208205 )
209206
210- except LookupError :
211- # perhaps our key is not formatted as we expected. If so skip it.
212- current_app .logger .exception ("LookupError #notify-debug-admin-1200" )
207+ except Exception as e :
208+ current_app .logger .exception (str (e ))
213209
214210
215211def get_s3_files ():
@@ -308,9 +304,7 @@ def file_exists(file_location):
308304
309305
310306def get_job_location (service_id , job_id ):
311- current_app .logger .debug (
312- f"#notify-debug-s3-partitioning NEW JOB_LOCATION: { NEW_FILE_LOCATION_STRUCTURE .format (service_id , job_id )} "
313- )
307+
314308 return (
315309 current_app .config ["CSV_UPLOAD_BUCKET" ]["bucket" ],
316310 NEW_FILE_LOCATION_STRUCTURE .format (service_id , job_id ),
@@ -326,9 +320,7 @@ def get_old_job_location(service_id, job_id):
326320 but it will take a few days where we have to support both formats.
327321 Remove this when everything works with the NEW_FILE_LOCATION_STRUCTURE.
328322 """
329- current_app .logger .debug (
330- f"#notify-debug-s3-partitioning OLD JOB LOCATION: { FILE_LOCATION_STRUCTURE .format (service_id , job_id )} "
331- )
323+
332324 return (
333325 current_app .config ["CSV_UPLOAD_BUCKET" ]["bucket" ],
334326 FILE_LOCATION_STRUCTURE .format (service_id , job_id ),
@@ -467,7 +459,6 @@ def extract_personalisation(job):
467459def get_phone_number_from_s3 (service_id , job_id , job_row_number ):
468460 job = get_job_cache (job_id )
469461 if job is None :
470- current_app .logger .debug (f"job { job_id } was not in the cache" )
471462 job = get_job_from_s3 (service_id , job_id )
472463 # Even if it is None, put it here to avoid KeyErrors
473464 set_job_cache (job_id , job )
@@ -481,8 +472,16 @@ def get_phone_number_from_s3(service_id, job_id, job_row_number):
481472 )
482473 return "Unavailable"
483474
484- phones = extract_phones (job , service_id , job_id )
485- set_job_cache (f"{ job_id } _phones" , phones )
475+ phones = get_job_cache (f"{ job_id } _phones" )
476+ if phones is None :
477+ current_app .logger .debug ("HAVE TO REEXTRACT PHONES!" )
478+ phones = extract_phones (job , service_id , job_id )
479+ set_job_cache (f"{ job_id } _phones" , phones )
480+ current_app .logger .debug (f"SETTING PHONES TO { phones } " )
481+ else :
482+ phones = phones [
483+ 0
484+ ] # we only want the phone numbers not the cache expiration time
486485
487486 # If we can find the quick dictionary, use it
488487 phone_to_return = phones [job_row_number ]
@@ -501,7 +500,6 @@ def get_personalisation_from_s3(service_id, job_id, job_row_number):
501500 # So this is a little recycling mechanism to reduce the number of downloads.
502501 job = get_job_cache (job_id )
503502 if job is None :
504- current_app .logger .debug (f"job { job_id } was not in the cache" )
505503 job = get_job_from_s3 (service_id , job_id )
506504 # Even if it is None, put it here to avoid KeyErrors
507505 set_job_cache (job_id , job )
@@ -519,7 +517,9 @@ def get_personalisation_from_s3(service_id, job_id, job_row_number):
519517 )
520518 return {}
521519
522- set_job_cache (f"{ job_id } _personalisation" , extract_personalisation (job ))
520+ personalisation = get_job_cache (f"{ job_id } _personalisation" )
521+ if personalisation is None :
522+ set_job_cache (f"{ job_id } _personalisation" , extract_personalisation (job ))
523523
524524 return get_job_cache (f"{ job_id } _personalisation" )[0 ].get (job_row_number )
525525
0 commit comments