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 "db/blob/blob_read_request.h"
12 #include "file/random_access_file_reader.h"
13 #include "rocksdb/compression_type.h"
14 #include "rocksdb/rocksdb_namespace.h"
15 #include "util/autovector.h"
17 namespace ROCKSDB_NAMESPACE
{
20 struct ImmutableOptions
;
25 class FilePrefetchBuffer
;
29 class BlobFileReader
{
31 static Status
Create(const ImmutableOptions
& immutable_options
,
32 const FileOptions
& file_options
,
33 uint32_t column_family_id
,
34 HistogramImpl
* blob_file_read_hist
,
35 uint64_t blob_file_number
,
36 const std::shared_ptr
<IOTracer
>& io_tracer
,
37 std::unique_ptr
<BlobFileReader
>* reader
);
39 BlobFileReader(const BlobFileReader
&) = delete;
40 BlobFileReader
& operator=(const BlobFileReader
&) = delete;
44 Status
GetBlob(const ReadOptions
& read_options
, const Slice
& user_key
,
45 uint64_t offset
, uint64_t value_size
,
46 CompressionType compression_type
,
47 FilePrefetchBuffer
* prefetch_buffer
,
48 MemoryAllocator
* allocator
,
49 std::unique_ptr
<BlobContents
>* result
,
50 uint64_t* bytes_read
) const;
52 // offsets must be sorted in ascending order by caller.
54 const ReadOptions
& read_options
, MemoryAllocator
* allocator
,
55 autovector
<std::pair
<BlobReadRequest
*, std::unique_ptr
<BlobContents
>>>&
57 uint64_t* bytes_read
) const;
59 CompressionType
GetCompressionType() const { return compression_type_
; }
61 uint64_t GetFileSize() const { return file_size_
; }
64 BlobFileReader(std::unique_ptr
<RandomAccessFileReader
>&& file_reader
,
65 uint64_t file_size
, CompressionType compression_type
,
66 SystemClock
* clock
, Statistics
* statistics
);
68 static Status
OpenFile(const ImmutableOptions
& immutable_options
,
69 const FileOptions
& file_opts
,
70 HistogramImpl
* blob_file_read_hist
,
71 uint64_t blob_file_number
,
72 const std::shared_ptr
<IOTracer
>& io_tracer
,
74 std::unique_ptr
<RandomAccessFileReader
>* file_reader
);
76 static Status
ReadHeader(const RandomAccessFileReader
* file_reader
,
77 uint32_t column_family_id
, Statistics
* statistics
,
78 CompressionType
* compression_type
);
80 static Status
ReadFooter(const RandomAccessFileReader
* file_reader
,
81 uint64_t file_size
, Statistics
* statistics
);
83 using Buffer
= std::unique_ptr
<char[]>;
85 static Status
ReadFromFile(const RandomAccessFileReader
* file_reader
,
86 uint64_t read_offset
, size_t read_size
,
87 Statistics
* statistics
, Slice
* slice
, Buffer
* buf
,
88 AlignedBuf
* aligned_buf
,
89 Env::IOPriority rate_limiter_priority
);
91 static Status
VerifyBlob(const Slice
& record_slice
, const Slice
& user_key
,
94 static Status
UncompressBlobIfNeeded(const Slice
& value_slice
,
95 CompressionType compression_type
,
96 MemoryAllocator
* allocator
,
98 Statistics
* statistics
,
99 std::unique_ptr
<BlobContents
>* result
);
101 std::unique_ptr
<RandomAccessFileReader
> file_reader_
;
103 CompressionType compression_type_
;
105 Statistics
* statistics_
;
108 } // namespace ROCKSDB_NAMESPACE