From 25a50b982314e8f28718a0bd4e622b7a681a30af Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Wed, 30 Jun 2021 13:33:42 +0530 Subject: [PATCH] runtime context cleanup --- .../opentelemetry/context/runtime_context.h | 12 +++++++---- sdk/test/trace/tracer_test.cc | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/api/include/opentelemetry/context/runtime_context.h b/api/include/opentelemetry/context/runtime_context.h index 400b3de544..3f11d42e02 100644 --- a/api/include/opentelemetry/context/runtime_context.h +++ b/api/include/opentelemetry/context/runtime_context.h @@ -223,15 +223,19 @@ class ThreadLocalContextStorage : public RuntimeContextStorage Stack() noexcept : size_(0), capacity_(0), base_(nullptr){}; - // Pops the top Context off the stack and returns it. - Context Pop() noexcept + // Pops the top Context off the stack. + void Pop() noexcept { if (size_ == 0) { - return Context(); + return; } + // Store empty Context before decrementing `size`, to ensure + // the shared_ptr object (if stored in prev context object ) are released. + // The stack is not resized, and the unused memory would be reutilised + // for subsequent context storage. + base_[size_ - 1] = Context(); size_ -= 1; - return base_[size_]; } bool Contains(const Token &token) const noexcept diff --git a/sdk/test/trace/tracer_test.cc b/sdk/test/trace/tracer_test.cc index 0c5cc397d8..f9a5d897c5 100644 --- a/sdk/test/trace/tracer_test.cc +++ b/sdk/test/trace/tracer_test.cc @@ -626,3 +626,23 @@ TEST(Tracer, ValidTraceIdToSampler) EXPECT_TRUE(span->IsRecording()); EXPECT_TRUE(span->GetContext().IsValid()); } + +TEST(Tracer, SpanCleanupWithScope) +{ + std::unique_ptr exporter(new InMemorySpanExporter()); + std::shared_ptr span_data = exporter->GetData(); + auto tracer = initTracer(std::move(exporter)); + { + auto span0 = tracer->StartSpan("Span0"); + auto span1 = tracer->StartSpan("span1"); + { + trace_api::Scope scope(span1); + auto span2 = tracer->StartSpan("span2"); + { + trace_api::Scope scope(span2); + auto span3 = tracer->StartSpan("span3"); + } + } + } + EXPECT_EQ(4, span_data->GetSpans().size()); +}