Copilot commented on code in PR #64238:
URL: https://github.com/apache/airflow/pull/64238#discussion_r3025329717


##########
task-sdk/src/airflow/sdk/execution_time/secrets/execution_api.py:
##########
@@ -66,25 +66,26 @@ def get_connection(self, conn_id: str, team_name: str | 
None = None) -> Connecti
             # Convert ExecutionAPI response to SDK Connection
             return _process_connection_result_conn(msg)
         except RuntimeError as e:
-            # TriggerCommsDecoder.send() uses async_to_sync internally, which 
raises RuntimeError
-            # when called within an async event loop. In greenback portal 
contexts (triggerer),
-            # we catch this and use greenback to call the async version 
instead.
-            if str(e).startswith("You cannot use AsyncToSync in the same 
thread as an async event loop"):
-                import asyncio
+            import asyncio
+            import greenback
 
-                import greenback
+            msg = str(e)
 
+            if (
+                "You cannot use AsyncToSync in the same thread as an async 
event loop" in msg
+                or "attached to a different loop" in msg
+            ):
                 task = asyncio.current_task()
-                if greenback.has_portal(task):
+                if task and greenback.has_portal(task):
                     import warnings
 
                     warnings.warn(
-                        "You should not use sync calls here -- use `await 
aget_connection` instead",
+                        "Sync connection access failed due to event loop 
mismatch. "
+                        "Falling back to async connection retrieval.",

Review Comment:
   The new warning message explains the fallback, but it no longer tells 
callers what to do instead (previously it suggested using `await 
aget_connection`). Consider including that actionable guidance so users hitting 
this in triggerer/async contexts know how to avoid the sync call entirely.
   ```suggestion
                           "If you are running in an async or triggerer 
context, use "
                           "`await aget_connection(conn_id)` instead of 
`get_connection` "
                           "to avoid this sync call. Falling back to async 
connection retrieval.",
   ```



##########
task-sdk/src/airflow/sdk/execution_time/secrets/execution_api.py:
##########
@@ -66,25 +66,26 @@ def get_connection(self, conn_id: str, team_name: str | 
None = None) -> Connecti
             # Convert ExecutionAPI response to SDK Connection
             return _process_connection_result_conn(msg)
         except RuntimeError as e:
-            # TriggerCommsDecoder.send() uses async_to_sync internally, which 
raises RuntimeError
-            # when called within an async event loop. In greenback portal 
contexts (triggerer),
-            # we catch this and use greenback to call the async version 
instead.
-            if str(e).startswith("You cannot use AsyncToSync in the same 
thread as an async event loop"):
-                import asyncio
+            import asyncio
+            import greenback
 
-                import greenback
+            msg = str(e)
 
+            if (
+                "You cannot use AsyncToSync in the same thread as an async 
event loop" in msg
+                or "attached to a different loop" in msg
+            ):

Review Comment:
   This change introduces a second RuntimeError message trigger ("attached to a 
different loop"), but there is no regression test covering that new branch. 
Please add a test analogous to `test_runtime_error_triggers_greenback_fallback` 
that raises the cross-loop RuntimeError and asserts the greenback fallback path 
is used.



##########
task-sdk/src/airflow/sdk/execution_time/secrets/execution_api.py:
##########
@@ -66,25 +66,26 @@ def get_connection(self, conn_id: str, team_name: str | 
None = None) -> Connecti
             # Convert ExecutionAPI response to SDK Connection
             return _process_connection_result_conn(msg)
         except RuntimeError as e:
-            # TriggerCommsDecoder.send() uses async_to_sync internally, which 
raises RuntimeError
-            # when called within an async event loop. In greenback portal 
contexts (triggerer),
-            # we catch this and use greenback to call the async version 
instead.
-            if str(e).startswith("You cannot use AsyncToSync in the same 
thread as an async event loop"):
-                import asyncio
+            import asyncio
+            import greenback
 

Review Comment:
   `asyncio`/`greenback` are imported for every `RuntimeError`, even when the 
message doesn't match the event-loop cases. This adds unnecessary work in the 
common path for unrelated runtime errors and also keeps imports inside a method 
body. Consider moving these imports to module scope, or at least deferring them 
until after the message check so they only happen when the greenback fallback 
branch is actually taken.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to