github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/leveldb.chai2010/include/db/db_impl.h (about) 1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. See the AUTHORS file for names of contributors. 4 5 #ifndef STORAGE_LEVELDB_DB_DB_IMPL_H_ 6 #define STORAGE_LEVELDB_DB_DB_IMPL_H_ 7 8 #include <deque> 9 #include <set> 10 #include "db/dbformat.h" 11 #include "db/log_writer.h" 12 #include "db/snapshot.h" 13 #include "leveldb/db.h" 14 #include "leveldb/env.h" 15 #include "port/port.h" 16 #include "port/thread_annotations.h" 17 18 namespace leveldb { 19 20 class MemTable; 21 class TableCache; 22 class Version; 23 class VersionEdit; 24 class VersionSet; 25 26 class DBImpl : public DB { 27 public: 28 DBImpl(const Options& options, const std::string& dbname); 29 virtual ~DBImpl(); 30 31 // Implementations of the DB interface 32 virtual Status Put(const WriteOptions&, const Slice& key, const Slice& value); 33 virtual Status Delete(const WriteOptions&, const Slice& key); 34 virtual Status Write(const WriteOptions& options, WriteBatch* updates); 35 virtual Status Get(const ReadOptions& options, 36 const Slice& key, 37 std::string* value); 38 virtual Iterator* NewIterator(const ReadOptions&); 39 virtual const Snapshot* GetSnapshot(); 40 virtual void ReleaseSnapshot(const Snapshot* snapshot); 41 virtual bool GetProperty(const Slice& property, std::string* value); 42 virtual void GetApproximateSizes(const Range* range, int n, uint64_t* sizes); 43 virtual void CompactRange(const Slice* begin, const Slice* end); 44 45 // Extra methods (for testing) that are not in the public DB interface 46 47 // Compact any files in the named level that overlap [*begin,*end] 48 void TEST_CompactRange(int level, const Slice* begin, const Slice* end); 49 50 // Force current memtable contents to be compacted. 51 Status TEST_CompactMemTable(); 52 53 // Return an internal iterator over the current state of the database. 54 // The keys of this iterator are internal keys (see format.h). 55 // The returned iterator should be deleted when no longer needed. 56 Iterator* TEST_NewInternalIterator(); 57 58 // Return the maximum overlapping data (in bytes) at next level for any 59 // file at a level >= 1. 60 int64_t TEST_MaxNextLevelOverlappingBytes(); 61 62 // Record a sample of bytes read at the specified internal key. 63 // Samples are taken approximately once every config::kReadBytesPeriod 64 // bytes. 65 void RecordReadSample(Slice key); 66 67 private: 68 friend class DB; 69 struct CompactionState; 70 struct Writer; 71 72 Iterator* NewInternalIterator(const ReadOptions&, 73 SequenceNumber* latest_snapshot, 74 uint32_t* seed); 75 76 Status NewDB(); 77 78 // Recover the descriptor from persistent storage. May do a significant 79 // amount of work to recover recently logged updates. Any changes to 80 // be made to the descriptor are added to *edit. 81 Status Recover(VersionEdit* edit) EXCLUSIVE_LOCKS_REQUIRED(mutex_); 82 83 void MaybeIgnoreError(Status* s) const; 84 85 // Delete any unneeded files and stale in-memory entries. 86 void DeleteObsoleteFiles(); 87 88 // Compact the in-memory write buffer to disk. Switches to a new 89 // log-file/memtable and writes a new descriptor iff successful. 90 Status CompactMemTable() 91 EXCLUSIVE_LOCKS_REQUIRED(mutex_); 92 93 Status RecoverLogFile(uint64_t log_number, 94 VersionEdit* edit, 95 SequenceNumber* max_sequence) 96 EXCLUSIVE_LOCKS_REQUIRED(mutex_); 97 98 Status WriteLevel0Table(MemTable* mem, VersionEdit* edit, Version* base) 99 EXCLUSIVE_LOCKS_REQUIRED(mutex_); 100 101 Status MakeRoomForWrite(bool force /* compact even if there is room? */) 102 EXCLUSIVE_LOCKS_REQUIRED(mutex_); 103 WriteBatch* BuildBatchGroup(Writer** last_writer); 104 105 void MaybeScheduleCompaction() EXCLUSIVE_LOCKS_REQUIRED(mutex_); 106 static void BGWork(void* db); 107 void BackgroundCall(); 108 Status BackgroundCompaction() EXCLUSIVE_LOCKS_REQUIRED(mutex_); 109 void CleanupCompaction(CompactionState* compact) 110 EXCLUSIVE_LOCKS_REQUIRED(mutex_); 111 Status DoCompactionWork(CompactionState* compact) 112 EXCLUSIVE_LOCKS_REQUIRED(mutex_); 113 114 Status OpenCompactionOutputFile(CompactionState* compact); 115 Status FinishCompactionOutputFile(CompactionState* compact, Iterator* input); 116 Status InstallCompactionResults(CompactionState* compact) 117 EXCLUSIVE_LOCKS_REQUIRED(mutex_); 118 119 // Constant after construction 120 Env* const env_; 121 const InternalKeyComparator internal_comparator_; 122 const InternalFilterPolicy internal_filter_policy_; 123 const Options options_; // options_.comparator == &internal_comparator_ 124 bool owns_info_log_; 125 bool owns_cache_; 126 const std::string dbname_; 127 128 // table_cache_ provides its own synchronization 129 TableCache* table_cache_; 130 131 // Lock over the persistent DB state. Non-NULL iff successfully acquired. 132 FileLock* db_lock_; 133 134 // State below is protected by mutex_ 135 port::Mutex mutex_; 136 port::AtomicPointer shutting_down_; 137 port::CondVar bg_cv_; // Signalled when background work finishes 138 MemTable* mem_; 139 MemTable* imm_; // Memtable being compacted 140 port::AtomicPointer has_imm_; // So bg thread can detect non-NULL imm_ 141 WritableFile* logfile_; 142 uint64_t logfile_number_; 143 log::Writer* log_; 144 uint32_t seed_; // For sampling. 145 146 // Queue of writers. 147 std::deque<Writer*> writers_; 148 WriteBatch* tmp_batch_; 149 150 SnapshotList snapshots_; 151 152 // Set of table files to protect from deletion because they are 153 // part of ongoing compactions. 154 std::set<uint64_t> pending_outputs_; 155 156 // Has a background compaction been scheduled or is running? 157 bool bg_compaction_scheduled_; 158 159 // Information for a manual compaction 160 struct ManualCompaction { 161 int level; 162 bool done; 163 const InternalKey* begin; // NULL means beginning of key range 164 const InternalKey* end; // NULL means end of key range 165 InternalKey tmp_storage; // Used to keep track of compaction progress 166 }; 167 ManualCompaction* manual_compaction_; 168 169 VersionSet* versions_; 170 171 // Have we encountered a background error in paranoid mode? 172 Status bg_error_; 173 int consecutive_compaction_errors_; 174 175 // Per level compaction stats. stats_[level] stores the stats for 176 // compactions that produced data for the specified "level". 177 struct CompactionStats { 178 int64_t micros; 179 int64_t bytes_read; 180 int64_t bytes_written; 181 182 CompactionStats() : micros(0), bytes_read(0), bytes_written(0) { } 183 184 void Add(const CompactionStats& c) { 185 this->micros += c.micros; 186 this->bytes_read += c.bytes_read; 187 this->bytes_written += c.bytes_written; 188 } 189 }; 190 CompactionStats stats_[config::kNumLevels]; 191 192 // No copying allowed 193 DBImpl(const DBImpl&); 194 void operator=(const DBImpl&); 195 196 const Comparator* user_comparator() const { 197 return internal_comparator_.user_comparator(); 198 } 199 }; 200 201 // Sanitize db options. The caller should delete result.info_log if 202 // it is not equal to src.info_log. 203 extern Options SanitizeOptions(const std::string& db, 204 const InternalKeyComparator* icmp, 205 const InternalFilterPolicy* ipolicy, 206 const Options& src); 207 208 } // namespace leveldb 209 210 #endif // STORAGE_LEVELDB_DB_DB_IMPL_H_