Skip to content

Commit f3834d2

Browse files
authored
Issue 4092: Mark "FAILED" droplets/packages as expired (#4093)
* otherwise they will never be cleaned up * create package delete jobs only if there is a hash (= package has a blob)
1 parent eece70a commit f3834d2

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

lib/cloud_controller/bits_expiration.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def initialize(config=Config.config)
1111

1212
def expire_droplets!(app)
1313
expirable_candidates = DropletModel.
14-
where(state: DropletModel::STAGED_STATE, app_guid: app.guid).
14+
where(state: [DropletModel::STAGED_STATE, DropletModel::FAILED_STATE], app_guid: app.guid).
1515
exclude(guid: app.droplet_guid)
1616

1717
return if expirable_candidates.count < droplets_storage_count
@@ -28,7 +28,7 @@ def expire_packages!(app)
2828
current_package_guid = app.droplet.try(:package_guid)
2929

3030
expirable_candidates = PackageModel.
31-
where(state: PackageModel::READY_STATE, app_guid: app.guid).
31+
where(state: [PackageModel::READY_STATE, PackageModel::FAILED_STATE], app_guid: app.guid).
3232
exclude(guid: current_package_guid)
3333

3434
return if expirable_candidates.count < packages_storage_count
@@ -37,7 +37,7 @@ def expire_packages!(app)
3737

3838
packages_to_expire.each do |package|
3939
package.update(state: PackageModel::EXPIRED_STATE)
40-
enqueue_package_delete_job(package.guid)
40+
enqueue_package_delete_job(package.guid) if package.package_hash
4141
end
4242
end
4343

spec/unit/lib/cloud_controller/bits_expiration_spec.rb

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@ module VCAP::CloudController
3030
expect(BitsExpiration.new(changed_config).packages_storage_count).to eq(10)
3131
end
3232

33-
context 'with an app with few droplets / packages' do
33+
context 'with an app with few droplets / packages and one failed droplet / package' do
3434
it 'does not mark any as expired' do
3535
3.times { DropletModel.make(state: DropletModel::STAGED_STATE, app_guid: app.guid) }
3636
3.times { PackageModel.make(state: PackageModel::READY_STATE, app_guid: app.guid) }
37+
DropletModel.make(state: DropletModel::FAILED_STATE, app_guid: app.guid)
38+
PackageModel.make(state: PackageModel::FAILED_STATE, app_guid: app.guid)
3739
BitsExpiration.new.expire_droplets!(app)
3840
BitsExpiration.new.expire_packages!(app)
3941
expect(DropletModel.where(state: DropletModel::EXPIRED_STATE).count).to eq(0)
@@ -77,10 +79,19 @@ module VCAP::CloudController
7779
)
7880
app.update(droplet: @current)
7981

80-
10.times do |i|
82+
2.times do |i|
8183
DropletModel.make(
8284
app_guid: app.guid,
8385
created_at: t + i,
86+
droplet_hash: nil,
87+
state: DropletModel::FAILED_STATE
88+
)
89+
end
90+
91+
10.times do |i|
92+
DropletModel.make(
93+
app_guid: app.guid,
94+
created_at: t + i + 2,
8495
droplet_hash: 'current_droplet_hash'
8596
)
8697
end
@@ -133,11 +144,18 @@ module VCAP::CloudController
133144
)
134145
app.update(droplet: @current)
135146

147+
2.times do |i|
148+
PackageModel.make(package_hash: nil,
149+
state: PackageModel::FAILED_STATE,
150+
app_guid: app.guid,
151+
created_at: t + i)
152+
end
153+
136154
10.times do |i|
137155
PackageModel.make(package_hash: 'real hash!',
138156
state: PackageModel::READY_STATE,
139157
app_guid: app.guid,
140-
created_at: t + i)
158+
created_at: t + i + 2)
141159
end
142160
end
143161

0 commit comments

Comments
 (0)