Skip to content

Commit d1390d5

Browse files
committed
Updated dispatcher
1 parent 5343e0e commit d1390d5

File tree

2 files changed

+19
-46
lines changed

2 files changed

+19
-46
lines changed

proxy_worker/dispatcher.py

+17-45
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import concurrent.futures
33
import importlib.util
44
import logging
5-
import os
65
import queue
76
import sys
87
import threading
@@ -13,7 +12,6 @@
1312
from typing import Optional
1413

1514
import grpc
16-
import azure_functions_worker
1715

1816
from proxy_worker import protos
1917
from proxy_worker.logging import (
@@ -30,6 +28,9 @@
3028
from proxy_worker.version import VERSION
3129
from .utils.dependency import DependencyManager
3230

31+
# Library worker import reloaded in init and reload request
32+
library_worker = None
33+
3334
class ContextEnabledTask(asyncio.Task):
3435
AZURE_INVOCATION_ID = '__azure_function_invocation_id__'
3536

@@ -103,6 +104,7 @@ def current(cls):
103104
return disp
104105

105106

107+
106108
class Dispatcher(metaclass=DispatcherMeta):
107109
_GRPC_STOP_RESPONSE = object()
108110

@@ -376,42 +378,6 @@ def tp_max_workers_validator(value: str) -> bool:
376378
# We can box the app setting as int for earlier python versions.
377379
return int(max_workers) if max_workers else None
378380

379-
@staticmethod
380-
def reload_azure_functions_worker():
381-
try:
382-
DependencyManager.reload_azure_google_namespace_from_worker_deps()
383-
384-
customer_packages_path = sys.path[0]
385-
potential_path = os.path.join(customer_packages_path, "azure_functions_worker", "__init__.py")
386-
387-
if not os.path.exists(potential_path):
388-
raise FileNotFoundError(f"ERROR: Expected module file not found at {potential_path}")
389-
390-
if "azure_functions_worker" in sys.modules:
391-
del sys.modules["azure_functions_worker"]
392-
393-
# Create module spec with forced reloading
394-
spec = importlib.util.spec_from_file_location("azure_functions_worker", potential_path)
395-
396-
if spec is None:
397-
raise ImportError(f"ERROR: Failed to create module spec for {potential_path}")
398-
399-
if spec.loader is None:
400-
raise ImportError(f"ERROR: spec.loader is None for {potential_path}")
401-
402-
# Load module manually
403-
module = importlib.util.module_from_spec(spec)
404-
spec.loader.exec_module(module)
405-
406-
# Force all references to use the new module
407-
sys.modules["azure_functions_worker"] = module
408-
globals()["azure_functions_worker"] = module
409-
410-
logger.debug("V1 Programming model detected. Successfully loaded azure_functions_worker from:"
411-
f" {module.__file__}")
412-
except FileNotFoundError:
413-
logger.debug("V2 Programming model detected. Skipping azure_functions_worker reload.")
414-
415381
async def _handle__worker_init_request(self, request):
416382
logger.info('Received WorkerInitRequest, '
417383
'python version %s, '
@@ -432,9 +398,12 @@ async def _handle__worker_init_request(self, request):
432398
if DependencyManager.should_load_cx_dependencies():
433399
DependencyManager.prioritize_customer_dependencies()
434400

435-
self.reload_azure_functions_worker()
401+
import azure_functions_worker as worker
402+
global library_worker
403+
importlib.reload(worker)
404+
library_worker = worker
436405

437-
init_response = await azure_functions_worker.worker_init_request(init_request)
406+
init_response = await library_worker.worker_init_request(init_request)
438407
logger.info("Finished WorkerInitRequest, request ID %s, worker id %s, ",
439408
self.request_id, self.worker_id)
440409

@@ -456,12 +425,15 @@ async def _handle__function_environment_reload_request(self, request):
456425
directory = func_env_reload_request.function_app_directory
457426
DependencyManager.reload_customer_libraries(directory)
458427

459-
self.reload_azure_functions_worker()
428+
import azure_functions_worker as worker
429+
global library_worker
430+
importlib.reload(worker)
431+
library_worker = worker
460432

461433
env_reload_request = WorkerRequest(name="FunctionEnvironmentReloadRequest", request=request,
462434
properties={"protos": protos,
463435
"host": self._host})
464-
env_reload_response = await azure_functions_worker.function_environment_reload_request(env_reload_request)
436+
env_reload_response = await library_worker.function_environment_reload_request(env_reload_request)
465437
return protos.StreamingMessage(
466438
request_id=self.request_id,
467439
function_environment_reload_response=env_reload_response)
@@ -481,7 +453,7 @@ async def _handle__functions_metadata_request(self, request):
481453
self.request_id, self.worker_id)
482454

483455
metadata_request = WorkerRequest(name="WorkerMetadataRequest", request=request)
484-
metadata_response = await azure_functions_worker.functions_metadata_request(metadata_request)
456+
metadata_response = await library_worker.functions_metadata_request(metadata_request)
485457

486458
return protos.StreamingMessage(
487459
request_id=request.request_id,
@@ -499,7 +471,7 @@ async def _handle__function_load_request(self, request):
499471
self.request_id, function_id, function_name, self.worker_id)
500472

501473
load_request = WorkerRequest(name="FunctionsLoadRequest", request=request)
502-
load_response = await azure_functions_worker.function_load_request(load_request)
474+
load_response = await library_worker.function_load_request(load_request)
503475

504476
return protos.StreamingMessage(
505477
request_id=self.request_id,
@@ -517,7 +489,7 @@ async def _handle__invocation_request(self, request):
517489

518490
invocation_request = WorkerRequest(name="WorkerInvRequest", request=request,
519491
properties={"threadpool": self._sync_call_tp})
520-
invocation_response = await azure_functions_worker.invocation_request(invocation_request)
492+
invocation_response = await library_worker.invocation_request(invocation_request)
521493
return protos.StreamingMessage(
522494
request_id=self.request_id,
523495
invocation_response=invocation_response)

python/proxyV4/worker.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ def determine_user_pkg_paths():
3030
User packages are defined in:
3131
/home/site/wwwroot/.python_packages/lib/site-packages
3232
"""
33-
validate_python_version()
3433
usr_packages_path = [os.path.join(PKGS_PATH, PKGS)]
3534
return usr_packages_path
3635

@@ -44,6 +43,8 @@ def add_script_root_to_sys_path():
4443

4544
if __name__ == '__main__':
4645
# worker.py lives in the same directory as proxy_worker
46+
validate_python_version()
47+
4748
func_worker_dir = str(pathlib.Path(__file__).absolute())
4849
env = os.environ
4950

0 commit comments

Comments
 (0)