]> git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/db/blob/blob_file_reader.h
import quincy beta 17.1.0
[ceph.git] / ceph / src / rocksdb / db / blob / blob_file_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 #include <cinttypes>
9 #include <memory>
10
11 #include "file/random_access_file_reader.h"
12 #include "rocksdb/compression_type.h"
13 #include "rocksdb/rocksdb_namespace.h"
14
15 namespace ROCKSDB_NAMESPACE {
16
17 class Status;
18 struct ImmutableCFOptions;
19 struct FileOptions;
20 class HistogramImpl;
21 struct ReadOptions;
22 class Slice;
23 class PinnableSlice;
24
25 class BlobFileReader {
26 public:
27 static Status Create(const ImmutableCFOptions& immutable_cf_options,
28 const FileOptions& file_options,
29 uint32_t column_family_id,
30 HistogramImpl* blob_file_read_hist,
31 uint64_t blob_file_number,
32 std::unique_ptr<BlobFileReader>* reader);
33
34 BlobFileReader(const BlobFileReader&) = delete;
35 BlobFileReader& operator=(const BlobFileReader&) = delete;
36
37 ~BlobFileReader();
38
39 Status GetBlob(const ReadOptions& read_options, const Slice& user_key,
40 uint64_t offset, uint64_t value_size,
41 CompressionType compression_type, PinnableSlice* value) const;
42
43 private:
44 BlobFileReader(std::unique_ptr<RandomAccessFileReader>&& file_reader,
45 uint64_t file_size, CompressionType compression_type);
46
47 static Status OpenFile(const ImmutableCFOptions& immutable_cf_options,
48 const FileOptions& file_opts,
49 HistogramImpl* blob_file_read_hist,
50 uint64_t blob_file_number, uint64_t* file_size,
51 std::unique_ptr<RandomAccessFileReader>* file_reader);
52
53 static Status ReadHeader(const RandomAccessFileReader* file_reader,
54 uint32_t column_family_id,
55 CompressionType* compression_type);
56
57 static Status ReadFooter(uint64_t file_size,
58 const RandomAccessFileReader* file_reader);
59
60 using Buffer = std::unique_ptr<char[]>;
61
62 static Status ReadFromFile(const RandomAccessFileReader* file_reader,
63 uint64_t read_offset, size_t read_size,
64 Slice* slice, Buffer* buf,
65 AlignedBuf* aligned_buf);
66
67 static Status VerifyBlob(const Slice& record_slice, const Slice& user_key,
68 uint64_t value_size);
69
70 static Status UncompressBlobIfNeeded(const Slice& value_slice,
71 CompressionType compression_type,
72 PinnableSlice* value);
73
74 static void SaveValue(const Slice& src, PinnableSlice* dst);
75
76 std::unique_ptr<RandomAccessFileReader> file_reader_;
77 uint64_t file_size_;
78 CompressionType compression_type_;
79 };
80
81 } // namespace ROCKSDB_NAMESPACE