retention: Eliminate join with Recipient table when archiving DMs.

We can use the is_channel_message column instead of doing the join to
filter on recipient type.
This commit is contained in:
Mateusz Mandera
2025-08-16 04:07:35 +08:00
committed by Tim Abbott
parent fd4104f365
commit 4e3ec77a0f
2 changed files with 3 additions and 7 deletions

View File

@@ -228,18 +228,15 @@ def move_expired_direct_messages_to_archive(
assert message_retention_days != -1 assert message_retention_days != -1
check_date = timezone_now() - timedelta(days=message_retention_days) check_date = timezone_now() - timedelta(days=message_retention_days)
recipient_types = (Recipient.PERSONAL, Recipient.DIRECT_MESSAGE_GROUP)
# Archive expired direct Messages in the realm, including cross-realm messages. # Archive expired direct Messages in the realm, including cross-realm messages.
# Uses index: zerver_message_realm_recipient_date_sent # Uses index: zerver_message_realm_date_sent
query = SQL( query = SQL(
""" """
INSERT INTO zerver_archivedmessage ({dst_fields}, archive_transaction_id) INSERT INTO zerver_archivedmessage ({dst_fields}, archive_transaction_id)
SELECT {src_fields}, {archive_transaction_id} SELECT {src_fields}, {archive_transaction_id}
FROM zerver_message FROM zerver_message
INNER JOIN zerver_recipient ON zerver_recipient.id = zerver_message.recipient_id
WHERE zerver_message.realm_id = {realm_id} WHERE zerver_message.realm_id = {realm_id}
AND zerver_recipient.type in {recipient_types} AND NOT zerver_message.is_channel_message
AND zerver_message.date_sent < {check_date} AND zerver_message.date_sent < {check_date}
LIMIT {chunk_size} LIMIT {chunk_size}
ON CONFLICT (id) DO UPDATE SET archive_transaction_id = {archive_transaction_id} ON CONFLICT (id) DO UPDATE SET archive_transaction_id = {archive_transaction_id}
@@ -252,7 +249,6 @@ def move_expired_direct_messages_to_archive(
type=ArchiveTransaction.RETENTION_POLICY_BASED, type=ArchiveTransaction.RETENTION_POLICY_BASED,
realm=realm, realm=realm,
realm_id=Literal(realm.id), realm_id=Literal(realm.id),
recipient_types=Literal(recipient_types),
check_date=Literal(check_date.isoformat()), check_date=Literal(check_date.isoformat()),
chunk_size=chunk_size, chunk_size=chunk_size,
) )

View File

@@ -218,7 +218,7 @@ class Message(AbstractMessage):
name="zerver_message_realm_sender_recipient", name="zerver_message_realm_sender_recipient",
), ),
models.Index( models.Index(
# For analytics queries # For analytics and retention queries
"realm_id", "realm_id",
"date_sent", "date_sent",
name="zerver_message_realm_date_sent", name="zerver_message_realm_date_sent",