1f9f630b27
Summary: As part of the IOTracing project, this PR 1. Caches "FileSystemPtr" object(wrapper class that returns file system pointer based on tracing enabled) instead of "FileSystem" pointer. 2. FileSystemPtr object is created using FileSystem pointer and IOTracer pointer. 3. IOTracer shared_ptr is created in DBImpl and it is passed to different classes through constructor. 4. When tracing is enabled through DB::StartIOTrace, FileSystemPtr returns FileSystemTracingWrapper pointer for tracing purpose and when it is disabled underlying FileSystem pointer is returned. Pull Request resolved: https://github.com/facebook/rocksdb/pull/7180 Test Plan: make check -j64 COMPILE_WITH_TSAN=1 make check -j64 Reviewed By: anand1976 Differential Revision: D22987117 Pulled By: akankshamahajan15 fbshipit-source-id: 6073617e4c2d5bc363914f3a1f55ae3b0a58fbf1
320 lines
13 KiB
C++
320 lines
13 KiB
C++
// Copyright (c) 2019-present, Facebook, Inc. All rights reserved.
|
|
// This source code is licensed under both the GPLv2 (found in the
|
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
// (found in the LICENSE.Apache file in the root directory).
|
|
|
|
#include "env/file_system_tracer.h"
|
|
|
|
#include "rocksdb/env.h"
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
|
|
IOStatus FileSystemTracingWrapper::NewWritableFile(
|
|
const std::string& fname, const FileOptions& file_opts,
|
|
std::unique_ptr<FSWritableFile>* result, IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->NewWritableFile(fname, file_opts, result, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOFileName, __func__,
|
|
elapsed, s.ToString(), fname);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FileSystemTracingWrapper::NewDirectory(
|
|
const std::string& name, const IOOptions& io_opts,
|
|
std::unique_ptr<FSDirectory>* result, IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->NewDirectory(name, io_opts, result, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOFileName, __func__,
|
|
elapsed, s.ToString(), name);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FileSystemTracingWrapper::GetChildren(const std::string& dir,
|
|
const IOOptions& io_opts,
|
|
std::vector<std::string>* r,
|
|
IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->GetChildren(dir, io_opts, r, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOFileName, __func__,
|
|
elapsed, s.ToString(), dir);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FileSystemTracingWrapper::DeleteFile(const std::string& fname,
|
|
const IOOptions& options,
|
|
IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->DeleteFile(fname, options, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOFileName, __func__,
|
|
elapsed, s.ToString(), fname);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FileSystemTracingWrapper::CreateDir(const std::string& dirname,
|
|
const IOOptions& options,
|
|
IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->CreateDir(dirname, options, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOFileName, __func__,
|
|
elapsed, s.ToString(), dirname);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FileSystemTracingWrapper::CreateDirIfMissing(
|
|
const std::string& dirname, const IOOptions& options, IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->CreateDirIfMissing(dirname, options, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOFileName, __func__,
|
|
elapsed, s.ToString(), dirname);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FileSystemTracingWrapper::DeleteDir(const std::string& dirname,
|
|
const IOOptions& options,
|
|
IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->DeleteDir(dirname, options, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOFileName, __func__,
|
|
elapsed, s.ToString(), dirname);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FileSystemTracingWrapper::GetFileSize(const std::string& fname,
|
|
const IOOptions& options,
|
|
uint64_t* file_size,
|
|
IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->GetFileSize(fname, options, file_size, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOFileNameAndFileSize,
|
|
__func__, elapsed, s.ToString(), fname, *file_size);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FSSequentialFileTracingWrapper::Read(size_t n,
|
|
const IOOptions& options,
|
|
Slice* result, char* scratch,
|
|
IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->Read(n, options, result, scratch, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOLen, __func__,
|
|
elapsed, s.ToString(), result->size());
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FSSequentialFileTracingWrapper::InvalidateCache(size_t offset,
|
|
size_t length) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->InvalidateCache(offset, length);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOLenAndOffset,
|
|
__func__, elapsed, s.ToString(), length, offset);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FSSequentialFileTracingWrapper::PositionedRead(
|
|
uint64_t offset, size_t n, const IOOptions& options, Slice* result,
|
|
char* scratch, IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s =
|
|
target()->PositionedRead(offset, n, options, result, scratch, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOLenAndOffset,
|
|
__func__, elapsed, s.ToString(), result->size(),
|
|
offset);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FSRandomAccessFileTracingWrapper::Read(uint64_t offset, size_t n,
|
|
const IOOptions& options,
|
|
Slice* result, char* scratch,
|
|
IODebugContext* dbg) const {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->Read(offset, n, options, result, scratch, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOLenAndOffset,
|
|
__func__, elapsed, s.ToString(), n, offset);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FSRandomAccessFileTracingWrapper::MultiRead(FSReadRequest* reqs,
|
|
size_t num_reqs,
|
|
const IOOptions& options,
|
|
IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->MultiRead(reqs, num_reqs, options, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
uint64_t latency = elapsed;
|
|
for (size_t i = 0; i < num_reqs; i++) {
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOLenAndOffset,
|
|
__func__, latency, reqs[i].status.ToString(),
|
|
reqs[i].len, reqs[i].offset);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
}
|
|
return s;
|
|
}
|
|
|
|
IOStatus FSRandomAccessFileTracingWrapper::Prefetch(uint64_t offset, size_t n,
|
|
const IOOptions& options,
|
|
IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->Prefetch(offset, n, options, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOLenAndOffset,
|
|
__func__, elapsed, s.ToString(), n, offset);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FSRandomAccessFileTracingWrapper::InvalidateCache(size_t offset,
|
|
size_t length) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->InvalidateCache(offset, length);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOLenAndOffset,
|
|
__func__, elapsed, s.ToString(), length,
|
|
static_cast<uint64_t>(offset));
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FSWritableFileTracingWrapper::Append(const Slice& data,
|
|
const IOOptions& options,
|
|
IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->Append(data, options, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOLen, __func__,
|
|
elapsed, s.ToString(), data.size());
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FSWritableFileTracingWrapper::PositionedAppend(
|
|
const Slice& data, uint64_t offset, const IOOptions& options,
|
|
IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->PositionedAppend(data, offset, options, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOLenAndOffset,
|
|
__func__, elapsed, s.ToString(), data.size(), offset);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FSWritableFileTracingWrapper::Truncate(uint64_t size,
|
|
const IOOptions& options,
|
|
IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->Truncate(size, options, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOLen, __func__,
|
|
elapsed, s.ToString(), size);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FSWritableFileTracingWrapper::Close(const IOOptions& options,
|
|
IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->Close(options, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOGeneral, __func__,
|
|
elapsed, s.ToString());
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
uint64_t FSWritableFileTracingWrapper::GetFileSize(const IOOptions& options,
|
|
IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
uint64_t file_size = target()->GetFileSize(options, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOFileNameAndFileSize,
|
|
"GetFileSize", elapsed, "" /* file_name */,
|
|
file_size);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return file_size;
|
|
}
|
|
|
|
IOStatus FSWritableFileTracingWrapper::InvalidateCache(size_t offset,
|
|
size_t length) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->InvalidateCache(offset, length);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOLenAndOffset,
|
|
__func__, elapsed, s.ToString(), length,
|
|
static_cast<uint64_t>(offset));
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FSRandomRWFileTracingWrapper::Write(uint64_t offset, const Slice& data,
|
|
const IOOptions& options,
|
|
IODebugContext* dbg) {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->Write(offset, data, options, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOLenAndOffset,
|
|
__func__, elapsed, s.ToString(), data.size(), offset);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
|
|
IOStatus FSRandomRWFileTracingWrapper::Read(uint64_t offset, size_t n,
|
|
const IOOptions& options,
|
|
Slice* result, char* scratch,
|
|
IODebugContext* dbg) const {
|
|
StopWatchNano timer(Env::Default());
|
|
timer.Start();
|
|
IOStatus s = target()->Read(offset, n, options, result, scratch, dbg);
|
|
uint64_t elapsed = timer.ElapsedNanos();
|
|
IOTraceRecord io_record(env_->NowNanos(), TraceType::kIOLenAndOffset,
|
|
__func__, elapsed, s.ToString(), n, offset);
|
|
io_tracer_->WriteIOOp(io_record);
|
|
return s;
|
|
}
|
|
} // namespace ROCKSDB_NAMESPACE
|