From f466632ac0a3e2e920ce42055e810f9a07df1a67 Mon Sep 17 00:00:00 2001 From: Kazuki Nagasawa <113568707+crafkaz@users.noreply.github.com> Date: Wed, 16 Sep 2026 16:14:18 +0000 Subject: [PATCH] Fix performance of media attachment queries in admin instance page (#40515) --- .../measure/instance_media_attachments_measure.rb | 2 +- .../instance_media_attachments_measure_spec.rb | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb b/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb index 00836191f1d..13bbd9843fa 100644 --- a/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb +++ b/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb @@ -47,7 +47,7 @@ class Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure < Admin::Metrics: SELECT #{media_size_total} AS size FROM media_attachments INNER JOIN accounts ON accounts.id = media_attachments.account_id - WHERE date_trunc('day', media_attachments.created_at)::date = axis.period + WHERE media_attachments.id >= (date_part('epoch', date_trunc('day', axis.period)::date) * 1000)::bigint << 16 AND media_attachments.id < ((date_part('epoch', date_trunc('day', axis.period)::date + ('1 day')::interval)) * 1000)::bigint << 16 AND #{account_domain_sql(params[:include_subdomains])} ) SELECT COALESCE(SUM(size), 0) FROM new_media_attachments diff --git a/spec/lib/admin/metrics/measure/instance_media_attachments_measure_spec.rb b/spec/lib/admin/metrics/measure/instance_media_attachments_measure_spec.rb index 11f13b85bc1..19383ea6e5e 100644 --- a/spec/lib/admin/metrics/measure/instance_media_attachments_measure_spec.rb +++ b/spec/lib/admin/metrics/measure/instance_media_attachments_measure_spec.rb @@ -16,6 +16,11 @@ RSpec.describe Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure do let(:remote_account_on_subdomain) { Fabricate(:account, domain: "foo.#{domain}") } before do + travel_to 2.days.ago do + # We specify the `id` because `travel_to` doesn't affect the database + remote_account.media_attachments.create!(id: Mastodon::Snowflake.id_at(Time.now.utc), file: attachment_fixture('attachment.jpg')) + end + remote_account.media_attachments.create!(file: attachment_fixture('attachment.jpg')) remote_account_on_subdomain.media_attachments.create!(file: attachment_fixture('attachment.jpg')) end @@ -47,14 +52,15 @@ RSpec.describe Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure do .to eq(3) expect(subject.data.map(&:symbolize_keys)) .to contain_exactly( - include(date: 2.days.ago.midnight.to_time, value: '0'), + include(date: 2.days.ago.midnight.to_time, value: expected_domain_only_total_on(2.days.ago).to_s), include(date: 1.day.ago.midnight.to_time, value: '0'), - include(date: 0.days.ago.midnight.to_time, value: expected_domain_only_total.to_s) + include(date: 0.days.ago.midnight.to_time, value: expected_domain_only_total_on(0.days.ago).to_s) ) end - def expected_domain_only_total - remote_account.media_attachments.sum(:file_file_size) + remote_account.media_attachments.sum(:thumbnail_file_size) + def expected_domain_only_total_on(date) + attachments = remote_account.media_attachments.where(created_at: date.all_day) + attachments.sum(:file_file_size) + attachments.sum(:thumbnail_file_size) end end end