From f53de62435897f1e942dcc72c8ebf730edf6fe23 Mon Sep 17 00:00:00 2001 From: Gavin Aguiar Date: Wed, 4 Mar 2026 12:14:53 -0600 Subject: [PATCH 1/3] Remove hasattr check for every invocation --- workers/proxy_worker/dispatcher.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/workers/proxy_worker/dispatcher.py b/workers/proxy_worker/dispatcher.py index 55aaeb3b..836c7df9 100644 --- a/workers/proxy_worker/dispatcher.py +++ b/workers/proxy_worker/dispatcher.py @@ -37,6 +37,7 @@ # Library worker import reloaded in init and reload request _library_worker = None +_library_worker_has_cv = False # Thread-local invocation ID registry for efficient lookup _thread_invocation_registry: typing.Dict[int, str] = {} @@ -99,9 +100,9 @@ def get_global_current_invocation_id() -> Optional[str]: def get_current_invocation_id() -> Optional[Any]: - global _library_worker + global _library_worker, _library_worker_has_cv # Check global current invocation first (most up-to-date) - if _library_worker and not hasattr(_library_worker, 'invocation_id_cv'): + if _library_worker and not _library_worker_has_cv: global_invocation_id = get_global_current_invocation_id() if global_invocation_id is not None: return global_invocation_id @@ -404,12 +405,13 @@ def stop(self) -> None: @staticmethod def reload_library_worker(directory: str): - global _library_worker + global _library_worker, _library_worker_has_cv v2_scriptfile = os.path.join(directory, get_script_file_name()) if os.path.exists(v2_scriptfile): try: import azure_functions_runtime # NoQA _library_worker = azure_functions_runtime + _library_worker_has_cv = hasattr(_library_worker, 'invocation_id_cv') logger.debug("azure_functions_runtime import succeeded: %s", _library_worker.__file__) except ImportError: @@ -419,6 +421,7 @@ def reload_library_worker(directory: str): try: import azure_functions_runtime_v1 # NoQA _library_worker = azure_functions_runtime_v1 + _library_worker_has_cv = hasattr(_library_worker, 'invocation_id_cv') logger.debug("azure_functions_runtime_v1 import succeeded: %s", _library_worker.__file__) # type: ignore[union-attr] except ImportError: From 6310d8702d1161892533c3395f7e57a13d5a3235 Mon Sep 17 00:00:00 2001 From: Gavin Aguiar Date: Wed, 4 Mar 2026 14:25:18 -0600 Subject: [PATCH 2/3] Removing get_attr --- workers/proxy_worker/dispatcher.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/workers/proxy_worker/dispatcher.py b/workers/proxy_worker/dispatcher.py index 836c7df9..d318d488 100644 --- a/workers/proxy_worker/dispatcher.py +++ b/workers/proxy_worker/dispatcher.py @@ -129,13 +129,12 @@ def get_current_invocation_id() -> Optional[Any]: return thread_invocation_id # Check contextvar from library worker - if _library_worker: + if _library_worker and _library_worker_has_cv: try: - cv = getattr(_library_worker, 'invocation_id_cv', None) - if cv: - val = cv.get() - if val is not None: - return val + cv = _library_worker.invocation_id_cv + val = cv.get() + if val is not None: + return val except (AttributeError, LookupError): pass From c0ed2cf1e0f57e428a264376d455224a164d94b6 Mon Sep 17 00:00:00 2001 From: Gavin Aguiar Date: Fri, 6 Mar 2026 14:02:33 -0600 Subject: [PATCH 3/3] Minor improvements for cold start --- workers/proxy_worker/dispatcher.py | 41 ++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/workers/proxy_worker/dispatcher.py b/workers/proxy_worker/dispatcher.py index d318d488..0276a044 100644 --- a/workers/proxy_worker/dispatcher.py +++ b/workers/proxy_worker/dispatcher.py @@ -35,6 +35,19 @@ from proxy_worker.version import VERSION from .utils.dependency import DependencyManager +# Cache protobuf constants to avoid repeated lookups in hot paths +_RpcLog = protos.RpcLog +_LOG_LEVEL_CRITICAL = _RpcLog.Critical +_LOG_LEVEL_ERROR = _RpcLog.Error +_LOG_LEVEL_WARNING = _RpcLog.Warning +_LOG_LEVEL_INFO = _RpcLog.Information +_LOG_LEVEL_DEBUG = _RpcLog.Debug +_LOG_LEVEL_NONE = getattr(_RpcLog, 'None') + +_RpcLogCategory = _RpcLog.RpcLogCategory +_LOG_CATEGORY_SYSTEM = _RpcLogCategory.Value('System') +_LOG_CATEGORY_USER = _RpcLogCategory.Value('User') + # Library worker import reloaded in init and reload request _library_worker = None _library_worker_has_cv = False @@ -122,12 +135,6 @@ def get_current_invocation_id() -> Optional[Any]: # No event loop running pass - # Check the thread-local invocation ID registry - current_thread_id = threading.get_ident() - thread_invocation_id = get_thread_invocation_id(current_thread_id) - if thread_invocation_id is not None: - return thread_invocation_id - # Check contextvar from library worker if _library_worker and _library_worker_has_cv: try: @@ -138,6 +145,12 @@ def get_current_invocation_id() -> Optional[Any]: except (AttributeError, LookupError): pass + # Check the thread-local invocation ID registry + current_thread_id = threading.get_ident() + thread_invocation_id = get_thread_invocation_id(current_thread_id) + if thread_invocation_id is not None: + return thread_invocation_id + return getattr(_invocation_id_local, 'invocation_id', None) @@ -204,22 +217,22 @@ def __init__(self, loop: AbstractEventLoop, host: str, port: int, def on_logging(self, record: logging.LogRecord, formatted_msg: str) -> None: if record.levelno >= logging.CRITICAL: - log_level = protos.RpcLog.Critical + log_level = _LOG_LEVEL_CRITICAL elif record.levelno >= logging.ERROR: - log_level = protos.RpcLog.Error + log_level = _LOG_LEVEL_ERROR elif record.levelno >= logging.WARNING: - log_level = protos.RpcLog.Warning + log_level = _LOG_LEVEL_WARNING elif record.levelno >= logging.INFO: - log_level = protos.RpcLog.Information + log_level = _LOG_LEVEL_INFO elif record.levelno >= logging.DEBUG: - log_level = protos.RpcLog.Debug + log_level = _LOG_LEVEL_DEBUG else: - log_level = getattr(protos.RpcLog, 'None') + log_level = _LOG_LEVEL_NONE if is_system_log_category(record.name): - log_category = protos.RpcLog.RpcLogCategory.Value('System') + log_category = _LOG_CATEGORY_SYSTEM else: # customers using logging will yield 'root' in record.name - log_category = protos.RpcLog.RpcLogCategory.Value('User') + log_category = _LOG_CATEGORY_USER log = dict( level=log_level,