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
This commit is contained in:
Yanqin Jin 2019-01-16 09:48:01 -08:00 committed by Facebook Github Bot
parent 5d4fddfa52
commit e79df377c5
5 changed files with 45 additions and 31 deletions

View File

@ -10,6 +10,7 @@
* `TableProperties::num_entries` and `TableProperties::num_deletions` now also account for number of range tombstones. * `TableProperties::num_entries` and `TableProperties::num_deletions` now also account for number of range tombstones.
* Remove geodb, spatial_db, document_db, json_document, date_tiered_db, and redis_lists. * Remove geodb, spatial_db, document_db, json_document, date_tiered_db, and redis_lists.
* With "ldb ----try_load_options", when wal_dir specified by the option file doesn't exist, ignore it. * With "ldb ----try_load_options", when wal_dir specified by the option file doesn't exist, ignore it.
* Change time resolution in FileOperationInfo.
### Bug Fixes ### Bug Fixes
* Fix a deadlock caused by compaction and file ingestion waiting for each other in the event of write stalls. * Fix a deadlock caused by compaction and file ingestion waiting for each other in the event of write stalls.

View File

@ -905,6 +905,7 @@ class TestFileOperationListener : public EventListener {
if (info.status.ok()) { if (info.status.ok()) {
++file_reads_success_; ++file_reads_success_;
} }
ReportDuration(info);
} }
void OnFileWriteFinish(const FileOperationInfo& info) override { void OnFileWriteFinish(const FileOperationInfo& info) override {
@ -912,6 +913,7 @@ class TestFileOperationListener : public EventListener {
if (info.status.ok()) { if (info.status.ok()) {
++file_writes_success_; ++file_writes_success_;
} }
ReportDuration(info);
} }
bool ShouldBeNotifiedOnFileIO() override { return true; } bool ShouldBeNotifiedOnFileIO() override { return true; }
@ -920,6 +922,13 @@ class TestFileOperationListener : public EventListener {
std::atomic<size_t> file_reads_success_; std::atomic<size_t> file_reads_success_;
std::atomic<size_t> file_writes_; std::atomic<size_t> file_writes_;
std::atomic<size_t> file_writes_success_; std::atomic<size_t> file_writes_success_;
private:
void ReportDuration(const FileOperationInfo& info) const {
auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(
info.finish_timestamp - info.start_timestamp);
ASSERT_GT(duration.count(), 0);
}
}; };
TEST_F(EventListenerTest, OnFileOperationTest) { TEST_F(EventListenerTest, OnFileOperationTest) {

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <chrono>
#include <memory> #include <memory>
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
@ -144,13 +145,18 @@ struct TableFileDeletionInfo {
}; };
struct FileOperationInfo { struct FileOperationInfo {
using TimePoint = std::chrono::time_point<std::chrono::system_clock,
std::chrono::nanoseconds>;
const std::string& path; const std::string& path;
uint64_t offset; uint64_t offset;
size_t length; size_t length;
time_t start_timestamp; const TimePoint& start_timestamp;
time_t finish_timestamp; const TimePoint& finish_timestamp;
Status status; 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 { struct FlushJobInfo {

View File

@ -99,17 +99,18 @@ Status RandomAccessFileReader::Read(uint64_t offset, size_t n, Slice* result,
} }
Slice tmp; Slice tmp;
time_t start_ts = 0; FileOperationInfo::TimePoint start_ts;
uint64_t orig_offset = 0; uint64_t orig_offset = 0;
if (ShouldNotifyListeners()) { if (ShouldNotifyListeners()) {
start_ts = std::chrono::system_clock::to_time_t( start_ts = std::chrono::system_clock::now();
std::chrono::system_clock::now());
orig_offset = aligned_offset + buf.CurrentSize(); orig_offset = aligned_offset + buf.CurrentSize();
} }
s = file_->Read(aligned_offset + buf.CurrentSize(), allowed, &tmp, s = file_->Read(aligned_offset + buf.CurrentSize(), allowed, &tmp,
buf.Destination()); buf.Destination());
if (ShouldNotifyListeners()) { 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()); buf.Size(buf.CurrentSize() + tmp.size());
@ -145,16 +146,17 @@ Status RandomAccessFileReader::Read(uint64_t offset, size_t n, Slice* result,
Slice tmp_result; Slice tmp_result;
#ifndef ROCKSDB_LITE #ifndef ROCKSDB_LITE
time_t start_ts = 0; FileOperationInfo::TimePoint start_ts;
if (ShouldNotifyListeners()) { if (ShouldNotifyListeners()) {
start_ts = std::chrono::system_clock::to_time_t( start_ts = std::chrono::system_clock::now();
std::chrono::system_clock::now());
} }
#endif #endif
s = file_->Read(offset + pos, allowed, &tmp_result, scratch + pos); s = file_->Read(offset + pos, allowed, &tmp_result, scratch + pos);
#ifndef ROCKSDB_LITE #ifndef ROCKSDB_LITE
if (ShouldNotifyListeners()) { 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 #endif
@ -444,18 +446,18 @@ Status WritableFileWriter::WriteBuffered(const char* data, size_t size) {
TEST_SYNC_POINT("WritableFileWriter::Flush:BeforeAppend"); TEST_SYNC_POINT("WritableFileWriter::Flush:BeforeAppend");
#ifndef ROCKSDB_LITE #ifndef ROCKSDB_LITE
time_t start_ts = 0; FileOperationInfo::TimePoint start_ts;
uint64_t old_size = writable_file_->GetFileSize(); uint64_t old_size = writable_file_->GetFileSize();
if (ShouldNotifyListeners()) { if (ShouldNotifyListeners()) {
start_ts = std::chrono::system_clock::to_time_t( start_ts = std::chrono::system_clock::now();
std::chrono::system_clock::now());
old_size = next_write_offset_; old_size = next_write_offset_;
} }
#endif #endif
s = writable_file_->Append(Slice(src, allowed)); s = writable_file_->Append(Slice(src, allowed));
#ifndef ROCKSDB_LITE #ifndef ROCKSDB_LITE
if (ShouldNotifyListeners()) { 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 #endif
if (!s.ok()) { if (!s.ok()) {
@ -520,15 +522,15 @@ Status WritableFileWriter::WriteDirect() {
{ {
IOSTATS_TIMER_GUARD(write_nanos); IOSTATS_TIMER_GUARD(write_nanos);
TEST_SYNC_POINT("WritableFileWriter::Flush:BeforeAppend"); TEST_SYNC_POINT("WritableFileWriter::Flush:BeforeAppend");
time_t start_ts(0); FileOperationInfo::TimePoint start_ts;
if (ShouldNotifyListeners()) { if (ShouldNotifyListeners()) {
start_ts = std::chrono::system_clock::to_time_t( start_ts = std::chrono::system_clock::now();
std::chrono::system_clock::now());
} }
// direct writes must be positional // direct writes must be positional
s = writable_file_->PositionedAppend(Slice(src, size), write_offset); s = writable_file_->PositionedAppend(Slice(src, size), write_offset);
if (ShouldNotifyListeners()) { 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()) { if (!s.ok()) {
buf_.Size(file_advance + leftover_tail); buf_.Size(file_advance + leftover_tail);

View File

@ -64,15 +64,13 @@ class SequentialFileReader {
class RandomAccessFileReader { class RandomAccessFileReader {
private: private:
#ifndef ROCKSDB_LITE #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 { const Status& status) const {
FileOperationInfo info(file_name_); FileOperationInfo info(file_name_, start_ts, finish_ts);
info.offset = offset; info.offset = offset;
info.length = length; 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; info.status = status;
for (auto& listener : listeners_) { for (auto& listener : listeners_) {
@ -157,15 +155,13 @@ class RandomAccessFileReader {
class WritableFileWriter { class WritableFileWriter {
private: private:
#ifndef ROCKSDB_LITE #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) { const Status& status) {
FileOperationInfo info(file_name_); FileOperationInfo info(file_name_, start_ts, finish_ts);
info.offset = offset; info.offset = offset;
info.length = length; 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; info.status = status;
for (auto& listener : listeners_) { for (auto& listener : listeners_) {