Change materialized views to be refreshed concurrently to avoid locks (#29015)
This commit is contained in:
		@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user