]>
git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/utilities/trace/file_trace_reader_writer.cc
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 "util/coding.h"
9 #include "util/file_reader_writer.h"
10 #include "util/trace_replay.h"
14 const unsigned int FileTraceReader::kBufferSize
= 1024; // 1KB
16 FileTraceReader::FileTraceReader(
17 std::unique_ptr
<RandomAccessFileReader
>&& reader
)
18 : file_reader_(std::move(reader
)),
20 buffer_(new char[kBufferSize
]) {}
22 FileTraceReader::~FileTraceReader() {
27 Status
FileTraceReader::Close() {
32 Status
FileTraceReader::Read(std::string
* data
) {
33 assert(file_reader_
!= nullptr);
34 Status s
= file_reader_
->Read(offset_
, kTraceMetadataSize
, &result_
, buffer_
);
38 if (result_
.size() == 0) {
39 // No more data to read
40 // Todo: Come up with a better way to indicate end of data. May be this
41 // could be avoided once footer is introduced.
42 return Status::Incomplete();
44 if (result_
.size() < kTraceMetadataSize
) {
45 return Status::Corruption("Corrupted trace file.");
47 *data
= result_
.ToString();
48 offset_
+= kTraceMetadataSize
;
50 uint32_t payload_len
=
51 DecodeFixed32(&buffer_
[kTraceTimestampSize
+ kTraceTypeSize
]);
54 unsigned int bytes_to_read
= payload_len
;
55 unsigned int to_read
=
56 bytes_to_read
> kBufferSize
? kBufferSize
: bytes_to_read
;
58 s
= file_reader_
->Read(offset_
, to_read
, &result_
, buffer_
);
62 if (result_
.size() < to_read
) {
63 return Status::Corruption("Corrupted trace file.");
65 data
->append(result_
.data(), result_
.size());
68 bytes_to_read
-= to_read
;
69 to_read
= bytes_to_read
> kBufferSize
? kBufferSize
: bytes_to_read
;
75 FileTraceWriter::~FileTraceWriter() { Close(); }
77 Status
FileTraceWriter::Close() {
82 Status
FileTraceWriter::Write(const Slice
& data
) {
83 return file_writer_
->Append(data
);
86 Status
NewFileTraceReader(Env
* env
, const EnvOptions
& env_options
,
87 const std::string
& trace_filename
,
88 std::unique_ptr
<TraceReader
>* trace_reader
) {
89 unique_ptr
<RandomAccessFile
> trace_file
;
90 Status s
= env
->NewRandomAccessFile(trace_filename
, &trace_file
, env_options
);
95 unique_ptr
<RandomAccessFileReader
> file_reader
;
97 new RandomAccessFileReader(std::move(trace_file
), trace_filename
));
98 trace_reader
->reset(new FileTraceReader(std::move(file_reader
)));
102 Status
NewFileTraceWriter(Env
* env
, const EnvOptions
& env_options
,
103 const std::string
& trace_filename
,
104 std::unique_ptr
<TraceWriter
>* trace_writer
) {
105 unique_ptr
<WritableFile
> trace_file
;
106 Status s
= env
->NewWritableFile(trace_filename
, &trace_file
, env_options
);
111 unique_ptr
<WritableFileWriter
> file_writer
;
112 file_writer
.reset(new WritableFileWriter(std::move(trace_file
),
113 trace_filename
, env_options
));
114 trace_writer
->reset(new FileTraceWriter(std::move(file_writer
)));
118 } // namespace rocksdb