blob_file_reader.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. #pragma once
  6. #include <cinttypes>
  7. #include <memory>
  8. #include "db/blob/blob_read_request.h"
  9. #include "file/random_access_file_reader.h"
  10. #include "rocksdb/compression_type.h"
  11. #include "rocksdb/rocksdb_namespace.h"
  12. #include "util/autovector.h"
  13. namespace ROCKSDB_NAMESPACE {
  14. class Status;
  15. struct ImmutableOptions;
  16. struct FileOptions;
  17. class HistogramImpl;
  18. struct ReadOptions;
  19. class Slice;
  20. class FilePrefetchBuffer;
  21. class BlobContents;
  22. class Statistics;
  23. class BlobFileReader {
  24. public:
  25. static Status Create(const ImmutableOptions& immutable_options,
  26. const ReadOptions& read_options,
  27. const FileOptions& file_options,
  28. uint32_t column_family_id,
  29. HistogramImpl* blob_file_read_hist,
  30. uint64_t blob_file_number,
  31. const std::shared_ptr<IOTracer>& io_tracer,
  32. std::unique_ptr<BlobFileReader>* reader);
  33. BlobFileReader(const BlobFileReader&) = delete;
  34. BlobFileReader& operator=(const BlobFileReader&) = delete;
  35. ~BlobFileReader();
  36. Status GetBlob(const ReadOptions& read_options, const Slice& user_key,
  37. uint64_t offset, uint64_t value_size,
  38. CompressionType compression_type,
  39. FilePrefetchBuffer* prefetch_buffer,
  40. MemoryAllocator* allocator,
  41. std::unique_ptr<BlobContents>* result,
  42. uint64_t* bytes_read) const;
  43. // offsets must be sorted in ascending order by caller.
  44. void MultiGetBlob(
  45. const ReadOptions& read_options, MemoryAllocator* allocator,
  46. autovector<std::pair<BlobReadRequest*, std::unique_ptr<BlobContents>>>&
  47. blob_reqs,
  48. uint64_t* bytes_read) const;
  49. CompressionType GetCompressionType() const { return compression_type_; }
  50. uint64_t GetFileSize() const { return file_size_; }
  51. private:
  52. BlobFileReader(std::unique_ptr<RandomAccessFileReader>&& file_reader,
  53. uint64_t file_size, CompressionType compression_type,
  54. SystemClock* clock, Statistics* statistics);
  55. static Status OpenFile(const ImmutableOptions& immutable_options,
  56. const FileOptions& file_opts,
  57. HistogramImpl* blob_file_read_hist,
  58. uint64_t blob_file_number,
  59. const std::shared_ptr<IOTracer>& io_tracer,
  60. uint64_t* file_size,
  61. std::unique_ptr<RandomAccessFileReader>* file_reader);
  62. static Status ReadHeader(const RandomAccessFileReader* file_reader,
  63. const ReadOptions& read_options,
  64. uint32_t column_family_id, Statistics* statistics,
  65. CompressionType* compression_type);
  66. static Status ReadFooter(const RandomAccessFileReader* file_reader,
  67. const ReadOptions& read_options, uint64_t file_size,
  68. Statistics* statistics);
  69. using Buffer = std::unique_ptr<char[]>;
  70. static Status ReadFromFile(const RandomAccessFileReader* file_reader,
  71. const ReadOptions& read_options,
  72. uint64_t read_offset, size_t read_size,
  73. Statistics* statistics, Slice* slice, Buffer* buf,
  74. AlignedBuf* aligned_buf);
  75. static Status VerifyBlob(const Slice& record_slice, const Slice& user_key,
  76. uint64_t value_size);
  77. static Status UncompressBlobIfNeeded(const Slice& value_slice,
  78. CompressionType compression_type,
  79. MemoryAllocator* allocator,
  80. SystemClock* clock,
  81. Statistics* statistics,
  82. std::unique_ptr<BlobContents>* result);
  83. std::unique_ptr<RandomAccessFileReader> file_reader_;
  84. uint64_t file_size_;
  85. CompressionType compression_type_;
  86. SystemClock* clock_;
  87. Statistics* statistics_;
  88. };
  89. } // namespace ROCKSDB_NAMESPACE