Skip to content

Commit fc705a2

Browse files
committed
feat: add rake task to clean unused data to improve performance
Currently, it deletes more verifications than expected, but if you are building the provider often, and you are not using can-i-deploy, this should be ok. pact-foundation#203
1 parent c8c2e91 commit fc705a2

File tree

4 files changed

+137
-0
lines changed

4 files changed

+137
-0
lines changed

lib/pact_broker/db/clean.rb

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
require 'sequel'
2+
require 'pact_broker/project_root'
3+
4+
module PactBroker
5+
module DB
6+
class Clean
7+
def self.call database_connection, options = {}
8+
new(database_connection, options).call
9+
end
10+
11+
def initialize database_connection, options = {}
12+
@db = database_connection
13+
@options = options
14+
end
15+
16+
def call
17+
db[:verifications].where(id: db[:materialized_head_matrix].select(:verification_id)).invert.delete
18+
pp_ids = db[:materialized_head_matrix].select(:pact_publication_id)
19+
20+
triggered_webhook_ids = db[:triggered_webhooks].where(pact_publication_id: pp_ids).invert.select(:id)
21+
db[:webhook_executions].where(triggered_webhook_id: triggered_webhook_ids).delete
22+
db[:triggered_webhooks].where(id: triggered_webhook_ids).delete
23+
db[:webhook_executions].where(pact_publication_id: pp_ids).invert.delete
24+
25+
db[:pact_publications].where(id: pp_ids).invert.delete
26+
27+
referenced_pact_version_ids = db[:pact_publications].select(:pact_version_id).collect{ | h| h[:pact_version_id] } +
28+
db[:verifications].select(:pact_version_id).collect{ | h| h[:pact_version_id] }
29+
db[:pact_versions].where(id: referenced_pact_version_ids).invert.delete
30+
31+
referenced_version_ids = db[:pact_publications].select(:consumer_version_id).collect{ | h| h[:consumer_version_id] } +
32+
db[:verifications].select(:provider_version_id).collect{ | h| h[:provider_version_id] }
33+
34+
db[:tags].where(version_id: referenced_version_ids).invert.delete
35+
db[:versions].where(id: referenced_version_ids).invert.delete
36+
37+
db[:materialized_matrix].delete
38+
db[:materialized_matrix].insert(db[:matrix].select_all)
39+
db[:materialized_head_matrix].delete
40+
db[:materialized_head_matrix].insert(db[:head_matrix].select_all)
41+
end
42+
43+
private
44+
45+
attr_reader :db
46+
47+
end
48+
end
49+
end

lib/pact_broker/tasks.rb

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
require 'pact_broker/tasks/migration_task'
22
require 'pact_broker/tasks/version_task'
3+
require 'pact_broker/tasks/clean_task'

lib/pact_broker/tasks/clean_task.rb

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
module PactBroker
2+
module DB
3+
class CleanTask < ::Rake::TaskLib
4+
5+
attr_accessor :database_connection
6+
7+
def initialize &block
8+
rake_task &block
9+
end
10+
11+
def rake_task &block
12+
namespace :pact_broker do
13+
namespace :db do
14+
desc "Clean unused pacts and verifications from database"
15+
task :clean do | t, args |
16+
require 'pact_broker/db/clean'
17+
instance_eval(&block)
18+
PactBroker::DB::Clean.call(database_connection)
19+
end
20+
end
21+
end
22+
end
23+
end
24+
end
25+
end

spec/lib/pact_broker/db/clean_spec.rb

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
require 'pact_broker/db/clean'
2+
3+
module PactBroker
4+
module DB
5+
describe Clean do
6+
describe ".call" do
7+
8+
let(:td) { TestDataBuilder.new }
9+
before do
10+
td.create_pact_with_hierarchy("Foo", "0", "Bar")
11+
.create_consumer_version_tag("prod")
12+
.create_consumer_version("1")
13+
.create_pact
14+
.create_consumer_version_tag("prod")
15+
.comment("keep")
16+
.create_verification(provider_version: "20")
17+
.create_consumer_version("2")
18+
.create_pact
19+
.comment("don't keep")
20+
.create_webhook
21+
.create_triggered_webhook
22+
.create_webhook_execution
23+
.create_deprecated_webhook_execution
24+
.create_verification(provider_version: "30")
25+
.create_consumer_version("3")
26+
.create_pact
27+
.comment("keep")
28+
.create_verification(provider_version: "40")
29+
.create_verification(provider_version: "50", number: 2)
30+
end
31+
32+
subject { Clean.call(PactBroker::DB.connection) }
33+
let(:db) { PactBroker::DB.connection }
34+
35+
it "does not delete any rows in the head matrix" do
36+
head_matrix_before = db[:head_matrix].select_all
37+
subject
38+
head_matrix_after = db[:head_matrix].select_all
39+
expect(head_matrix_before).to eq head_matrix_after
40+
end
41+
42+
it "deletes rows that aren't the latest or latest tagged" do
43+
subject
44+
expect(db[:materialized_matrix].where(consumer_version_number: "2").count).to eq 0
45+
end
46+
47+
it "deletes orphan pact_versions" do
48+
subject
49+
expect(db[:pact_versions].count).to eq 2
50+
end
51+
52+
it "deletes orphan versions" do
53+
subject
54+
expect(db[:versions].where(number: "20").count).to be 1
55+
expect(db[:versions].where(number: "30").count).to be 0
56+
expect(db[:versions].where(number: "40").count).to be 0
57+
expect(db[:versions].where(number: "50").count).to be 1
58+
end
59+
end
60+
end
61+
end
62+
end

0 commit comments

Comments
 (0)