Storage Engine API
kv_engine.h
Go to the documentation of this file.
1 // kv_engine.h
2 
31 #pragma once
32 
33 #include <memory>
34 #include <string>
35 #include <vector>
36 
37 #include "mongo/base/status.h"
38 #include "mongo/base/string_data.h"
39 #include "mongo/bson/timestamp.h"
43 
44 namespace mongo {
45 
46 class IndexDescriptor;
47 class JournalListener;
48 class OperationContext;
49 class RecoveryUnit;
50 class SortedDataInterface;
51 class SnapshotManager;
52 
53 class KVEngine {
54 public:
55  virtual RecoveryUnit* newRecoveryUnit() = 0;
56 
57  // ---------
58 
63  virtual std::unique_ptr<RecordStore> getRecordStore(OperationContext* opCtx,
64  StringData ns,
65  StringData ident,
66  const CollectionOptions& options) = 0;
67 
76  virtual std::unique_ptr<RecordStore> getGroupedRecordStore(OperationContext* opCtx,
77  StringData ns,
78  StringData ident,
79  const CollectionOptions& options,
80  KVPrefix prefix) {
81  invariant(prefix == KVPrefix::kNotPrefixed);
82  return getRecordStore(opCtx, ns, ident, options);
83  }
84 
85  virtual SortedDataInterface* getSortedDataInterface(OperationContext* opCtx,
86  StringData ident,
87  const IndexDescriptor* desc) = 0;
88 
98  virtual SortedDataInterface* getGroupedSortedDataInterface(OperationContext* opCtx,
99  StringData ident,
100  const IndexDescriptor* desc,
101  KVPrefix prefix) {
102  invariant(prefix == KVPrefix::kNotPrefixed);
103  return getSortedDataInterface(opCtx, ident, desc);
104  }
105 
113  virtual Status createRecordStore(OperationContext* opCtx,
114  StringData ns,
115  StringData ident,
116  const CollectionOptions& options) = 0;
117 
129  virtual Status createGroupedRecordStore(OperationContext* opCtx,
130  StringData ns,
131  StringData ident,
132  const CollectionOptions& options,
133  KVPrefix prefix) {
134  invariant(prefix == KVPrefix::kNotPrefixed);
135  return createRecordStore(opCtx, ns, ident, options);
136  }
137 
138  virtual Status createSortedDataInterface(OperationContext* opCtx,
139  StringData ident,
140  const IndexDescriptor* desc) = 0;
141 
152  virtual Status createGroupedSortedDataInterface(OperationContext* opCtx,
153  StringData ident,
154  const IndexDescriptor* desc,
155  KVPrefix prefix) {
156  invariant(prefix == KVPrefix::kNotPrefixed);
157  return createSortedDataInterface(opCtx, ident, desc);
158  }
159 
160  virtual int64_t getIdentSize(OperationContext* opCtx, StringData ident) = 0;
161 
162  virtual Status repairIdent(OperationContext* opCtx, StringData ident) = 0;
163 
164  virtual Status dropIdent(OperationContext* opCtx, StringData ident) = 0;
165 
166  virtual void alterIdentMetadata(OperationContext* opCtx,
167  StringData ident,
168  const IndexDescriptor* desc){};
169 
170  // optional
171  virtual int flushAllFiles(OperationContext* opCtx, bool sync) {
172  return 0;
173  }
174 
178  virtual Status beginBackup(OperationContext* opCtx) {
179  return Status(ErrorCodes::CommandNotSupported,
180  "The current storage engine doesn't support backup mode");
181  }
182 
186  virtual void endBackup(OperationContext* opCtx) {
187  MONGO_UNREACHABLE;
188  }
189 
190  virtual bool isDurable() const = 0;
191 
196  virtual bool isEphemeral() const = 0;
197 
201  virtual bool supportsDocLocking() const = 0;
202 
206  virtual bool supportsDBLocking() const {
207  return true;
208  }
209 
213  virtual bool supportsCappedCollections() const {
214  return true;
215  }
216 
222  virtual bool supportsDirectoryPerDB() const = 0;
223 
224  virtual Status okToRename(OperationContext* opCtx,
225  StringData fromNS,
226  StringData toNS,
227  StringData ident,
228  const RecordStore* originalRecordStore) const {
229  return Status::OK();
230  }
231 
232  virtual bool hasIdent(OperationContext* opCtx, StringData ident) const = 0;
233 
234  virtual std::vector<std::string> getAllIdents(OperationContext* opCtx) const = 0;
235 
243  virtual void cleanShutdown() = 0;
244 
251  return nullptr;
252  }
253 
258  virtual void setJournalListener(JournalListener* jl) = 0;
259 
263  virtual void setStableTimestamp(Timestamp stableTimestamp) {}
264 
268  virtual void setInitialDataTimestamp(Timestamp initialDataTimestamp) {}
269 
274 
278  virtual void setOldestTimestamp(Timestamp newOldestTimestamp) {}
279 
283  virtual bool isCacheUnderPressure(OperationContext* opCtx) const {
284  return false;
285  }
286 
290  virtual void setCachePressureForTest(int pressure) {}
291 
295  virtual bool supportsRecoverToStableTimestamp() const {
296  return false;
297  }
298 
302  virtual StatusWith<Timestamp> recoverToStableTimestamp(OperationContext* opCtx) {
303  fassertFailed(50664);
304  }
305 
309  virtual boost::optional<Timestamp> getRecoveryTimestamp() const {
310  MONGO_UNREACHABLE;
311  }
312 
316  virtual boost::optional<Timestamp> getLastStableCheckpointTimestamp() const {
317  MONGO_UNREACHABLE;
318  }
319 
323  virtual Timestamp getAllCommittedTimestamp() const = 0;
324 
328  virtual bool supportsReadConcernSnapshot() const {
329  return false;
330  }
331 
335  virtual void replicationBatchIsComplete() const {};
336 
342  virtual ~KVEngine() {}
343 };
344 }
virtual bool supportsReadConcernSnapshot() const
See StorageEngine::supportsReadConcernSnapshot
Definition: kv_engine.h:328
virtual Status dropIdent(OperationContext *opCtx, StringData ident)=0
virtual boost::optional< Timestamp > getLastStableCheckpointTimestamp() const
See StorageEngine::getLastStableCheckpointTimestamp
Definition: kv_engine.h:316
Definition: kv_engine.h:53
virtual void setStableTimestamp(Timestamp stableTimestamp)
See StorageEngine::setStableTimestamp
Definition: kv_engine.h:263
virtual void cleanShutdown()=0
This method will be called before there is a clean shutdown.
Collection *const const NamespaceString & ns
Definition: collection_info_cache_impl.cpp:53
virtual bool supportsRecoverToStableTimestamp() const
See StorageEngine::supportsRecoverToStableTimestamp
Definition: kv_engine.h:295
Definition: collection_options.h:57
virtual Status okToRename(OperationContext *opCtx, StringData fromNS, StringData toNS, StringData ident, const RecordStore *originalRecordStore) const
Definition: kv_engine.h:224
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
virtual Timestamp getAllCommittedTimestamp() const =0
See StorageEngine::getAllCommittedTimestamp
OperationContext Database StringData BSONObj CollectionOptions::ParseKind bool const BSONObj &idIndex Status
Definition: database_impl.cpp:956
virtual Status createGroupedRecordStore(OperationContext *opCtx, StringData ns, StringData ident, const CollectionOptions &options, KVPrefix prefix)
Create a RecordStore that MongoDB considers eligible to share space in an underlying table with other...
Definition: kv_engine.h:129
virtual StatusWith< Timestamp > recoverToStableTimestamp(OperationContext *opCtx)
See StorageEngine::recoverToStableTimestamp
Definition: kv_engine.h:302
virtual bool supportsCappedCollections() const
This must not change over the lifetime of the engine.
Definition: kv_engine.h:213
virtual void alterIdentMetadata(OperationContext *opCtx, StringData ident, const IndexDescriptor *desc)
Definition: kv_engine.h:166
virtual void setInitialDataTimestamp(Timestamp initialDataTimestamp)
See StorageEngine::setInitialDataTimestamp
Definition: kv_engine.h:268
virtual bool hasIdent(OperationContext *opCtx, StringData ident) const =0
virtual SnapshotManager * getSnapshotManager() const
Return the SnapshotManager for this KVEngine or NULL if not supported.
Definition: kv_engine.h:250
virtual int flushAllFiles(OperationContext *opCtx, bool sync)
Definition: kv_engine.h:171
virtual boost::optional< Timestamp > getRecoveryTimestamp() const
See StorageEngine::getRecoveryTimestamp
Definition: kv_engine.h:309
This class allows for the storageEngine to alert the rest of the system about journaled write progres...
Definition: journal_listener.h:48
static const KVPrefix kNotPrefixed
Definition: kv_prefix.h:47
virtual Status createRecordStore(OperationContext *opCtx, StringData ns, StringData ident, const CollectionOptions &options)=0
The create and drop methods on KVEngine are not transactional.
virtual Status createSortedDataInterface(OperationContext *opCtx, StringData ident, const IndexDescriptor *desc)=0
Definition: index_key_validate.h:40
A RecoveryUnit is responsible for ensuring that data is persisted.
Definition: recovery_unit.h:51
virtual Status createGroupedSortedDataInterface(OperationContext *opCtx, StringData ident, const IndexDescriptor *desc, KVPrefix prefix)
Create a SortedDataInterface that MongoDB considers eligible to share space in an underlying table wi...
Definition: kv_engine.h:152
virtual std::unique_ptr< RecordStore > getRecordStore(OperationContext *opCtx, StringData ns, StringData ident, const CollectionOptions &options)=0
Having multiple out for the same ns is a rules violation; Calling on a non-created ident is invalid a...
virtual bool isEphemeral() const =0
Returns true if the KVEngine is ephemeral – that is, it is NOT persistent and all data is lost after...
virtual SortedDataInterface * getSortedDataInterface(OperationContext *opCtx, StringData ident, const IndexDescriptor *desc)=0
virtual bool supportsDBLocking() const
This must not change over the lifetime of the engine.
Definition: kv_engine.h:206
An abstraction used for storing documents in a collection or entries in an index. ...
Definition: record_store.h:282
virtual int64_t getIdentSize(OperationContext *opCtx, StringData ident)=0
virtual void endBackup(OperationContext *opCtx)
See StorageEngine::endBackup for details.
Definition: kv_engine.h:186
virtual bool isCacheUnderPressure(OperationContext *opCtx) const
See StorageEngine::isCacheUnderPressure()
Definition: kv_engine.h:283
virtual bool isDurable() const =0
virtual bool supportsDocLocking() const =0
This must not change over the lifetime of the engine.
virtual void replicationBatchIsComplete() const
See StorageEngine::replicationBatchIsComplete()
Definition: kv_engine.h:335
virtual void setOldestTimestampFromStable()
See StorageEngine::setOldestTimestampFromStable
Definition: kv_engine.h:273
OperationContext Database StringData BSONObj options
Definition: database_impl.cpp:949
virtual Status repairIdent(OperationContext *opCtx, StringData ident)=0
virtual void setCachePressureForTest(int pressure)
See &#39;StorageEngine::setCachePressureForTest()&#39;.
Definition: kv_engine.h:290
A KVPrefix may be prepended to the keys of entries in an underlying KV store.
Definition: kv_prefix.h:44
virtual void setJournalListener(JournalListener *jl)=0
Sets a new JournalListener, which is used to alert the rest of the system about journaled write progr...
Manages snapshots that can be read from at a later time.
Definition: snapshot_manager.h:47
virtual std::vector< std::string > getAllIdents(OperationContext *opCtx) const =0
virtual ~KVEngine()
The destructor will never be called from mongod, but may be called from tests.
Definition: kv_engine.h:342
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
virtual Status beginBackup(OperationContext *opCtx)
See StorageEngine::beginBackup for details.
Definition: kv_engine.h:178
virtual bool supportsDirectoryPerDB() const =0
Returns true if storage engine supports –directoryperdb.
virtual void setOldestTimestamp(Timestamp newOldestTimestamp)
See StorageEngine::setOldestTimestamp
Definition: kv_engine.h:278
virtual std::unique_ptr< RecordStore > getGroupedRecordStore(OperationContext *opCtx, StringData ns, StringData ident, const CollectionOptions &options, KVPrefix prefix)
Get a RecordStore that may share an underlying table with other RecordStores.
Definition: kv_engine.h:76
OperationContext const IndexDescriptor * desc
Definition: index_catalog_impl.cpp:97
virtual RecoveryUnit * newRecoveryUnit()=0
This interface is a work in progress.
Definition: sorted_data_interface.h:64
virtual SortedDataInterface * getGroupedSortedDataInterface(OperationContext *opCtx, StringData ident, const IndexDescriptor *desc, KVPrefix prefix)
Get a SortedDataInterface that may share an underlying table with other SortedDataInterface.
Definition: kv_engine.h:98