From 9b4d076ca5cd09b63c4025d2523da65530f8f1b0 Mon Sep 17 00:00:00 2001 From: amyjaynethompson <52806925+amyjaynethompson@users.noreply.github.com> Date: Mon, 16 Mar 2026 10:22:21 +0000 Subject: [PATCH 1/2] custom delay option --- src/dlstbx/services/trigger.py | 38 +++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/dlstbx/services/trigger.py b/src/dlstbx/services/trigger.py index f4a401097..a2d269ab3 100644 --- a/src/dlstbx/services/trigger.py +++ b/src/dlstbx/services/trigger.py @@ -215,9 +215,18 @@ class MultiplexParameters(pydantic.BaseModel): spacegroup: Optional[str] = None automatic: Optional[bool] = False comment: Optional[str] = None - backoff_delay: float = pydantic.Field(default=8, alias="backoff-delay") - backoff_max_try: int = pydantic.Field(default=10, alias="backoff-max-try") - backoff_multiplier: float = pydantic.Field(default=2, alias="backoff-multiplier") + backoff_delay: Dict[str, float] = pydantic.Field( + default={"default": 8}, alias="backoff-delay" + ) + backoff_max_try: Dict[str, int] = pydantic.Field( + default={"default": 10}, alias="backoff-max-try" + ) + backoff_multiplier: Dict[str, float] = pydantic.Field( + default={"default": 2}, alias="backoff-multiplier" + ) + # backoff_delay: float = pydantic.Field(default=8, alias="backoff-delay") + # backoff_max_try: int = pydantic.Field(default=10, alias="backoff-max-try") + # backoff_multiplier: float = pydantic.Field(default=2, alias="backoff-multiplier") wavelength_tolerance: float = pydantic.Field(default=1e-4, ge=0) diffraction_plan_info: Optional[DiffractionPlanInfo] = None recipe: Optional[str] = None @@ -1870,14 +1879,29 @@ def trigger_multiplex( # Calculate message delay for exponential backoff in case a processing # program for a related data collection is still running, in which case # we checkpoint with the calculated message delay + self.log.debug(parameters.backoff_delay) + self.log.debug(parameters.backoff_multiplier) + self.log.debug(parameters.backoff_max_try) + backoff_delay = parameters.backoff_delay.get( + parameters.beamline, parameters.backoff_delay["default"] + ) + backoff_multiplier = parameters.backoff_multiplier.get( + parameters.beamline, parameters.backoff_multiplier["default"] + ) + backoff_max_try = parameters.backoff_max_try.get( + parameters.beamline, parameters.backoff_max_try["default"] + ) + + self.log.debug( + f"Using backoff parameters: delay {backoff_delay}, multiplier {backoff_multiplier}, max_try {backoff_max_try}" + ) + status = { "ntry": 0, } if isinstance(message, dict): status.update(message.get("trigger-status", {})) - message_delay = int( - parameters.backoff_delay * parameters.backoff_multiplier ** status["ntry"] - ) + message_delay = int(backoff_delay * backoff_multiplier ** status["ntry"]) status["ntry"] += 1 self.log.debug(f"dcid={dcid}\nmessage_delay={message_delay}\n{status}") @@ -1934,7 +1958,7 @@ def trigger_multiplex( row.AutoProcProgram.autoProcProgramId for row in waiting_processing_jobs ] - if status["ntry"] >= parameters.backoff_max_try: + if status["ntry"] >= backoff_max_try: # Give up waiting for this program to finish and trigger # multiplex with remaining related results are available self.log.info( From 005236312dd4d61338b5967f3e7817072f91cb99 Mon Sep 17 00:00:00 2001 From: amyjaynethompson <52806925+amyjaynethompson@users.noreply.github.com> Date: Wed, 18 Mar 2026 11:34:31 +0000 Subject: [PATCH 2/2] tidy --- src/dlstbx/services/trigger.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/dlstbx/services/trigger.py b/src/dlstbx/services/trigger.py index a2d269ab3..5592bbd36 100644 --- a/src/dlstbx/services/trigger.py +++ b/src/dlstbx/services/trigger.py @@ -224,9 +224,6 @@ class MultiplexParameters(pydantic.BaseModel): backoff_multiplier: Dict[str, float] = pydantic.Field( default={"default": 2}, alias="backoff-multiplier" ) - # backoff_delay: float = pydantic.Field(default=8, alias="backoff-delay") - # backoff_max_try: int = pydantic.Field(default=10, alias="backoff-max-try") - # backoff_multiplier: float = pydantic.Field(default=2, alias="backoff-multiplier") wavelength_tolerance: float = pydantic.Field(default=1e-4, ge=0) diffraction_plan_info: Optional[DiffractionPlanInfo] = None recipe: Optional[str] = None @@ -1794,9 +1791,9 @@ def trigger_multiplex( "name": "sample_bar", } ], - "backoff-delay": 8, # default - "backoff-max-try": 10, # default - "backoff-multiplier": 2, # default + "backoff-delay": {'default': 8} + "backoff-max-try": {'default': 10, 'i02-1': 7} + "backoff-multiplier": {'default': 2} } """ dcid = parameters.dcid @@ -1879,9 +1876,6 @@ def trigger_multiplex( # Calculate message delay for exponential backoff in case a processing # program for a related data collection is still running, in which case # we checkpoint with the calculated message delay - self.log.debug(parameters.backoff_delay) - self.log.debug(parameters.backoff_multiplier) - self.log.debug(parameters.backoff_max_try) backoff_delay = parameters.backoff_delay.get( parameters.beamline, parameters.backoff_delay["default"] )