From 52a7c1fa0b34d6bd44c59e3bc3ec271897c0de25 Mon Sep 17 00:00:00 2001 From: owent Date: Thu, 10 Jul 2025 11:08:07 +0800 Subject: [PATCH 1/3] Fixes duration overflow --- sdk/src/logs/multi_log_record_processor.cc | 36 ++++++++-------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/sdk/src/logs/multi_log_record_processor.cc b/sdk/src/logs/multi_log_record_processor.cc index c16dc0b469..88229a67f7 100644 --- a/sdk/src/logs/multi_log_record_processor.cc +++ b/sdk/src/logs/multi_log_record_processor.cc @@ -1,6 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#include #include #include #include @@ -75,39 +76,34 @@ void MultiLogRecordProcessor::OnEmit(std::unique_ptr &&record) noexc bool MultiLogRecordProcessor::ForceFlush(std::chrono::microseconds timeout) noexcept { - // Convert to nanos to prevent overflow - std::chrono::nanoseconds timeout_ns = std::chrono::nanoseconds::max(); - if (std::chrono::duration_cast(timeout_ns) > timeout) - { - timeout_ns = std::chrono::duration_cast(timeout); - } bool result = true; auto start_time = std::chrono::system_clock::now(); auto overflow_checker = std::chrono::system_clock::time_point::max(); std::chrono::system_clock::time_point expire_time; - if (overflow_checker - start_time <= timeout_ns) + if (std::chrono::duration_cast(overflow_checker - + start_time) <= timeout) { expire_time = overflow_checker; } else { expire_time = - start_time + std::chrono::duration_cast(timeout_ns); + start_time + std::chrono::duration_cast(timeout); } for (auto &processor : processors_) { - if (!processor->ForceFlush(std::chrono::duration_cast(timeout_ns))) + if (!processor->ForceFlush(timeout)) { result = false; } start_time = std::chrono::system_clock::now(); if (expire_time > start_time) { - timeout_ns = std::chrono::duration_cast(expire_time - start_time); + timeout = std::chrono::duration_cast(expire_time - start_time); } else { - timeout_ns = std::chrono::nanoseconds::zero(); + timeout = std::chrono::microseconds::zero(); } } return result; @@ -115,37 +111,31 @@ bool MultiLogRecordProcessor::ForceFlush(std::chrono::microseconds timeout) noex bool MultiLogRecordProcessor::Shutdown(std::chrono::microseconds timeout) noexcept { - // Converto nanos to prevent overflow - std::chrono::nanoseconds timeout_ns = std::chrono::nanoseconds::max(); - if (std::chrono::duration_cast(timeout_ns) > timeout) - { - timeout_ns = std::chrono::duration_cast(timeout); - } bool result = true; auto start_time = std::chrono::system_clock::now(); auto overflow_checker = std::chrono::system_clock::time_point::max(); std::chrono::system_clock::time_point expire_time; - if (overflow_checker - start_time <= timeout_ns) + if (std::chrono::duration_cast(overflow_checker - + start_time) <= timeout) { expire_time = overflow_checker; } else { expire_time = - start_time + std::chrono::duration_cast(timeout_ns); + start_time + std::chrono::duration_cast(timeout); } for (auto &processor : processors_) { - result |= - processor->Shutdown(std::chrono::duration_cast(timeout_ns)); + result |= processor->Shutdown(timeout); start_time = std::chrono::system_clock::now(); if (expire_time > start_time) { - timeout_ns = std::chrono::duration_cast(expire_time - start_time); + timeout = std::chrono::duration_cast(expire_time - start_time); } else { - timeout_ns = std::chrono::nanoseconds::zero(); + timeout = std::chrono::microseconds::zero(); } } return result; From 209760a4c76f31b5b4ff089a50f3fb09c91eb598 Mon Sep 17 00:00:00 2001 From: owent Date: Thu, 10 Jul 2025 11:51:32 +0800 Subject: [PATCH 2/3] Fixes IWYU and asan --- sdk/src/logs/multi_log_record_processor.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sdk/src/logs/multi_log_record_processor.cc b/sdk/src/logs/multi_log_record_processor.cc index 88229a67f7..d8b7e327a2 100644 --- a/sdk/src/logs/multi_log_record_processor.cc +++ b/sdk/src/logs/multi_log_record_processor.cc @@ -1,9 +1,9 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -#include #include #include +#include #include #include @@ -80,8 +80,8 @@ bool MultiLogRecordProcessor::ForceFlush(std::chrono::microseconds timeout) noex auto start_time = std::chrono::system_clock::now(); auto overflow_checker = std::chrono::system_clock::time_point::max(); std::chrono::system_clock::time_point expire_time; - if (std::chrono::duration_cast(overflow_checker - - start_time) <= timeout) + if (std::chrono::duration_cast(overflow_checker - start_time) <= + timeout) { expire_time = overflow_checker; } @@ -115,8 +115,8 @@ bool MultiLogRecordProcessor::Shutdown(std::chrono::microseconds timeout) noexce auto start_time = std::chrono::system_clock::now(); auto overflow_checker = std::chrono::system_clock::time_point::max(); std::chrono::system_clock::time_point expire_time; - if (std::chrono::duration_cast(overflow_checker - - start_time) <= timeout) + if (std::chrono::duration_cast(overflow_checker - start_time) <= + timeout) { expire_time = overflow_checker; } From 08b9e8bc715427cf7872fb2ef817597840b5ee44 Mon Sep 17 00:00:00 2001 From: owent Date: Thu, 10 Jul 2025 14:09:16 +0800 Subject: [PATCH 3/3] Fixes IWYU --- sdk/src/logs/multi_log_record_processor.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/src/logs/multi_log_record_processor.cc b/sdk/src/logs/multi_log_record_processor.cc index d8b7e327a2..8fdbf08328 100644 --- a/sdk/src/logs/multi_log_record_processor.cc +++ b/sdk/src/logs/multi_log_record_processor.cc @@ -3,7 +3,6 @@ #include #include -#include #include #include