mirror of https://github.com/zulip/zulip.git
populate_db: Temporarily remove post-delete signal on AlertWord.
The post-delete signal on AlertWord clears the realm cache; when it is called repeatedly, this results in re-fetching the realm object O(n) times, where n scales by number of users in the database. Disconnect this cache-clearing signal before removing the AlertWord entries, and reconnect it afterwards. This is not thread-safe, but this section is single-threaded. It is also probably unnecessary to re-connect the signal, as rest of `./manage.py populate_db` does not delete AlertWord objects, but cleanliness dictates doing the re-connection. This drops the time to repeatedly run: python3 ./manage.py populate_db --num-messages=0 --extra-users=1000 ...from 47 seconds to 36 seconds.
This commit is contained in:
parent
7cafbefdef
commit
7feda75c5f
|
@ -14,6 +14,7 @@ from django.core.management import call_command
|
|||
from django.core.management.base import BaseCommand, CommandParser
|
||||
from django.db import connection
|
||||
from django.db.models import F
|
||||
from django.db.models.signals import post_delete
|
||||
from django.utils.timezone import now as timezone_now
|
||||
from django.utils.timezone import timedelta as timezone_timedelta
|
||||
|
||||
|
@ -59,6 +60,7 @@ from zerver.models import (
|
|||
UserMessage,
|
||||
UserPresence,
|
||||
UserProfile,
|
||||
flush_alert_word,
|
||||
get_client,
|
||||
get_or_create_huddle,
|
||||
get_realm,
|
||||
|
@ -103,9 +105,15 @@ def clear_database() -> None:
|
|||
).flush_all()
|
||||
|
||||
model: Any = None # Hack because mypy doesn't know these are model classes
|
||||
|
||||
# The after-delete signal on this just updates caches, and slows
|
||||
# down the deletion noticeably. Remove the signal and replace it
|
||||
# after we're done.
|
||||
post_delete.disconnect(flush_alert_word, sender=AlertWord)
|
||||
for model in [
|
||||
Message,
|
||||
Stream,
|
||||
AlertWord,
|
||||
UserProfile,
|
||||
Recipient,
|
||||
Realm,
|
||||
|
@ -117,6 +125,7 @@ def clear_database() -> None:
|
|||
]:
|
||||
model.objects.all().delete()
|
||||
Session.objects.all().delete()
|
||||
post_delete.connect(flush_alert_word, sender=AlertWord)
|
||||
|
||||
|
||||
def subscribe_users_to_streams(realm: Realm, stream_dict: Dict[str, Dict[str, Any]]) -> None:
|
||||
|
|
Loading…
Reference in New Issue