caches: Only take the realm_id, not the Realm, as a cache key function.

This saves a hit to the database to fetch the Realm of a UserProfile
that we are trying to flush.
This commit is contained in:
Alex Vandiver 2024-03-04 20:08:53 +00:00 committed by Tim Abbott
parent 6630981de8
commit 352dbf9387
5 changed files with 13 additions and 13 deletions

View File

@ -122,7 +122,7 @@ def compute_jabber_user_fullname(email: str) -> str:
def get_user_profile_delivery_email_cache_key( def get_user_profile_delivery_email_cache_key(
realm: Realm, email: str, email_to_fullname: Callable[[str], str] realm: Realm, email: str, email_to_fullname: Callable[[str], str]
) -> str: ) -> str:
return user_profile_delivery_email_cache_key(email, realm) return user_profile_delivery_email_cache_key(email, realm.id)
@cache_with_key( @cache_with_key(

View File

@ -109,7 +109,7 @@ def send_delivery_email_update_events(
@transaction.atomic(savepoint=False) @transaction.atomic(savepoint=False)
def do_change_user_delivery_email(user_profile: UserProfile, new_email: str) -> None: def do_change_user_delivery_email(user_profile: UserProfile, new_email: str) -> None:
delete_user_profile_caches([user_profile], user_profile.realm) delete_user_profile_caches([user_profile], user_profile.realm_id)
user_profile.delivery_email = new_email user_profile.delivery_email = new_email
if user_profile.email_address_is_realm_public(): if user_profile.email_address_is_realm_public():

View File

@ -431,8 +431,8 @@ def user_profile_cache_key(email: str, realm: "Realm") -> str:
return user_profile_cache_key_id(email, realm.id) return user_profile_cache_key_id(email, realm.id)
def user_profile_delivery_email_cache_key(delivery_email: str, realm: "Realm") -> str: def user_profile_delivery_email_cache_key(delivery_email: str, realm_id: int) -> str:
return f"user_profile_by_delivery_email:{hashlib.sha1(delivery_email.strip().encode()).hexdigest()}:{realm.id}" return f"user_profile_by_delivery_email:{hashlib.sha1(delivery_email.strip().encode()).hexdigest()}:{realm_id}"
def bot_profile_cache_key(email: str, realm_id: int) -> str: def bot_profile_cache_key(email: str, realm_id: int) -> str:
@ -515,7 +515,7 @@ def bot_dicts_in_realm_cache_key(realm_id: int) -> str:
return f"bot_dicts_in_realm:{realm_id}" return f"bot_dicts_in_realm:{realm_id}"
def delete_user_profile_caches(user_profiles: Iterable["UserProfile"], realm: "Realm") -> None: def delete_user_profile_caches(user_profiles: Iterable["UserProfile"], realm_id: int) -> None:
# Imported here to avoid cyclic dependency. # Imported here to avoid cyclic dependency.
from zerver.lib.users import get_all_api_keys from zerver.lib.users import get_all_api_keys
from zerver.models.users import is_cross_realm_bot_email from zerver.models.users import is_cross_realm_bot_email
@ -524,11 +524,11 @@ def delete_user_profile_caches(user_profiles: Iterable["UserProfile"], realm: "R
for user_profile in user_profiles: for user_profile in user_profiles:
keys.append(user_profile_by_id_cache_key(user_profile.id)) keys.append(user_profile_by_id_cache_key(user_profile.id))
keys += map(user_profile_by_api_key_cache_key, get_all_api_keys(user_profile)) keys += map(user_profile_by_api_key_cache_key, get_all_api_keys(user_profile))
keys.append(user_profile_cache_key(user_profile.email, realm)) keys.append(user_profile_cache_key_id(user_profile.email, realm_id))
keys.append(user_profile_delivery_email_cache_key(user_profile.delivery_email, realm)) keys.append(user_profile_delivery_email_cache_key(user_profile.delivery_email, realm_id))
if user_profile.is_bot and is_cross_realm_bot_email(user_profile.email): if user_profile.is_bot and is_cross_realm_bot_email(user_profile.email):
# Handle clearing system bots from their special cache. # Handle clearing system bots from their special cache.
keys.append(bot_profile_cache_key(user_profile.email, realm.id)) keys.append(bot_profile_cache_key(user_profile.email, realm_id))
keys.append(get_cross_realm_dicts_key()) keys.append(get_cross_realm_dicts_key())
cache_delete_many(keys) cache_delete_many(keys)
@ -563,7 +563,7 @@ def flush_user_profile(
**kwargs: object, **kwargs: object,
) -> None: ) -> None:
user_profile = instance user_profile = instance
delete_user_profile_caches([user_profile], user_profile.realm) delete_user_profile_caches([user_profile], user_profile.realm_id)
# Invalidate our active_users_in_realm info dict if any user has changed # Invalidate our active_users_in_realm info dict if any user has changed
# the fields in the dict or become (in)active # the fields in the dict or become (in)active
@ -603,7 +603,7 @@ def flush_realm(
) -> None: ) -> None:
realm = instance realm = instance
users = realm.get_active_users() users = realm.get_active_users()
delete_user_profile_caches(users, realm) delete_user_profile_caches(users, realm.id)
if ( if (
from_deletion from_deletion

View File

@ -19,7 +19,7 @@ from zerver.lib.cache import (
get_remote_cache_requests, get_remote_cache_requests,
get_remote_cache_time, get_remote_cache_time,
user_profile_by_api_key_cache_key, user_profile_by_api_key_cache_key,
user_profile_cache_key, user_profile_cache_key_id,
) )
from zerver.lib.safe_session_cached_db import SessionStore from zerver.lib.safe_session_cached_db import SessionStore
from zerver.lib.sessions import session_engine from zerver.lib.sessions import session_engine
@ -33,7 +33,7 @@ def user_cache_items(
) -> None: ) -> None:
for api_key in get_all_api_keys(user_profile): for api_key in get_all_api_keys(user_profile):
items_for_remote_cache[user_profile_by_api_key_cache_key(api_key)] = (user_profile,) items_for_remote_cache[user_profile_by_api_key_cache_key(api_key)] = (user_profile,)
items_for_remote_cache[user_profile_cache_key(user_profile.email, user_profile.realm)] = ( items_for_remote_cache[user_profile_cache_key_id(user_profile.email, user_profile.realm_id)] = (
user_profile, user_profile,
) )
# We have other user_profile caches, but none of them are on the # We have other user_profile caches, but none of them are on the

View File

@ -398,7 +398,7 @@ class SoftDeactivationMessageTest(ZulipTestCase):
idle_user_msg_list = get_user_messages(long_term_idle_user) idle_user_msg_list = get_user_messages(long_term_idle_user)
idle_user_msg_count = len(idle_user_msg_list) idle_user_msg_count = len(idle_user_msg_list)
self.assertNotEqual(idle_user_msg_list[-1], sent_message) self.assertNotEqual(idle_user_msg_list[-1], sent_message)
with self.assert_database_query_count(6): with self.assert_database_query_count(5):
add_missing_messages(long_term_idle_user) add_missing_messages(long_term_idle_user)
idle_user_msg_list = get_user_messages(long_term_idle_user) idle_user_msg_list = get_user_messages(long_term_idle_user)
self.assert_length(idle_user_msg_list, idle_user_msg_count + 1) self.assert_length(idle_user_msg_list, idle_user_msg_count + 1)