Skip to content

feat: add rss router serving cached resource status#940

Draft
chrisburr wants to merge 6 commits into
DIRACGrid:mainfrom
chrisburr:rss-5-router
Draft

feat: add rss router serving cached resource status#940
chrisburr wants to merge 6 commits into
DIRACGrid:mainfrom
chrisburr:rss-5-router

Conversation

@chrisburr

@chrisburr chrisburr commented Jun 11, 2026

Copy link
Copy Markdown
Member

Adds the concrete resource status sources (storage, compute, FTS, site)
backed by ResourceStatusDB and serves them through new
/api/rss/{storage,compute,site,fts} endpoints. Responses are read from
an all-VO snapshot cached per source, filtered to the caller's VO, and
carry ETag/Last-Modified headers with 304 support; any authenticated
user may read. Includes the regenerated diracx and gubbins clients.

Replaces #910
Part of #839

Blocked by #936
Blocked by #937
Blocked by #938
Blocked by #939

chrisburr and others added 6 commits June 11, 2026 09:51
Async equivalent of TwoLevelCache for use with coroutine populate
functions: same soft/hard TTL semantics, but coordinated with asyncio
primitives instead of a ThreadPoolExecutor.

Co-authored-by: Loxeris <30194187+Loxeris@users.noreply.github.com>
…headers

The If-Modified-Since header is always GMT (RFC 9110) but it was parsed
with astimezone(), which interprets the naive datetime as server-local
time. Use replace(tzinfo=timezone.utc) instead.

The conditional-request logic (ETag / Last-Modified / 304) is moved out
of the configuration router into a reusable apply_cache_headers helper.

Co-authored-by: Loxeris <30194187+Loxeris@users.noreply.github.com>
Adds a generic diracx.core.sources module with AsyncCacheableSource and
Snapshot, a diracx.cacheable_sources entry-point group, and application
factory support: each source is instantiated once per app (so its caches
persist across requests) with the database instance matching its
db_class, and its read method overrides the create dependency for every
implementation class so extensions can substitute their own sources.
Routers depending on a source whose database is not available fail at
startup, consistent with the handling of missing databases.

Co-authored-by: Loxeris <30194187+Loxeris@users.noreply.github.com>
Replaces the per-resource lookups with bulk queries returning every
site/resource status across all VOs, keyed by VO so that rows for the
same resource in different VOs cannot overwrite each other, plus
max(DateEffective)/count queries to serve as cache revisions. The logic
layer maps the rows to the rss Pydantic models per VO, skipping storage
elements with an incomplete set of access rows.

Co-authored-by: Loxeris <30194187+Loxeris@users.noreply.github.com>
Adds the concrete resource status sources (storage, compute, FTS, site)
backed by ResourceStatusDB and serves them through new
/api/rss/{storage,compute,site,fts} endpoints. Responses are read from
an all-VO snapshot cached per source, filtered to the caller's VO, and
carry ETag/Last-Modified headers with 304 support; any authenticated
user may read. Includes the regenerated diracx and gubbins clients.

Closes DIRACGrid#839

Co-authored-by: Loxeris <30194187+Loxeris@users.noreply.github.com>
@read-the-docs-community

Copy link
Copy Markdown

@chrisburr chrisburr linked an issue Jun 11, 2026 that may be closed by this pull request
5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ResourceStatusSource + route

1 participant