summaryrefslogtreecommitdiffstats
path: root/vespalog
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2019-04-04 08:25:01 +0200
committerGitHub <noreply@github.com>2019-04-04 08:25:01 +0200
commitc8c842d622eb744504fe0b7b15044602b85ec0ee (patch)
treee9dbd67083ca292e6212293d0b91e7b76faefd26 /vespalog
parentf513e87c06b9cb136411b1bfcc182cf1e0aae706 (diff)
parentdac529d0484c34424d3930e1b2ac4737ae98812f (diff)
Merge pull request #8996 from vespa-engine/toregge/avoid-log-timestamp-rounding-errors
Avoid log timestamp rounding errors
Diffstat (limited to 'vespalog')
-rw-r--r--vespalog/src/vespa/log/log_message.cpp25
1 files changed, 18 insertions, 7 deletions
diff --git a/vespalog/src/vespa/log/log_message.cpp b/vespalog/src/vespa/log/log_message.cpp
index 77f9b619e9f..8ce7df93a12 100644
--- a/vespalog/src/vespa/log/log_message.cpp
+++ b/vespalog/src/vespa/log/log_message.cpp
@@ -31,18 +31,29 @@ find_tab(std::string_view log_line, const char *tab_name, std::string_view::size
}
int64_t
-parse_time_field(std::string time_field)
+parse_time_subfield(std::string time_subfield, const std::string &time_field)
{
- std::istringstream time_stream(time_field);
- time_stream.imbue(clocale);
- double logtime = 0;
- time_stream >> logtime;
- if (!time_stream.eof()) {
+ std::istringstream subfield_stream(time_subfield);
+ subfield_stream.imbue(clocale);
+ int64_t result = 0;
+ subfield_stream >> result;
+ if (!subfield_stream.eof()) {
std::ostringstream os;
os << "Bad time field: " << time_field;
throw BadLogLineException(os.str());
}
- return logtime * 1000000000;
+ return result;
+}
+
+int64_t
+parse_time_field(std::string time_field)
+{
+ auto dotPos = time_field.find('.');
+ int64_t log_time = parse_time_subfield(time_field.substr(0, dotPos), time_field) * 1000000000;
+ if (dotPos != std::string::npos) {
+ log_time += parse_time_subfield((time_field.substr(dotPos + 1) + "000000000").substr(0, 9), time_field);
+ }
+ return log_time;
}
struct PidFieldParser