Skip to content

Commit

Permalink
Merge pull request #1389 from dmitry-sinina/partitions_detach
Browse files Browse the repository at this point in the history
support detaching partitions before dropping. refs #1380
  • Loading branch information
dmitry-sinina committed Dec 9, 2023
2 parents 441065e + c69fd11 commit 36eb691
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 5 deletions.
8 changes: 6 additions & 2 deletions app/jobs/jobs/partition_removing.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ def partition_remove_delay

def execute_cmd(cmd)
Open3.popen3(cmd) do |_stdin, _stdout, _stderr, wait_thr|
return wait_thr.value # Process::Status object returned.
o = _stdout.read
e = _stderr.read
return wait_thr.value, o, e
end
end

Expand Down Expand Up @@ -50,7 +52,9 @@ def remove_partition!(partition_class, model_class)
if YetiConfig.partition_remove_hook.present?
cmd = "#{YetiConfig.partition_remove_hook} #{cdr_remove_candidate.class} #{cdr_remove_candidate.parent_table} #{cdr_remove_candidate.name}"
logger.info { "Running partition removing hook: #{cmd}" }
return_value = execute_cmd(cmd)
return_value, sout, serr = execute_cmd(cmd)
logger.info { "Partition remove hook stdout:\n#{sout}" }
logger.info { "Partition remove hook stderr:\n#{serr}" }
if return_value.success?
logger.info { "Partition remove hook succeed, exit code: #{return_value.exitstatus}" }
else
Expand Down
10 changes: 9 additions & 1 deletion app/lib/pg_partition/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,15 @@ def partitions(table_names, id: nil)
select_all_serialized(query, *bindings)
end

def remove_partition(partition_name)
def remove_partition(table_name, partition_name)
if YetiConfig.partition_detach_before_drop
Rails.logger.info { "Detaching partition #{partition_name} from table #{table_name}" }
execute <<-SQL
ALTER TABLE #{table_name} DETACH PARTITION #{partition_name} CONCURRENTLY;
SQL
end

Rails.logger.info { "Dropping partition #{partition_name}" }
execute <<-SQL
DROP TABLE #{partition_name};
SQL
Expand Down
2 changes: 1 addition & 1 deletion app/models/partition_model/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ def to_param
end

def destroy
self.class.pg_partition_class.remove_partition(name)
self.class.pg_partition_class.remove_partition(parent_table, name)
true
rescue ActiveRecord::StatementInvalid => e
errors.add(:base, e.message)
Expand Down
2 changes: 2 additions & 0 deletions config/initializers/_config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ def self.setting_files(config_root, _env)
required(:'logs.api_requests').maybe(:string, format?: /\A\d+ days\z/)
end

optional(:partition_detach_before_drop).filled(:bool)

required(:prometheus).schema do
required(:enabled).value(:bool?)
required(:host).maybe(:string)
Expand Down
2 changes: 1 addition & 1 deletion spec/models/cdr/cdr_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ def current_partitions

before do
current_partitions.each do |partition|
Cdr::Cdr.pg_partition_class.remove_partition partition[:name]
Cdr::Cdr.pg_partition_class.remove_partition(partition[:parent_table], partition[:name])
end
expect(current_partitions).to be_empty
end
Expand Down

0 comments on commit 36eb691

Please sign in to comment.