Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion include/envoy/stats/scope.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ class Scope {
/**
* @return a reference to the symbol table.
*/
virtual const SymbolTable& symbolTable() const PURE;
virtual const SymbolTable& constSymbolTable() const PURE;
virtual SymbolTable& symbolTable() PURE;
};

Expand Down
2 changes: 1 addition & 1 deletion include/envoy/stats/stat_data_allocator.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ class StatDataAllocator {
virtual GaugeSharedPtr makeGauge(StatName name, absl::string_view tag_extracted_name,
const std::vector<Tag>& tags) PURE;

virtual const SymbolTable& symbolTable() const PURE;
virtual const SymbolTable& constSymbolTable() const PURE;
virtual SymbolTable& symbolTable() PURE;

// TODO(jmarantz): create a parallel mechanism to instantiate histograms. At
Expand Down
2 changes: 1 addition & 1 deletion include/envoy/stats/stats.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ class Metric {
static const uint8_t LogicCached = LogicAccumulate | LogicNeverImport;
};
virtual SymbolTable& symbolTable() PURE;
virtual const SymbolTable& symbolTable() const PURE;
virtual const SymbolTable& constSymbolTable() const PURE;
};

/**
Expand Down
1 change: 0 additions & 1 deletion source/common/stats/histogram_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ class HistogramImpl : public Histogram, public MetricImpl {

bool used() const override { return true; }
StatName statName() const override { return name_.statName(); }
const SymbolTable& symbolTable() const override { return parent_.symbolTable(); }
SymbolTable& symbolTable() override { return parent_.symbolTable(); }

private:
Expand Down
4 changes: 2 additions & 2 deletions source/common/stats/metric_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ MetricImpl::MetricImpl(absl::string_view tag_extracted_name, const std::vector<T
void MetricImpl::clear() { stat_names_.clear(symbolTable()); }

std::string MetricImpl::tagExtractedName() const {
return symbolTable().toString(tagExtractedStatName());
return constSymbolTable().toString(tagExtractedStatName());
}

StatName MetricImpl::tagExtractedStatName() const {
Expand Down Expand Up @@ -76,7 +76,7 @@ void MetricImpl::iterateTagStatNames(const TagStatNameIterFn& fn) const {
}

void MetricImpl::iterateTags(const TagIterFn& fn) const {
const SymbolTable& symbol_table = symbolTable();
const SymbolTable& symbol_table = constSymbolTable();
iterateTagStatNames([&fn, &symbol_table](StatName name, StatName value) -> bool {
return fn(Tag{symbol_table.toString(name), symbol_table.toString(value)});
});
Expand Down
7 changes: 5 additions & 2 deletions source/common/stats/metric_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,17 @@ class MetricImpl : public virtual Metric {
SymbolTable& symbol_table);
~MetricImpl();

std::string name() const override { return symbolTable().toString(statName()); }
std::string name() const override { return constSymbolTable().toString(statName()); }
std::string tagExtractedName() const override;
std::vector<Tag> tags() const override;
StatName tagExtractedStatName() const override;
void iterateTagStatNames(const TagStatNameIterFn& fn) const override;
void iterateTags(const TagIterFn& fn) const override;

const SymbolTable& constSymbolTable() const override {
return const_cast<MetricImpl*>(this)->symbolTable();
Comment thread
jmarantz marked this conversation as resolved.
}

protected:
void clear();

Expand All @@ -45,7 +49,6 @@ class NullMetricImpl : public MetricImpl {
explicit NullMetricImpl(SymbolTable& symbol_table)
: MetricImpl("", std::vector<Tag>(), symbol_table), stat_name_storage_("", symbol_table) {}

const SymbolTable& symbolTable() const override { return stat_name_storage_.symbolTable(); }
SymbolTable& symbolTable() override { return stat_name_storage_.symbolTable(); }
bool used() const override { return false; }
StatName statName() const override { return stat_name_storage_.statName(); }
Expand Down
2 changes: 1 addition & 1 deletion source/common/stats/scope_prefixer.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class ScopePrefixer : public Scope {
absl::optional<std::reference_wrapper<const Histogram>>
findHistogram(StatName name) const override;

const SymbolTable& symbolTable() const override { return scope_.symbolTable(); }
const SymbolTable& constSymbolTable() const override { return scope_.constSymbolTable(); }
virtual SymbolTable& symbolTable() override { return scope_.symbolTable(); }

NullGaugeImpl& nullGauge(const std::string& str) override { return scope_.nullGauge(str); }
Expand Down
5 changes: 1 addition & 4 deletions source/common/stats/stat_data_allocator_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ template <class StatData> class StatDataAllocatorImpl : public StatDataAllocator
virtual void free(StatData& data) PURE;

SymbolTable& symbolTable() override { return symbol_table_; }
const SymbolTable& symbolTable() const override { return symbol_table_; }
const SymbolTable& constSymbolTable() const override { return symbol_table_; }

private:
// SymbolTable encodes encodes stat names as back into strings. This does not
Expand Down Expand Up @@ -81,7 +81,6 @@ template <class StatData> class CounterImpl : public Counter, public MetricImpl
bool used() const override { return data_.flags_ & Flags::Used; }
uint64_t value() const override { return data_.value_; }

const SymbolTable& symbolTable() const override { return alloc_.symbolTable(); }
SymbolTable& symbolTable() override { return alloc_.symbolTable(); }

protected:
Expand Down Expand Up @@ -164,8 +163,6 @@ template <class StatData> class GaugeImpl : public Gauge, public MetricImpl {
}
}

private:
const SymbolTable& symbolTable() const override { return alloc_.symbolTable(); }
SymbolTable& symbolTable() override { return alloc_.symbolTable(); }

protected:
Expand Down
12 changes: 1 addition & 11 deletions source/common/stats/store_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,8 @@ class StoreImpl : public Store {
public:
explicit StoreImpl(SymbolTable& symbol_table) : symbol_table_(symbol_table) {}

Counter& counterFromStatName(StatName name) override {
return counter(symbol_table_.toString(name));
}

Gauge& gaugeFromStatName(StatName name) override { return gauge(symbol_table_.toString(name)); }

Histogram& histogramFromStatName(StatName name) override {
return histogram(symbol_table_.toString(name));
}

SymbolTable& symbolTable() override { return symbol_table_; }
const SymbolTable& symbolTable() const override { return symbol_table_; }
const SymbolTable& constSymbolTable() const override { return symbol_table_; }

private:
SymbolTable& symbol_table_;
Expand Down
2 changes: 1 addition & 1 deletion source/common/stats/symbol_table_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ class StatNameManagedStorage : public StatNameStorage {
~StatNameManagedStorage() { free(symbol_table_); }

SymbolTable& symbolTable() { return symbol_table_; }
const SymbolTable& symbolTable() const { return symbol_table_; }
const SymbolTable& constSymbolTable() const { return symbol_table_; }

private:
SymbolTable& symbol_table_;
Expand Down
4 changes: 2 additions & 2 deletions source/common/stats/thread_local_store.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
#include "envoy/stats/stats.h"

#include "common/common/lock_guard.h"
#include "common/stats/scope_prefixer.h"
#include "common/stats/stats_matcher_impl.h"
#include "common/stats/tag_producer_impl.h"

Expand Down Expand Up @@ -86,7 +85,8 @@ bool ThreadLocalStoreImpl::rejects(StatName stat_name) const {
// Also note that the elaboration of the stat-name into a string is expensive,
// so I think it might be better to move the matcher test until after caching,
// unless its acceptsAll/rejectsAll.
return stats_matcher_->rejectsAll() || stats_matcher_->rejects(symbolTable().toString(stat_name));
return stats_matcher_->rejectsAll() ||
stats_matcher_->rejects(constSymbolTable().toString(stat_name));
}

std::vector<CounterSharedPtr> ThreadLocalStoreImpl::counters() const {
Expand Down
6 changes: 2 additions & 4 deletions source/common/stats/thread_local_store.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ class ThreadLocalHistogramImpl : public Histogram, public MetricImpl {
// Stats::Metric
StatName statName() const override { return name_.statName(); }
SymbolTable& symbolTable() override { return symbol_table_; }
const SymbolTable& symbolTable() const override { return symbol_table_; }

private:
uint64_t otherHistogramIndex() const { return 1 - current_active_; }
Expand Down Expand Up @@ -98,7 +97,6 @@ class ParentHistogramImpl : public ParentHistogram, public MetricImpl {
// Stats::Metric
StatName statName() const override { return name_.statName(); }
SymbolTable& symbolTable() override { return parent_.symbolTable(); }
const SymbolTable& symbolTable() const override { return parent_.symbolTable(); }

private:
bool usedLockHeld() const EXCLUSIVE_LOCKS_REQUIRED(merge_lock_);
Expand Down Expand Up @@ -159,7 +157,7 @@ class ThreadLocalStoreImpl : Logger::Loggable<Logger::Id::stats>, public StoreRo
}
Histogram& histogram(const std::string& name) override { return default_scope_->histogram(name); }
NullGaugeImpl& nullGauge(const std::string&) override { return null_gauge_; }
const SymbolTable& symbolTable() const override { return alloc_.symbolTable(); }
const SymbolTable& constSymbolTable() const override { return alloc_.constSymbolTable(); }
SymbolTable& symbolTable() override { return alloc_.symbolTable(); }
const TagProducer& tagProducer() const { return *tag_producer_; }
absl::optional<std::reference_wrapper<const Counter>> findCounter(StatName name) const override {
Expand Down Expand Up @@ -250,7 +248,7 @@ class ThreadLocalStoreImpl : Logger::Loggable<Logger::Id::stats>, public StoreRo
ScopePtr createScope(const std::string& name) override {
return parent_.createScope(symbolTable().toString(prefix_.statName()) + "." + name);
}
const SymbolTable& symbolTable() const override { return parent_.symbolTable(); }
const SymbolTable& constSymbolTable() const override { return parent_.constSymbolTable(); }
SymbolTable& symbolTable() override { return parent_.symbolTable(); }

Counter& counter(const std::string& name) override {
Expand Down
9 changes: 9 additions & 0 deletions test/common/stats/isolated_store_impl_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ TEST_F(StatsIsolatedStoreImplTest, All) {
EXPECT_EQ(0, g2.tags().size());

Histogram& h1 = store_.histogram("h1");
EXPECT_TRUE(h1.used()); // hardcoded in impl to be true always.
Histogram& h2 = scope1->histogram("h2");
scope1->deliverHistogramToSinks(h2, 0);
EXPECT_EQ("h1", h1.name());
Expand Down Expand Up @@ -111,6 +112,14 @@ TEST_F(StatsIsolatedStoreImplTest, AllWithSymbolTable) {
EXPECT_EQ(2UL, store_.gauges().size());
}

TEST_F(StatsIsolatedStoreImplTest, ConstSymtabAccessor) {
ScopePtr scope = store_.createScope("scope.");
const Scope& cscope = *scope;
const SymbolTable& csymtab = cscope.constSymbolTable();
Comment thread
jmarantz marked this conversation as resolved.
Outdated
SymbolTable& symtab = scope->symbolTable();
EXPECT_EQ(&csymtab, &symtab);
}

TEST_F(StatsIsolatedStoreImplTest, LongStatName) {
const std::string long_string(128, 'A');

Expand Down
16 changes: 16 additions & 0 deletions test/common/stats/thread_local_store_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,14 @@ TEST_F(StatsThreadLocalStoreTest, SanitizePrefix) {
tls_.shutdownThread();
}

TEST_F(StatsThreadLocalStoreTest, ConstSymtabAccessor) {
ScopePtr scope = store_->createScope("scope.");
const Scope& cscope = *scope;
const SymbolTable& csymtab = cscope.constSymbolTable();
SymbolTable& symtab = scope->symbolTable();
EXPECT_EQ(&csymtab, &symtab);
}

TEST_F(StatsThreadLocalStoreTest, ScopeDelete) {
InSequence s;
store_->initializeThreading(main_thread_dispatcher_, tls_);
Expand Down Expand Up @@ -501,6 +509,13 @@ TEST_F(LookupWithStatNameTest, All) {
EXPECT_EQ(2UL, store_.gauges().size());
}

TEST_F(LookupWithStatNameTest, NotFound) {
StatName not_found(makeStatName("not_found"));
EXPECT_FALSE(store_.findCounter(not_found));
EXPECT_FALSE(store_.findGauge(not_found));
EXPECT_FALSE(store_.findHistogram(not_found));
}

class StatsMatcherTLSTest : public StatsThreadLocalStoreTest {
public:
envoy::config::metrics::v2::StatsConfig stats_config_;
Expand All @@ -527,6 +542,7 @@ TEST_F(StatsMatcherTLSTest, TestNoOpStatImpls) {
EXPECT_EQ(noop_counter.value(), 0);
Counter& noop_counter_2 = store_->counter("noop_counter_2");
EXPECT_EQ(&noop_counter, &noop_counter_2);
EXPECT_FALSE(noop_counter.used()); // hardcoded to return false in NullMetricImpl.

// Gauge
Gauge& noop_gauge = store_->gauge("noop_gauge");
Expand Down
6 changes: 5 additions & 1 deletion test/integration/filters/eds_ready_filter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,14 @@ namespace Envoy {
// responds OK to all requests if it is.
class EdsReadyFilter : public Http::PassThroughFilter {
public:
// TODO(jmarantz): this const-cast of the symbol-table is needed only because
Comment thread
jmarantz marked this conversation as resolved.
Outdated
// it lacks a const-method to encode a string, that could fail (e.g. via
// absl::optional) if the tokens in it were not already present in the symbol
// table. No new stats are created by this filter.
EdsReadyFilter(const Stats::Scope& root_scope)
: root_scope_(root_scope),
stat_name_("cluster.cluster_0.membership_healthy",
const_cast<Stats::SymbolTable&>(root_scope_.symbolTable())) {}
const_cast<Stats::SymbolTable&>(root_scope_.constSymbolTable())) {}
Http::FilterHeadersStatus decodeHeaders(Http::HeaderMap&, bool) override {
absl::optional<std::reference_wrapper<const Stats::Gauge>> gauge =
root_scope_.findGauge(stat_name_.statName());
Expand Down
6 changes: 4 additions & 2 deletions test/integration/server.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,9 @@ class TestScopeWrapper : public Scope {
return wrapped_scope_->findHistogram(name);
}

const SymbolTable& symbolTable() const override { return wrapped_scope_->symbolTable(); }
const SymbolTable& constSymbolTable() const override {
return wrapped_scope_->constSymbolTable();
}
SymbolTable& symbolTable() override { return wrapped_scope_->symbolTable(); }

private:
Expand Down Expand Up @@ -177,7 +179,7 @@ class TestIsolatedStoreImpl : public StoreRoot {
Thread::LockGuard lock(lock_);
return store_.findHistogram(name);
}
const SymbolTable& symbolTable() const override { return store_.symbolTable(); }
const SymbolTable& constSymbolTable() const override { return store_.constSymbolTable(); }
SymbolTable& symbolTable() override { return store_.symbolTable(); }

// Stats::Store
Expand Down
5 changes: 1 addition & 4 deletions test/mocks/stats/mocks.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class MockMetric : public virtual Metric {
};

SymbolTable& symbolTable() override { return symbol_table_.get(); }
const SymbolTable& symbolTable() const override { return symbol_table_.get(); }
const SymbolTable& constSymbolTable() const override { return symbol_table_.get(); }

// Note: cannot be mocked because it is accessed as a Property in a gmock EXPECT_CALL. This
// creates a deadlock in gmock and is an unintended use of mock functions.
Expand Down Expand Up @@ -205,9 +205,6 @@ class MockStore : public SymbolTableProvider, public StoreImpl {
return histogram(symbol_table_->toString(name));
}

SymbolTable& symbolTable() override { return symbol_table_.get(); }
const SymbolTable& symbolTable() const override { return symbol_table_.get(); }

Test::Global<FakeSymbolTableImpl> symbol_table_;
testing::NiceMock<MockCounter> counter_;
std::vector<std::unique_ptr<MockHistogram>> histograms_;
Expand Down