From 1242e57c270e9ff356e8c175670d5dc3a10ad273 Mon Sep 17 00:00:00 2001 From: ThibG Date: Thu, 19 Nov 2020 17:37:49 +0100 Subject: Deal with collation-related index corruption (#14860) * Add tootctl maintenance fix-duplicates This tool goes through the database to detect and fix duplicates. This operation is very slow and may cause data loss (of data that would be inaccessible without intervention because of the existing index corruptions). It tries its best to make sensible decisions, and asks the user in some cases. * Add warning message in db:migrate hook * Clear Rails cache after being done with database deduplication Avoids followers hash cache being incorrect, among other things --- lib/tasks/db.rake | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'lib/tasks/db.rake') diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake index b76e90131..199155107 100644 --- a/lib/tasks/db.rake +++ b/lib/tasks/db.rake @@ -48,6 +48,17 @@ namespace :db do end end + task :post_migration_hook do + at_exit do + unless %w(C POSIX).include?(ActiveRecord::Base.connection.execute('SELECT datcollate FROM pg_database WHERE datname = current_database();').first['datcollate']) + Rails.logger.warn 'WARNING: Your database is using an unsafe collation setting, which might result in index corruption.' + Rails.logger.warn 'WARNING: See https://docs.joinmastodon.org/admin/troubleshooting/index-corruption/#am-i-affected' + end + end + end + + Rake::Task['db:migrate'].enhance(['db:post_migration_hook']) + # Before we load the schema, define the timestamp_id function. # Idiomatically, we might do this in a migration, but then it # wouldn't end up in schema.rb, so we'd need to figure out a way to -- cgit