]>
git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/utilities/trace/file_trace_reader_writer.cc
7160f7a4c9ad9500167a58b93ce837f6702a0a08
1 // Copyright (c) 2011-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 "utilities/trace/file_trace_reader_writer.h"
8 #include "env/composite_env_wrapper.h"
9 #include "file/random_access_file_reader.h"
10 #include "file/writable_file_writer.h"
11 #include "trace_replay/trace_replay.h"
12 #include "util/coding.h"
14 namespace ROCKSDB_NAMESPACE
{
16 const unsigned int FileTraceReader::kBufferSize
= 1024; // 1KB
18 FileTraceReader::FileTraceReader(
19 std::unique_ptr
<RandomAccessFileReader
>&& reader
)
20 : file_reader_(std::move(reader
)),
22 buffer_(new char[kBufferSize
]) {}
24 FileTraceReader::~FileTraceReader() {
29 Status
FileTraceReader::Close() {
34 Status
FileTraceReader::Read(std::string
* data
) {
35 assert(file_reader_
!= nullptr);
36 Status s
= file_reader_
->Read(offset_
, kTraceMetadataSize
, &result_
, buffer_
);
40 if (result_
.size() == 0) {
41 // No more data to read
42 // Todo: Come up with a better way to indicate end of data. May be this
43 // could be avoided once footer is introduced.
44 return Status::Incomplete();
46 if (result_
.size() < kTraceMetadataSize
) {
47 return Status::Corruption("Corrupted trace file.");
49 *data
= result_
.ToString();
50 offset_
+= kTraceMetadataSize
;
52 uint32_t payload_len
=
53 DecodeFixed32(&buffer_
[kTraceTimestampSize
+ kTraceTypeSize
]);
56 unsigned int bytes_to_read
= payload_len
;
57 unsigned int to_read
=
58 bytes_to_read
> kBufferSize
? kBufferSize
: bytes_to_read
;
60 s
= file_reader_
->Read(offset_
, to_read
, &result_
, buffer_
);
64 if (result_
.size() < to_read
) {
65 return Status::Corruption("Corrupted trace file.");
67 data
->append(result_
.data(), result_
.size());
70 bytes_to_read
-= to_read
;
71 to_read
= bytes_to_read
> kBufferSize
? kBufferSize
: bytes_to_read
;
77 FileTraceWriter::~FileTraceWriter() { Close(); }
79 Status
FileTraceWriter::Close() {
84 Status
FileTraceWriter::Write(const Slice
& data
) {
85 return file_writer_
->Append(data
);
88 uint64_t FileTraceWriter::GetFileSize() { return file_writer_
->GetFileSize(); }
90 Status
NewFileTraceReader(Env
* env
, const EnvOptions
& env_options
,
91 const std::string
& trace_filename
,
92 std::unique_ptr
<TraceReader
>* trace_reader
) {
93 std::unique_ptr
<RandomAccessFile
> trace_file
;
94 Status s
= env
->NewRandomAccessFile(trace_filename
, &trace_file
, env_options
);
99 std::unique_ptr
<RandomAccessFileReader
> file_reader
;
100 file_reader
.reset(new RandomAccessFileReader(
101 NewLegacyRandomAccessFileWrapper(trace_file
), trace_filename
));
102 trace_reader
->reset(new FileTraceReader(std::move(file_reader
)));
106 Status
NewFileTraceWriter(Env
* env
, const EnvOptions
& env_options
,
107 const std::string
& trace_filename
,
108 std::unique_ptr
<TraceWriter
>* trace_writer
) {
109 std::unique_ptr
<WritableFile
> trace_file
;
110 Status s
= env
->NewWritableFile(trace_filename
, &trace_file
, env_options
);
115 std::unique_ptr
<WritableFileWriter
> file_writer
;
116 file_writer
.reset(new WritableFileWriter(
117 NewLegacyWritableFileWrapper(std::move(trace_file
)), trace_filename
,
119 trace_writer
->reset(new FileTraceWriter(std::move(file_writer
)));
123 } // namespace ROCKSDB_NAMESPACE