37 #include <wiredtiger.h> 46 #include "mongo/platform/atomic_word.h" 47 #include "mongo/stdx/condition_variable.h" 48 #include "mongo/stdx/mutex.h" 49 #include "mongo/stdx/thread.h" 50 #include "mongo/util/fail_point_service.h" 57 #define WT_OP_CHECK(x) (((MONGO_FAIL_POINT(WTWriteConflictException))) ? (WT_ROLLBACK) : (x)) 62 #define WT_READ_CHECK(x) \ 63 (((MONGO_FAIL_POINT(WTWriteConflictExceptionForReads))) ? (WT_ROLLBACK) : (x)) 68 class WiredTigerSessionCache;
69 class WiredTigerSizeStorer;
101 StringData extraStrings,
124 virtual const char*
name()
const;
133 BSONObjBuilder* extraInfo = NULL,
134 int infoLevel = 0)
const;
145 std::vector<Record>* records,
146 std::vector<Timestamp>* timestamps,
150 OperationContext*
opCtx,
const char*
data,
int len, Timestamp timestamp,
bool enforceQuota);
154 const Timestamp* timestamps,
159 const RecordId& oldLocation,
170 const char* damageSource,
171 const mutablebson::DamageVector& damages);
173 virtual std::unique_ptr<SeekableRecordCursor>
getCursor(OperationContext*
opCtx,
174 bool forward)
const = 0;
179 OperationContext*
opCtx, StringData extraConfig)
const = 0;
181 std::vector<std::unique_ptr<RecordCursor>>
getManyCursors(OperationContext*
opCtx)
const final;
205 BSONObjBuilder* output);
208 BSONObjBuilder* result,
211 virtual Status touch(OperationContext*
opCtx, BSONObjBuilder* output)
const;
216 const RecordId& startingPosition)
const;
219 const Timestamp& opTime,
286 virtual RecordId
getKey(WT_CURSOR* cursor)
const = 0;
288 virtual void setKey(WT_CURSOR* cursor, RecordId
id)
const = 0;
293 class NumRecordsChange;
294 class DataSizeChange;
300 const Timestamp* timestamps,
315 const RecordId& firstKey,
316 bool forTruncate)
const;
367 std::shared_ptr<WiredTigerSizeStorer::SizeInfo>
_sizeInfo;
378 OperationContext*
opCtx,
381 virtual std::unique_ptr<SeekableRecordCursor>
getCursor(OperationContext*
opCtx,
382 bool forward)
const override;
385 OperationContext*
opCtx, StringData extraConfig)
const override;
388 virtual RecordId
getKey(WT_CURSOR* cursor)
const;
390 virtual void setKey(WT_CURSOR* cursor, RecordId
id)
const;
396 OperationContext*
opCtx,
400 virtual std::unique_ptr<SeekableRecordCursor>
getCursor(OperationContext*
opCtx,
401 bool forward)
const override;
404 OperationContext*
opCtx, StringData extraConfig)
const override;
411 virtual RecordId
getKey(WT_CURSOR* cursor)
const;
413 virtual void setKey(WT_CURSOR* cursor, RecordId
id)
const;
425 boost::optional<Record>
next();
427 boost::optional<Record>
seekExact(
const RecordId&
id);
440 virtual RecordId
getKey(WT_CURSOR* cursor)
const = 0;
442 virtual void setKey(WT_CURSOR* cursor, RecordId
id)
const = 0;
451 virtual bool hasWrongPrefix(WT_CURSOR* cursor, RecordId*
id)
const = 0;
474 bool forward =
true);
477 virtual RecordId
getKey(WT_CURSOR* cursor)
const override;
479 virtual void setKey(WT_CURSOR* cursor, RecordId
id)
const override;
488 virtual bool hasWrongPrefix(WT_CURSOR* cursor, RecordId*
id)
const override;
498 bool forward =
true);
501 virtual RecordId
getKey(WT_CURSOR* cursor)
const override;
503 virtual void setKey(WT_CURSOR* cursor, RecordId
id)
const override;
512 virtual bool hasWrongPrefix(WT_CURSOR* cursor, RecordId*
id)
const override;
virtual void setKey(WT_CURSOR *cursor, RecordId id) const override
Definition: wiredtiger_record_store.cpp:2136
Definition: record_store.h:665
int64_t _cappedMaxSize
Definition: wiredtiger_record_store.h:350
void setCappedCallback(CappedCallback *cb)
Definition: wiredtiger_record_store.h:231
int64_t cappedDeleteAsNeeded_inlock(OperationContext *opCtx, const RecordId &justInserted)
Definition: wiredtiger_record_store.cpp:974
AtomicLockStats stats
Definition: lock_state.cpp:92
bool isEphemeral
Definition: wiredtiger_record_store.h:109
virtual long long dataSize(OperationContext *opCtx) const
The dataSize is an approximation of the sum of the sizes (in bytes) of the documents or entries in th...
Definition: wiredtiger_record_store.cpp:756
ValidateCmdLevel
Definition: record_store.h:93
virtual std::unique_ptr< RecordCursor > getRandomCursorWithOptions(OperationContext *opCtx, StringData extraConfig) const =0
void reclaimOplog(OperationContext *opCtx)
Definition: wiredtiger_record_store.cpp:1153
WiredTigerRecordStorePrefixedCursor(OperationContext *opCtx, const WiredTigerRecordStore &rs, KVPrefix prefix, bool forward=true)
Definition: wiredtiger_record_store.cpp:2130
const int64_t _cappedMaxDocs
Definition: wiredtiger_record_store.h:352
int64_t cappedMaxDocs
Definition: wiredtiger_record_store.h:111
virtual bool compactsInPlace() const
Does compact() leave RecordIds alone or can they change.
Definition: wiredtiger_record_store.h:188
virtual void cappedTruncateAfter(OperationContext *opCtx, RecordId end, bool inclusive)
Truncate documents newer than the document at 'end' from the capped collection.
Definition: wiredtiger_record_store.cpp:1744
virtual StatusWith< RecordId > insertRecord(OperationContext *opCtx, const char *data, int len, Timestamp timestamp, bool enforceQuota)
Definition: wiredtiger_record_store.cpp:1306
void notifyCappedWaitersIfNeeded()
Definition: wiredtiger_record_store.cpp:1327
Definition: wiredtiger_record_store.h:73
virtual ~WiredTigerRecordStore()
Definition: wiredtiger_record_store.cpp:670
CappedCallback * _cappedCallback
Definition: wiredtiger_record_store.h:356
Definition: record_store.h:673
Definition: wiredtiger_record_store.h:493
void setSizeStorer(WiredTigerSizeStorer *ss)
Definition: wiredtiger_record_store.h:251
const bool _isOplog
Definition: wiredtiger_record_store.h:349
bool isVisible(const RecordId &id)
virtual std::unique_ptr< SeekableRecordCursor > getCursor(OperationContext *opCtx, bool forward) const =0
Returns a new cursor over this record store.
PrefixedWiredTigerRecordStore(WiredTigerKVEngine *kvEngine, OperationContext *opCtx, Params params, KVPrefix prefix)
Definition: wiredtiger_record_store.cpp:2089
Definition: collection_options.h:57
The WiredTigerSizeStorer class serves as a write buffer to durably store size information for MongoDB...
Definition: wiredtiger_size_storer.h:57
const std::string & getIdent() const override
Definition: wiredtiger_record_store.h:243
virtual boost::optional< RecordId > oplogStartHack(OperationContext *opCtx, const RecordId &startingPosition) const
Return the RecordId of an oplog entry as close to startingPosition as possible without being higher.
Definition: wiredtiger_record_store.cpp:1641
virtual void deleteRecord(OperationContext *opCtx, const RecordId &id)
Definition: wiredtiger_record_store.cpp:843
AtomicInt64 _cappedSleepMS
Definition: wiredtiger_record_store.h:355
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
Status _insertRecords(OperationContext *opCtx, Record *records, const Timestamp *timestamps, size_t nRecords)
Definition: wiredtiger_record_store.cpp:1226
virtual bool hasWrongPrefix(WT_CURSOR *cursor, RecordId *id) const override
Callers must have already checked the return value of a positioning method against 'WT_NOTFOUND'.
Definition: wiredtiger_record_store.cpp:2080
const std::string _engineName
Definition: wiredtiger_record_store.h:343
const std::string _uri
Definition: wiredtiger_record_store.h:339
virtual bool isInRecordIdOrder() const override
Does the RecordStore cursor retrieve its document in RecordId Order?
Definition: wiredtiger_record_store.h:197
const WiredTigerRecordStore & _rs
Definition: wiredtiger_record_store.h:458
virtual void initCursorToBeginning() override
Called when restoring a cursor that has not been advanced.
Definition: wiredtiger_record_store.cpp:2157
A replacement for the Record class.
Definition: record_data.h:43
StandardWiredTigerRecordStore(WiredTigerKVEngine *kvEngine, OperationContext *opCtx, Params params)
Definition: wiredtiger_record_store.cpp:2027
Definition: wiredtiger_record_store.h:393
virtual bool hasWrongPrefix(WT_CURSOR *cursor, RecordId *id) const =0
Callers must have already checked the return value of a positioning method against 'WT_NOTFOUND'.
MONGO_FAIL_POINT_DECLARE(WTPrepareConflictForReads)
bool cappedAndNeedDelete() const
Definition: wiredtiger_record_store.cpp:870
OplogStones * oplogStones()
Definition: wiredtiger_record_store.h:281
virtual bool updateWithDamagesSupported() const
Definition: wiredtiger_record_store.cpp:1416
virtual void setKey(WT_CURSOR *cursor, RecordId id) const
Definition: wiredtiger_record_store.cpp:2038
AtomicInt64 _cappedSleep
Definition: wiredtiger_record_store.h:354
OperationContext * _opCtx
Definition: wiredtiger_record_store.h:459
virtual RecordId getKey(WT_CURSOR *cursor) const override
Definition: wiredtiger_record_store.cpp:2140
virtual RecordId getKey(WT_CURSOR *cursor) const
Definition: wiredtiger_record_store.cpp:2118
This is so when a RecordStore is validating all records it can call back to someone to check if a rec...
Definition: record_store.h:687
Definition: wiredtiger_record_store.h:375
Definition: record_store.h:78
int64_t cappedMaxSize() const
Definition: wiredtiger_record_store.cpp:773
const bool _isCapped
Definition: wiredtiger_record_store.h:345
stdx::timed_mutex _cappedDeleterMutex
Definition: wiredtiger_record_store.h:362
CappedCallback * cappedCallback
Definition: wiredtiger_record_store.h:112
int64_t cappedDeleteAsNeeded(OperationContext *opCtx, const RecordId &justInserted)
Definition: wiredtiger_record_store.cpp:883
void _positionAtFirstRecordId(OperationContext *opCtx, WT_CURSOR *cursor, const RecordId &firstKey, bool forTruncate) const
Position the cursor at the first key.
Definition: wiredtiger_record_store.cpp:946
virtual void initCursorToBeginning()=0
Called when restoring a cursor that has not been advanced.
KVPrefix _prefix
Definition: wiredtiger_record_store.h:416
bool inShutdown() const
Definition: wiredtiger_record_store.cpp:751
bool inclusive
Definition: btree_interface.cpp:335
Definition: collection.h:77
Allows inserting a Record "in-place" without creating a copy ahead of time.
Definition: record_store.h:62
virtual RecordId getKey(WT_CURSOR *cursor) const override
Definition: wiredtiger_record_store.cpp:2073
const std::string & getURI() const
Definition: wiredtiger_record_store.h:239
virtual Status touch(OperationContext *opCtx, BSONObjBuilder *output) const
Load all data into cache.
Definition: wiredtiger_record_store.cpp:1622
std::shared_ptr< void > data
Definition: ephemeral_for_test_record_store_test.cpp:74
virtual RecordData dataFor(OperationContext *opCtx, const RecordId &id) const
Get the RecordData at loc, which must exist.
Definition: wiredtiger_record_store.cpp:811
void reattachToOperationContext(OperationContext *opCtx)
Reattaches to the OperationContext and reacquires any storage-engine state.
Definition: wiredtiger_record_store.cpp:2019
Definition: wiredtiger_record_store.h:419
void _increaseDataSize(OperationContext *opCtx, int64_t amount)
Definition: wiredtiger_record_store.cpp:1729
The data items stored in a RecordStore.
Definition: record_store.h:88
Definition: wiredtiger_kv_engine.h:66
std::unique_ptr< RecordStore > rs
Definition: kv_engine_test_timestamps.cpp:207
WiredTigerKVEngine * _kvEngine
Definition: wiredtiger_record_store.h:368
bool isReadOnly
Definition: wiredtiger_record_store.h:114
std::shared_ptr< OplogStones > _oplogStones
Definition: wiredtiger_record_store.h:371
bool isOpHidden_forTest(const RecordId &id) const
Definition: wiredtiger_record_store.cpp:1315
virtual std::unique_ptr< SeekableRecordCursor > getCursor(OperationContext *opCtx, bool forward) const override
Returns a new cursor over this record store.
Definition: wiredtiger_record_store.cpp:2042
Definition: wiredtiger_record_store.h:470
Definition: wiredtiger_record_store_oplog_stones.h:46
virtual const char * name() const
Definition: wiredtiger_record_store.cpp:747
RecordId _lastReturnedId
Definition: wiredtiger_record_store.h:464
bool _eof
Definition: wiredtiger_record_store.h:463
This is a smart pointer that wraps a WT_CURSOR and knows how to obtain and get from pool.
Definition: wiredtiger_recovery_unit.h:187
virtual StatusWith< RecordData > updateWithDamages(OperationContext *opCtx, const RecordId &id, const RecordData &oldRec, const char *damageSource, const mutablebson::DamageVector &damages)
Updates the record positioned at 'loc' in-place using the deltas described by 'damages'.
Definition: wiredtiger_record_store.cpp:1420
virtual void updateStatsAfterRepair(OperationContext *opCtx, long long numRecords, long long dataSize)
Called after a repair operation is run with the recomputed numRecords and dataSize.
Definition: wiredtiger_record_store.cpp:1667
AtomicInt64 _nextIdNum
Definition: wiredtiger_record_store.h:364
OperationContext Database StringData CollectionOptions bool const BSONObj &idIndex Status
Definition: database_impl.cpp:955
virtual void setKey(WT_CURSOR *cursor, RecordId id) const override
Definition: wiredtiger_record_store.cpp:2069
Status updateCappedSize(OperationContext *opCtx, long long cappedSize) final
used to support online change oplog size.
Definition: wiredtiger_record_store.cpp:2216
void detachFromOperationContext()
Detaches from the OperationContext and releases any storage-engine state.
Definition: wiredtiger_record_store.cpp:2014
void waitForAllEarlierOplogWritesToBeVisible(OperationContext *opCtx) const override
Waits for all writes that completed before this call to be visible to forward scans.
Definition: wiredtiger_record_store.cpp:1630
bool _skipNextAdvance
Definition: wiredtiger_record_store.h:461
virtual void setKey(WT_CURSOR *cursor, RecordId id) const =0
Definition: index_key_validate.h:40
virtual Status oplogDiskLocRegister(OperationContext *opCtx, const Timestamp &opTime, bool orderedCommit)
When we write to an oplog, we call this so that if the storage engine supports doc locking,...
Definition: wiredtiger_record_store.cpp:1848
virtual void postConstructorInit(OperationContext *opCtx)
Definition: wiredtiger_record_store.cpp:688
virtual std::unique_ptr< RecordCursor > getRandomCursorWithOptions(OperationContext *opCtx, StringData extraConfig) const override
Definition: wiredtiger_record_store.cpp:2060
KVPrefix _prefix
Definition: wiredtiger_record_store.h:517
WiredTigerRecordStoreStandardCursor(OperationContext *opCtx, const WiredTigerRecordStore &rs, bool forward=true)
Definition: wiredtiger_record_store.cpp:2065
WiredTigerRecordStore(WiredTigerKVEngine *kvEngine, OperationContext *opCtx, Params params)
Definition: wiredtiger_record_store.cpp:621
std::vector< std::unique_ptr< RecordCursor > > getManyCursors(OperationContext *opCtx) const final
Returns many RecordCursors that partition the RecordStore into many disjoint sets.
Definition: wiredtiger_record_store.cpp:1462
bool restore()
Recovers from potential state changes in underlying data.
Definition: wiredtiger_record_store.cpp:1955
const int64_t _cappedMaxSizeSlack
Definition: wiredtiger_record_store.h:351
void save()
Prepares for state changes in underlying data in a way that allows the cursor's current position to b...
Definition: wiredtiger_record_store.cpp:1940
stdx::mutex _cappedCallbackMutex
Definition: wiredtiger_record_store.h:358
bool haveCappedWaiters()
Definition: wiredtiger_record_store.cpp:1322
virtual void setKey(WT_CURSOR *cursor, RecordId id) const
Definition: wiredtiger_record_store.cpp:2126
An abstraction used for storing documents in a collection or entries in an index.
Definition: record_store.h:282
static StatusWith< std::string > parseOptionsField(const BSONObj options)
Parses collections options for wired tiger configuration string for table creation.
Definition: wiredtiger_record_store.cpp:457
When a capped collection is modified (delete/insert/etc) then certain notifications need to be made,...
Definition: capped_callback.h:44
RecordId _cappedFirstRecord
Definition: wiredtiger_record_store.h:353
virtual void setKey(WT_CURSOR *cursor, RecordId id) const =0
bool yieldAndAwaitOplogDeletionRequest(OperationContext *opCtx)
Definition: wiredtiger_record_store.cpp:1125
virtual const std::string & ns() const
Definition: record_store.h:295
void _changeNumRecords(OperationContext *opCtx, int64_t diff)
Adjusts the record count and data size metadata for this record store, respectively.
Definition: wiredtiger_record_store.cpp:1706
std::unique_ptr< RecordCursor > getRandomCursor(OperationContext *opCtx) const final
Constructs a cursor over a record store that returns documents in a randomized order,...
Definition: wiredtiger_record_store.cpp:1456
virtual Status insertRecords(OperationContext *opCtx, std::vector< Record > *records, std::vector< Timestamp > *timestamps, bool enforceQuota)
Definition: wiredtiger_record_store.cpp:1219
const uint64_t _tableId
Definition: wiredtiger_record_store.h:340
uint64_t tableId() const
Definition: wiredtiger_record_store.h:247
std::shared_ptr< WiredTigerSizeStorer::SizeInfo > _sizeInfo
Definition: wiredtiger_record_store.h:367
virtual Status updateRecord(OperationContext *opCtx, const RecordId &oldLocation, const char *data, int len, bool enforceQuota, UpdateNotifier *notifier)
Definition: wiredtiger_record_store.cpp:1377
virtual bool findRecord(OperationContext *opCtx, const RecordId &id, RecordData *out) const
Definition: wiredtiger_record_store.cpp:825
virtual RecordId getKey(WT_CURSOR *cursor) const
Definition: wiredtiger_record_store.cpp:2032
std::string engineName
Definition: wiredtiger_record_store.h:107
virtual long long numRecords(OperationContext *opCtx) const
Total number of record in the RecordStore.
Definition: wiredtiger_record_store.cpp:760
const std::string kWiredTigerEngineName
Definition: wiredtiger_record_store.cpp:95
Definition: wiredtiger_record_store.h:104
boost::optional< Record > next()
Moves forward and returns the new data or boost::none if there is no more data.
Definition: wiredtiger_record_store.cpp:1873
boost::optional< WiredTigerCursor > _cursor
Definition: wiredtiger_record_store.h:462
WiredTigerRecordStoreCursorBase(OperationContext *opCtx, const WiredTigerRecordStore &rs, bool forward)
Definition: wiredtiger_record_store.cpp:1866
void saveUnpositioned()
Prepares for state changes in underlying data without necessarily saving the current state.
Definition: wiredtiger_record_store.cpp:1950
virtual Status insertRecordsWithDocWriter(OperationContext *opCtx, const DocWriter *const *docs, const Timestamp *timestamps, size_t nDocs, RecordId *idsOut)
Inserts nDocs documents into this RecordStore using the DocWriter interface.
Definition: wiredtiger_record_store.cpp:1335
virtual RecordId getKey(WT_CURSOR *cursor) const =0
int _cappedDeleteCheckCount
Definition: wiredtiger_record_store.h:361
boost::optional< Record > seekExact(const RecordId &id)
Seeks to a Record with the provided id.
Definition: wiredtiger_record_store.cpp:1918
Adds explicit seeking of records.
Definition: record_store.h:236
virtual int64_t storageSize(OperationContext *opCtx, BSONObjBuilder *extraInfo=NULL, int infoLevel=0) const
Definition: wiredtiger_record_store.cpp:778
virtual RecordId getKey(WT_CURSOR *cursor) const =0
virtual bool hasWrongPrefix(WT_CURSOR *cursor, RecordId *id) const override
Callers must have already checked the return value of a positioning method against 'WT_NOTFOUND'.
Definition: wiredtiger_record_store.cpp:2149
WiredTigerSizeStorer * _sizeStorer
Definition: wiredtiger_record_store.h:366
virtual Status validate(OperationContext *opCtx, ValidateCmdLevel level, ValidateAdaptor *adaptor, ValidateResults *results, BSONObjBuilder *output)
Definition: wiredtiger_record_store.cpp:1507
const bool _isEphemeral
Definition: wiredtiger_record_store.h:347
Definition: collection.h:97
A KVPrefix may be prepended to the keys of entries in an underlying KV store.
Definition: kv_prefix.h:44
virtual std::unique_ptr< RecordCursor > getRandomCursorWithOptions(OperationContext *opCtx, StringData extraConfig) const override
Definition: wiredtiger_record_store.cpp:2113
static StatusWith< std::string > generateCreateString(const std::string &engineName, StringData ns, const CollectionOptions &options, StringData extraStrings, bool prefixed)
Creates a configuration string suitable for 'config' parameter in WT_SESSION::create().
Definition: wiredtiger_record_store.cpp:552
int64_t cappedMaxDocs() const
Definition: wiredtiger_record_store.cpp:768
bool isCapped
Definition: wiredtiger_record_store.h:108
virtual void appendCustomStats(OperationContext *opCtx, BSONObjBuilder *result, double scale) const
Definition: wiredtiger_record_store.cpp:1575
virtual bool isCapped() const
Definition: wiredtiger_record_store.cpp:764
static WiredTigerRecoveryUnit * _getRecoveryUnit(OperationContext *opCtx)
Definition: wiredtiger_record_store.cpp:1688
virtual Status compact(OperationContext *opCtx, RecordStoreCompactAdaptor *adaptor, const CompactOptions *options, CompactStats *stats)
Attempt to reduce the storage space used by this RecordStore.
Definition: wiredtiger_record_store.cpp:1491
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
const bool _forward
Definition: wiredtiger_record_store.h:460
int64_t cappedMaxSize
Definition: wiredtiger_record_store.h:110
virtual KVPrefix getPrefix() const
Definition: wiredtiger_record_store.h:406
StringData ns
Definition: wiredtiger_record_store.h:105
WiredTigerSizeStorer * sizeStorer
Definition: wiredtiger_record_store.h:113
bool _shuttingDown
Definition: wiredtiger_record_store.h:357
virtual void initCursorToBeginning()
Called when restoring a cursor that has not been advanced.
Definition: wiredtiger_record_store.h:490
virtual Status truncate(OperationContext *opCtx)
removes all Records
Definition: wiredtiger_record_store.cpp:1469
Definition: wiredtiger_recovery_unit.h:52
RecordData _getData(const WiredTigerCursor &cursor) const
Definition: wiredtiger_record_store.cpp:804
virtual std::unique_ptr< SeekableRecordCursor > getCursor(OperationContext *opCtx, bool forward) const override
Returns a new cursor over this record store.
Definition: wiredtiger_record_store.cpp:2095
virtual bool compactSupported() const
does this RecordStore support the compact operation?
Definition: wiredtiger_record_store.h:185
std::string uri
Definition: wiredtiger_record_store.h:106
RecordId _nextId()
Definition: wiredtiger_record_store.cpp:1681