-
Notifications
You must be signed in to change notification settings - Fork 88
Cache koji builds #748
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Cache koji builds #748
Conversation
in order to decrease the load on koji. With what's currently in the pipe, we decrease the number of koji calls from 65 to 37 with the cache. Signed-off-by: Gaëtan Lehmann <[email protected]>
It would be great if it could be validated quickly—this might have an impact on koji, but only once merged 🙂 |
def get_koji_build(session, build_id) -> dict: | ||
cache_key = f'koji-build-{build_id}' | ||
if not args.re_cache and cache_key in CACHE: | ||
return cast(dict, CACHE[cache_key]) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the cast looks necessary just because CACHE
itself cannot be properly type-hinted?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yes 👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
thinking twice about it, CACHE
could be typed using a TypeDict
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think it would fit well.
I could assert isinstance(…)
instead of casting if you prefer
else: | ||
build = session.getBuild(build_id) | ||
CACHE.set(cache_key, build, expire=RETENTION_TIME) | ||
return build |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
instead of managing such a cache manually, wouldn't get_koji_build = functools.cache(session.getBuild)
do the job? I guess other uses of CACHE
could also go that same way.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
that's a persistent cache, using diskcache
. I don't think functool
has anything similar.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah, right. Looks like this is a common pattern, though, and there are some libs for this, like:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
there is a memoize()
decorator in diskcache
, but it doesn't fit well with the command line option to refresh the cache
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
or maybe I can set the expire
property after creating the CACHE
object. I'll check
in order to decrease the load on koji. With what's currently in the pipe, we decrease the number of koji calls from 65 to 37 with the cache.