Skip to content

Commit

Permalink
SERVER-19551: Fix up the sizeStorer to update only on commit, not opp…
Browse files Browse the repository at this point in the history
…ortunistically, then revert on rollback
  • Loading branch information
martinbligh committed Aug 4, 2015
1 parent 8c8da71 commit 769c713
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 15 deletions.
32 changes: 18 additions & 14 deletions src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1125,10 +1125,10 @@ WiredTigerRecoveryUnit* WiredTigerRecordStore::_getRecoveryUnit(OperationContext
class WiredTigerRecordStore::NumRecordsChange : public RecoveryUnit::Change {
public:
NumRecordsChange(WiredTigerRecordStore* rs, int64_t diff) : _rs(rs), _diff(diff) {}
virtual void commit() {}
virtual void rollback() {
_rs->_numRecords.fetchAndAdd(-_diff);
virtual void commit() {
_rs->_changeNumRecordsCommit(_diff);
}
virtual void rollback() {}

private:
WiredTigerRecordStore* _rs;
Expand All @@ -1137,6 +1137,9 @@ class WiredTigerRecordStore::NumRecordsChange : public RecoveryUnit::Change {

void WiredTigerRecordStore::_changeNumRecords(OperationContext* txn, int64_t diff) {
txn->recoveryUnit()->registerChange(new NumRecordsChange(this, diff));
}

void WiredTigerRecordStore::_changeNumRecordsCommit(int64_t diff) {
if (diff > 0) {
if (_numRecords.fetchAndAdd(diff) < diff)
_numRecords.store(diff);
Expand All @@ -1147,24 +1150,25 @@ void WiredTigerRecordStore::_changeNumRecords(OperationContext* txn, int64_t dif

class WiredTigerRecordStore::DataSizeChange : public RecoveryUnit::Change {
public:
DataSizeChange(WiredTigerRecordStore* rs, int amount) : _rs(rs), _amount(amount) {}
virtual void commit() {}
virtual void rollback() {
_rs->_increaseDataSize(NULL, -_amount);
DataSizeChange(WiredTigerRecordStore* rs, int64_t diff) : _rs(rs), _diff(diff) {}
virtual void commit() {
_rs->_increaseDataSizeCommit(_diff);
}
virtual void rollback() {}

private:
WiredTigerRecordStore* _rs;
bool _amount;
int64_t _diff;
};

void WiredTigerRecordStore::_increaseDataSize(OperationContext* txn, int amount) {
if (txn)
txn->recoveryUnit()->registerChange(new DataSizeChange(this, amount));
void WiredTigerRecordStore::_increaseDataSize(OperationContext* txn, int64_t diff) {
txn->recoveryUnit()->registerChange(new DataSizeChange(this, diff));
}

if (_dataSize.fetchAndAdd(amount) < 0) {
if (amount > 0) {
_dataSize.store(amount);
void WiredTigerRecordStore::_increaseDataSizeCommit(int64_t diff) {
if (_dataSize.fetchAndAdd(diff) < 0) {
if (diff > 0) {
_dataSize.store(diff);
} else {
_dataSize.store(0);
}
Expand Down
4 changes: 3 additions & 1 deletion src/mongo/db/storage/wiredtiger/wiredtiger_record_store.h
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,9 @@ class WiredTigerRecordStore : public RecordStore {
void _setId(RecordId loc);
bool cappedAndNeedDelete() const;
void _changeNumRecords(OperationContext* txn, int64_t diff);
void _increaseDataSize(OperationContext* txn, int amount);
void _changeNumRecordsCommit(int64_t diff);
void _increaseDataSize(OperationContext* txn, int64_t diff);
void _increaseDataSizeCommit(int64_t diff);
RecordData _getData(const WiredTigerCursor& cursor) const;
StatusWith<RecordId> extractAndCheckLocForOplog(const char* data, int len);
void _oplogSetStartHack(WiredTigerRecoveryUnit* wru) const;
Expand Down

0 comments on commit 769c713

Please sign in to comment.