|
2 | 2 | from typing import Optional |
3 | 3 |
|
4 | 4 | from temporalio import workflow |
| 5 | +from temporalio.exceptions import ApplicationError |
5 | 6 |
|
6 | 7 | from resource_pool.shared import AcquireRequest, AcquireResponse |
7 | 8 |
|
@@ -79,20 +80,28 @@ def get_current_holders(self) -> dict[str, Optional[InternalAcquireRequest]]: |
79 | 80 | async def assign_resource( |
80 | 81 | self, resource: str, internal_request: InternalAcquireRequest |
81 | 82 | ) -> None: |
82 | | - self.resources[resource] = internal_request |
83 | 83 | workflow.logger.info( |
84 | 84 | f"workflow_id={internal_request.workflow_id} acquired resource {resource}" |
85 | 85 | ) |
86 | | - internal_request.release_signal = str(workflow.uuid4()) |
87 | | - self.release_key_to_resource[internal_request.release_signal] = resource |
88 | 86 |
|
89 | 87 | requester = workflow.get_external_workflow_handle(internal_request.workflow_id) |
90 | | - await requester.signal( |
91 | | - f"assign_resource_{workflow.info().workflow_id}", |
92 | | - AcquireResponse( |
93 | | - release_key=internal_request.release_signal, resource=resource |
94 | | - ), |
95 | | - ) |
| 88 | + try: |
| 89 | + release_signal = str(workflow.uuid4()) |
| 90 | + await requester.signal( |
| 91 | + f"assign_resource_{workflow.info().workflow_id}", |
| 92 | + AcquireResponse(release_key=release_signal, resource=resource), |
| 93 | + ) |
| 94 | + |
| 95 | + internal_request.release_signal = release_signal |
| 96 | + self.resources[resource] = internal_request |
| 97 | + self.release_key_to_resource[release_signal] = resource |
| 98 | + except ApplicationError as e: |
| 99 | + if e.type == "ExternalWorkflowExecutionNotFound": |
| 100 | + workflow.logger.info( |
| 101 | + f"Could not assign resource {resource} to {internal_request.workflow_id}: {e.message}" |
| 102 | + ) |
| 103 | + else: |
| 104 | + raise e |
96 | 105 |
|
97 | 106 | async def assign_next_resource(self) -> bool: |
98 | 107 | if len(self.waiters) == 0: |
|
0 commit comments