]>
git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/env/file_system_tracer.cc
1 // Copyright (c) 2019-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under both the GPLv2 (found in the
3 // COPYING file in the root directory) and Apache 2.0 License
4 // (found in the LICENSE.Apache file in the root directory).
6 #include "env/file_system_tracer.h"
8 #include "rocksdb/file_system.h"
9 #include "rocksdb/system_clock.h"
10 #include "rocksdb/trace_record.h"
12 namespace ROCKSDB_NAMESPACE
{
14 IOStatus
FileSystemTracingWrapper::NewSequentialFile(
15 const std::string
& fname
, const FileOptions
& file_opts
,
16 std::unique_ptr
<FSSequentialFile
>* result
, IODebugContext
* dbg
) {
17 StopWatchNano
timer(clock_
);
19 IOStatus s
= target()->NewSequentialFile(fname
, file_opts
, result
, dbg
);
20 uint64_t elapsed
= timer
.ElapsedNanos();
21 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
22 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
23 fname
.substr(fname
.find_last_of("/\\") + 1));
24 io_tracer_
->WriteIOOp(io_record
, dbg
);
28 IOStatus
FileSystemTracingWrapper::NewRandomAccessFile(
29 const std::string
& fname
, const FileOptions
& file_opts
,
30 std::unique_ptr
<FSRandomAccessFile
>* result
, IODebugContext
* dbg
) {
31 StopWatchNano
timer(clock_
);
33 IOStatus s
= target()->NewRandomAccessFile(fname
, file_opts
, result
, dbg
);
34 uint64_t elapsed
= timer
.ElapsedNanos();
35 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
36 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
37 fname
.substr(fname
.find_last_of("/\\") + 1));
38 io_tracer_
->WriteIOOp(io_record
, dbg
);
42 IOStatus
FileSystemTracingWrapper::NewWritableFile(
43 const std::string
& fname
, const FileOptions
& file_opts
,
44 std::unique_ptr
<FSWritableFile
>* result
, IODebugContext
* dbg
) {
45 StopWatchNano
timer(clock_
);
47 IOStatus s
= target()->NewWritableFile(fname
, file_opts
, result
, dbg
);
48 uint64_t elapsed
= timer
.ElapsedNanos();
49 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
50 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
51 fname
.substr(fname
.find_last_of("/\\") + 1));
52 io_tracer_
->WriteIOOp(io_record
, dbg
);
56 IOStatus
FileSystemTracingWrapper::ReopenWritableFile(
57 const std::string
& fname
, const FileOptions
& file_opts
,
58 std::unique_ptr
<FSWritableFile
>* result
, IODebugContext
* dbg
) {
59 StopWatchNano
timer(clock_
);
61 IOStatus s
= target()->ReopenWritableFile(fname
, file_opts
, result
, dbg
);
62 uint64_t elapsed
= timer
.ElapsedNanos();
63 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
64 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
65 fname
.substr(fname
.find_last_of("/\\") + 1));
66 io_tracer_
->WriteIOOp(io_record
, dbg
);
70 IOStatus
FileSystemTracingWrapper::ReuseWritableFile(
71 const std::string
& fname
, const std::string
& old_fname
,
72 const FileOptions
& file_opts
, std::unique_ptr
<FSWritableFile
>* result
,
73 IODebugContext
* dbg
) {
74 StopWatchNano
timer(clock_
);
77 target()->ReuseWritableFile(fname
, old_fname
, file_opts
, result
, dbg
);
78 uint64_t elapsed
= timer
.ElapsedNanos();
79 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
80 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
81 fname
.substr(fname
.find_last_of("/\\") + 1));
82 io_tracer_
->WriteIOOp(io_record
, dbg
);
86 IOStatus
FileSystemTracingWrapper::NewRandomRWFile(
87 const std::string
& fname
, const FileOptions
& file_opts
,
88 std::unique_ptr
<FSRandomRWFile
>* result
, IODebugContext
* dbg
) {
89 StopWatchNano
timer(clock_
);
91 IOStatus s
= target()->NewRandomRWFile(fname
, file_opts
, result
, dbg
);
92 uint64_t elapsed
= timer
.ElapsedNanos();
93 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
94 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
95 fname
.substr(fname
.find_last_of("/\\") + 1));
96 io_tracer_
->WriteIOOp(io_record
, dbg
);
100 IOStatus
FileSystemTracingWrapper::NewDirectory(
101 const std::string
& name
, const IOOptions
& io_opts
,
102 std::unique_ptr
<FSDirectory
>* result
, IODebugContext
* dbg
) {
103 StopWatchNano
timer(clock_
);
105 IOStatus s
= target()->NewDirectory(name
, io_opts
, result
, dbg
);
106 uint64_t elapsed
= timer
.ElapsedNanos();
107 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
108 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
109 name
.substr(name
.find_last_of("/\\") + 1));
110 io_tracer_
->WriteIOOp(io_record
, dbg
);
114 IOStatus
FileSystemTracingWrapper::GetChildren(const std::string
& dir
,
115 const IOOptions
& io_opts
,
116 std::vector
<std::string
>* r
,
117 IODebugContext
* dbg
) {
118 StopWatchNano
timer(clock_
);
120 IOStatus s
= target()->GetChildren(dir
, io_opts
, r
, dbg
);
121 uint64_t elapsed
= timer
.ElapsedNanos();
122 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
123 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
124 dir
.substr(dir
.find_last_of("/\\") + 1));
125 io_tracer_
->WriteIOOp(io_record
, dbg
);
129 IOStatus
FileSystemTracingWrapper::DeleteFile(const std::string
& fname
,
130 const IOOptions
& options
,
131 IODebugContext
* dbg
) {
132 StopWatchNano
timer(clock_
);
134 IOStatus s
= target()->DeleteFile(fname
, options
, dbg
);
135 uint64_t elapsed
= timer
.ElapsedNanos();
136 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
137 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
138 fname
.substr(fname
.find_last_of("/\\") + 1));
139 io_tracer_
->WriteIOOp(io_record
, dbg
);
143 IOStatus
FileSystemTracingWrapper::CreateDir(const std::string
& dirname
,
144 const IOOptions
& options
,
145 IODebugContext
* dbg
) {
146 StopWatchNano
timer(clock_
);
148 IOStatus s
= target()->CreateDir(dirname
, options
, dbg
);
149 uint64_t elapsed
= timer
.ElapsedNanos();
150 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
151 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
152 dirname
.substr(dirname
.find_last_of("/\\") + 1));
153 io_tracer_
->WriteIOOp(io_record
, dbg
);
157 IOStatus
FileSystemTracingWrapper::CreateDirIfMissing(
158 const std::string
& dirname
, const IOOptions
& options
, IODebugContext
* dbg
) {
159 StopWatchNano
timer(clock_
);
161 IOStatus s
= target()->CreateDirIfMissing(dirname
, options
, dbg
);
162 uint64_t elapsed
= timer
.ElapsedNanos();
163 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
164 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
165 dirname
.substr(dirname
.find_last_of("/\\") + 1));
166 io_tracer_
->WriteIOOp(io_record
, dbg
);
170 IOStatus
FileSystemTracingWrapper::DeleteDir(const std::string
& dirname
,
171 const IOOptions
& options
,
172 IODebugContext
* dbg
) {
173 StopWatchNano
timer(clock_
);
175 IOStatus s
= target()->DeleteDir(dirname
, options
, dbg
);
176 uint64_t elapsed
= timer
.ElapsedNanos();
177 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
178 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
179 dirname
.substr(dirname
.find_last_of("/\\") + 1));
180 io_tracer_
->WriteIOOp(io_record
, dbg
);
184 IOStatus
FileSystemTracingWrapper::GetFileSize(const std::string
& fname
,
185 const IOOptions
& options
,
187 IODebugContext
* dbg
) {
188 StopWatchNano
timer(clock_
);
190 IOStatus s
= target()->GetFileSize(fname
, options
, file_size
, dbg
);
191 uint64_t elapsed
= timer
.ElapsedNanos();
192 uint64_t io_op_data
= 0;
193 io_op_data
|= (1 << IOTraceOp::kIOFileSize
);
194 IOTraceRecord
io_record(
195 clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
, __func__
, elapsed
,
196 s
.ToString(), fname
.substr(fname
.find_last_of("/\\") + 1), *file_size
);
197 io_tracer_
->WriteIOOp(io_record
, dbg
);
201 IOStatus
FileSystemTracingWrapper::Truncate(const std::string
& fname
,
203 const IOOptions
& options
,
204 IODebugContext
* dbg
) {
205 StopWatchNano
timer(clock_
);
207 IOStatus s
= target()->Truncate(fname
, size
, options
, dbg
);
208 uint64_t elapsed
= timer
.ElapsedNanos();
209 uint64_t io_op_data
= 0;
210 io_op_data
|= (1 << IOTraceOp::kIOFileSize
);
211 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
212 __func__
, elapsed
, s
.ToString(),
213 fname
.substr(fname
.find_last_of("/\\") + 1), size
);
214 io_tracer_
->WriteIOOp(io_record
, dbg
);
218 IOStatus
FSSequentialFileTracingWrapper::Read(size_t n
,
219 const IOOptions
& options
,
220 Slice
* result
, char* scratch
,
221 IODebugContext
* dbg
) {
222 StopWatchNano
timer(clock_
);
224 IOStatus s
= target()->Read(n
, options
, result
, scratch
, dbg
);
225 uint64_t elapsed
= timer
.ElapsedNanos();
226 uint64_t io_op_data
= 0;
227 io_op_data
|= (1 << IOTraceOp::kIOLen
);
228 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
229 __func__
, elapsed
, s
.ToString(), file_name_
,
230 result
->size(), 0 /*Offset*/);
231 io_tracer_
->WriteIOOp(io_record
, dbg
);
235 IOStatus
FSSequentialFileTracingWrapper::InvalidateCache(size_t offset
,
237 StopWatchNano
timer(clock_
);
239 IOStatus s
= target()->InvalidateCache(offset
, length
);
240 uint64_t elapsed
= timer
.ElapsedNanos();
241 uint64_t io_op_data
= 0;
242 io_op_data
|= (1 << IOTraceOp::kIOLen
);
243 io_op_data
|= (1 << IOTraceOp::kIOOffset
);
244 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
245 __func__
, elapsed
, s
.ToString(), file_name_
, length
,
247 io_tracer_
->WriteIOOp(io_record
, nullptr /*dbg*/);
251 IOStatus
FSSequentialFileTracingWrapper::PositionedRead(
252 uint64_t offset
, size_t n
, const IOOptions
& options
, Slice
* result
,
253 char* scratch
, IODebugContext
* dbg
) {
254 StopWatchNano
timer(clock_
);
257 target()->PositionedRead(offset
, n
, options
, result
, scratch
, dbg
);
258 uint64_t elapsed
= timer
.ElapsedNanos();
259 uint64_t io_op_data
= 0;
260 io_op_data
|= (1 << IOTraceOp::kIOLen
);
261 io_op_data
|= (1 << IOTraceOp::kIOOffset
);
262 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
263 __func__
, elapsed
, s
.ToString(), file_name_
,
264 result
->size(), offset
);
265 io_tracer_
->WriteIOOp(io_record
, dbg
);
269 IOStatus
FSRandomAccessFileTracingWrapper::Read(uint64_t offset
, size_t n
,
270 const IOOptions
& options
,
271 Slice
* result
, char* scratch
,
272 IODebugContext
* dbg
) const {
273 StopWatchNano
timer(clock_
);
275 IOStatus s
= target()->Read(offset
, n
, options
, result
, scratch
, dbg
);
276 uint64_t elapsed
= timer
.ElapsedNanos();
277 uint64_t io_op_data
= 0;
278 io_op_data
|= (1 << IOTraceOp::kIOLen
);
279 io_op_data
|= (1 << IOTraceOp::kIOOffset
);
280 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
281 __func__
, elapsed
, s
.ToString(), file_name_
, n
,
283 io_tracer_
->WriteIOOp(io_record
, dbg
);
287 IOStatus
FSRandomAccessFileTracingWrapper::MultiRead(FSReadRequest
* reqs
,
289 const IOOptions
& options
,
290 IODebugContext
* dbg
) {
291 StopWatchNano
timer(clock_
);
293 IOStatus s
= target()->MultiRead(reqs
, num_reqs
, options
, dbg
);
294 uint64_t elapsed
= timer
.ElapsedNanos();
295 uint64_t latency
= elapsed
;
296 uint64_t io_op_data
= 0;
297 io_op_data
|= (1 << IOTraceOp::kIOLen
);
298 io_op_data
|= (1 << IOTraceOp::kIOOffset
);
299 for (size_t i
= 0; i
< num_reqs
; i
++) {
300 IOTraceRecord
io_record(
301 clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
, __func__
, latency
,
302 reqs
[i
].status
.ToString(), file_name_
, reqs
[i
].len
, reqs
[i
].offset
);
303 io_tracer_
->WriteIOOp(io_record
, dbg
);
308 IOStatus
FSRandomAccessFileTracingWrapper::Prefetch(uint64_t offset
, size_t n
,
309 const IOOptions
& options
,
310 IODebugContext
* dbg
) {
311 StopWatchNano
timer(clock_
);
313 IOStatus s
= target()->Prefetch(offset
, n
, options
, dbg
);
314 uint64_t elapsed
= timer
.ElapsedNanos();
315 uint64_t io_op_data
= 0;
316 io_op_data
|= (1 << IOTraceOp::kIOLen
);
317 io_op_data
|= (1 << IOTraceOp::kIOOffset
);
318 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
319 __func__
, elapsed
, s
.ToString(), file_name_
, n
,
321 io_tracer_
->WriteIOOp(io_record
, dbg
);
325 IOStatus
FSRandomAccessFileTracingWrapper::InvalidateCache(size_t offset
,
327 StopWatchNano
timer(clock_
);
329 IOStatus s
= target()->InvalidateCache(offset
, length
);
330 uint64_t elapsed
= timer
.ElapsedNanos();
331 uint64_t io_op_data
= 0;
332 io_op_data
|= (1 << IOTraceOp::kIOLen
);
333 io_op_data
|= (1 << IOTraceOp::kIOOffset
);
334 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
335 __func__
, elapsed
, s
.ToString(), file_name_
, length
,
336 static_cast<uint64_t>(offset
));
337 io_tracer_
->WriteIOOp(io_record
, nullptr /*dbg*/);
341 IOStatus
FSRandomAccessFileTracingWrapper::ReadAsync(
342 FSReadRequest
& req
, const IOOptions
& opts
,
343 std::function
<void(const FSReadRequest
&, void*)> cb
, void* cb_arg
,
344 void** io_handle
, IOHandleDeleter
* del_fn
, IODebugContext
* dbg
) {
345 // Create a callback and populate info.
346 auto read_async_callback
=
347 std::bind(&FSRandomAccessFileTracingWrapper::ReadAsyncCallback
, this,
348 std::placeholders::_1
, std::placeholders::_2
);
349 ReadAsyncCallbackInfo
* read_async_cb_info
= new ReadAsyncCallbackInfo
;
350 read_async_cb_info
->cb_
= cb
;
351 read_async_cb_info
->cb_arg_
= cb_arg
;
352 read_async_cb_info
->start_time_
= clock_
->NowNanos();
353 read_async_cb_info
->file_op_
= __func__
;
355 IOStatus s
= target()->ReadAsync(req
, opts
, read_async_callback
,
356 read_async_cb_info
, io_handle
, del_fn
, dbg
);
359 delete read_async_cb_info
;
364 void FSRandomAccessFileTracingWrapper::ReadAsyncCallback(
365 const FSReadRequest
& req
, void* cb_arg
) {
366 ReadAsyncCallbackInfo
* read_async_cb_info
=
367 static_cast<ReadAsyncCallbackInfo
*>(cb_arg
);
368 assert(read_async_cb_info
);
369 assert(read_async_cb_info
->cb_
);
371 uint64_t elapsed
= clock_
->NowNanos() - read_async_cb_info
->start_time_
;
372 uint64_t io_op_data
= 0;
373 io_op_data
|= (1 << IOTraceOp::kIOLen
);
374 io_op_data
|= (1 << IOTraceOp::kIOOffset
);
375 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
376 read_async_cb_info
->file_op_
, elapsed
,
377 req
.status
.ToString(), file_name_
, req
.result
.size(),
379 io_tracer_
->WriteIOOp(io_record
, nullptr /*dbg*/);
381 // call the underlying callback.
382 read_async_cb_info
->cb_(req
, read_async_cb_info
->cb_arg_
);
383 delete read_async_cb_info
;
386 IOStatus
FSWritableFileTracingWrapper::Append(const Slice
& data
,
387 const IOOptions
& options
,
388 IODebugContext
* dbg
) {
389 StopWatchNano
timer(clock_
);
391 IOStatus s
= target()->Append(data
, options
, dbg
);
392 uint64_t elapsed
= timer
.ElapsedNanos();
393 uint64_t io_op_data
= 0;
394 io_op_data
|= (1 << IOTraceOp::kIOLen
);
395 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
396 __func__
, elapsed
, s
.ToString(), file_name_
,
397 data
.size(), 0 /*Offset*/);
398 io_tracer_
->WriteIOOp(io_record
, dbg
);
402 IOStatus
FSWritableFileTracingWrapper::PositionedAppend(
403 const Slice
& data
, uint64_t offset
, const IOOptions
& options
,
404 IODebugContext
* dbg
) {
405 StopWatchNano
timer(clock_
);
407 IOStatus s
= target()->PositionedAppend(data
, offset
, options
, dbg
);
408 uint64_t elapsed
= timer
.ElapsedNanos();
409 uint64_t io_op_data
= 0;
410 io_op_data
|= (1 << IOTraceOp::kIOLen
);
411 io_op_data
|= (1 << IOTraceOp::kIOOffset
);
412 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
413 __func__
, elapsed
, s
.ToString(), file_name_
,
414 data
.size(), offset
);
415 io_tracer_
->WriteIOOp(io_record
, dbg
);
419 IOStatus
FSWritableFileTracingWrapper::Truncate(uint64_t size
,
420 const IOOptions
& options
,
421 IODebugContext
* dbg
) {
422 StopWatchNano
timer(clock_
);
424 IOStatus s
= target()->Truncate(size
, options
, dbg
);
425 uint64_t elapsed
= timer
.ElapsedNanos();
426 uint64_t io_op_data
= 0;
427 io_op_data
|= (1 << IOTraceOp::kIOLen
);
428 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
429 __func__
, elapsed
, s
.ToString(), file_name_
, size
,
431 io_tracer_
->WriteIOOp(io_record
, dbg
);
435 IOStatus
FSWritableFileTracingWrapper::Close(const IOOptions
& options
,
436 IODebugContext
* dbg
) {
437 StopWatchNano
timer(clock_
);
439 IOStatus s
= target()->Close(options
, dbg
);
440 uint64_t elapsed
= timer
.ElapsedNanos();
441 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
442 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
444 io_tracer_
->WriteIOOp(io_record
, dbg
);
448 uint64_t FSWritableFileTracingWrapper::GetFileSize(const IOOptions
& options
,
449 IODebugContext
* dbg
) {
450 StopWatchNano
timer(clock_
);
452 uint64_t file_size
= target()->GetFileSize(options
, dbg
);
453 uint64_t elapsed
= timer
.ElapsedNanos();
454 uint64_t io_op_data
= 0;
455 io_op_data
|= (1 << IOTraceOp::kIOFileSize
);
456 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
457 __func__
, elapsed
, "OK", file_name_
, file_size
);
458 io_tracer_
->WriteIOOp(io_record
, dbg
);
462 IOStatus
FSWritableFileTracingWrapper::InvalidateCache(size_t offset
,
464 StopWatchNano
timer(clock_
);
466 IOStatus s
= target()->InvalidateCache(offset
, length
);
467 uint64_t elapsed
= timer
.ElapsedNanos();
468 uint64_t io_op_data
= 0;
469 io_op_data
|= (1 << IOTraceOp::kIOLen
);
470 io_op_data
|= (1 << IOTraceOp::kIOOffset
);
471 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
472 __func__
, elapsed
, s
.ToString(), file_name_
, length
,
473 static_cast<uint64_t>(offset
));
474 io_tracer_
->WriteIOOp(io_record
, nullptr /*dbg*/);
478 IOStatus
FSRandomRWFileTracingWrapper::Write(uint64_t offset
, const Slice
& data
,
479 const IOOptions
& options
,
480 IODebugContext
* dbg
) {
481 StopWatchNano
timer(clock_
);
483 IOStatus s
= target()->Write(offset
, data
, options
, dbg
);
484 uint64_t elapsed
= timer
.ElapsedNanos();
485 uint64_t io_op_data
= 0;
486 io_op_data
|= (1 << IOTraceOp::kIOLen
);
487 io_op_data
|= (1 << IOTraceOp::kIOOffset
);
488 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
489 __func__
, elapsed
, s
.ToString(), file_name_
,
490 data
.size(), offset
);
491 io_tracer_
->WriteIOOp(io_record
, dbg
);
495 IOStatus
FSRandomRWFileTracingWrapper::Read(uint64_t offset
, size_t n
,
496 const IOOptions
& options
,
497 Slice
* result
, char* scratch
,
498 IODebugContext
* dbg
) const {
499 StopWatchNano
timer(clock_
);
501 IOStatus s
= target()->Read(offset
, n
, options
, result
, scratch
, dbg
);
502 uint64_t elapsed
= timer
.ElapsedNanos();
503 uint64_t io_op_data
= 0;
504 io_op_data
|= (1 << IOTraceOp::kIOLen
);
505 io_op_data
|= (1 << IOTraceOp::kIOOffset
);
506 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
, io_op_data
,
507 __func__
, elapsed
, s
.ToString(), file_name_
, n
,
509 io_tracer_
->WriteIOOp(io_record
, dbg
);
513 IOStatus
FSRandomRWFileTracingWrapper::Flush(const IOOptions
& options
,
514 IODebugContext
* dbg
) {
515 StopWatchNano
timer(clock_
);
517 IOStatus s
= target()->Flush(options
, dbg
);
518 uint64_t elapsed
= timer
.ElapsedNanos();
519 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
520 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
522 io_tracer_
->WriteIOOp(io_record
, dbg
);
526 IOStatus
FSRandomRWFileTracingWrapper::Close(const IOOptions
& options
,
527 IODebugContext
* dbg
) {
528 StopWatchNano
timer(clock_
);
530 IOStatus s
= target()->Close(options
, dbg
);
531 uint64_t elapsed
= timer
.ElapsedNanos();
532 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
533 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
535 io_tracer_
->WriteIOOp(io_record
, dbg
);
539 IOStatus
FSRandomRWFileTracingWrapper::Sync(const IOOptions
& options
,
540 IODebugContext
* dbg
) {
541 StopWatchNano
timer(clock_
);
543 IOStatus s
= target()->Sync(options
, dbg
);
544 uint64_t elapsed
= timer
.ElapsedNanos();
545 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
546 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
548 io_tracer_
->WriteIOOp(io_record
, dbg
);
552 IOStatus
FSRandomRWFileTracingWrapper::Fsync(const IOOptions
& options
,
553 IODebugContext
* dbg
) {
554 StopWatchNano
timer(clock_
);
556 IOStatus s
= target()->Fsync(options
, dbg
);
557 uint64_t elapsed
= timer
.ElapsedNanos();
558 IOTraceRecord
io_record(clock_
->NowNanos(), TraceType::kIOTracer
,
559 0 /*io_op_data*/, __func__
, elapsed
, s
.ToString(),
561 io_tracer_
->WriteIOOp(io_record
, dbg
);
564 } // namespace ROCKSDB_NAMESPACE