Skip to content

Commit 74838fa

Browse files
authored
Merge pull request #194 from cloudblue/LITE-31014-fix-memleak
LITE-31014: Fix memory leak in runner, support new connect-eaas-core
2 parents 5a9e3e5 + 557f199 commit 74838fa

File tree

10 files changed

+211
-249
lines changed

10 files changed

+211
-249
lines changed

.github/workflows/build.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
timeout-minutes: 10
1616
strategy:
1717
matrix:
18-
python-version: ["3.9", "3.10"]
18+
python-version: ["3.9", "3.10", "3.11"]
1919
steps:
2020
- uses: actions/checkout@v3
2121
with:

connect/eaas/runner/managers/background.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,14 @@ async def get_argument(self, task_data):
4949
"""
5050
client = self.client
5151
if task_data.options.api_key:
52-
client = AsyncConnectClient(
52+
client = self._task_api_key_clients.setdefault(
5353
task_data.options.api_key,
54-
endpoint=self.config.get_api_url(),
55-
use_specs=False,
56-
default_headers=self.config.get_user_agent(),
54+
AsyncConnectClient(
55+
task_data.options.api_key,
56+
endpoint=self.config.get_api_url(),
57+
use_specs=False,
58+
default_headers=self.config.get_user_agent(),
59+
),
5760
)
5861
object_exists = await self.filter_collection_by_event_definition(
5962
client,

connect/eaas/runner/managers/base.py

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def __init__(self, config: ConfigHelper, handler: Union[EventsApp, TfnApp], enqu
6363
use_specs=False,
6464
default_headers=self.config.get_user_agent(),
6565
)
66+
self._task_api_key_clients = {}
6667
self.running_tasks = 0
6768

6869
async def filter_collection_by_event_definition(self, client, task_data):

connect/eaas/runner/managers/transformation.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,15 @@ class TransformationTasksManager(TasksManagerBase):
7373

7474
def get_client(self, task_data):
7575
if task_data.options.api_key:
76-
return AsyncConnectClient(
76+
return self._task_api_key_clients.setdefault(
7777
task_data.options.api_key,
78-
endpoint=self.config.get_api_url(),
79-
use_specs=False,
80-
default_headers=self.config.get_user_agent(),
81-
logger=RequestLogger(logger),
78+
AsyncConnectClient(
79+
task_data.options.api_key,
80+
endpoint=self.config.get_api_url(),
81+
use_specs=False,
82+
default_headers=self.config.get_user_agent(),
83+
logger=RequestLogger(logger),
84+
),
8285
)
8386

8487
return self.client

poetry.lock

+165-225
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

+5-4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ classifiers = [
1717
"Intended Audience :: Developers",
1818
"Programming Language :: Python :: 3.9",
1919
"Programming Language :: Python :: 3.10",
20+
"Programming Language :: Python :: 3.11",
2021
"Topic :: Utilities",
2122
"Topic :: Software Development :: Libraries",
2223
]
@@ -28,13 +29,13 @@ cextrun = 'connect.eaas.runner.main:main'
2829
python = ">=3.9,<4"
2930
websockets = "13.*"
3031
connect-openapi-client = ">=29.0,<30"
31-
logzio-python-handler = "^3.1.1"
32+
logzio-python-handler = "^4.1.4"
3233
backoff = "^2.2.1"
33-
connect-eaas-core = ">=30.3,<31"
34+
connect-eaas-core = ">=33.0,<34"
3435
httpx = ">=0.23,<1"
3536
rich = ">=12"
3637
pyfiglet = "^1.0.2"
37-
devtools = "^0.10.0"
38+
devtools = "^0.12.2"
3839
watchfiles = "^0.24"
3940
openpyxl = ">=3.0.0,<4"
4041
lxml = "^4.9.2"
@@ -57,7 +58,7 @@ flake8-pyproject = "^1.2"
5758
pytest-asyncio = "0.20.*"
5859
pytest-httpx = ">=0.20"
5960
responses = "^0.23.0"
60-
freezegun = "^1.2.1"
61+
freezegun = "^1.5.1"
6162
flaky = "^3.8"
6263
flake8-isort = "^6.0.0"
6364

tests/conftest.py

+9
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
import responses as sentry_responses
1111
import websockets
1212

13+
from connect.eaas.core.decorators import (
14+
router as router_decorator,
15+
)
1316
from connect.eaas.core.extension import (
1417
Extension,
1518
)
@@ -185,3 +188,9 @@ def default_env(mocker, unused_port):
185188
'row_transformation_task_max_execution_time': 60,
186189
},
187190
)
191+
192+
193+
@pytest.fixture(scope='function')
194+
def router():
195+
router_decorator.routes = []
196+
return router_decorator

tests/handlers/test_base.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import sys
12
from importlib.metadata import (
23
EntryPoint,
34
)
@@ -195,7 +196,10 @@ def get_features(self):
195196

196197
mocker.patch(
197198
'connect.eaas.runner.handlers.base.sys.modules',
198-
{'my_module': mocked_module},
199+
{
200+
**sys.modules,
201+
'my_module': mocked_module,
202+
},
199203
)
200204

201205
mocker.patch(

tests/handlers/test_web.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -362,19 +362,19 @@ def example_no_auth(self):
362362
{
363363
'method': 'GET',
364364
'path': '/auth',
365-
'summary': 'Example Auth',
365+
'summary': 'Myextension.Example Auth',
366366
},
367367
],
368368
'no_auth': [
369369
{
370370
'method': 'GET',
371371
'path': '/no_auth_deprecated',
372-
'summary': 'Example No Auth Deprecated',
372+
'summary': 'Myextension.Example No Auth Deprecated',
373373
},
374374
{
375375
'method': 'GET',
376376
'path': '/no_auth',
377-
'summary': 'Example No Auth',
377+
'summary': 'Myextension.Example No Auth',
378378
},
379379
],
380380
},

tests/workers/test_web.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from connect.eaas.core.decorators import (
1111
account_settings_page,
1212
customer_pages,
13-
router,
1413
web_app,
1514
)
1615
from connect.eaas.core.extension import (
@@ -169,7 +168,7 @@ def get_proxied_connect_api(cls):
169168
),
170169
)
171170
@pytest.mark.asyncio
172-
async def test_http_call(mocker, ws_server, unused_port, settings_payload, task_options):
171+
async def test_http_call(mocker, ws_server, unused_port, settings_payload, task_options, router):
173172
setup_response = copy.deepcopy(settings_payload)
174173
setup_response['logging']['logging_api_key'] = 'logging_api_key'
175174
setup_response['logging']['log_level'] = None
@@ -340,7 +339,9 @@ def test_url(self):
340339
),
341340
)
342341
@pytest.mark.asyncio
343-
async def test_http_call_redirect(mocker, ws_server, unused_port, settings_payload, task_options):
342+
async def test_http_call_redirect(
343+
mocker, ws_server, unused_port, settings_payload, task_options, router,
344+
):
344345
setup_response = copy.deepcopy(settings_payload)
345346
setup_response['logging']['logging_api_key'] = 'logging_api_key'
346347
setup_response['logging']['log_level'] = None
@@ -477,7 +478,7 @@ def test_url(self):
477478

478479

479480
@pytest.mark.asyncio
480-
async def test_http_call_exception(mocker, ws_server, unused_port, settings_payload):
481+
async def test_http_call_exception(mocker, ws_server, unused_port, settings_payload, router):
481482
setup_response = copy.deepcopy(settings_payload)
482483
setup_response['logging']['logging_api_key'] = 'logging_api_key'
483484
mocker.patch(
@@ -1017,7 +1018,7 @@ def get_descriptor(cls):
10171018

10181019

10191020
@pytest.mark.asyncio
1020-
async def test_proper_internal_headers(mocker, ws_server, unused_port, settings_payload):
1021+
async def test_proper_internal_headers(mocker, ws_server, unused_port, settings_payload, router):
10211022

10221023
task_options = WebTaskOptions(
10231024
correlation_id='correlation_id',
@@ -1148,7 +1149,7 @@ def test_url(self):
11481149

11491150

11501151
@pytest.mark.asyncio
1151-
async def test_optional_internal_headers(mocker, ws_server, unused_port, settings_payload):
1152+
async def test_optional_internal_headers(mocker, ws_server, unused_port, settings_payload, router):
11521153

11531154
task_options = WebTaskOptions(
11541155
correlation_id='correlation_id',

0 commit comments

Comments
 (0)