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).
11 #include "file/random_access_file_reader.h"
12 #include "rocksdb/compression_type.h"
13 #include "rocksdb/rocksdb_namespace.h"
15 namespace ROCKSDB_NAMESPACE
{
18 struct ImmutableCFOptions
;
25 class BlobFileReader
{
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
);
34 BlobFileReader(const BlobFileReader
&) = delete;
35 BlobFileReader
& operator=(const BlobFileReader
&) = delete;
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;
44 BlobFileReader(std::unique_ptr
<RandomAccessFileReader
>&& file_reader
,
45 uint64_t file_size
, CompressionType compression_type
);
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
);
53 static Status
ReadHeader(const RandomAccessFileReader
* file_reader
,
54 uint32_t column_family_id
,
55 CompressionType
* compression_type
);
57 static Status
ReadFooter(uint64_t file_size
,
58 const RandomAccessFileReader
* file_reader
);
60 using Buffer
= std::unique_ptr
<char[]>;
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
);
67 static Status
VerifyBlob(const Slice
& record_slice
, const Slice
& user_key
,
70 static Status
UncompressBlobIfNeeded(const Slice
& value_slice
,
71 CompressionType compression_type
,
72 PinnableSlice
* value
);
74 static void SaveValue(const Slice
& src
, PinnableSlice
* dst
);
76 std::unique_ptr
<RandomAccessFileReader
> file_reader_
;
78 CompressionType compression_type_
;
81 } // namespace ROCKSDB_NAMESPACE