1 // Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. 2 // Copyright (c) 2011 The LevelDB Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. See the AUTHORS file for names of contributors. 5 6 #pragma once 7 #include <map> 8 #include <memory> 9 #include <string> 10 #include "rocksdb/db.h" 11 12 #ifdef _WIN32 13 // Windows API macro interference 14 #undef DeleteFile 15 #endif 16 17 namespace ROCKSDB_NAMESPACE { 18 19 // This class contains APIs to stack rocksdb wrappers.Eg. Stack TTL over base d 20 class StackableDB : public DB { 21 public: 22 // StackableDB take sole ownership of the underlying db. StackableDB(DB * db)23 explicit StackableDB(DB* db) : db_(db) {} 24 25 // StackableDB take shared ownership of the underlying db. StackableDB(std::shared_ptr<DB> db)26 explicit StackableDB(std::shared_ptr<DB> db) 27 : db_(db.get()), shared_db_ptr_(db) {} 28 ~StackableDB()29 ~StackableDB() { 30 if (shared_db_ptr_ == nullptr) { 31 delete db_; 32 } else { 33 assert(shared_db_ptr_.get() == db_); 34 } 35 db_ = nullptr; 36 } 37 Close()38 virtual Status Close() override { return db_->Close(); } 39 GetBaseDB()40 virtual DB* GetBaseDB() { return db_; } 41 GetRootDB()42 virtual DB* GetRootDB() override { return db_->GetRootDB(); } 43 CreateColumnFamily(const ColumnFamilyOptions & options,const std::string & column_family_name,ColumnFamilyHandle ** handle)44 virtual Status CreateColumnFamily(const ColumnFamilyOptions& options, 45 const std::string& column_family_name, 46 ColumnFamilyHandle** handle) override { 47 return db_->CreateColumnFamily(options, column_family_name, handle); 48 } 49 CreateColumnFamilies(const ColumnFamilyOptions & options,const std::vector<std::string> & column_family_names,std::vector<ColumnFamilyHandle * > * handles)50 virtual Status CreateColumnFamilies( 51 const ColumnFamilyOptions& options, 52 const std::vector<std::string>& column_family_names, 53 std::vector<ColumnFamilyHandle*>* handles) override { 54 return db_->CreateColumnFamilies(options, column_family_names, handles); 55 } 56 CreateColumnFamilies(const std::vector<ColumnFamilyDescriptor> & column_families,std::vector<ColumnFamilyHandle * > * handles)57 virtual Status CreateColumnFamilies( 58 const std::vector<ColumnFamilyDescriptor>& column_families, 59 std::vector<ColumnFamilyHandle*>* handles) override { 60 return db_->CreateColumnFamilies(column_families, handles); 61 } 62 DropColumnFamily(ColumnFamilyHandle * column_family)63 virtual Status DropColumnFamily(ColumnFamilyHandle* column_family) override { 64 return db_->DropColumnFamily(column_family); 65 } 66 DropColumnFamilies(const std::vector<ColumnFamilyHandle * > & column_families)67 virtual Status DropColumnFamilies( 68 const std::vector<ColumnFamilyHandle*>& column_families) override { 69 return db_->DropColumnFamilies(column_families); 70 } 71 DestroyColumnFamilyHandle(ColumnFamilyHandle * column_family)72 virtual Status DestroyColumnFamilyHandle( 73 ColumnFamilyHandle* column_family) override { 74 return db_->DestroyColumnFamilyHandle(column_family); 75 } 76 77 using DB::Put; Put(const WriteOptions & options,ColumnFamilyHandle * column_family,const Slice & key,const Slice & val)78 virtual Status Put(const WriteOptions& options, 79 ColumnFamilyHandle* column_family, const Slice& key, 80 const Slice& val) override { 81 return db_->Put(options, column_family, key, val); 82 } 83 84 using DB::Get; Get(const ReadOptions & options,ColumnFamilyHandle * column_family,const Slice & key,PinnableSlice * value)85 virtual Status Get(const ReadOptions& options, 86 ColumnFamilyHandle* column_family, const Slice& key, 87 PinnableSlice* value) override { 88 return db_->Get(options, column_family, key, value); 89 } 90 91 using DB::GetMergeOperands; GetMergeOperands(const ReadOptions & options,ColumnFamilyHandle * column_family,const Slice & key,PinnableSlice * slice,GetMergeOperandsOptions * get_merge_operands_options,int * number_of_operands)92 virtual Status GetMergeOperands( 93 const ReadOptions& options, ColumnFamilyHandle* column_family, 94 const Slice& key, PinnableSlice* slice, 95 GetMergeOperandsOptions* get_merge_operands_options, 96 int* number_of_operands) override { 97 return db_->GetMergeOperands(options, column_family, key, slice, 98 get_merge_operands_options, 99 number_of_operands); 100 } 101 102 using DB::MultiGet; MultiGet(const ReadOptions & options,const std::vector<ColumnFamilyHandle * > & column_family,const std::vector<Slice> & keys,std::vector<std::string> * values)103 virtual std::vector<Status> MultiGet( 104 const ReadOptions& options, 105 const std::vector<ColumnFamilyHandle*>& column_family, 106 const std::vector<Slice>& keys, 107 std::vector<std::string>* values) override { 108 return db_->MultiGet(options, column_family, keys, values); 109 } 110 111 virtual void MultiGet(const ReadOptions& options, 112 ColumnFamilyHandle* column_family, 113 const size_t num_keys, const Slice* keys, 114 PinnableSlice* values, Status* statuses, 115 const bool sorted_input = false) override { 116 return db_->MultiGet(options, column_family, num_keys, keys, 117 values, statuses, sorted_input); 118 } 119 120 using DB::IngestExternalFile; IngestExternalFile(ColumnFamilyHandle * column_family,const std::vector<std::string> & external_files,const IngestExternalFileOptions & options)121 virtual Status IngestExternalFile( 122 ColumnFamilyHandle* column_family, 123 const std::vector<std::string>& external_files, 124 const IngestExternalFileOptions& options) override { 125 return db_->IngestExternalFile(column_family, external_files, options); 126 } 127 128 using DB::IngestExternalFiles; IngestExternalFiles(const std::vector<IngestExternalFileArg> & args)129 virtual Status IngestExternalFiles( 130 const std::vector<IngestExternalFileArg>& args) override { 131 return db_->IngestExternalFiles(args); 132 } 133 134 using DB::CreateColumnFamilyWithImport; CreateColumnFamilyWithImport(const ColumnFamilyOptions & options,const std::string & column_family_name,const ImportColumnFamilyOptions & import_options,const ExportImportFilesMetaData & metadata,ColumnFamilyHandle ** handle)135 virtual Status CreateColumnFamilyWithImport( 136 const ColumnFamilyOptions& options, const std::string& column_family_name, 137 const ImportColumnFamilyOptions& import_options, 138 const ExportImportFilesMetaData& metadata, 139 ColumnFamilyHandle** handle) override { 140 return db_->CreateColumnFamilyWithImport(options, column_family_name, 141 import_options, metadata, handle); 142 } 143 VerifyChecksum()144 virtual Status VerifyChecksum() override { return db_->VerifyChecksum(); } 145 VerifyChecksum(const ReadOptions & options)146 virtual Status VerifyChecksum(const ReadOptions& options) override { 147 return db_->VerifyChecksum(options); 148 } 149 150 using DB::KeyMayExist; 151 virtual bool KeyMayExist(const ReadOptions& options, 152 ColumnFamilyHandle* column_family, const Slice& key, 153 std::string* value, 154 bool* value_found = nullptr) override { 155 return db_->KeyMayExist(options, column_family, key, value, value_found); 156 } 157 158 using DB::Delete; Delete(const WriteOptions & wopts,ColumnFamilyHandle * column_family,const Slice & key)159 virtual Status Delete(const WriteOptions& wopts, 160 ColumnFamilyHandle* column_family, 161 const Slice& key) override { 162 return db_->Delete(wopts, column_family, key); 163 } 164 165 using DB::SingleDelete; SingleDelete(const WriteOptions & wopts,ColumnFamilyHandle * column_family,const Slice & key)166 virtual Status SingleDelete(const WriteOptions& wopts, 167 ColumnFamilyHandle* column_family, 168 const Slice& key) override { 169 return db_->SingleDelete(wopts, column_family, key); 170 } 171 172 using DB::Merge; Merge(const WriteOptions & options,ColumnFamilyHandle * column_family,const Slice & key,const Slice & value)173 virtual Status Merge(const WriteOptions& options, 174 ColumnFamilyHandle* column_family, const Slice& key, 175 const Slice& value) override { 176 return db_->Merge(options, column_family, key, value); 177 } 178 Write(const WriteOptions & opts,WriteBatch * updates)179 virtual Status Write(const WriteOptions& opts, WriteBatch* updates) override { 180 return db_->Write(opts, updates); 181 } 182 183 using DB::NewIterator; NewIterator(const ReadOptions & opts,ColumnFamilyHandle * column_family)184 virtual Iterator* NewIterator(const ReadOptions& opts, 185 ColumnFamilyHandle* column_family) override { 186 return db_->NewIterator(opts, column_family); 187 } 188 NewIterators(const ReadOptions & options,const std::vector<ColumnFamilyHandle * > & column_families,std::vector<Iterator * > * iterators)189 virtual Status NewIterators( 190 const ReadOptions& options, 191 const std::vector<ColumnFamilyHandle*>& column_families, 192 std::vector<Iterator*>* iterators) override { 193 return db_->NewIterators(options, column_families, iterators); 194 } 195 GetSnapshot()196 virtual const Snapshot* GetSnapshot() override { return db_->GetSnapshot(); } 197 ReleaseSnapshot(const Snapshot * snapshot)198 virtual void ReleaseSnapshot(const Snapshot* snapshot) override { 199 return db_->ReleaseSnapshot(snapshot); 200 } 201 202 using DB::GetMapProperty; 203 using DB::GetProperty; GetProperty(ColumnFamilyHandle * column_family,const Slice & property,std::string * value)204 virtual bool GetProperty(ColumnFamilyHandle* column_family, 205 const Slice& property, std::string* value) override { 206 return db_->GetProperty(column_family, property, value); 207 } GetMapProperty(ColumnFamilyHandle * column_family,const Slice & property,std::map<std::string,std::string> * value)208 virtual bool GetMapProperty( 209 ColumnFamilyHandle* column_family, const Slice& property, 210 std::map<std::string, std::string>* value) override { 211 return db_->GetMapProperty(column_family, property, value); 212 } 213 214 using DB::GetIntProperty; GetIntProperty(ColumnFamilyHandle * column_family,const Slice & property,uint64_t * value)215 virtual bool GetIntProperty(ColumnFamilyHandle* column_family, 216 const Slice& property, uint64_t* value) override { 217 return db_->GetIntProperty(column_family, property, value); 218 } 219 220 using DB::GetAggregatedIntProperty; GetAggregatedIntProperty(const Slice & property,uint64_t * value)221 virtual bool GetAggregatedIntProperty(const Slice& property, 222 uint64_t* value) override { 223 return db_->GetAggregatedIntProperty(property, value); 224 } 225 226 using DB::GetApproximateSizes; GetApproximateSizes(const SizeApproximationOptions & options,ColumnFamilyHandle * column_family,const Range * r,int n,uint64_t * sizes)227 virtual Status GetApproximateSizes(const SizeApproximationOptions& options, 228 ColumnFamilyHandle* column_family, 229 const Range* r, int n, 230 uint64_t* sizes) override { 231 return db_->GetApproximateSizes(options, column_family, r, n, sizes); 232 } 233 234 using DB::GetApproximateMemTableStats; GetApproximateMemTableStats(ColumnFamilyHandle * column_family,const Range & range,uint64_t * const count,uint64_t * const size)235 virtual void GetApproximateMemTableStats(ColumnFamilyHandle* column_family, 236 const Range& range, 237 uint64_t* const count, 238 uint64_t* const size) override { 239 return db_->GetApproximateMemTableStats(column_family, range, count, size); 240 } 241 242 using DB::CompactRange; CompactRange(const CompactRangeOptions & options,ColumnFamilyHandle * column_family,const Slice * begin,const Slice * end)243 virtual Status CompactRange(const CompactRangeOptions& options, 244 ColumnFamilyHandle* column_family, 245 const Slice* begin, const Slice* end) override { 246 return db_->CompactRange(options, column_family, begin, end); 247 } 248 249 using DB::CompactFiles; 250 virtual Status CompactFiles( 251 const CompactionOptions& compact_options, 252 ColumnFamilyHandle* column_family, 253 const std::vector<std::string>& input_file_names, const int output_level, 254 const int output_path_id = -1, 255 std::vector<std::string>* const output_file_names = nullptr, 256 CompactionJobInfo* compaction_job_info = nullptr) override { 257 return db_->CompactFiles(compact_options, column_family, input_file_names, 258 output_level, output_path_id, output_file_names, 259 compaction_job_info); 260 } 261 PauseBackgroundWork()262 virtual Status PauseBackgroundWork() override { 263 return db_->PauseBackgroundWork(); 264 } ContinueBackgroundWork()265 virtual Status ContinueBackgroundWork() override { 266 return db_->ContinueBackgroundWork(); 267 } 268 EnableAutoCompaction(const std::vector<ColumnFamilyHandle * > & column_family_handles)269 virtual Status EnableAutoCompaction( 270 const std::vector<ColumnFamilyHandle*>& column_family_handles) override { 271 return db_->EnableAutoCompaction(column_family_handles); 272 } 273 EnableManualCompaction()274 virtual void EnableManualCompaction() override { 275 return db_->EnableManualCompaction(); 276 } DisableManualCompaction()277 virtual void DisableManualCompaction() override { 278 return db_->DisableManualCompaction(); 279 } 280 281 using DB::NumberLevels; NumberLevels(ColumnFamilyHandle * column_family)282 virtual int NumberLevels(ColumnFamilyHandle* column_family) override { 283 return db_->NumberLevels(column_family); 284 } 285 286 using DB::MaxMemCompactionLevel; MaxMemCompactionLevel(ColumnFamilyHandle * column_family)287 virtual int MaxMemCompactionLevel( 288 ColumnFamilyHandle* column_family) override { 289 return db_->MaxMemCompactionLevel(column_family); 290 } 291 292 using DB::Level0StopWriteTrigger; Level0StopWriteTrigger(ColumnFamilyHandle * column_family)293 virtual int Level0StopWriteTrigger( 294 ColumnFamilyHandle* column_family) override { 295 return db_->Level0StopWriteTrigger(column_family); 296 } 297 GetName()298 virtual const std::string& GetName() const override { return db_->GetName(); } 299 GetEnv()300 virtual Env* GetEnv() const override { return db_->GetEnv(); } 301 GetFileSystem()302 virtual FileSystem* GetFileSystem() const override { 303 return db_->GetFileSystem(); 304 } 305 306 using DB::GetOptions; GetOptions(ColumnFamilyHandle * column_family)307 virtual Options GetOptions(ColumnFamilyHandle* column_family) const override { 308 return db_->GetOptions(column_family); 309 } 310 311 using DB::GetDBOptions; GetDBOptions()312 virtual DBOptions GetDBOptions() const override { 313 return db_->GetDBOptions(); 314 } 315 316 using DB::Flush; Flush(const FlushOptions & fopts,ColumnFamilyHandle * column_family)317 virtual Status Flush(const FlushOptions& fopts, 318 ColumnFamilyHandle* column_family) override { 319 return db_->Flush(fopts, column_family); 320 } Flush(const FlushOptions & fopts,const std::vector<ColumnFamilyHandle * > & column_families)321 virtual Status Flush( 322 const FlushOptions& fopts, 323 const std::vector<ColumnFamilyHandle*>& column_families) override { 324 return db_->Flush(fopts, column_families); 325 } 326 SyncWAL()327 virtual Status SyncWAL() override { return db_->SyncWAL(); } 328 FlushWAL(bool sync)329 virtual Status FlushWAL(bool sync) override { return db_->FlushWAL(sync); } 330 LockWAL()331 virtual Status LockWAL() override { return db_->LockWAL(); } 332 UnlockWAL()333 virtual Status UnlockWAL() override { return db_->UnlockWAL(); } 334 335 #ifndef ROCKSDB_LITE 336 DisableFileDeletions()337 virtual Status DisableFileDeletions() override { 338 return db_->DisableFileDeletions(); 339 } 340 EnableFileDeletions(bool force)341 virtual Status EnableFileDeletions(bool force) override { 342 return db_->EnableFileDeletions(force); 343 } 344 GetLiveFilesMetaData(std::vector<LiveFileMetaData> * metadata)345 virtual void GetLiveFilesMetaData( 346 std::vector<LiveFileMetaData>* metadata) override { 347 db_->GetLiveFilesMetaData(metadata); 348 } 349 GetColumnFamilyMetaData(ColumnFamilyHandle * column_family,ColumnFamilyMetaData * cf_meta)350 virtual void GetColumnFamilyMetaData(ColumnFamilyHandle* column_family, 351 ColumnFamilyMetaData* cf_meta) override { 352 db_->GetColumnFamilyMetaData(column_family, cf_meta); 353 } 354 355 using DB::StartBlockCacheTrace; StartBlockCacheTrace(const TraceOptions & options,std::unique_ptr<TraceWriter> && trace_writer)356 Status StartBlockCacheTrace( 357 const TraceOptions& options, 358 std::unique_ptr<TraceWriter>&& trace_writer) override { 359 return db_->StartBlockCacheTrace(options, std::move(trace_writer)); 360 } 361 362 using DB::EndBlockCacheTrace; EndBlockCacheTrace()363 Status EndBlockCacheTrace() override { return db_->EndBlockCacheTrace(); } 364 365 #endif // ROCKSDB_LITE 366 367 virtual Status GetLiveFiles(std::vector<std::string>& vec, uint64_t* mfs, 368 bool flush_memtable = true) override { 369 return db_->GetLiveFiles(vec, mfs, flush_memtable); 370 } 371 GetLatestSequenceNumber()372 virtual SequenceNumber GetLatestSequenceNumber() const override { 373 return db_->GetLatestSequenceNumber(); 374 } 375 SetPreserveDeletesSequenceNumber(SequenceNumber seqnum)376 virtual bool SetPreserveDeletesSequenceNumber( 377 SequenceNumber seqnum) override { 378 return db_->SetPreserveDeletesSequenceNumber(seqnum); 379 } 380 GetSortedWalFiles(VectorLogPtr & files)381 virtual Status GetSortedWalFiles(VectorLogPtr& files) override { 382 return db_->GetSortedWalFiles(files); 383 } 384 GetCurrentWalFile(std::unique_ptr<LogFile> * current_log_file)385 virtual Status GetCurrentWalFile( 386 std::unique_ptr<LogFile>* current_log_file) override { 387 return db_->GetCurrentWalFile(current_log_file); 388 } 389 GetCreationTimeOfOldestFile(uint64_t * creation_time)390 virtual Status GetCreationTimeOfOldestFile( 391 uint64_t* creation_time) override { 392 return db_->GetCreationTimeOfOldestFile(creation_time); 393 } 394 DeleteFile(std::string name)395 virtual Status DeleteFile(std::string name) override { 396 return db_->DeleteFile(name); 397 } 398 GetDbIdentity(std::string & identity)399 virtual Status GetDbIdentity(std::string& identity) const override { 400 return db_->GetDbIdentity(identity); 401 } 402 403 using DB::SetOptions; SetOptions(ColumnFamilyHandle * column_family_handle,const std::unordered_map<std::string,std::string> & new_options)404 virtual Status SetOptions(ColumnFamilyHandle* column_family_handle, 405 const std::unordered_map<std::string, std::string>& 406 new_options) override { 407 return db_->SetOptions(column_family_handle, new_options); 408 } 409 SetDBOptions(const std::unordered_map<std::string,std::string> & new_options)410 virtual Status SetDBOptions( 411 const std::unordered_map<std::string, std::string>& new_options) 412 override { 413 return db_->SetDBOptions(new_options); 414 } 415 416 using DB::ResetStats; ResetStats()417 virtual Status ResetStats() override { return db_->ResetStats(); } 418 419 using DB::GetPropertiesOfAllTables; GetPropertiesOfAllTables(ColumnFamilyHandle * column_family,TablePropertiesCollection * props)420 virtual Status GetPropertiesOfAllTables( 421 ColumnFamilyHandle* column_family, 422 TablePropertiesCollection* props) override { 423 return db_->GetPropertiesOfAllTables(column_family, props); 424 } 425 426 using DB::GetPropertiesOfTablesInRange; GetPropertiesOfTablesInRange(ColumnFamilyHandle * column_family,const Range * range,std::size_t n,TablePropertiesCollection * props)427 virtual Status GetPropertiesOfTablesInRange( 428 ColumnFamilyHandle* column_family, const Range* range, std::size_t n, 429 TablePropertiesCollection* props) override { 430 return db_->GetPropertiesOfTablesInRange(column_family, range, n, props); 431 } 432 GetUpdatesSince(SequenceNumber seq_number,std::unique_ptr<TransactionLogIterator> * iter,const TransactionLogIterator::ReadOptions & read_options)433 virtual Status GetUpdatesSince( 434 SequenceNumber seq_number, std::unique_ptr<TransactionLogIterator>* iter, 435 const TransactionLogIterator::ReadOptions& read_options) override { 436 return db_->GetUpdatesSince(seq_number, iter, read_options); 437 } 438 SuggestCompactRange(ColumnFamilyHandle * column_family,const Slice * begin,const Slice * end)439 virtual Status SuggestCompactRange(ColumnFamilyHandle* column_family, 440 const Slice* begin, 441 const Slice* end) override { 442 return db_->SuggestCompactRange(column_family, begin, end); 443 } 444 PromoteL0(ColumnFamilyHandle * column_family,int target_level)445 virtual Status PromoteL0(ColumnFamilyHandle* column_family, 446 int target_level) override { 447 return db_->PromoteL0(column_family, target_level); 448 } 449 DefaultColumnFamily()450 virtual ColumnFamilyHandle* DefaultColumnFamily() const override { 451 return db_->DefaultColumnFamily(); 452 } 453 454 #ifndef ROCKSDB_LITE TryCatchUpWithPrimary()455 Status TryCatchUpWithPrimary() override { 456 return db_->TryCatchUpWithPrimary(); 457 } 458 #endif // ROCKSDB_LITE 459 460 protected: 461 DB* db_; 462 std::shared_ptr<DB> shared_db_ptr_; 463 }; 464 465 } // namespace ROCKSDB_NAMESPACE 466