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