From: Yanqin Jin Date: Wed, 16 Jan 2019 17:48:01 +0000 (-0800) Subject: Use chrono::time_point instead of time_t (#4868) X-Git-Tag: v5.18.3~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9ae0528dc481add34ce6f4a072e51b827710bde2;p=rocksdb.git Use chrono::time_point instead of time_t (#4868) Summary: By convention, time_t almost always stores the integral number of seconds since 00:00 hours, Jan 1, 1970 UTC, according to http://www.cplusplus.com/reference/ctime/time_t/. We surely want more precision than seconds. Pull Request resolved: https://github.com/facebook/rocksdb/pull/4868 Differential Revision: D13633046 Pulled By: riversand963 fbshipit-source-id: 4e01e23a22e8838023c51a91247a286dbf3a5396 --- diff --git a/HISTORY.md b/HISTORY.md index 822b919e..9040717f 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,4 +1,8 @@ # Rocksdb Change Log +## 5.18.2 (01/23/2019) +### Public API Change +* Change time resolution in FileOperationInfo. + ## 5.18.0 (11/30/2018) ### New Features * Introduced `JemallocNodumpAllocator` memory allocator. When being use, block cache will be excluded from core dump. diff --git a/db/listener_test.cc b/db/listener_test.cc index cbbffc8c..894769d8 100644 --- a/db/listener_test.cc +++ b/db/listener_test.cc @@ -905,6 +905,7 @@ class TestFileOperationListener : public EventListener { if (info.status.ok()) { ++file_reads_success_; } + ReportDuration(info); } void OnFileWriteFinish(const FileOperationInfo& info) override { @@ -912,6 +913,7 @@ class TestFileOperationListener : public EventListener { if (info.status.ok()) { ++file_writes_success_; } + ReportDuration(info); } bool ShouldBeNotifiedOnFileIO() override { return true; } @@ -920,6 +922,13 @@ class TestFileOperationListener : public EventListener { std::atomic file_reads_success_; std::atomic file_writes_; std::atomic file_writes_success_; + + private: + void ReportDuration(const FileOperationInfo& info) const { + auto duration = std::chrono::duration_cast( + info.finish_timestamp - info.start_timestamp); + ASSERT_GT(duration.count(), 0); + } }; TEST_F(EventListenerTest, OnFileOperationTest) { diff --git a/include/rocksdb/listener.h b/include/rocksdb/listener.h index 8ceb2ed4..9b4e8a86 100644 --- a/include/rocksdb/listener.h +++ b/include/rocksdb/listener.h @@ -4,6 +4,7 @@ #pragma once +#include #include #include #include @@ -144,13 +145,18 @@ struct TableFileDeletionInfo { }; struct FileOperationInfo { + using TimePoint = std::chrono::time_point; + const std::string& path; uint64_t offset; size_t length; - time_t start_timestamp; - time_t finish_timestamp; + const TimePoint& start_timestamp; + const TimePoint& finish_timestamp; Status status; - FileOperationInfo(const std::string& _path) : path(_path) {} + FileOperationInfo(const std::string& _path, const TimePoint& start, + const TimePoint& finish) + : path(_path), start_timestamp(start), finish_timestamp(finish) {} }; struct FlushJobInfo { diff --git a/util/file_reader_writer.cc b/util/file_reader_writer.cc index 821d657b..9e40d4d4 100644 --- a/util/file_reader_writer.cc +++ b/util/file_reader_writer.cc @@ -99,17 +99,18 @@ Status RandomAccessFileReader::Read(uint64_t offset, size_t n, Slice* result, } Slice tmp; - time_t start_ts = 0; + FileOperationInfo::TimePoint start_ts; uint64_t orig_offset = 0; if (ShouldNotifyListeners()) { - start_ts = std::chrono::system_clock::to_time_t( - std::chrono::system_clock::now()); + start_ts = std::chrono::system_clock::now(); orig_offset = aligned_offset + buf.CurrentSize(); } s = file_->Read(aligned_offset + buf.CurrentSize(), allowed, &tmp, buf.Destination()); if (ShouldNotifyListeners()) { - NotifyOnFileReadFinish(orig_offset, tmp.size(), start_ts, s); + auto finish_ts = std::chrono::system_clock::now(); + NotifyOnFileReadFinish(orig_offset, tmp.size(), start_ts, finish_ts, + s); } buf.Size(buf.CurrentSize() + tmp.size()); @@ -145,16 +146,17 @@ Status RandomAccessFileReader::Read(uint64_t offset, size_t n, Slice* result, Slice tmp_result; #ifndef ROCKSDB_LITE - time_t start_ts = 0; + FileOperationInfo::TimePoint start_ts; if (ShouldNotifyListeners()) { - start_ts = std::chrono::system_clock::to_time_t( - std::chrono::system_clock::now()); + start_ts = std::chrono::system_clock::now(); } #endif s = file_->Read(offset + pos, allowed, &tmp_result, scratch + pos); #ifndef ROCKSDB_LITE if (ShouldNotifyListeners()) { - NotifyOnFileReadFinish(offset + pos, tmp_result.size(), start_ts, s); + auto finish_ts = std::chrono::system_clock::now(); + NotifyOnFileReadFinish(offset + pos, tmp_result.size(), start_ts, + finish_ts, s); } #endif @@ -442,18 +444,18 @@ Status WritableFileWriter::WriteBuffered(const char* data, size_t size) { TEST_SYNC_POINT("WritableFileWriter::Flush:BeforeAppend"); #ifndef ROCKSDB_LITE - time_t start_ts = 0; + FileOperationInfo::TimePoint start_ts; uint64_t old_size = writable_file_->GetFileSize(); if (ShouldNotifyListeners()) { - start_ts = std::chrono::system_clock::to_time_t( - std::chrono::system_clock::now()); + start_ts = std::chrono::system_clock::now(); old_size = next_write_offset_; } #endif s = writable_file_->Append(Slice(src, allowed)); #ifndef ROCKSDB_LITE if (ShouldNotifyListeners()) { - NotifyOnFileWriteFinish(old_size, allowed, start_ts, s); + auto finish_ts = std::chrono::system_clock::now(); + NotifyOnFileWriteFinish(old_size, allowed, start_ts, finish_ts, s); } #endif if (!s.ok()) { @@ -518,15 +520,15 @@ Status WritableFileWriter::WriteDirect() { { IOSTATS_TIMER_GUARD(write_nanos); TEST_SYNC_POINT("WritableFileWriter::Flush:BeforeAppend"); - time_t start_ts(0); + FileOperationInfo::TimePoint start_ts; if (ShouldNotifyListeners()) { - start_ts = std::chrono::system_clock::to_time_t( - std::chrono::system_clock::now()); + start_ts = std::chrono::system_clock::now(); } // direct writes must be positional s = writable_file_->PositionedAppend(Slice(src, size), write_offset); if (ShouldNotifyListeners()) { - NotifyOnFileWriteFinish(write_offset, size, start_ts, s); + auto finish_ts = std::chrono::system_clock::now(); + NotifyOnFileWriteFinish(write_offset, size, start_ts, finish_ts, s); } if (!s.ok()) { buf_.Size(file_advance + leftover_tail); diff --git a/util/file_reader_writer.h b/util/file_reader_writer.h index ec7acebc..1083c685 100644 --- a/util/file_reader_writer.h +++ b/util/file_reader_writer.h @@ -64,15 +64,13 @@ class SequentialFileReader { class RandomAccessFileReader { private: #ifndef ROCKSDB_LITE - void NotifyOnFileReadFinish(uint64_t offset, size_t length, time_t start_ts, + void NotifyOnFileReadFinish(uint64_t offset, size_t length, + const FileOperationInfo::TimePoint& start_ts, + const FileOperationInfo::TimePoint& finish_ts, const Status& status) const { - FileOperationInfo info(file_name_); + FileOperationInfo info(file_name_, start_ts, finish_ts); info.offset = offset; info.length = length; - info.start_timestamp = start_ts; - time_t finish_ts = - std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); - info.finish_timestamp = finish_ts; info.status = status; for (auto& listener : listeners_) { @@ -157,15 +155,13 @@ class RandomAccessFileReader { class WritableFileWriter { private: #ifndef ROCKSDB_LITE - void NotifyOnFileWriteFinish(uint64_t offset, size_t length, time_t start_ts, + void NotifyOnFileWriteFinish(uint64_t offset, size_t length, + const FileOperationInfo::TimePoint& start_ts, + const FileOperationInfo::TimePoint& finish_ts, const Status& status) { - FileOperationInfo info(file_name_); + FileOperationInfo info(file_name_, start_ts, finish_ts); info.offset = offset; info.length = length; - info.start_timestamp = start_ts; - time_t finish_ts = - std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); - info.finish_timestamp = finish_ts; info.status = status; for (auto& listener : listeners_) {