maintenance: add job to check for database corruption.

Add a job to run pg_amcheck hourly to check for corrupt database indexes.

https://www.postgresql.org/docs/14/app-pgamcheck.html
This commit is contained in:
evazion
2021-10-06 04:14:23 -05:00
parent f687bb0608
commit 950bc608c2
3 changed files with 28 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
# A job that runs hourly to check the database for corruption. Spawned by {DanbooruMaintenance}.
# Requires at least PostgreSQL 14.0 to be installed for pg_amcheck to be available.
#
# https://www.postgresql.org/docs/14/app-pgamcheck.html
class AmcheckDatabaseJob < ApplicationJob
def perform(options: "--verbose --install-missing --heapallindexed --parent-check")
return unless system("pg_amcheck --version")
connection_url = ApplicationRecord.connection_db_config.url
output = %x(PGDATABASE="#{connection_url}" pg_amcheck #{options})
notify(output) unless $?.success?
end
def notify(output)
DanbooruLogger.info(output)
Dmail.create_automated(to: User.owner, title: "pg_amcheck failed", body: output)
end
end

View File

@@ -6,6 +6,7 @@ module DanbooruMaintenance
queue PrunePostsJob
queue PruneRateLimitsJob
queue RegeneratePostCountsJob
queue AmcheckDatabaseJob
end
def daily

View File

@@ -0,0 +1,9 @@
require 'test_helper'
class AmcheckDatabaseJobTest < ActiveJob::TestCase
context "AmcheckDatabaseJob" do
should "work" do
AmcheckDatabaseJob.perform_now
end
end
end