mirror of
https://github.com/zulip/zulip.git
synced 2025-10-24 00:23:49 +00:00
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.
54 lines
1.7 KiB
Python
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"),
|
|
]
|