Change materialized views to be refreshed concurrently to avoid locks (#29015)

This commit is contained in:
Eugen Rochko 2024-01-30 19:21:30 +01:00 committed by GitHub
parent c4af668e5c
commit fa0ba67753
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 11 additions and 7 deletions

View file

@ -19,6 +19,8 @@ class AccountSummary < ApplicationRecord
scope :filtered, -> { where.missing(:follow_recommendation_suppressions) }
def self.refresh
Scenic.database.refresh_materialized_view(table_name, concurrently: true, cascade: false)
rescue ActiveRecord::StatementInvalid
Scenic.database.refresh_materialized_view(table_name, concurrently: false, cascade: false)
end

View file

@ -19,6 +19,8 @@ class FollowRecommendation < ApplicationRecord
scope :localized, ->(locale) { joins(:account_summary).merge(AccountSummary.localized(locale)) }
def self.refresh
Scenic.database.refresh_materialized_view(table_name, concurrently: true, cascade: false)
rescue ActiveRecord::StatementInvalid
Scenic.database.refresh_materialized_view(table_name, concurrently: false, cascade: false)
end

View file

@ -2,7 +2,7 @@
class CreateAccountSummaries < ActiveRecord::Migration[5.2]
def change
create_view :account_summaries, materialized: { no_data: true }
create_view :account_summaries, materialized: true
# To be able to refresh the view concurrently,
# at least one unique index is required

View file

@ -6,7 +6,7 @@ class UpdateFollowRecommendationsToVersion2 < ActiveRecord::Migration[6.1]
def up
drop_view :follow_recommendations
create_view :follow_recommendations, version: 2, materialized: { no_data: true }
create_view :follow_recommendations, version: 2, materialized: true
# To be able to refresh the view concurrently,
# at least one unique index is required

View file

@ -4,7 +4,7 @@ class UpdateAccountSummariesToVersion2 < ActiveRecord::Migration[6.1]
def up
reapplication_follow_recommendations_v2 do
drop_view :account_summaries, materialized: true
create_view :account_summaries, version: 2, materialized: { no_data: true }
create_view :account_summaries, version: 2, materialized: true
safety_assured { add_index :account_summaries, :account_id, unique: true }
end
end
@ -12,7 +12,7 @@ class UpdateAccountSummariesToVersion2 < ActiveRecord::Migration[6.1]
def down
reapplication_follow_recommendations_v2 do
drop_view :account_summaries, materialized: true
create_view :account_summaries, version: 1, materialized: { no_data: true }
create_view :account_summaries, version: 1, materialized: true
safety_assured { add_index :account_summaries, :account_id, unique: true }
end
end
@ -20,7 +20,7 @@ class UpdateAccountSummariesToVersion2 < ActiveRecord::Migration[6.1]
def reapplication_follow_recommendations_v2
drop_view :follow_recommendations, materialized: true
yield
create_view :follow_recommendations, version: 2, materialized: { no_data: true }
create_view :follow_recommendations, version: 2, materialized: true
safety_assured { add_index :follow_recommendations, :account_id, unique: true }
end
end

View file

@ -2,7 +2,7 @@
class CreateGlobalFollowRecommendations < ActiveRecord::Migration[7.0]
def change
create_view :global_follow_recommendations, materialized: { no_data: true }
create_view :global_follow_recommendations, materialized: true
safety_assured { add_index :global_follow_recommendations, :account_id, unique: true }
end
end

View file

@ -6,7 +6,7 @@ class DropFollowRecommendations < ActiveRecord::Migration[7.0]
end
def down
create_view :follow_recommendations, version: 2, materialized: { no_data: true }
create_view :follow_recommendations, version: 2, materialized: true
safety_assured { add_index :follow_recommendations, :account_id, unique: true }
end
end