]> git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/utilities/blob_db/blob_log_reader.h
buildsys: switch source download to quincy
[ceph.git] / ceph / src / rocksdb / utilities / blob_db / blob_log_reader.h
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).
5 //
6 #pragma once
7
8 #ifndef ROCKSDB_LITE
9
10 #include <memory>
11 #include <string>
12
13 #include "file/random_access_file_reader.h"
14 #include "rocksdb/env.h"
15 #include "rocksdb/slice.h"
16 #include "rocksdb/statistics.h"
17 #include "rocksdb/status.h"
18 #include "utilities/blob_db/blob_log_format.h"
19
20 namespace ROCKSDB_NAMESPACE {
21
22 class SequentialFileReader;
23 class Logger;
24
25 namespace blob_db {
26
27 /**
28 * Reader is a general purpose log stream reader implementation. The actual job
29 * of reading from the device is implemented by the SequentialFile interface.
30 *
31 * Please see Writer for details on the file and record layout.
32 */
33 class Reader {
34 public:
35 enum ReadLevel {
36 kReadHeader,
37 kReadHeaderKey,
38 kReadHeaderKeyBlob,
39 };
40
41 // Create a reader that will return log records from "*file".
42 // "*file" must remain live while this Reader is in use.
43 Reader(std::unique_ptr<RandomAccessFileReader>&& file_reader, Env* env,
44 Statistics* statistics);
45 // No copying allowed
46 Reader(const Reader&) = delete;
47 Reader& operator=(const Reader&) = delete;
48
49 ~Reader() = default;
50
51 Status ReadHeader(BlobLogHeader* header);
52
53 // Read the next record into *record. Returns true if read
54 // successfully, false if we hit end of the input. May use
55 // "*scratch" as temporary storage. The contents filled in *record
56 // will only be valid until the next mutating operation on this
57 // reader or the next mutation to *scratch.
58 // If blob_offset is non-null, return offset of the blob through it.
59 Status ReadRecord(BlobLogRecord* record, ReadLevel level = kReadHeader,
60 uint64_t* blob_offset = nullptr);
61
62 void ResetNextByte() { next_byte_ = 0; }
63
64 uint64_t GetNextByte() const { return next_byte_; }
65
66 private:
67 Status ReadSlice(uint64_t size, Slice* slice, char* buf);
68
69 const std::unique_ptr<RandomAccessFileReader> file_;
70 Env* env_;
71 Statistics* statistics_;
72
73 Slice buffer_;
74 char header_buf_[BlobLogRecord::kHeaderSize];
75
76 // which byte to read next. For asserting proper usage
77 uint64_t next_byte_;
78 };
79
80 } // namespace blob_db
81 } // namespace ROCKSDB_NAMESPACE
82 #endif // ROCKSDB_LITE