Skip to content

Commit 53e13f7

Browse files
authored
App state is not updating in cf cli and appsman ui when the app is down (#4309)
* App state is not updating in cf cli and appsman ui when the app is down In case of duplicate actual_lrp events(same index), CAPI should look at the since and pick the latest * App state is not updating in cf cli and appsman ui when the app is down Fix Rubocop error * App state is not updating in cf cli and appsman ui when the app is down Remove empty lines * App state is not updating in cf cli and appsman ui when the app is down Remove empty line * App state is not updating in cf cli and appsman ui when the app is down Code review changes
1 parent 29ecd74 commit 53e13f7

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

lib/cloud_controller/diego/reporters/instances_stats_reporter.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,22 @@ def get_stats(desired_lrp, process)
4545
def actual_lrp_info(process, stats=nil, quota_stats=nil, log_cache_errors=nil, isolation_segment=nil, state=nil)
4646
# rubocop:enable Metrics/ParameterLists
4747
result = {}
48+
lrp_instances = {}
49+
4850
bbs_instances_client.lrp_instances(process).each do |actual_lrp|
4951
next unless actual_lrp.actual_lrp_key.index < process.instances
5052

51-
lrp_state = state || LrpStateTranslator.translate_lrp_state(actual_lrp)
53+
# if an LRP already exists with the same index use the one with the latest since value
54+
if lrp_instances.include?(actual_lrp.actual_lrp_key.index)
55+
existing_lrp = lrp_instances[actual_lrp.actual_lrp_key.index]
56+
next if actual_lrp.since < existing_lrp.since
57+
end
5258

59+
lrp_state = state || LrpStateTranslator.translate_lrp_state(actual_lrp)
5360
info = build_info(lrp_state, actual_lrp, process, stats, quota_stats, log_cache_errors)
5461
info[:isolation_segment] = isolation_segment unless isolation_segment.nil?
5562
result[actual_lrp.actual_lrp_key.index] = info
63+
lrp_instances[actual_lrp.actual_lrp_key.index] = actual_lrp
5664
end
5765

5866
fill_unreported_instances_with_down_instances(result, process, flat: false)

spec/unit/lib/cloud_controller/diego/reporters/instances_stats_reporter_spec.rb

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,61 @@ def make_actual_lrp(instance_guid:, index:, state:, error:, since:)
149149
end
150150
end
151151

152+
context 'when there are multiple lrps with the same index' do
153+
let(:desired_instances) { 3 }
154+
let(:bbs_actual_lrps_response) { [actual_lrp_1, actual_lrp_2, actual_lrp_3, actual_lrp_4, actual_lrp_5] }
155+
let(:actual_lrp_1) do
156+
make_actual_lrp(
157+
instance_guid: '', index: 0, state: ::Diego::ActualLRPState::UNCLAIMED, error: 'some-details', since: two_days_ago_since_epoch_ns
158+
).tap do |actual_lrp|
159+
actual_lrp.actual_lrp_net_info = lrp_1_net_info
160+
end
161+
end
162+
let(:actual_lrp_2) do
163+
make_actual_lrp(
164+
instance_guid: 'instance-a', index: 0, state: ::Diego::ActualLRPState::RUNNING, error: 'some-details', since: two_days_ago_since_epoch_ns - 1000
165+
).tap do |actual_lrp|
166+
actual_lrp.actual_lrp_net_info = lrp_1_net_info
167+
end
168+
end
169+
170+
let(:actual_lrp_3) do
171+
make_actual_lrp(
172+
instance_guid: '', index: 1, state: ::Diego::ActualLRPState::UNCLAIMED, error: 'some-details', since: two_days_ago_since_epoch_ns
173+
).tap do |actual_lrp|
174+
actual_lrp.actual_lrp_net_info = lrp_1_net_info
175+
end
176+
end
177+
178+
let(:actual_lrp_4) do
179+
make_actual_lrp(
180+
instance_guid: 'instance-b', index: 1, state: ::Diego::ActualLRPState::CLAIMED, error: 'some-details', since: two_days_ago_since_epoch_ns - 1000
181+
).tap do |actual_lrp|
182+
actual_lrp.actual_lrp_net_info = lrp_1_net_info
183+
end
184+
end
185+
186+
let(:actual_lrp_5) do
187+
make_actual_lrp(
188+
instance_guid: 'instance-c', index: 2, state: ::Diego::ActualLRPState::RUNNING, error: 'some-details', since: two_days_ago_since_epoch_ns
189+
).tap do |actual_lrp|
190+
actual_lrp.actual_lrp_net_info = lrp_1_net_info
191+
end
192+
end
193+
194+
before do
195+
allow(bbs_instances_client).to receive_messages(lrp_instances: bbs_actual_lrps_response, desired_lrp_instance: bbs_desired_lrp_response)
196+
end
197+
198+
it 'shows all correct state for all instances' do
199+
result, = instances_reporter.stats_for_app(process)
200+
expect(result.length).to eq(3)
201+
expect(result[0][:state]).to eq('DOWN')
202+
expect(result[1][:state]).to eq('DOWN')
203+
expect(result[2][:state]).to eq('RUNNING')
204+
end
205+
end
206+
152207
context 'when a NoRunningInstances error is thrown for desired_lrp and it exists an actual_lrp' do
153208
let(:error) { CloudController::Errors::NoRunningInstances.new('No running instances ruh roh') }
154209
let(:expected_stopping_response) do

0 commit comments

Comments
 (0)