1
#include "source/common/rds/rds_route_config_provider_impl.h"
2

            
3
namespace Envoy {
4
namespace Rds {
5

            
6
RdsRouteConfigProviderImpl::RdsRouteConfigProviderImpl(
7
    RdsRouteConfigSubscriptionSharedPtr&& subscription,
8
    Server::Configuration::ServerFactoryContext& factory_context)
9
380
    : subscription_(std::move(subscription)),
10
380
      config_update_info_(subscription_->routeConfigUpdate()), tls_(factory_context.threadLocal()) {
11

            
12
380
  auto initial_config = config_update_info_->parsedConfiguration();
13
380
  ASSERT(initial_config);
14
706
  tls_.set([initial_config](Event::Dispatcher&) {
15
706
    return std::make_shared<ThreadLocalConfig>(initial_config);
16
706
  });
17
  // It should be 1:1 mapping due to shared rds config.
18
380
  ASSERT(subscription_->routeConfigProvider() == nullptr);
19
380
  subscription_->routeConfigProvider() = this;
20
380
}
21

            
22
380
RdsRouteConfigProviderImpl::~RdsRouteConfigProviderImpl() {
23
380
  ASSERT(subscription_->routeConfigProvider() != nullptr);
24
380
  subscription_->routeConfigProvider() = nullptr;
25
380
}
26

            
27
const absl::optional<RouteConfigProvider::ConfigInfo>&
28
199
RdsRouteConfigProviderImpl::configInfo() const {
29
199
  return config_update_info_->configInfo();
30
199
}
31

            
32
452
absl::Status RdsRouteConfigProviderImpl::onConfigUpdate() {
33
452
  tls_.runOnAllThreads([new_config = config_update_info_->parsedConfiguration()](
34
873
                           OptRef<ThreadLocalConfig> tls) { tls->config_ = new_config; });
35
452
  return absl::OkStatus();
36
452
}
37

            
38
} // namespace Rds
39
} // namespace Envoy