Skip to content

Commit 2ca0b90

Browse files
committed
use insert for update in WiredTigerRecordStore
this prevents repositioning the cursor
1 parent a204654 commit 2ca0b90

File tree

8 files changed

+55
-29
lines changed

8 files changed

+55
-29
lines changed

src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ namespace {
219219
if (!s.isOK())
220220
return s;
221221

222-
WiredTigerCursor curwrap(_uri, _instanceId, txn);
222+
WiredTigerCursor curwrap(_uri, _instanceId, false, txn);
223223
curwrap.assertInActiveTxn();
224224
WT_CURSOR *c = curwrap.get();
225225

@@ -233,7 +233,7 @@ namespace {
233233
invariant(loc.isNormal());
234234
dassert(!hasFieldNames(key));
235235

236-
WiredTigerCursor curwrap(_uri, _instanceId, txn);
236+
WiredTigerCursor curwrap(_uri, _instanceId, false, txn);
237237
curwrap.assertInActiveTxn();
238238
WT_CURSOR *c = curwrap.get();
239239
invariant( c );
@@ -312,7 +312,7 @@ namespace {
312312
invariant(!hasFieldNames(key));
313313
invariant(unique());
314314

315-
WiredTigerCursor curwrap(_uri, _instanceId, txn);
315+
WiredTigerCursor curwrap(_uri, _instanceId, false, txn);
316316
WT_CURSOR *c = curwrap.get();
317317

318318
if ( isDup(c, key, loc) )
@@ -321,7 +321,7 @@ namespace {
321321
}
322322

323323
bool WiredTigerIndex::isEmpty(OperationContext* txn) {
324-
WiredTigerCursor curwrap(_uri, _instanceId, txn);
324+
WiredTigerCursor curwrap(_uri, _instanceId, false, txn);
325325
WT_CURSOR *c = curwrap.get();
326326
if (!c)
327327
return true;
@@ -565,7 +565,7 @@ namespace {
565565
OperationContext *txn,
566566
bool forward)
567567
: _txn(txn),
568-
_cursor(idx.uri(), idx.instanceId(), txn ),
568+
_cursor(idx.uri(), idx.instanceId(), false, txn ),
569569
_idx(idx),
570570
_forward(forward),
571571
_eof(true),

src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ namespace mongo {
464464

465465
std::vector<std::string> WiredTigerKVEngine::getAllIdents( OperationContext* opCtx ) const {
466466
std::vector<std::string> all;
467-
WiredTigerCursor cursor( "metadata:", WiredTigerSession::kMetadataCursorId, opCtx );
467+
WiredTigerCursor cursor( "metadata:", WiredTigerSession::kMetadataCursorId, false, opCtx );
468468
WT_CURSOR* c = cursor.get();
469469
if ( !c )
470470
return all;

src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ namespace {
297297

298298
RecordData WiredTigerRecordStore::dataFor(OperationContext* txn, const RecordId& loc) const {
299299
// ownership passes to the shared_array created below
300-
WiredTigerCursor curwrap( _uri, _instanceId, txn);
300+
WiredTigerCursor curwrap( _uri, _instanceId, true, txn);
301301
WT_CURSOR *c = curwrap.get();
302302
invariant( c );
303303
c->set_key(c, _makeKey(loc));
@@ -311,7 +311,7 @@ namespace {
311311

312312
bool WiredTigerRecordStore::findRecord( OperationContext* txn,
313313
const RecordId& loc, RecordData* out ) const {
314-
WiredTigerCursor curwrap( _uri, _instanceId, txn);
314+
WiredTigerCursor curwrap( _uri, _instanceId, true, txn);
315315
WT_CURSOR *c = curwrap.get();
316316
invariant( c );
317317
c->set_key(c, _makeKey(loc));
@@ -324,7 +324,7 @@ namespace {
324324
}
325325

326326
void WiredTigerRecordStore::deleteRecord( OperationContext* txn, const RecordId& loc ) {
327-
WiredTigerCursor cursor( _uri, _instanceId, txn );
327+
WiredTigerCursor cursor( _uri, _instanceId, true, txn );
328328
cursor.assertInActiveTxn();
329329
WT_CURSOR *c = cursor.get();
330330
c->set_key(c, _makeKey(loc));
@@ -392,7 +392,7 @@ namespace {
392392
docsOverCap = numRecords - _cappedMaxDocs;
393393

394394
try {
395-
WiredTigerCursor curwrap( _uri, _instanceId, txn);
395+
WiredTigerCursor curwrap( _uri, _instanceId, true, txn);
396396
WT_CURSOR *c = curwrap.get();
397397
RecordId oldest;
398398
int ret = 0;
@@ -488,7 +488,7 @@ namespace {
488488
loc = _nextId();
489489
}
490490

491-
WiredTigerCursor curwrap( _uri, _instanceId, txn);
491+
WiredTigerCursor curwrap( _uri, _instanceId, true, txn);
492492
curwrap.assertInActiveTxn();
493493
WT_CURSOR *c = curwrap.get();
494494
invariant( c );
@@ -544,7 +544,7 @@ namespace {
544544
int len,
545545
bool enforceQuota,
546546
UpdateMoveNotifier* notifier ) {
547-
WiredTigerCursor curwrap( _uri, _instanceId, txn);
547+
WiredTigerCursor curwrap( _uri, _instanceId, true, txn);
548548
curwrap.assertInActiveTxn();
549549
WT_CURSOR *c = curwrap.get();
550550
invariant( c );
@@ -561,7 +561,7 @@ namespace {
561561
c->set_key(c, _makeKey(loc));
562562
WiredTigerItem value(data, len);
563563
c->set_value(c, value.Get());
564-
ret = c->update(c);
564+
ret = c->insert(c);
565565
invariantWTOK(ret);
566566

567567
_increaseDataSize(txn, len - old_length);
@@ -842,7 +842,7 @@ namespace {
842842
_oplogSetStartHack( wru );
843843
}
844844

845-
WiredTigerCursor cursor(_uri, _instanceId, txn);
845+
WiredTigerCursor cursor(_uri, _instanceId, true, txn);
846846
WT_CURSOR* c = cursor.get();
847847

848848
int cmp;
@@ -942,7 +942,7 @@ namespace {
942942
_txn( txn ),
943943
_forward( dir == CollectionScanParams::FORWARD ),
944944
_forParallelCollectionScan( forParallelCollectionScan ),
945-
_cursor( new WiredTigerCursor( rs.getURI(), rs.instanceId(), txn ) ),
945+
_cursor( new WiredTigerCursor( rs.getURI(), rs.instanceId(), true, txn ) ),
946946
_eof(false),
947947
_readUntilForOplog(WiredTigerRecoveryUnit::get(txn)->getOplogReadTill()) {
948948
RS_ITERATOR_TRACE("start");
@@ -1111,7 +1111,7 @@ namespace {
11111111
// parallel collection scan or something
11121112
needRestore = true;
11131113
_savedRecoveryUnit = txn->recoveryUnit();
1114-
_cursor.reset( new WiredTigerCursor( _rs.getURI(), _rs.instanceId(), txn ) );
1114+
_cursor.reset( new WiredTigerCursor( _rs.getURI(), _rs.instanceId(), true, txn ) );
11151115
_forParallelCollectionScan = false; // we only do this the first time
11161116
}
11171117

src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -243,19 +243,28 @@ namespace mongo {
243243

244244
// ---------------------
245245

246-
WiredTigerCursor::WiredTigerCursor(const std::string& uri, uint64_t id, WiredTigerRecoveryUnit* ru) {
247-
_init( uri, id, ru );
246+
WiredTigerCursor::WiredTigerCursor(const std::string& uri,
247+
uint64_t id,
248+
bool forRecordStore,
249+
WiredTigerRecoveryUnit* ru) {
250+
_init( uri, id, forRecordStore, ru );
248251
}
249252

250-
WiredTigerCursor::WiredTigerCursor(const std::string& uri, uint64_t id, OperationContext* txn) {
251-
_init( uri, id, WiredTigerRecoveryUnit::get( txn ) );
253+
WiredTigerCursor::WiredTigerCursor(const std::string& uri,
254+
uint64_t id,
255+
bool forRecordStore,
256+
OperationContext* txn) {
257+
_init( uri, id, forRecordStore, WiredTigerRecoveryUnit::get( txn ) );
252258
}
253259

254-
void WiredTigerCursor::_init( const std::string& uri, uint64_t id, WiredTigerRecoveryUnit* ru ) {
260+
void WiredTigerCursor::_init( const std::string& uri,
261+
uint64_t id,
262+
bool forRecordStore,
263+
WiredTigerRecoveryUnit* ru ) {
255264
_uriID = id;
256265
_ru = ru;
257266
_session = _ru->getSession();
258-
_cursor = _session->getCursor( uri, id );
267+
_cursor = _session->getCursor( uri, id, forRecordStore );
259268
if ( !_cursor ) {
260269
error() << "no cursor for uri: " << uri;
261270
}

src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,14 @@ namespace mongo {
121121
*/
122122
class WiredTigerCursor {
123123
public:
124-
WiredTigerCursor(const std::string& uri, uint64_t uriID, OperationContext* txn);
125-
WiredTigerCursor(const std::string& uri, uint64_t uriID, WiredTigerRecoveryUnit* ru);
124+
WiredTigerCursor(const std::string& uri,
125+
uint64_t uriID,
126+
bool forRecordStore,
127+
OperationContext* txn);
128+
WiredTigerCursor(const std::string& uri,
129+
uint64_t uriID,
130+
bool forRecordStore,
131+
WiredTigerRecoveryUnit* ru);
126132
~WiredTigerCursor();
127133

128134

@@ -141,7 +147,10 @@ namespace mongo {
141147
void assertInActiveTxn() const { _ru->assertInActiveTxn(); }
142148

143149
private:
144-
void _init( const std::string& uri, uint64_t uriID, WiredTigerRecoveryUnit* ru );
150+
void _init( const std::string& uri,
151+
uint64_t uriID,
152+
bool forRecordStore,
153+
WiredTigerRecoveryUnit* ru );
145154

146155
uint64_t _uriID;
147156
WiredTigerRecoveryUnit* _ru; // not owned

src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ namespace mongo {
5656
}
5757
}
5858

59-
WT_CURSOR* WiredTigerSession::getCursor(const std::string& uri, uint64_t id) {
59+
WT_CURSOR* WiredTigerSession::getCursor(const std::string& uri,
60+
uint64_t id,
61+
bool forRecordStore) {
6062
{
6163
Cursors& cursors = _curmap[id];
6264
if ( !cursors.empty() ) {
@@ -67,7 +69,11 @@ namespace mongo {
6769
}
6870
}
6971
WT_CURSOR* c = NULL;
70-
int ret = _session->open_cursor(_session, uri.c_str(), NULL, "overwrite=false", &c);
72+
int ret = _session->open_cursor(_session,
73+
uri.c_str(),
74+
NULL,
75+
forRecordStore ? "" : "overwrite=false",
76+
&c);
7177
if (ret != ENOENT)
7278
invariantWTOK(ret);
7379
if ( c ) _cursorsOut++;

src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ namespace mongo {
7171

7272
WT_SESSION* getSession() const { return _session; }
7373

74-
WT_CURSOR* getCursor(const std::string& uri, uint64_t id);
74+
WT_CURSOR* getCursor(const std::string& uri,
75+
uint64_t id,
76+
bool forRecordStore);
7577
void releaseCursor(uint64_t id, WT_CURSOR *cursor);
7678

7779
void closeAllCursors();

src/mongo/db/storage/wiredtiger/wiredtiger_util.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ namespace mongo {
100100
StatusWith<std::string> WiredTigerUtil::getMetadata(OperationContext* opCtx,
101101
const StringData& uri) {
102102
invariant(opCtx);
103-
WiredTigerCursor curwrap("metadata:", WiredTigerSession::kMetadataCursorId, opCtx);
103+
WiredTigerCursor curwrap("metadata:", WiredTigerSession::kMetadataCursorId, false, opCtx);
104104
WT_CURSOR* cursor = curwrap.get();
105105
invariant(cursor);
106106
std::string strUri = uri.toString();

0 commit comments

Comments
 (0)