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 
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 {
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;
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
virtual Status beginBackup(OperationContext *opCtx)
Transitions the storage engine into backup mode.
Definition: kv_storage_engine.cpp:462
Definition: kv_engine.h:53
virtual void cleanShutdown()
This method will be called before there is a clean shutdown.
Definition: kv_storage_engine.cpp:346
virtual void replicationBatchIsComplete() const override
Notifies the storage engine that a replication batch has completed.
Definition: kv_storage_engine.cpp:571
KVEngine * engine
Definition: kv_engine_test_timestamps.cpp:205
virtual void setCachePressureForTest(int pressure) override
For unit tests only.
Definition: kv_storage_engine.cpp:525
const bool _supportsDBLocking
Definition: kv_storage_engine.h:206
void loadCatalog(OperationContext *opCtx) final
When loading after an unclean shutdown, this performs cleanup on the KVCatalog and unsets the startin...
Definition: kv_storage_engine.cpp:96
bool supportsReadConcernSnapshot() const final
Returns true if the storage engine supports the readConcern level "snapshot".
Definition: kv_storage_engine.cpp:567
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
void _dumpCatalog(OperationContext *opCtx)
Definition: kv_storage_engine.cpp:579
const KVEngine * getEngine() const
Definition: kv_storage_engine.h:155
Collection *const const NamespaceString & ns
Definition: collection_info_cache_impl.cpp:53
virtual Status dropDatabase(OperationContext *opCtx, StringData db)
Deletes all data and metadata for a database.
Definition: kv_storage_engine.cpp:396
virtual ~KVStorageEngine()
Definition: kv_storage_engine.cpp:359
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
Status _dropCollectionsWithTimestamp(OperationContext *opCtx, KVDatabaseCatalogEntryBase *dbce, std::list< std::string > &toDrop, CollIter begin, CollIter end)
bool _inBackupMode
Definition: kv_storage_engine.h:218
stdx::function< KVDatabaseCatalogEntryFactory > _databaseCatalogEntryFactory
Definition: kv_storage_engine.h:196
void setJournalListener(JournalListener *jl) final
Sets a new JournalListener, which is used by the storage engine to alert the rest of the system about...
Definition: kv_storage_engine.cpp:500
StatusWith< std::vector< StorageEngine::CollectionIndexNamePair > > reconcileCatalogAndIdents(OperationContext *opCtx) override
Drop abandoned idents.
Definition: kv_storage_engine.cpp:215
virtual bool isEphemeral() const
Returns true if the engine does not persist data to disk; false otherwise.
Definition: kv_storage_engine.cpp:483
virtual bool supportsRecoverToStableTimestamp() const override
Returns whether the storage engine supports "recover to stable timestamp".
Definition: kv_storage_engine.cpp:529
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
KVStorageEngine(KVEngine *engine, const KVStorageEngineOptions &options=KVStorageEngineOptions(), stdx::function< KVDatabaseCatalogEntryFactory > databaseCatalogEntryFactory=defaultDatabaseCatalogEntryFactory)
Definition: kv_storage_engine.cpp:78
decltype(defaultDatabaseCatalogEntryFactory) KVDatabaseCatalogEntryFactory
Definition: kv_storage_engine.h:67
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
OperationContext Database StringData CollectionOptions bool const BSONObj &idIndex Status
Definition: database_impl.cpp:955
KVStorageEngineOptions _options
Definition: kv_storage_engine.h:200
virtual void setOldestTimestamp(Timestamp newOldestTimestamp) override
Sets the oldest timestamp for which the storage engine must maintain snapshot history through.
Definition: kv_storage_engine.cpp:517
virtual StatusWith< Timestamp > recoverToStableTimestamp(OperationContext *opCtx) override
Recovers the storage engine state to the last stable timestamp.
Definition: kv_storage_engine.cpp:533
virtual bool supportsDocLocking() const
Returns whether the storage engine supports its own locking locking below the collection level.
Definition: kv_storage_engine.h:90
virtual Status repairRecordStore(OperationContext *opCtx, const std::string &ns)
Recover as much data as possible from a potentially corrupt RecordStore.
Definition: kv_storage_engine.cpp:491
Definition: index_key_validate.h:40
A RecoveryUnit is responsible for ensuring that data is persisted.
Definition: recovery_unit.h:51
virtual int flushAllFiles(OperationContext *opCtx, bool sync)
Definition: kv_storage_engine.cpp:458
virtual void listDatabases(std::vector< std::string > *out) const
List the databases stored in this storage engine.
Definition: kv_storage_engine.cpp:371
stdx::mutex _dbsLock
Definition: kv_storage_engine.h:215
virtual void setOldestTimestampFromStable() override
Uses the current stable timestamp to set the oldest timestamp for which the storage engine must maint...
Definition: kv_storage_engine.cpp:513
DBMap _dbs
Definition: kv_storage_engine.h:214
void closeCatalog(OperationContext *opCtx) final
Definition: kv_storage_engine.cpp:184
SnapshotManager * getSnapshotManager() const final
Returns the SnapshotManager for this StorageEngine or NULL if not supported.
Definition: kv_storage_engine.cpp:487
virtual bool isDurable() const
Returns whether the engine supports a journalling concept or not.
Definition: kv_storage_engine.cpp:479
std::unique_ptr< KVEngine > _engine
Definition: kv_storage_engine.h:203
virtual bool isCacheUnderPressure(OperationContext *opCtx) const override
Indicates whether the storage engine cache is under pressure.
Definition: kv_storage_engine.cpp:521
Timestamp _initialDataTimestamp
Definition: kv_storage_engine.h:208
virtual void setStableTimestamp(Timestamp stableTimestamp) override
Sets the highest timestamp at which the storage engine is allowed to take a checkpoint.
Definition: kv_storage_engine.cpp:504
OperationContext Database * db
Definition: database_impl.cpp:949
const KVCatalog * getCatalog() const
Definition: kv_storage_engine.h:162
virtual Status closeDatabase(OperationContext *opCtx, StringData db)
Closes all file handles associated with a database.
Definition: kv_storage_engine.cpp:391
virtual void endBackup(OperationContext *opCtx)
Transitions the storage engine out of backup mode.
Definition: kv_storage_engine.cpp:472
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
Manages snapshots that can be read from at a later time.
Definition: snapshot_manager.h:47
Definition: kv_storage_engine.cpp:59
virtual boost::optional< Timestamp > getRecoveryTimestamp() const override
Returns the stable timestamp that the storage engine recovered to on startup.
Definition: kv_storage_engine.cpp:559
KVDatabaseCatalogEntryBase * getDatabaseCatalogEntry(OperationContext *opCtx, StringData db) override
Return the DatabaseCatalogEntry that describes the database indicated by 'db'.
Definition: kv_storage_engine.cpp:380
Database *const OperationContext *const const StringData name
Definition: database_impl.cpp:82
virtual void setInitialDataTimestamp(Timestamp initialDataTimestamp) override
Tells the storage engine the timestamp of the data at startup.
Definition: kv_storage_engine.cpp:508
virtual void finishInit()
Called after the globalStorageEngine pointer has been set up, before any other methods are called.
Definition: kv_storage_engine.cpp:361
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
virtual RecoveryUnit * newRecoveryUnit()
Returns a new interface to the storage engine's recovery unit.
Definition: kv_storage_engine.cpp:363
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 Timestamp getAllCommittedTimestamp() const override
Returns the all committed timestamp.
Definition: kv_storage_engine.cpp:575
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
virtual boost::optional< Timestamp > getLastStableCheckpointTimestamp() const override
Returns a timestamp that is guaranteed to be persisted to disk in a checkpoint.
Definition: kv_storage_engine.cpp:563
Status _dropCollectionsNoTimestamp(OperationContext *opCtx, KVDatabaseCatalogEntryBase *dbce, CollIter begin, CollIter end)
Returns the first dropCollection error that this method encounters.
Definition: kv_storage_engine.cpp:419
bool directoryForIndexes
Definition: kv_storage_engine.h:53