Storage Engine API
kv_storage_engine.h
Go to the documentation of this file.
1 
29 #pragma once
30 
31 #include <map>
32 #include <string>
33 
34 #include "mongo/base/status_with.h"
35 #include "mongo/base/string_data.h"
36 #include "mongo/bson/timestamp.h"
42 #include "mongo/stdx/functional.h"
43 #include "mongo/stdx/memory.h"
44 #include "mongo/stdx/mutex.h"
45 
46 namespace mongo {
47 
48 class KVCatalog;
49 class KVEngine;
50 
52  bool directoryPerDB = false;
53  bool directoryForIndexes = false;
54  bool forRepair = false;
55 };
56 
57 /*
58  * The actual definition for this function is in
59  * `src/mongo/db/storage/kv/kv_database_catalog_entry.cpp` This unusual forward declaration is to
60  * facilitate better linker error messages. Tests need to pass a mock construction factory, whereas
61  * main implementations should pass the `default...` factory which is linked in with the main
62  * `KVDatabaseCatalogEntry` code.
63  */
64 std::unique_ptr<KVDatabaseCatalogEntryBase> defaultDatabaseCatalogEntryFactory(
65  const StringData name, KVStorageEngine* const engine);
66 
68 
69 class KVStorageEngine final : public StorageEngine {
70 public:
76  stdx::function<KVDatabaseCatalogEntryFactory> databaseCatalogEntryFactory =
78 
79  virtual ~KVStorageEngine();
80 
81  virtual void finishInit();
82 
83  virtual RecoveryUnit* newRecoveryUnit();
84 
85  virtual void listDatabases(std::vector<std::string>* out) const;
86 
87  KVDatabaseCatalogEntryBase* getDatabaseCatalogEntry(OperationContext* opCtx,
88  StringData db) override;
89 
90  virtual bool supportsDocLocking() const {
91  return _supportsDocLocking;
92  }
93 
94  virtual bool supportsDBLocking() const {
95  return _supportsDBLocking;
96  }
97 
98  virtual bool supportsCappedCollections() const {
99  return _supportsCappedCollections;
100  }
101 
102  virtual Status closeDatabase(OperationContext* opCtx, StringData db);
103 
104  virtual Status dropDatabase(OperationContext* opCtx, StringData db);
105 
106  virtual int flushAllFiles(OperationContext* opCtx, bool sync);
107 
108  virtual Status beginBackup(OperationContext* opCtx);
109 
110  virtual void endBackup(OperationContext* opCtx);
111 
112  virtual bool isDurable() const;
113 
114  virtual bool isEphemeral() const;
115 
116  virtual Status repairRecordStore(OperationContext* opCtx, const std::string& ns);
117 
118  virtual void cleanShutdown();
119 
120  virtual void setStableTimestamp(Timestamp stableTimestamp) override;
121 
122  virtual void setInitialDataTimestamp(Timestamp initialDataTimestamp) override;
123 
124  virtual void setOldestTimestampFromStable() override;
125 
126  virtual void setOldestTimestamp(Timestamp newOldestTimestamp) override;
127 
128  virtual bool isCacheUnderPressure(OperationContext* opCtx) const override;
129 
130  virtual void setCachePressureForTest(int pressure) override;
131 
132  virtual bool supportsRecoverToStableTimestamp() const override;
133 
134  virtual StatusWith<Timestamp> recoverToStableTimestamp(OperationContext* opCtx) override;
135 
136  virtual boost::optional<Timestamp> getRecoveryTimestamp() const override;
137 
138  virtual boost::optional<Timestamp> getLastStableCheckpointTimestamp() const override;
139 
140  virtual Timestamp getAllCommittedTimestamp() const override;
141 
142  bool supportsReadConcernSnapshot() const final;
143 
144  virtual void replicationBatchIsComplete() const override;
145 
146  SnapshotManager* getSnapshotManager() const final;
147 
148  void setJournalListener(JournalListener* jl) final;
149 
150  // ------ kv ------
151 
153  return _engine.get();
154  }
155  const KVEngine* getEngine() const {
156  return _engine.get();
157  }
158 
160  return _catalog.get();
161  }
162  const KVCatalog* getCatalog() const {
163  return _catalog.get();
164  }
165 
170  OperationContext* opCtx) override;
171 
176  void loadCatalog(OperationContext* opCtx) final;
177 
178  void closeCatalog(OperationContext* opCtx) final;
179 
180 private:
181  using CollIter = std::list<std::string>::iterator;
182 
183  Status _dropCollectionsNoTimestamp(OperationContext* opCtx,
185  CollIter begin,
186  CollIter end);
187 
188  Status _dropCollectionsWithTimestamp(OperationContext* opCtx,
190  std::list<std::string>& toDrop,
191  CollIter begin,
192  CollIter end);
193 
194  void _dumpCatalog(OperationContext* opCtx);
195 
197 
198  stdx::function<KVDatabaseCatalogEntryFactory> _databaseCatalogEntryFactory;
199 
201 
202  // This must be the first member so it is destroyed last.
203  std::unique_ptr<KVEngine> _engine;
204 
206  const bool _supportsDBLocking;
208  Timestamp _initialDataTimestamp = Timestamp::kAllowUnstableCheckpointsSentinel;
209 
210  std::unique_ptr<RecordStore> _catalogRecordStore;
211  std::unique_ptr<KVCatalog> _catalog;
212 
213  typedef std::map<std::string, KVDatabaseCatalogEntryBase*> DBMap;
214  DBMap _dbs;
215  mutable stdx::mutex _dbsLock;
216 
217  // Flag variable that states if the storage engine is in backup mode.
218  bool _inBackupMode = false;
219 };
220 } // namespace mongo
const bool _supportsCappedCollections
Definition: kv_storage_engine.h:207
std::list< std::string >::iterator CollIter
Definition: kv_storage_engine.h:181
Definition: kv_storage_engine.h:51
Definition: kv_engine.h:53
KVEngine * engine
Definition: kv_engine_test_timestamps.cpp:205
const bool _supportsDBLocking
Definition: kv_storage_engine.h:206
void setJournalListener(JournalListener *jl)
Definition: dur.cpp:906
virtual bool supportsDBLocking() const
Returns whether the storage engine supports locking at a database level.
Definition: kv_storage_engine.h:94
std::unique_ptr< KVDatabaseCatalogEntryBase > defaultDatabaseCatalogEntryFactory(const StringData name, KVStorageEngine *const engine)
Definition: kv_database_catalog_entry.cpp:49
const KVEngine * getEngine() const
Definition: kv_storage_engine.h:155
void closeCatalog(OperationContext *opCtx)
Closes the catalog, destroying all associated in-memory data structures for all databases.
Definition: catalog_control.cpp:46
Collection *const const NamespaceString & ns
Definition: collection_info_cache_impl.cpp:53
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
Definition: kv_database_catalog_entry_base.h:42
std::unique_ptr< RecordStore > _catalogRecordStore
Definition: kv_storage_engine.h:210
OperationContext Database StringData BSONObj CollectionOptions::ParseKind bool const BSONObj &idIndex Status
Definition: database_impl.cpp:956
stdx::function< KVDatabaseCatalogEntryFactory > _databaseCatalogEntryFactory
Definition: kv_storage_engine.h:196
Collection *const OperationContext *const const StringData OptionalCollectionUUID CollectionCatalogEntry *const RecordStore *const DatabaseCatalogEntry *const dbce
Definition: collection_impl.cpp:80
bool directoryPerDB
Definition: kv_storage_engine.h:52
const bool _supportsDocLocking
Definition: kv_storage_engine.h:205
decltype(defaultDatabaseCatalogEntryFactory) KVDatabaseCatalogEntryFactory
Definition: kv_storage_engine.h:67
std::unique_ptr< EphemeralForTestEngine > _engine
Definition: ephemeral_for_test_engine_test.cpp:53
Definition: kv_storage_engine.h:69
This class allows for the storageEngine to alert the rest of the system about journaled write progres...
Definition: journal_listener.h:48
Definition: kv_catalog.h:49
KVStorageEngineOptions _options
Definition: kv_storage_engine.h:200
virtual bool supportsDocLocking() const
Returns whether the storage engine supports its own locking locking below the collection level...
Definition: kv_storage_engine.h:90
Definition: index_key_validate.h:40
A RecoveryUnit is responsible for ensuring that data is persisted.
Definition: recovery_unit.h:51
stdx::mutex _dbsLock
Definition: kv_storage_engine.h:215
DBMap _dbs
Definition: kv_storage_engine.h:214
std::unique_ptr< KVEngine > _engine
Definition: kv_storage_engine.h:203
Status dropDatabase(OperationContext *opCtx, const std::string &dbName)
Drops the database "dbName".
Definition: drop_database.cpp:85
OperationContext Database * db
Definition: database_impl.cpp:949
OperationContext Database StringData BSONObj options
Definition: database_impl.cpp:949
const KVCatalog * getCatalog() const
Definition: kv_storage_engine.h:162
std::map< std::string, KVDatabaseCatalogEntryBase * > DBMap
Definition: kv_storage_engine.h:213
KVEngine * getEngine()
Definition: kv_storage_engine.h:152
bool forRepair
Definition: kv_storage_engine.h:54
std::unique_ptr< KVCatalog > _catalog
Definition: kv_catalog_feature_tracker_test.cpp:103
Manages snapshots that can be read from at a later time.
Definition: snapshot_manager.h:47
Definition: kv_storage_engine.cpp:59
Database *const OperationContext *const const StringData name
Definition: database_impl.cpp:82
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
std::unique_ptr< KVCatalog > _catalog
Definition: kv_storage_engine.h:211
The StorageEngine class is the top level interface for creating a new storage engine.
Definition: storage_engine.h:57
virtual bool supportsCappedCollections() const
Returns whether the storage engine supports capped collections.
Definition: kv_storage_engine.h:98
KVCatalog * getCatalog()
Definition: kv_storage_engine.h:159
bool _supportsDocLocking
A RAII object that temporarily forces setting of the _supportsDocLocking global variable (defined in ...
Definition: lock_manager_test_help.h:77
bool directoryForIndexes
Definition: kv_storage_engine.h:53