Skip to content

Commit d65d0ec

Browse files
Copilotcijothomas
andcommitted
fix: Restore proper shutdown semantics for TonicTracesClient with &self
Co-authored-by: cijothomas <5232798+cijothomas@users.noreply.github.com>
1 parent 8fb8894 commit d65d0ec

File tree

1 file changed

+13
-7
lines changed
  • opentelemetry-otlp/src/exporter/tonic

1 file changed

+13
-7
lines changed

opentelemetry-otlp/src/exporter/tonic/trace.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use tonic::{codegen::CompressionEncoding, service::Interceptor, transport::Chann
1616
use super::BoxInterceptor;
1717

1818
pub(crate) struct TonicTracesClient {
19-
inner: Option<ClientInner>,
19+
inner: Mutex<Option<ClientInner>>,
2020
#[allow(dead_code)]
2121
// <allow dead> would be removed once we support set_resource for metrics.
2222
resource: opentelemetry_proto::transform::common::tonic::ResourceAttributesWithSchema,
@@ -49,18 +49,18 @@ impl TonicTracesClient {
4949
otel_debug!(name: "TonicsTracesClientBuilt");
5050

5151
TonicTracesClient {
52-
inner: Some(ClientInner {
52+
inner: Mutex::new(Some(ClientInner {
5353
client,
5454
interceptor: Mutex::new(interceptor),
55-
}),
55+
})),
5656
resource: Default::default(),
5757
}
5858
}
5959
}
6060

6161
impl SpanExporter for TonicTracesClient {
6262
async fn export(&self, batch: Vec<SpanData>) -> OTelSdkResult {
63-
let (mut client, metadata, extensions) = match &self.inner {
63+
let (mut client, metadata, extensions) = match self.inner.lock().await.as_ref() {
6464
Some(inner) => {
6565
let (m, e, _) = inner
6666
.interceptor
@@ -100,9 +100,15 @@ impl SpanExporter for TonicTracesClient {
100100
}
101101

102102
fn shutdown(&self) -> OTelSdkResult {
103-
// For tonic client, we don't need to do anything special for shutdown
104-
// as it's already using atomic operations for state management
105-
Ok(())
103+
match self.inner.try_lock() {
104+
Ok(mut guard) => match guard.take() {
105+
Some(_) => Ok(()), // Successfully took `inner`, indicating a successful shutdown.
106+
None => Err(OTelSdkError::AlreadyShutdown), // `inner` was already `None`, meaning it's already shut down.
107+
},
108+
Err(_) => Err(OTelSdkError::InternalFailure(
109+
"Failed to acquire lock for shutdown".to_string(),
110+
)),
111+
}
106112
}
107113

108114
fn set_resource(&mut self, resource: &opentelemetry_sdk::Resource) {

0 commit comments

Comments
 (0)