diff --git a/source/common/upstream/cluster_manager_impl.cc b/source/common/upstream/cluster_manager_impl.cc index 1907b9b1a99b0..87988274acaf3 100644 --- a/source/common/upstream/cluster_manager_impl.cc +++ b/source/common/upstream/cluster_manager_impl.cc @@ -309,7 +309,7 @@ ClusterManagerImpl::ClusterManagerImpl( // Load all the primary clusters. for (const auto& cluster : bootstrap.static_resources().clusters()) { if (is_primary_cluster(cluster)) { - loadCluster(cluster, "", false, active_clusters_); + loadCluster(cluster, MessageUtil::hash(cluster), "", false, active_clusters_); } } @@ -365,7 +365,7 @@ ClusterManagerImpl::ClusterManagerImpl( if (cluster.type() == envoy::config::cluster::v3::Cluster::EDS && cluster.eds_cluster_config().eds_config().config_source_specifier_case() != envoy::config::core::v3::ConfigSource::ConfigSourceSpecifierCase::kPath) { - loadCluster(cluster, "", false, active_clusters_); + loadCluster(cluster, MessageUtil::hash(cluster), "", false, active_clusters_); } } @@ -650,7 +650,8 @@ bool ClusterManagerImpl::addOrUpdateCluster(const envoy::config::cluster::v3::Cl init_helper_.state() == ClusterManagerInitHelper::State::AllClustersInitialized; // Preserve the previous cluster data to avoid early destroy. The same cluster should be added // before destroy to avoid early initialization complete. - const auto previous_cluster = loadCluster(cluster, version_info, true, warming_clusters_); + const auto previous_cluster = + loadCluster(cluster, new_hash, version_info, true, warming_clusters_); auto& cluster_entry = warming_clusters_.at(cluster_name); if (!all_clusters_initialized) { ENVOY_LOG(debug, "add/update cluster {} during init", cluster_name); @@ -720,8 +721,8 @@ bool ClusterManagerImpl::removeCluster(const std::string& cluster_name) { ClusterManagerImpl::ClusterDataPtr ClusterManagerImpl::loadCluster(const envoy::config::cluster::v3::Cluster& cluster, - const std::string& version_info, bool added_via_api, - ClusterMap& cluster_map) { + const uint64_t cluster_hash, const std::string& version_info, + bool added_via_api, ClusterMap& cluster_map) { std::pair new_cluster_pair = factory_.clusterFromProto(cluster, *this, outlier_event_logger_, added_via_api); auto& new_cluster = new_cluster_pair.first; @@ -770,14 +771,15 @@ ClusterManagerImpl::loadCluster(const envoy::config::cluster::v3::Cluster& clust auto cluster_entry_it = cluster_map.find(cluster_reference.info()->name()); if (cluster_entry_it != cluster_map.end()) { result = std::exchange(cluster_entry_it->second, - std::make_unique(cluster, version_info, added_via_api, - std::move(new_cluster), time_source_)); + std::make_unique(cluster, cluster_hash, version_info, + added_via_api, std::move(new_cluster), + time_source_)); } else { bool inserted = false; - std::tie(cluster_entry_it, inserted) = - cluster_map.emplace(cluster_reference.info()->name(), - std::make_unique(cluster, version_info, added_via_api, - std::move(new_cluster), time_source_)); + std::tie(cluster_entry_it, inserted) = cluster_map.emplace( + cluster_reference.info()->name(), + std::make_unique(cluster, cluster_hash, version_info, added_via_api, + std::move(new_cluster), time_source_)); ASSERT(inserted); } // If an LB is thread aware, create it here. The LB is not initialized until cluster pre-init diff --git a/source/common/upstream/cluster_manager_impl.h b/source/common/upstream/cluster_manager_impl.h index dd9ac4056a2e7..4a287bf80c341 100644 --- a/source/common/upstream/cluster_manager_impl.h +++ b/source/common/upstream/cluster_manager_impl.h @@ -468,9 +468,9 @@ class ClusterManagerImpl : public ClusterManager, Logger::Loggable