zulip/zerver/lib
Steve Howell 51db22c86c per-request caches: Add per_request_cache library.
We have historically cached two types of values
on a per-request basis inside of memory:

    * linkifiers
    * display recipients

Both of these caches were hand-written, and they
both actually cache values that are also in memcached,
so the per-request cache essentially only saves us
from a few memcached hits.

I think the linkifier per-request cache is a necessary
evil. It's an important part of message rendering, and
it's not super easy to structure the code to just get
a single value up front and pass it down the stack.

I'm not so sure we even need the display recipient
per-request cache any more, as we are generally pretty
smart now about hydrating recipient data in terms of
how the code is organized. But I haven't done thorough
research on that hypotheseis.

Fortunately, it's not rocket science to just write
a glorified memoize decorator and tie it into key
places in the code:

    * middleware
    * tests (e.g. asserting db counts)
    * queue processors

That's what I did in this commit.

This commit definitely reduces the amount of code
to maintain. I think it also gets us closer to
possibly phasing out this whole technique, but that
effort is beyond the scope of this PR. We could
add some instrumentation to the decorator to see
how often we get a non-trivial number of saved
round trips to memcached.

Note that when we flush linkifiers, we just use
a big hammer and flush the entire per-request
cache for linkifiers, since there is only ever
one realm in the cache.
2023-08-11 11:09:34 -07:00
..
markdown help: Update "View your starred messages" section. 2023-08-10 17:31:10 -07:00
upload ruff: Fix FLY002 Consider f"…" instead of string join. 2023-08-07 17:12:41 -07:00
url_preview ruff: Fix UP032 Use f-string instead of `format` call. 2023-07-19 16:14:59 -07:00
webhooks ruff: Fix PERF401 Use a list comprehension to create a transformed list. 2023-08-07 17:23:55 -07:00
__init__.py
addressee.py users: Directly access id of foreign keys instead of full object. 2023-07-20 10:44:39 -07:00
alert_words.py alert_words: Refactor the code to flush alert_words cache. 2023-06-28 18:03:32 -07:00
async_utils.py
attachments.py upload: Rename delete_message_image to use word "attachment". 2023-03-02 16:36:19 -08:00
avatar.py settings: Make DEFAULT_LOGO_URI/DEFAULT_AVATAR_URI use staticfiles. 2023-02-14 17:17:06 -05:00
avatar_hash.py utils: Remove make_safe_digest wrapper. 2023-07-19 10:54:05 -07:00
bot_config.py ruff: Fix UP032 Use f-string instead of `format` call. 2023-08-02 15:58:55 -07:00
bot_lib.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
bot_storage.py python: Import F, Q, QuerySet from their canonical module. 2023-03-05 14:46:28 -08:00
bulk_create.py ruff: Fix PERF401 Use a list comprehension to create a transformed list. 2023-08-07 17:23:55 -07:00
cache.py ruff: Fix PERF401 Use a list comprehension to create a transformed list. 2023-08-07 17:23:55 -07:00
cache_helpers.py models: Fetch "recipient" object when along with "Huddle" object. 2023-08-10 17:35:43 -07:00
camo.py
ccache.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
compatibility.py ruff: Fix DTZ004 `datetime.datetime.utcfromtimestamp()`. 2023-01-04 16:25:07 -08:00
context_managers.py
create_user.py models: Add a unique index on UserProfile.api_key. 2023-05-19 11:11:04 -07:00
data_types.py ruff: Fix more of RUF010 Use conversion in f-string. 2023-06-06 14:58:11 -07:00
db.py python: Annotate type aliases with TypeAlias. 2023-08-07 10:02:49 -07:00
debug.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
default_streams.py streams: Pass stream_weekly_traffic field in stream objects. 2023-08-06 18:06:42 -07:00
dev_ldap_directory.py tests: Update tests to use example profile picture. 2022-10-31 14:36:54 -07:00
digest.py python: Annotate type aliases with TypeAlias. 2023-08-07 10:02:49 -07:00
display_recipient.py mypy: Improve type checks for user display recipients. 2023-08-10 18:13:43 -07:00
domains.py
drafts.py drafts: Access recipient_id when creating or editing Draft objects. 2023-08-10 17:35:43 -07:00
email_mirror.py mypy: Improve type checks for user display recipients. 2023-08-10 18:13:43 -07:00
email_mirror_helpers.py
email_notifications.py mypy: Improve type checks for user display recipients. 2023-08-10 18:13:43 -07:00
email_validation.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
emoji.py python: Convert translated positional {} fields to {named} fields. 2023-07-18 15:19:07 -07:00
event_schema.py events: Add test to remove existing value for custom profile field. 2023-08-07 11:39:27 -07:00
events.py ruff: Fix PERF401 Use a list comprehension to create a transformed list. 2023-08-07 17:23:55 -07:00
exceptions.py reactions: Add error code for duplicate addition/removal. 2023-07-19 16:18:31 -07:00
export.py export: Pass "user_profile" as arg to select_related call for Subscription. 2023-08-10 17:35:43 -07:00
external_accounts.py ruff: Fix SIM118 Use `k not in d` instead of `k not in d.keys()`. 2023-07-24 10:39:28 -07:00
fix_unreads.py ruff: Fix PERF401 Use a list comprehension to create a transformed list. 2023-08-07 17:23:55 -07:00
generate_test_data.py ruff: Fix PERF401 Use a list comprehension to create a transformed list. 2023-08-07 17:23:55 -07:00
github.py ruff: Fix RSE102 Unnecessary parentheses on raised exception. 2023-02-04 16:34:55 -08:00
home.py narrow: Split out narrow_helpers. 2023-06-30 11:26:23 -07:00
hotspots.py ruff: Fix SIM118 Use `key in dict` instead of `key in dict.keys()`. 2023-01-04 16:25:07 -08:00
html_diff.py html_diff: Fix lxml import. 2023-03-05 14:46:28 -08:00
html_to_text.py
i18n.py
import_realm.py ruff: Fix PERF401 Use a list comprehension to create a transformed list. 2023-08-07 17:23:55 -07:00
initial_password.py
integrations.py python: Annotate type aliases with TypeAlias. 2023-08-07 10:02:49 -07:00
logging_util.py ruff: Fix PLR1714 Consider merging multiple comparisons. 2023-07-23 15:21:33 -07:00
management.py send_custom_email: Stop turning every user query into an id-based set. 2023-08-09 15:49:49 -07:00
mdiff.py node_tests: Move to web/tests. 2023-02-23 16:04:17 -08:00
mention.py mention: Determine @topic mention during message rendering. 2023-07-13 11:34:48 -07:00
message.py mypy: Improve type checks for user display recipients. 2023-08-10 18:13:43 -07:00
migrate.py
mobile_auth_otp.py
muted_users.py muted users: Make file naming consistent. 2023-02-10 15:39:57 -08:00
name_restrictions.py name_restrictions: Update disposable_email_domains usage. 2023-07-19 16:14:59 -07:00
narrow.py narrow: Directly access recipient_id from Stream object. 2023-08-10 17:35:43 -07:00
narrow_helpers.py narrow: Split out narrow_helpers. 2023-06-30 11:26:23 -07:00
notes.py
notification_data.py notifications: Rename 'pm' to 'dm' in 'RecipientInfoResult' dataclass. 2023-08-10 17:41:49 -07:00
onboarding.py ruff: Fix PLR1714 Consider merging multiple comparisons. 2023-07-23 15:21:33 -07:00
outgoing_http.py
outgoing_webhook.py outgoing_webhook: Respect settings.OUTGOING_WEBHOOK_TIMEOUT_SECONDS. 2023-05-16 07:00:37 -07:00
per_request_cache.py per-request caches: Add per_request_cache library. 2023-08-11 11:09:34 -07:00
presence.py presence: Support null values in UserPresence. 2023-04-26 14:26:47 -07:00
profile.py
push_notifications.py push notifications: Go to the DB for streams. 2023-08-10 18:13:43 -07:00
pysa.py
queue.py python: Annotate type aliases with TypeAlias. 2023-08-07 10:02:49 -07:00
rate_limiter.py ruff: Fix PERF102 Using only the keys/values of a dict. 2023-08-07 17:23:55 -07:00
realm_description.py
realm_icon.py settings: Make DEFAULT_LOGO_URI/DEFAULT_AVATAR_URI use staticfiles. 2023-02-14 17:17:06 -05:00
realm_logo.py settings: Make DEFAULT_LOGO_URI/DEFAULT_AVATAR_URI use staticfiles. 2023-02-14 17:17:06 -05:00
recipient_users.py models: Remove get_huddle_recipient and use get_or_create_huddle. 2023-08-10 17:35:43 -07:00
redis_utils.py
remote_server.py python: Convert translated positional {} fields to {named} fields. 2023-07-18 15:19:07 -07:00
request.py ruff: Fix FLY002 Consider f"…" instead of string join. 2023-08-07 17:12:41 -07:00
response.py webhooks: Use 200 status code for unknown events. 2023-07-11 13:51:37 -07:00
rest.py ruff: Fix RSE102 Unnecessary parentheses on raised exception. 2023-02-04 16:34:55 -08:00
retention.py retention: Do not archive attachments with scheduled messages. 2023-08-06 13:40:02 -07:00
safe_session_cached_db.py
scheduled_messages.py scheduled_messages: Add reasonable failure handling. 2023-05-09 13:48:28 -07:00
scim.py users: Set tos_version to -1 for users who have not logged-in yet. 2023-05-16 13:52:56 -07:00
scim_filter.py
send_email.py send_custom_email: Only put the unsubscribe footer on marketing emails. 2023-08-09 15:49:49 -07:00
server_initialization.py auth: Rewrite data model for tracking enabled auth backends. 2023-04-18 09:22:56 -07:00
sessions.py
singleton_bmemcached.py requirements: Upgrade Python requirements. 2023-04-03 22:39:21 -07:00
soft_deactivation.py notification_trigger: Rename `private_message` to `direct_message`. 2023-08-10 17:41:49 -07:00
sounds.py
sqlalchemy_utils.py
storage.py ruff: Fix PLE0101 Explicit return in `__init__`. 2023-02-23 11:47:08 -08:00
stream_color.py
stream_subscription.py topic_mentions: Fetch users to be notified of @topic mentions. 2023-07-13 11:34:48 -07:00
stream_topic.py message_send: Handle notifications for UNMUTED topic in a muted stream. 2023-03-06 19:15:45 -08:00
stream_traffic.py
streams.py stream_settings: Add 'Default stream' option in create stream UI. 2023-08-09 15:20:09 -07:00
string_validation.py python: Convert translated positional {} fields to {named} fields. 2023-07-18 15:19:07 -07:00
subdomains.py settings: Allow customization of STATIC_URL. 2023-02-14 17:17:06 -05:00
subscription_info.py streams: Rename `can_remove_subscribers_group_id` parameter. 2023-07-25 18:33:04 -07:00
templates.py requirements: Upgrade Python requirements. 2023-04-03 22:39:21 -07:00
test_classes.py per-request caches: Add per_request_cache library. 2023-08-11 11:09:34 -07:00
test_console_output.py requirements: Upgrade Python requirements. 2023-04-25 21:20:33 -07:00
test_data.source.txt
test_fixtures.py ruff: Fix ANN204 missing return type annotation for __init__. 2022-11-16 09:29:11 -08:00
test_helpers.py per-request caches: Add per_request_cache library. 2023-08-11 11:09:34 -07:00
test_runner.py python: Annotate type aliases with TypeAlias. 2023-08-07 10:02:49 -07:00
tex.py
thumbnail.py
timeout.py test_timeout: Skip test_timeout_warn on Python 3.11 for coverage issue. 2023-05-18 11:52:22 -07:00
timestamp.py timestamp: Switch to a slightly faster datetime_to_timestamp. 2023-02-23 12:15:13 -08:00
timezone.py
topic.py topic: Pass args to select_related call for Message objects. 2023-08-10 17:35:43 -07:00
transfer.py uploads: Allow uploads to set storage class. 2023-07-19 16:19:34 -07:00
types.py python: Annotate type aliases with TypeAlias. 2023-08-07 10:02:49 -07:00
url_encoding.py narrow urls: Avoid complicated optional types. 2023-08-10 18:13:43 -07:00
url_redirects.py help: Rename "Starting a new private thread" to "... new direct message". 2023-05-15 16:13:55 -07:00
user_agent.py
user_counts.py
user_groups.py user_groups: Rename `can_mention_group_id` parameter. 2023-07-25 18:33:04 -07:00
user_message.py
user_status.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
user_topics.py user_topics: Update 'topic_has_visibility_policy' to support INHERIT. 2023-04-18 16:40:57 -07:00
users.py ruff: Fix PERF401 Use a list comprehension to create a transformed list. 2023-08-07 17:23:55 -07:00
utils.py utils: Remove make_safe_digest wrapper. 2023-07-19 10:54:05 -07:00
validator.py python: Convert translated positional {} fields to {named} fields. 2023-07-18 15:19:07 -07:00
widget.py ruff: Fix B034 `re.split`, `re.sub` should pass keyword arguments. 2023-07-19 16:14:59 -07:00
zcommand.py ruff: Fix UP032 Use f-string instead of `format` call. 2023-08-02 15:58:55 -07:00
zephyr.py