11from __future__ import annotations
22
33import re
4+ import time
45import traceback
56from ast import literal_eval
67from importlib .metadata import EntryPoint # type hinting only
@@ -94,7 +95,14 @@ def validate_and_sanitise(
9495 raise ValueError (f"{ file } points to a directory that is not permitted" )
9596
9697 # Check that it's a file, not a directory
97- if full_path .is_file () is False :
98+ # Make a couple of attempts to rule out race condition
99+ attempts = 0
100+ while attempts < 50 :
101+ if full_path .is_file () is True :
102+ break
103+ attempts += 1
104+ time .sleep (0.1 )
105+ else :
98106 raise ValueError (f"{ file } is not a file" )
99107
100108 # Check that it is of a permitted file type
@@ -184,7 +192,23 @@ def get_db_entry(
184192 )
185193 db .add (db_entry )
186194 db .commit ()
187- db .refresh (db_entry )
195+
196+ # Make multiple attempts to refresh data in case of race condition
197+ attempts = 0
198+ while attempts < 50 :
199+ try :
200+ db .refresh (db_entry )
201+ break
202+ except Exception :
203+ pass
204+ attempts += 1
205+ time .sleep (0.1 )
206+ else :
207+ raise RuntimeError (
208+ "Maximum number of attempts reached while trying to refresh database "
209+ f"entry for { str (file_path if file_path else series_name )!r} "
210+ )
211+
188212 except Exception :
189213 raise Exception
190214
@@ -215,7 +239,10 @@ def register_lif_file(
215239 file_path = lif_file ,
216240 )
217241 except Exception :
218- logger .error (traceback .format_exc ())
242+ logger .error (
243+ f"Exception encountered while registering LIF file { str (lif_file )!r} : \n "
244+ f"{ traceback .format_exc ()} "
245+ )
219246 return False
220247
221248 # Add metadata information if provided
@@ -224,7 +251,11 @@ def register_lif_file(
224251 master_metadata = validate_and_sanitise (master_metadata , session_id , db )
225252 clem_lif_file .master_metadata = str (master_metadata )
226253 except Exception :
227- logger .warning (traceback .format_exc ())
254+ logger .warning (
255+ "Unable to add master metadata information to database entry for "
256+ f"LIF file { str (lif_file )!r} : \n "
257+ f"{ traceback .format_exc ()} "
258+ )
228259
229260 # Register child metadata if provided
230261 for metadata in child_metadata :
@@ -238,7 +269,11 @@ def register_lif_file(
238269 # Append to database entry
239270 clem_lif_file .child_metadata .append (metadata_db_entry )
240271 except Exception :
241- logger .warning (traceback .format_exc ())
272+ logger .warning (
273+ "Unable to add child metadata information to database entry for "
274+ f"LIF file { str (lif_file )!r} : \n "
275+ f"{ traceback .format_exc ()} "
276+ )
242277 continue
243278
244279 # Register child image series if provided
@@ -253,7 +288,11 @@ def register_lif_file(
253288 # Append to database entry
254289 clem_lif_file .child_series .append (series_db_entry )
255290 except Exception :
256- logger .warning (traceback .format_exc ())
291+ logger .warning (
292+ "Unable to add child series information to database entry for "
293+ f"LIF file { str (lif_file )!r} : \n "
294+ f"{ traceback .format_exc ()} "
295+ )
257296 continue
258297
259298 # Register child image stacks if provided
@@ -268,7 +307,11 @@ def register_lif_file(
268307 # Append to database entry
269308 clem_lif_file .child_stacks .append (stack_db_entry )
270309 except Exception :
271- logger .warning (traceback .format_exc ())
310+ logger .warning (
311+ "Unable to add child image stack information to database entry for "
312+ f"LIF file { str (lif_file )!r} : \n "
313+ f"{ traceback .format_exc ()} "
314+ )
272315 continue
273316
274317 # Commit to database
@@ -296,7 +339,10 @@ def register_tiff_file(
296339 file_path = tiff_file ,
297340 )
298341 except Exception :
299- logger .error (traceback .format_exc ())
342+ logger .error (
343+ f"Exception encountered while registering TIFF file { str (tiff_file )!r} : \n "
344+ f"{ traceback .format_exc ()} "
345+ )
300346 return False
301347
302348 # Add metadata if provided
@@ -311,7 +357,10 @@ def register_tiff_file(
311357 # Link database entries
312358 clem_tiff_file .associated_metadata = metadata_db_entry
313359 except Exception :
314- logger .warning (traceback .format_exc ())
360+ logger .warning (
361+ f"Unable to register metadata for TIFF file { str (tiff_file )!r} : \n "
362+ f"{ traceback .format_exc ()} "
363+ )
315364
316365 # Add series information if provided
317366 if associated_series is not None :
@@ -325,7 +374,11 @@ def register_tiff_file(
325374 # Link database entries
326375 clem_tiff_file .child_series = series_db_entry
327376 except Exception :
328- logger .warning (traceback .format_exc ())
377+ logger .warning (
378+ "Unable to register series information for TIFF file "
379+ f"{ str (tiff_file )!r} : \n "
380+ f"{ traceback .format_exc ()} "
381+ )
329382
330383 # Add image stack information if provided
331384 if associated_stack is not None :
@@ -339,7 +392,11 @@ def register_tiff_file(
339392 # Link database entries
340393 clem_tiff_file .child_stack = stack_db_entry
341394 except Exception :
342- logger .warning (traceback .format_exc ())
395+ logger .warning (
396+ f"Unable to register image stack { str (associated_stack )!r} "
397+ f"in database for TIFF file { str (tiff_file )!r} : \n "
398+ f"{ traceback .format_exc ()} "
399+ )
343400
344401 # Commit to database
345402 db .add (clem_tiff_file )
0 commit comments