Files
zulip/zerver/migrations/0718_fix_topics_for_direct_messages.py
Sahil Batra b655bd14ea messages: Use "\x07" as topic for DMs and group DMs.
This commit updates code to use "\x07" as value for
"subject" field of Message objects for DMs and group
DMs, so that we have a unique value for DMs and group
DMs which cannot be used for channel messages.

This helps in avoiding having an empty string value as
topic for DMs, which is also used for "general chat"
channel messages, as large number of DMs in the realm
resulted in PostgreSQL query planner thinking that there
are too many "general chat" messages and thus generated
bad query plans for operations like fetching
"general chat" messages in a stream or moving messages
to and from "general chat" topic.

This change as done for ArchivedMessage and
ScheduledMessage objects as well.

Note that the clients still get "subject" value as
an empty string "".

This commit also adds tests for checking that "\x07"
cannot be used as topic for channel messages.

Fixes #34360.
2025-06-19 10:44:37 -07:00

54 lines
1.7 KiB
Python

# Generated by Django 5.1.8 on 2025-05-23 09:25
from django.db import migrations
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations.state import StateApps
from django.db.models import Max
def fix_topic_for_direct_messages(apps: StateApps, schema_editor: BaseDatabaseSchemaEditor) -> None:
Message = apps.get_model("zerver", "Message")
ArchivedMessage = apps.get_model("zerver", "ArchivedMessage")
ScheduledMessage = apps.get_model("zerver", "ScheduledMessage")
RECIPIENT_STREAM = 2
DM_TOPIC = "\x07"
BATCH_SIZE = 10000
for message_model in [Message, ArchivedMessage, ScheduledMessage]:
lower_bound = 1
max_id = message_model.objects.aggregate(Max("id"))["id__max"]
if max_id is None:
continue
while lower_bound <= max_id:
upper_bound = lower_bound + BATCH_SIZE - 1
print(f"Processing batch {lower_bound} to {upper_bound} for {message_model.__name__}")
message_model.objects.filter(
id__range=(lower_bound, upper_bound),
).exclude(recipient__type=RECIPIENT_STREAM).update(subject=DM_TOPIC)
lower_bound += BATCH_SIZE
class Migration(migrations.Migration):
atomic = False
dependencies = [
("zerver", "0717_stream_topics_policy"),
]
operations = [
migrations.RunPython(
fix_topic_for_direct_messages,
reverse_code=migrations.RunPython.noop,
elidable=True,
),
# We need to run an ANALYZE for the query planner statistics
# to no longer think most messages have "" as the topic.
migrations.RunSQL("ANALYZE zerver_message"),
]