Skip to content

Commit 52a7c1f

Browse files
committed
Fixes duration overflow
1 parent 6c4d45c commit 52a7c1f

File tree

1 file changed

+13
-23
lines changed

1 file changed

+13
-23
lines changed

sdk/src/logs/multi_log_record_processor.cc

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright The OpenTelemetry Authors
22
// SPDX-License-Identifier: Apache-2.0
33

4+
#include <algorithm>
45
#include <chrono>
56
#include <memory>
67
#include <utility>
@@ -75,77 +76,66 @@ void MultiLogRecordProcessor::OnEmit(std::unique_ptr<Recordable> &&record) noexc
7576

7677
bool MultiLogRecordProcessor::ForceFlush(std::chrono::microseconds timeout) noexcept
7778
{
78-
// Convert to nanos to prevent overflow
79-
std::chrono::nanoseconds timeout_ns = std::chrono::nanoseconds::max();
80-
if (std::chrono::duration_cast<std::chrono::microseconds>(timeout_ns) > timeout)
81-
{
82-
timeout_ns = std::chrono::duration_cast<std::chrono::nanoseconds>(timeout);
83-
}
8479
bool result = true;
8580
auto start_time = std::chrono::system_clock::now();
8681
auto overflow_checker = std::chrono::system_clock::time_point::max();
8782
std::chrono::system_clock::time_point expire_time;
88-
if (overflow_checker - start_time <= timeout_ns)
83+
if (std::chrono::duration_cast<std::chrono::system_clock::duration>(overflow_checker -
84+
start_time) <= timeout)
8985
{
9086
expire_time = overflow_checker;
9187
}
9288
else
9389
{
9490
expire_time =
95-
start_time + std::chrono::duration_cast<std::chrono::system_clock::duration>(timeout_ns);
91+
start_time + std::chrono::duration_cast<std::chrono::system_clock::duration>(timeout);
9692
}
9793
for (auto &processor : processors_)
9894
{
99-
if (!processor->ForceFlush(std::chrono::duration_cast<std::chrono::microseconds>(timeout_ns)))
95+
if (!processor->ForceFlush(timeout))
10096
{
10197
result = false;
10298
}
10399
start_time = std::chrono::system_clock::now();
104100
if (expire_time > start_time)
105101
{
106-
timeout_ns = std::chrono::duration_cast<std::chrono::nanoseconds>(expire_time - start_time);
102+
timeout = std::chrono::duration_cast<std::chrono::microseconds>(expire_time - start_time);
107103
}
108104
else
109105
{
110-
timeout_ns = std::chrono::nanoseconds::zero();
106+
timeout = std::chrono::microseconds::zero();
111107
}
112108
}
113109
return result;
114110
}
115111

116112
bool MultiLogRecordProcessor::Shutdown(std::chrono::microseconds timeout) noexcept
117113
{
118-
// Converto nanos to prevent overflow
119-
std::chrono::nanoseconds timeout_ns = std::chrono::nanoseconds::max();
120-
if (std::chrono::duration_cast<std::chrono::microseconds>(timeout_ns) > timeout)
121-
{
122-
timeout_ns = std::chrono::duration_cast<std::chrono::nanoseconds>(timeout);
123-
}
124114
bool result = true;
125115
auto start_time = std::chrono::system_clock::now();
126116
auto overflow_checker = std::chrono::system_clock::time_point::max();
127117
std::chrono::system_clock::time_point expire_time;
128-
if (overflow_checker - start_time <= timeout_ns)
118+
if (std::chrono::duration_cast<std::chrono::system_clock::duration>(overflow_checker -
119+
start_time) <= timeout)
129120
{
130121
expire_time = overflow_checker;
131122
}
132123
else
133124
{
134125
expire_time =
135-
start_time + std::chrono::duration_cast<std::chrono::system_clock::duration>(timeout_ns);
126+
start_time + std::chrono::duration_cast<std::chrono::system_clock::duration>(timeout);
136127
}
137128
for (auto &processor : processors_)
138129
{
139-
result |=
140-
processor->Shutdown(std::chrono::duration_cast<std::chrono::microseconds>(timeout_ns));
130+
result |= processor->Shutdown(timeout);
141131
start_time = std::chrono::system_clock::now();
142132
if (expire_time > start_time)
143133
{
144-
timeout_ns = std::chrono::duration_cast<std::chrono::nanoseconds>(expire_time - start_time);
134+
timeout = std::chrono::duration_cast<std::chrono::microseconds>(expire_time - start_time);
145135
}
146136
else
147137
{
148-
timeout_ns = std::chrono::nanoseconds::zero();
138+
timeout = std::chrono::microseconds::zero();
149139
}
150140
}
151141
return result;

0 commit comments

Comments
 (0)