@@ -216,9 +216,15 @@ class MultiplexParameters(pydantic.BaseModel):
216216 spacegroup : Optional [str ] = None
217217 automatic : Optional [bool ] = False
218218 comment : Optional [str ] = None
219- backoff_delay : float = pydantic .Field (default = 8 , alias = "backoff-delay" )
220- backoff_max_try : int = pydantic .Field (default = 10 , alias = "backoff-max-try" )
221- backoff_multiplier : float = pydantic .Field (default = 2 , alias = "backoff-multiplier" )
219+ backoff_delay : Dict [str , float ] = pydantic .Field (
220+ default = {"default" : 8 }, alias = "backoff-delay"
221+ )
222+ backoff_max_try : Dict [str , int ] = pydantic .Field (
223+ default = {"default" : 10 }, alias = "backoff-max-try"
224+ )
225+ backoff_multiplier : Dict [str , float ] = pydantic .Field (
226+ default = {"default" : 2 }, alias = "backoff-multiplier"
227+ )
222228 wavelength_tolerance : float = pydantic .Field (default = 1e-4 , ge = 0 )
223229 diffraction_plan_info : Optional [DiffractionPlanInfo ] = None
224230 recipe : Optional [str ] = None
@@ -1795,9 +1801,9 @@ def trigger_multiplex(
17951801 "name": "sample_bar",
17961802 }
17971803 ],
1798- "backoff-delay": 8, # default
1799- "backoff-max-try": 10, # default
1800- "backoff-multiplier": 2, # default
1804+ "backoff-delay": {' default': 8}
1805+ "backoff-max-try": {'default': 10, 'i02-1': 7}
1806+ "backoff-multiplier": {' default': 2}
18011807 }
18021808 """
18031809 dcid = parameters .dcid
@@ -1880,14 +1886,26 @@ def trigger_multiplex(
18801886 # Calculate message delay for exponential backoff in case a processing
18811887 # program for a related data collection is still running, in which case
18821888 # we checkpoint with the calculated message delay
1889+ backoff_delay = parameters .backoff_delay .get (
1890+ parameters .beamline , parameters .backoff_delay ["default" ]
1891+ )
1892+ backoff_multiplier = parameters .backoff_multiplier .get (
1893+ parameters .beamline , parameters .backoff_multiplier ["default" ]
1894+ )
1895+ backoff_max_try = parameters .backoff_max_try .get (
1896+ parameters .beamline , parameters .backoff_max_try ["default" ]
1897+ )
1898+
1899+ self .log .debug (
1900+ f"Using backoff parameters: delay { backoff_delay } , multiplier { backoff_multiplier } , max_try { backoff_max_try } "
1901+ )
1902+
18831903 status = {
18841904 "ntry" : 0 ,
18851905 }
18861906 if isinstance (message , dict ):
18871907 status .update (message .get ("trigger-status" , {}))
1888- message_delay = int (
1889- parameters .backoff_delay * parameters .backoff_multiplier ** status ["ntry" ]
1890- )
1908+ message_delay = int (backoff_delay * backoff_multiplier ** status ["ntry" ])
18911909 status ["ntry" ] += 1
18921910 self .log .debug (f"dcid={ dcid } \n message_delay={ message_delay } \n { status } " )
18931911
@@ -1944,7 +1962,7 @@ def trigger_multiplex(
19441962 row .AutoProcProgram .autoProcProgramId
19451963 for row in waiting_processing_jobs
19461964 ]
1947- if status ["ntry" ] >= parameters . backoff_max_try :
1965+ if status ["ntry" ] > backoff_max_try :
19481966 # Give up waiting for this program to finish and trigger
19491967 # multiplex with remaining related results are available
19501968 self .log .info (
0 commit comments