Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/database/partitioning/detached_partition_dropper.rb')
-rw-r--r--lib/gitlab/database/partitioning/detached_partition_dropper.rb38
1 files changed, 20 insertions, 18 deletions
diff --git a/lib/gitlab/database/partitioning/detached_partition_dropper.rb b/lib/gitlab/database/partitioning/detached_partition_dropper.rb
index dc63d93fd07..3e7ddece20b 100644
--- a/lib/gitlab/database/partitioning/detached_partition_dropper.rb
+++ b/lib/gitlab/database/partitioning/detached_partition_dropper.rb
@@ -7,18 +7,15 @@ module Gitlab
return unless Feature.enabled?(:drop_detached_partitions, default_enabled: :yaml)
Gitlab::AppLogger.info(message: "Checking for previously detached partitions to drop")
+
Postgresql::DetachedPartition.ready_to_drop.find_each do |detached_partition|
- conn.transaction do
+ connection.transaction do
# Another process may have already dropped the table and deleted this entry
next unless (detached_partition = Postgresql::DetachedPartition.lock.find_by(id: detached_partition.id))
- unless check_partition_detached?(detached_partition)
- Gitlab::AppLogger.error(message: "Attempt to drop attached database partition", partition_name: detached_partition.table_name)
- detached_partition.destroy!
- next
- end
+ drop_detached_partition(detached_partition.table_name)
- drop_one(detached_partition)
+ detached_partition.destroy!
end
rescue StandardError => e
Gitlab::AppLogger.error(message: "Failed to drop previously detached partition",
@@ -30,25 +27,30 @@ module Gitlab
private
- def drop_one(detached_partition)
- conn.transaction do
- conn.execute(<<~SQL)
- DROP TABLE #{Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA}.#{conn.quote_table_name(detached_partition.table_name)}
- SQL
+ def drop_detached_partition(partition_name)
+ partition_identifier = qualify_partition_name(partition_name)
+
+ if partition_detached?(partition_identifier)
+ connection.drop_table(partition_identifier, if_exists: true)
- detached_partition.destroy!
+ Gitlab::AppLogger.info(message: "Dropped previously detached partition", partition_name: partition_name)
+ else
+ Gitlab::AppLogger.error(message: "Attempt to drop attached database partition", partition_name: partition_name)
end
- Gitlab::AppLogger.info(message: "Dropped previously detached partition", partition_name: detached_partition.table_name)
end
- def check_partition_detached?(detached_partition)
+ def qualify_partition_name(table_name)
+ "#{Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA}.#{table_name}"
+ end
+
+ def partition_detached?(partition_identifier)
# PostgresPartition checks the pg_inherits view, so our partition will only show here if it's still attached
# and thus should not be dropped
- !PostgresPartition.for_identifier("#{Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA}.#{detached_partition.table_name}").exists?
+ !Gitlab::Database::PostgresPartition.for_identifier(partition_identifier).exists?
end
- def conn
- @conn ||= ApplicationRecord.connection
+ def connection
+ Postgresql::DetachedPartition.connection
end
end
end