diff --git a/source/common/upstream/subset_lb.cc b/source/common/upstream/subset_lb.cc index 162eb31e28d62..e15f6250ac3fc 100644 --- a/source/common/upstream/subset_lb.cc +++ b/source/common/upstream/subset_lb.cc @@ -54,7 +54,17 @@ SubsetLoadBalancer::SubsetLoadBalancer( }); } -SubsetLoadBalancer::~SubsetLoadBalancer() { original_priority_set_callback_handle_->remove(); } +SubsetLoadBalancer::~SubsetLoadBalancer() { + original_priority_set_callback_handle_->remove(); + + // Ensure gauges reflect correct values. + forEachSubset(subsets_, [&](LbSubsetEntryPtr entry) { + if (entry->initialized() && entry->active()) { + stats_.lb_subsets_removed_.inc(); + stats_.lb_subsets_active_.dec(); + } + }); +} void SubsetLoadBalancer::refreshSubsets() { for (auto& host_set : original_priority_set_.hostSetsPerPriority()) { diff --git a/test/common/upstream/subset_lb_test.cc b/test/common/upstream/subset_lb_test.cc index 21ccceb04797b..4da2cfbb0811c 100644 --- a/test/common/upstream/subset_lb_test.cc +++ b/test/common/upstream/subset_lb_test.cc @@ -1433,6 +1433,26 @@ TEST_F(SubsetLoadBalancerTest, EnabledLocalityWeightAwareness) { EXPECT_EQ(host_set_.healthy_hosts_per_locality_->get()[1][0], lb_->chooseHost(&context)); } +TEST_P(SubsetLoadBalancerTest, GaugesUpdatedOnDestroy) { + EXPECT_CALL(subset_info_, fallbackPolicy()) + .WillRepeatedly(Return(envoy::api::v2::Cluster::LbSubsetConfig::ANY_ENDPOINT)); + + std::vector> subset_keys = {{"version"}}; + EXPECT_CALL(subset_info_, subsetKeys()).WillRepeatedly(ReturnRef(subset_keys)); + + init({ + {"tcp://127.0.0.1:80", {{"version", "1.0"}}}, + }); + + EXPECT_EQ(1U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); + + lb_ = nullptr; + + EXPECT_EQ(0U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_removed_.value()); +} + INSTANTIATE_TEST_CASE_P(UpdateOrderings, SubsetLoadBalancerTest, testing::ValuesIn({REMOVES_FIRST, SIMULTANEOUS}));