From b57ad9f202bbe204ed887d054641cac2b8a19aac Mon Sep 17 00:00:00 2001 From: Brad Banister Date: Tue, 11 Nov 2025 13:01:53 -0600 Subject: [PATCH] Ensure per-user Locust HTTP clients Prefer the current Locust user's HTTP client when constructing EdFiTaskSet instances and keep the shared class attribute only as a fallback. VolumeTestUser now rebinds EdFiAPIClient.client at the start of every user initialization so each simulated user maintains its own socket pool beyond 10 clients. --- .../edfi_performance_test/tasks/ed_fi_task_set.py | 8 +++++++- .../edfi_performance_test/tasks/volume/volume_tests.py | 5 ++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/ed_fi_task_set.py b/src/edfi-performance-test/edfi_performance_test/tasks/ed_fi_task_set.py index e203a45c..0c9c7473 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/ed_fi_task_set.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/ed_fi_task_set.py @@ -56,8 +56,14 @@ def __init__(self, parent, *args, **kwargs): self.client_class = self.generate_client_class() + # Prefer the Locust user's HTTP client so every simulated user maintains its own + # socket pool. Fall back to the shared class attribute for backwards compatibility. + locust_http_client = getattr(getattr(self, "user", None), "client", None) + if locust_http_client is None: + locust_http_client = EdFiAPIClient.client + self._api_client: EdFiAPIClient = self.client_class( - client=EdFiAPIClient.client, token=EdFiAPIClient.token + client=locust_http_client, token=EdFiAPIClient.token ) def __getattr__(self, item): diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/volume/volume_tests.py b/src/edfi-performance-test/edfi_performance_test/tasks/volume/volume_tests.py index 37aa233e..d8640e0c 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/volume/volume_tests.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/volume/volume_tests.py @@ -40,10 +40,13 @@ class VolumeTestUser(FastHttpUser): volume_test_root_namespace: str = "edfi_performance_test.tasks.volume." def on_start(self): + # Always associate the current user's HTTP client with the EdFiAPIClient so that + # every simulated Locust user maintains its own socket/connection pool. + EdFiAPIClient.client = self.client + if VolumeTestUser.is_initialized: return - EdFiAPIClient.client = self.client EdFiAPIClient.token = None # Import root pipeclean modules