Skip to content

Commit 196629e

Browse files
committed
Remove codegen caching
1 parent 71e9ff6 commit 196629e

File tree

9 files changed

+30
-171
lines changed

9 files changed

+30
-171
lines changed

servicex/app/codegen.py

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2022, IRIS-HEP
1+
# Copyright (c) 2022-2025, IRIS-HEP
22
# All rights reserved.
33
#
44
# Redistribution and use in source and binary forms, with or without
@@ -36,20 +36,6 @@
3636
codegen_app = typer.Typer(name="codegen", no_args_is_help=True)
3737

3838

39-
@codegen_app.command(no_args_is_help=False)
40-
def flush(
41-
backend: Optional[str] = backend_cli_option,
42-
config_path: Optional[str] = config_file_option,
43-
):
44-
"""
45-
Flush the available code generators from the cache
46-
"""
47-
sx = ServiceXClient(backend=backend, config_path=config_path)
48-
cache = sx.query_cache
49-
cache.delete_codegen_by_backend(backend)
50-
rich.print("Deleted cached code generators.")
51-
52-
5339
@codegen_app.command(no_args_is_help=False)
5440
def list(
5541
backend: Optional[str] = backend_cli_option,

servicex/query_cache.py

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -211,28 +211,3 @@ def delete_record_by_hash(self, hash: str):
211211
transforms = Query()
212212
with self.lock:
213213
self.db.remove(transforms.hash == hash)
214-
215-
def get_codegen_by_backend(self, backend: str) -> Optional[dict]:
216-
codegens = Query()
217-
with self.lock:
218-
records = self.db.search(codegens.backend == backend)
219-
220-
if not records:
221-
return None
222-
223-
if len(records) != 1:
224-
raise CacheException("Multiple records found in db for same backend")
225-
else:
226-
return records[0]
227-
228-
def update_codegen_by_backend(self, backend: str, codegen_list: list):
229-
transforms = Query()
230-
with self.lock:
231-
self.db.upsert(
232-
{"backend": backend, "codegens": codegen_list},
233-
transforms.backend == backend,
234-
)
235-
236-
def delete_codegen_by_backend(self, backend: str):
237-
with self.lock:
238-
self.db.remove(where("backend") == backend)

servicex/servicex_adapter.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2022, IRIS-HEP
1+
# Copyright (c) 2022-2025, IRIS-HEP
22
# All rights reserved.
33
#
44
# Redistribution and use in source and binary forms, with or without
@@ -31,7 +31,6 @@
3131
from typing import Optional, Dict, List
3232
from dataclasses import dataclass
3333

34-
import httpx
3534
from httpx import AsyncClient, Response
3635
from json import JSONDecodeError
3736
from httpx_retries import RetryTransport, Retry
@@ -146,7 +145,7 @@ async def get_servicex_info(self) -> ServiceXInfo:
146145
retry_options = Retry(total=3, backoff_factor=10)
147146
async with AsyncClient(transport=RetryTransport(retry=retry_options)) as client:
148147
r = await client.get(url=f"{self.url}/servicex", headers=headers)
149-
if r.status_code == 401:
148+
if r.status_code in (401, 403):
150149
raise AuthorizationError(
151150
f"Not authorized to access serviceX at {self.url}"
152151
)
@@ -200,15 +199,8 @@ async def get_transforms(self) -> List[TransformStatus]:
200199
statuses = [TransformStatus(**status) for status in o["requests"]]
201200
return statuses
202201

203-
def get_code_generators(self):
204-
with httpx.Client() as client:
205-
r = client.get(url=f"{self.url}/multiple-codegen-list")
206-
207-
if r.status_code == 403:
208-
raise AuthorizationError(
209-
f"Not authorized to access serviceX at {self.url}"
210-
)
211-
return r.json()
202+
async def get_code_generators(self) -> dict[str, str]:
203+
return (await self.get_servicex_info()).code_gen_image
212204

213205
async def get_datasets(
214206
self, did_finder=None, show_deleted=False

servicex/servicex_client.py

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ def __init__(self, backend=None, url=None, config_path=None):
348348
)
349349

350350
self.query_cache = QueryCache(self.config)
351-
self.code_generators = set(self.get_code_generators(backend).keys())
351+
self.code_generators = set(self.get_code_generators().keys())
352352

353353
async def get_transforms_async(self) -> List[TransformStatus]:
354354
r"""
@@ -404,21 +404,12 @@ def cancel_transform(self, transform_id) -> None:
404404
"""
405405
return _async_execute_and_wait(self.servicex.cancel_transform(transform_id))
406406

407-
def get_code_generators(self, backend=None):
407+
def get_code_generators(self) -> dict[str, str]:
408408
r"""
409409
Retrieve the code generators deployed with the serviceX instance
410410
:return: The list of code generators as json dictionary
411411
"""
412-
cached_backends = None
413-
if backend:
414-
cached_backends = self.query_cache.get_codegen_by_backend(backend)
415-
if cached_backends:
416-
logger.info("Returning code generators from cache")
417-
return cached_backends["codegens"]
418-
else:
419-
code_generators = self.servicex.get_code_generators()
420-
self.query_cache.update_codegen_by_backend(backend, code_generators)
421-
return code_generators
412+
return _async_execute_and_wait(self.servicex.get_code_generators())
422413

423414
def generic_query(
424415
self,

tests/app/test_codegen.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -41,20 +41,3 @@ def test_codegen_list(script_runner):
4141
}
4242
"""
4343
)
44-
45-
46-
def test_codegen_flush(script_runner):
47-
with patch("servicex.query_cache.QueryCache.delete_codegen_by_backend") as p:
48-
result = script_runner.run(
49-
[
50-
"servicex",
51-
"codegen",
52-
"flush",
53-
"-c",
54-
"tests/example_config.yaml",
55-
"-b",
56-
"localhost",
57-
]
58-
)
59-
assert result.returncode == 0
60-
p.assert_called_once_with("localhost")

tests/test_query_cache.py

Lines changed: 1 addition & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
from servicex.configuration import Configuration
3434
from servicex.models import ResultFormat
3535
from servicex.query_cache import QueryCache, CacheException
36-
from tinydb import Query
3736

3837
file_uris = ["/tmp/foo1.root", "/tmp/foo2.root"]
3938

@@ -185,83 +184,7 @@ def test_record_delete(transform_request, completed_status):
185184
cache.close()
186185

187186

188-
def test_get_codegen_by_backend_empty():
189-
with tempfile.TemporaryDirectory() as temp_dir:
190-
config = Configuration(cache_path=temp_dir, api_endpoints=[]) # type: ignore
191-
cache = QueryCache(config)
192-
result = cache.get_codegen_by_backend("non-existent")
193-
assert result is None
194-
cache.close()
195-
196-
197-
def test_update_codegen_by_backend_single():
198-
with tempfile.TemporaryDirectory() as temp_dir:
199-
config = Configuration(cache_path=temp_dir, api_endpoints=[]) # type: ignore
200-
cache = QueryCache(config)
201-
codegens = Query()
202-
cache.update_codegen_by_backend("backend_1", ["codegen_1"])
203-
result = cache.db.search(codegens.backend == "backend_1")
204-
assert len(result) == 1
205-
assert result[0] == {"backend": "backend_1", "codegens": ["codegen_1"]}
206-
cache.close()
207-
208-
209-
def test_get_codegen_by_backend_single():
210-
with tempfile.TemporaryDirectory() as temp_dir:
211-
config = Configuration(cache_path=temp_dir, api_endpoints=[]) # type: ignore
212-
cache = QueryCache(config)
213-
cache.update_codegen_by_backend("backend_1", ["codegen_1"])
214-
result = cache.get_codegen_by_backend("backend_1")
215-
assert result == {"backend": "backend_1", "codegens": ["codegen_1"]}
216-
cache.close()
217-
218-
219-
def test_delete_codegen_by_backend():
220-
with tempfile.TemporaryDirectory() as temp_dir:
221-
config = Configuration(cache_path=temp_dir, api_endpoints=[]) # type: ignore
222-
cache = QueryCache(config)
223-
cache.update_codegen_by_backend("backend_1", ["codegen_1"])
224-
result = cache.get_codegen_by_backend("backend_1")
225-
assert result == {"backend": "backend_1", "codegens": ["codegen_1"]}
226-
227-
cache.delete_codegen_by_backend("backend_1")
228-
result = cache.get_codegen_by_backend("backend_1")
229-
assert result is None
230-
cache.close()
231-
232-
233-
def test_delete_codegen_by_backend_nonexistent():
234-
with tempfile.TemporaryDirectory() as temp_dir:
235-
config = Configuration(cache_path=temp_dir, api_endpoints=[]) # type: ignore
236-
cache = QueryCache(config)
237-
cache.delete_codegen_by_backend("backend_1")
238-
with pytest.raises(AssertionError):
239-
raise AssertionError()
240-
cache.close()
241-
242-
243-
def test_add_both_codegen_and_transform_to_cache(transform_request, completed_status):
244-
with tempfile.TemporaryDirectory() as temp_dir:
245-
config = Configuration(cache_path=temp_dir, api_endpoints=[]) # type: ignore
246-
cache = QueryCache(config)
247-
cache.cache_transform(
248-
cache.transformed_results(
249-
transform=transform_request,
250-
completed_status=completed_status,
251-
data_dir="/foo/bar",
252-
file_list=file_uris,
253-
signed_urls=[],
254-
)
255-
)
256-
257-
cache.update_codegen_by_backend("backend_1", ["codegen_1"])
258-
result = cache.get_codegen_by_backend("backend_1")
259-
assert result == {"backend": "backend_1", "codegens": ["codegen_1"]}
260-
assert len(cache.cached_queries()) == 1
261-
cache.close()
262-
263-
264-
def test_delete_codegen_by_hash(transform_request, completed_status):
187+
def test_delete_transform_by_hash(transform_request, completed_status):
265188
with tempfile.TemporaryDirectory() as temp_dir:
266189
config = Configuration(cache_path=temp_dir, api_endpoints=[]) # type: ignore
267190
cache = QueryCache(config)

tests/test_servicex_adapter.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -162,21 +162,29 @@ async def test_get_transforms_with_refresh(get, post, transform_status_response)
162162
)
163163

164164

165-
@patch("servicex.servicex_adapter.httpx.Client.get")
166-
def test_get_codegens(get, servicex):
165+
@patch("servicex.servicex_adapter.AsyncClient.get")
166+
async def test_get_codegens(get, servicex):
167167
get.return_value = httpx.Response(
168-
200, json={"uproot": "http://uproot-codegen", "xaod": "http://xaod-codegen"}
168+
200,
169+
json={
170+
"app-version": "0.0.0",
171+
"code-gen-image": {
172+
"uproot": "http://uproot-codegen",
173+
"xaod": "http://xaod-codegen",
174+
},
175+
"capabilities": [],
176+
},
169177
)
170-
c = servicex.get_code_generators()
178+
c = await servicex.get_code_generators()
171179
assert len(c) == 2
172180
assert c["uproot"] == "http://uproot-codegen"
173181

174182

175-
@patch("servicex.servicex_adapter.httpx.Client.get")
176-
def test_get_codegens_error(get, servicex):
183+
@patch("servicex.servicex_adapter.AsyncClient.get")
184+
async def test_get_codegens_error(get, servicex):
177185
get.return_value = httpx.Response(403)
178186
with pytest.raises(AuthorizationError) as err:
179-
servicex.get_code_generators()
187+
await servicex.get_code_generators()
180188
assert "Not authorized to access serviceX at" in str(err.value)
181189

182190

tests/test_servicex_client.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@
4141
def servicex_adaptor(mocker):
4242
adapter_mock = mocker.patch("servicex.servicex_client.ServiceXAdapter")
4343
mock_adapter = MagicMock(spec=ServiceXAdapter)
44+
mock_adapter.get_code_generators.return_value = {
45+
"uproot": "http://uproot-codegen",
46+
"xaod": "http://xaod-codegen",
47+
}
4448

4549
adapter_mock.return_value = mock_adapter
4650
return mock_adapter
@@ -50,9 +54,6 @@ def servicex_adaptor(mocker):
5054
def mock_cache(mocker):
5155
cache_mock = mocker.patch("servicex.servicex_client.QueryCache")
5256
mock_cache = MagicMock(spec=QueryCache)
53-
mock_cache.get_codegen_by_backend.return_value = {
54-
"codegens": {"ROOT": "my_root_generator", "UPROOT": "my_uproot_generator"}
55-
}
5657
cache_mock.return_value = mock_cache
5758
return cache_mock
5859

tests/test_servicex_dataset.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,7 @@ async def test_submit_generic(mocker, codegen_list):
593593
mocker.patch("servicex.minio_adapter.MinioAdapter", return_value=mock_minio)
594594
did = FileListDataset("/foo/bar/baz.root")
595595
with patch(
596-
"servicex.servicex_adapter.ServiceXAdapter.get_code_generators",
596+
"servicex.servicex_client.ServiceXClient.get_code_generators",
597597
return_value=codegen_list,
598598
):
599599
client = ServiceXClient(
@@ -641,7 +641,7 @@ async def test_submit_cancelled(mocker, codegen_list):
641641
mocker.patch("servicex.minio_adapter.MinioAdapter", return_value=mock_minio)
642642
did = FileListDataset("/foo/bar/baz.root")
643643
with patch(
644-
"servicex.servicex_adapter.ServiceXAdapter.get_code_generators",
644+
"servicex.servicex_client.ServiceXClient.get_code_generators",
645645
return_value=codegen_list,
646646
):
647647
client = ServiceXClient(

0 commit comments

Comments
 (0)