]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/rocksdb/table/block_fetcher.h
import 14.2.4 nautilus point release
[ceph.git] / ceph / src / rocksdb / table / block_fetcher.h
index 9e0d2448dd57973f199c197024e4aca8b8ed7ef4..b5fee941597c42a530d189fa5a537dee9c1d33c6 100644 (file)
@@ -10,6 +10,7 @@
 #pragma once
 #include "table/block.h"
 #include "table/format.h"
+#include "util/memory_allocator.h"
 
 namespace rocksdb {
 class BlockFetcher {
@@ -18,15 +19,17 @@ class BlockFetcher {
   // The only relevant option is options.verify_checksums for now.
   // On failure return non-OK.
   // On success fill *result and return OK - caller owns *result
-  // @param compression_dict Data for presetting the compression library's
+  // @param uncompression_dict Data for presetting the compression library's
   //    dictionary.
   BlockFetcher(RandomAccessFileReader* file,
                FilePrefetchBuffer* prefetch_buffer, const Footer& footer,
                const ReadOptions& read_options, const BlockHandle& handle,
                BlockContents* contents, const ImmutableCFOptions& ioptions,
-               bool do_uncompress, const Slice& compression_dict,
+               bool do_uncompress, bool maybe_compressed,
+               const UncompressionDict& uncompression_dict,
                const PersistentCacheOptions& cache_options,
-               const bool immortal_source = false)
+               MemoryAllocator* memory_allocator = nullptr,
+               MemoryAllocator* memory_allocator_compressed = nullptr)
       : file_(file),
         prefetch_buffer_(prefetch_buffer),
         footer_(footer),
@@ -35,10 +38,13 @@ class BlockFetcher {
         contents_(contents),
         ioptions_(ioptions),
         do_uncompress_(do_uncompress),
-        immortal_source_(immortal_source),
-        compression_dict_(compression_dict),
-        cache_options_(cache_options) {}
+        maybe_compressed_(maybe_compressed),
+        uncompression_dict_(uncompression_dict),
+        cache_options_(cache_options),
+        memory_allocator_(memory_allocator),
+        memory_allocator_compressed_(memory_allocator_compressed) {}
   Status ReadBlockContents();
+  CompressionType get_compression_type() const { return compression_type_; }
 
  private:
   static const uint32_t kDefaultStackBufferSize = 5000;
@@ -51,17 +57,20 @@ class BlockFetcher {
   BlockContents* contents_;
   const ImmutableCFOptions& ioptions_;
   bool do_uncompress_;
-  const bool immortal_source_;
-  const Slice& compression_dict_;
+  bool maybe_compressed_;
+  const UncompressionDict& uncompression_dict_;
   const PersistentCacheOptions& cache_options_;
+  MemoryAllocator* memory_allocator_;
+  MemoryAllocator* memory_allocator_compressed_;
   Status status_;
   Slice slice_;
   char* used_buf_ = nullptr;
   size_t block_size_;
-  std::unique_ptr<char[]> heap_buf_;
+  CacheAllocationPtr heap_buf_;
+  CacheAllocationPtr compressed_buf_;
   char stack_buf_[kDefaultStackBufferSize];
   bool got_from_prefetch_buffer_ = false;
-  rocksdb::CompressionType compression_type;
+  rocksdb::CompressionType compression_type_;
 
   // return true if found
   bool TryGetUncompressBlockFromPersistentCache();
@@ -69,6 +78,8 @@ class BlockFetcher {
   bool TryGetFromPrefetchBuffer();
   bool TryGetCompressedBlockFromPersistentCache();
   void PrepareBufferForBlockFromFile();
+  // Copy content from used_buf_ to new heap buffer.
+  void CopyBufferToHeap();
   void GetBlockContents();
   void InsertCompressedBlockToPersistentCacheIfNeeded();
   void InsertUncompressedBlockToPersistentCacheIfNeeded();