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

pull/2647/head
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) } scope :filtered, -> { where.missing(:follow_recommendation_suppressions) }
def self.refresh 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) Scenic.database.refresh_materialized_view(table_name, concurrently: false, cascade: false)
end end

View File

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

View File

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

View File

@ -6,7 +6,7 @@ class UpdateFollowRecommendationsToVersion2 < ActiveRecord::Migration[6.1]
def up def up
drop_view :follow_recommendations 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, # To be able to refresh the view concurrently,
# at least one unique index is required # at least one unique index is required

View File

@ -4,7 +4,7 @@ class UpdateAccountSummariesToVersion2 < ActiveRecord::Migration[6.1]
def up def up
reapplication_follow_recommendations_v2 do reapplication_follow_recommendations_v2 do
drop_view :account_summaries, materialized: true 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 } safety_assured { add_index :account_summaries, :account_id, unique: true }
end end
end end
@ -12,7 +12,7 @@ class UpdateAccountSummariesToVersion2 < ActiveRecord::Migration[6.1]
def down def down
reapplication_follow_recommendations_v2 do reapplication_follow_recommendations_v2 do
drop_view :account_summaries, materialized: true 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 } safety_assured { add_index :account_summaries, :account_id, unique: true }
end end
end end
@ -20,7 +20,7 @@ class UpdateAccountSummariesToVersion2 < ActiveRecord::Migration[6.1]
def reapplication_follow_recommendations_v2 def reapplication_follow_recommendations_v2
drop_view :follow_recommendations, materialized: true drop_view :follow_recommendations, materialized: true
yield 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 } safety_assured { add_index :follow_recommendations, :account_id, unique: true }
end end
end end

View File

@ -2,7 +2,7 @@
class CreateGlobalFollowRecommendations < ActiveRecord::Migration[7.0] class CreateGlobalFollowRecommendations < ActiveRecord::Migration[7.0]
def change 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 } safety_assured { add_index :global_follow_recommendations, :account_id, unique: true }
end end
end end

View File

@ -6,7 +6,7 @@ class DropFollowRecommendations < ActiveRecord::Migration[7.0]
end end
def down 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 } safety_assured { add_index :follow_recommendations, :account_id, unique: true }
end end
end end