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 // Copyright (c) 2011 The LevelDB Authors. All rights reserved. 6 // Use of this source code is governed by a BSD-style license that can be 7 // found in the LICENSE file. See the AUTHORS file for names of contributors. 8 // 9 10 // Compression context cache allows to cache compression/uncompression contexts 11 // This helps with Random Read latencies and reduces CPU utilization 12 // Caching is implemented using CoreLocal facility. Compression/Uncompression 13 // instances are cached on a per core basis using CoreLocalArray. A borrowed 14 // instance is atomically replaced with a sentinel value for the time of being 15 // used. If it turns out that another thread is already makes use of the 16 // instance we still create one on the heap which is later is destroyed. 17 18 #pragma once 19 20 #include <stdint.h> 21 22 #include "rocksdb/rocksdb_namespace.h" 23 24 namespace ROCKSDB_NAMESPACE { 25 class ZSTDUncompressCachedData; 26 27 class CompressionContextCache { 28 public: 29 // Singleton 30 static CompressionContextCache* Instance(); 31 static void InitSingleton(); 32 CompressionContextCache(const CompressionContextCache&) = delete; 33 CompressionContextCache& operator=(const CompressionContextCache&) = delete; 34 35 ZSTDUncompressCachedData GetCachedZSTDUncompressData(); 36 void ReturnCachedZSTDUncompressData(int64_t idx); 37 38 private: 39 // Singleton 40 CompressionContextCache(); 41 ~CompressionContextCache(); 42 43 class Rep; 44 Rep* rep_; 45 }; 46 47 } // namespace ROCKSDB_NAMESPACE 48