cache_helpers: Use the same select_related as the cache methods use.

Only prefetching `realm` and `bot_owner` means that the cache values
filled by this process differ from the cache values that would be
stored on a cache miss -- leading to extra database queries for those
objects.

Use the same `base_get_user_queryset()` to ensure we get the same
related prefetches.
This commit is contained in:
Alex Vandiver
2025-02-11 21:00:48 +00:00
committed by Tim Abbott
parent 392f7556dd
commit c29e11de93

View File

@@ -26,6 +26,11 @@ from zerver.lib.sessions import session_engine
from zerver.lib.users import get_all_api_keys from zerver.lib.users import get_all_api_keys
from zerver.models import Client, UserProfile from zerver.models import Client, UserProfile
from zerver.models.clients import get_client_cache_key from zerver.models.clients import get_client_cache_key
from zerver.models.users import base_get_user_queryset
def get_users() -> QuerySet[UserProfile]:
return base_get_user_queryset().filter(long_term_idle=False, realm__in=get_active_realm_ids())
def user_cache_items( def user_cache_items(
@@ -79,12 +84,6 @@ def get_active_realm_ids() -> QuerySet[RealmCount, int]:
) )
def get_users() -> QuerySet[UserProfile]:
return UserProfile.objects.select_related("realm", "bot_owner").filter(
long_term_idle=False, realm__in=get_active_realm_ids()
)
# Format is (objects query, items filler function, timeout, batch size) # Format is (objects query, items filler function, timeout, batch size)
# #
# The objects queries are put inside lambdas to prevent Django from # The objects queries are put inside lambdas to prevent Django from