From 3ea0d7318287aa131532938e7bc70662abaedcbb Mon Sep 17 00:00:00 2001 From: Alex Vandiver Date: Sun, 2 Jun 2024 15:16:31 +0000 Subject: [PATCH] zerver: Add a partial audit log index for counting active users. This index is used by `active_users_audit:is_bot:day`, and provides roughly a 2x speedup. The existing `zerver_realmauditlog_realm__event_type__event_time` is used if there is a realm limit, but the standard statistics fill runs for all realms at once, and thus cannot use it. --- ...rver_realmauditlog_user_activations_idx.py | 26 +++++++++++++++++++ zerver/models/realm_audit_logs.py | 13 ++++++++++ 2 files changed, 39 insertions(+) create mode 100644 zerver/migrations/0528_realmauditlog_zerver_realmauditlog_user_activations_idx.py diff --git a/zerver/migrations/0528_realmauditlog_zerver_realmauditlog_user_activations_idx.py b/zerver/migrations/0528_realmauditlog_zerver_realmauditlog_user_activations_idx.py new file mode 100644 index 0000000000..2bbe6a6fb9 --- /dev/null +++ b/zerver/migrations/0528_realmauditlog_zerver_realmauditlog_user_activations_idx.py @@ -0,0 +1,26 @@ +from django.contrib.postgres.operations import AddIndexConcurrently +from django.db import migrations, models + + +class Migration(migrations.Migration): + atomic = False + + dependencies = [ + ("zerver", "0527_presencesequence"), + ] + + operations = [ + AddIndexConcurrently( + model_name="realmauditlog", + index=models.Index( + # event_type__in: + # AbstractRealmAuditLog.USER_CREATED, + # AbstractRealmAuditLog.USER_ACTIVATED, + # AbstractRealmAuditLog.USER_DEACTIVATED, + # AbstractRealmAuditLog.USER_REACTIVATED, + condition=models.Q(("event_type__in", [101, 102, 103, 104])), + fields=["modified_user", "event_time"], + name="zerver_realmauditlog_user_activations_idx", + ), + ), + ] diff --git a/zerver/models/realm_audit_logs.py b/zerver/models/realm_audit_logs.py index 01383be53f..32c010cee2 100644 --- a/zerver/models/realm_audit_logs.py +++ b/zerver/models/realm_audit_logs.py @@ -242,6 +242,19 @@ class RealmAuditLog(AbstractRealmAuditLog): ] ), ), + models.Index( + # Used in analytics/lib/counts.py for computing active users for realm_active_humans + name="zerver_realmauditlog_user_activations_idx", + fields=["modified_user", "event_time"], + condition=Q( + event_type__in=[ + AbstractRealmAuditLog.USER_CREATED, + AbstractRealmAuditLog.USER_ACTIVATED, + AbstractRealmAuditLog.USER_DEACTIVATED, + AbstractRealmAuditLog.USER_REACTIVATED, + ] + ), + ), ] @override