retention: Use a consistent ordering for processing realms.

This is probably a good idea for the production use case, since then
there's some consistency of behavior, and if we extend logging, one
knows exactly which realms were or were not executed before a logged
failure.

This fixes the nondeterministic test failures we've been seeing in CI:
if you use `-id` in that order_by, it happens consistently.
This commit is contained in:
Tim Abbott 2019-05-22 10:47:44 -07:00
parent 3e50ed2075
commit 3d1aa98b2e
2 changed files with 1 additions and 11 deletions

View File

@ -131,7 +131,7 @@ def clean_unused_messages() -> None:
def archive_messages() -> None:
for realm in Realm.objects.filter(message_retention_days__isnull=False):
for realm in Realm.objects.filter(message_retention_days__isnull=False).order_by("id"):
move_expired_messages_to_archive(realm)
move_expired_user_messages_to_archive(realm)
move_expired_attachments_to_archive(realm)

View File

@ -263,20 +263,10 @@ class TestRetentionLib(ZulipTestCase):
# Get expired user messages by message ids
expected_user_msgs_ids = list(UserMessage.objects.filter(
message_id__in=expected_message_ids).order_by('id').values_list('id', flat=True))
user_messages = list(UserMessage.objects.select_related(
"message").filter(message_id__in=expected_message_ids).order_by('message_id'))
msgs_qty = Message.objects.count()
archive_messages()
# Temporary debugging code while we investigate CI failures
for user_message in user_messages: # nocoverage
archived = ArchivedUserMessage.objects.filter(
message_id=user_message.message_id,
user_profile_id=user_message.user_profile_id).exists()
if not archived:
print("Missing:", user_message, user_message.message_id, flush=True)
# Compare archived messages and user messages with expired messages
self.assertEqual(ArchivedMessage.objects.count(), len(expected_message_ids))
self.assertEqual(ArchivedUserMessage.objects.count(), len(expected_user_msgs_ids))