Skip to content

Commit cab4356

Browse files
committed
SERVER-6793 - parallel writer batch lock needs to be involved in yield/tempRelease
1 parent 11420d1 commit cab4356

File tree

4 files changed

+46
-6
lines changed

4 files changed

+46
-6
lines changed

src/mongo/db/d_concurrency.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -278,11 +278,24 @@ namespace mongo {
278278
void Lock::ParallelBatchWriterMode::iAmABatchParticipant() {
279279
lockState()._batchWriter = true;
280280
}
281-
Lock::ParallelBatchWriterSupport::ParallelBatchWriterSupport() :
282-
_lk( lockState()._batchWriter ? 0 : new RWLockRecursive::Shared(ParallelBatchWriterMode::_batchLock) )
283-
{
281+
282+
Lock::ParallelBatchWriterSupport::ParallelBatchWriterSupport() {
283+
relock();
284284
}
285285

286+
void Lock::ParallelBatchWriterSupport::tempRelease() {
287+
_lk.reset( 0 );
288+
}
289+
290+
void Lock::ParallelBatchWriterSupport::relock() {
291+
LockState& ls = lockState();
292+
if ( ! ls._batchWriter ) {
293+
AcquiringParallelWriter a(ls);
294+
_lk.reset( new RWLockRecursive::Shared(ParallelBatchWriterMode::_batchLock) );
295+
}
296+
}
297+
298+
286299
Lock::ScopedLock::ScopedLock( char type )
287300
: _type(type), _stat(0) {
288301
LockState& ls = lockState();
@@ -306,6 +319,7 @@ namespace mongo {
306319
void Lock::ScopedLock::tempRelease() {
307320
long long micros = _timer.micros();
308321
_tempRelease();
322+
_pbws_lk.tempRelease();
309323
_recordTime( micros ); // might as well do after we unlock
310324
}
311325

@@ -324,6 +338,7 @@ namespace mongo {
324338
}
325339

326340
void Lock::ScopedLock::relock() {
341+
_pbws_lk.relock();
327342
_relock();
328343
resetTime();
329344
}

src/mongo/db/d_concurrency.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,15 @@ namespace mongo {
7878

7979
private:
8080
class ParallelBatchWriterSupport : boost::noncopyable {
81-
scoped_ptr<RWLockRecursive::Shared> _lk;
8281
public:
8382
ParallelBatchWriterSupport();
83+
84+
private:
85+
void tempRelease();
86+
void relock();
87+
88+
scoped_ptr<RWLockRecursive::Shared> _lk;
89+
friend class ScopedLock;
8490
};
8591

8692
public:

src/mongo/db/lockstate.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ namespace mongo {
3535
_otherCount(0),
3636
_otherLock(NULL),
3737
_scopedLk(NULL),
38-
_lockPending(false)
38+
_lockPending(false),
39+
_lockPendingParallelWriter(false)
3940
{
4041
}
4142

@@ -241,4 +242,13 @@ namespace mongo {
241242
stat->recordAcquireTimeMicros( _ls.threadState(), _lock->acquireFinished( stat ) );
242243
}
243244

245+
AcquiringParallelWriter::AcquiringParallelWriter( LockState& ls )
246+
: _ls( ls ) {
247+
_ls._lockPendingParallelWriter = true;
248+
}
249+
250+
AcquiringParallelWriter::~AcquiringParallelWriter() {
251+
_ls._lockPendingParallelWriter = false;
252+
}
253+
244254
}

src/mongo/db/lockstate.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ namespace mongo {
5050
bool isLocked( const StringData& ns ); // rwRW
5151

5252
/** pending means we are currently trying to get a lock */
53-
bool hasLockPending() const { return _lockPending; }
53+
bool hasLockPending() const { return _lockPending || _lockPendingParallelWriter; }
5454

5555
// ----
5656

@@ -105,8 +105,10 @@ namespace mongo {
105105
Lock::ScopedLock* _scopedLk;
106106

107107
bool _lockPending;
108+
bool _lockPendingParallelWriter;
108109

109110
friend class Acquiring;
111+
friend class AcquiringParallelWriter;
110112
};
111113

112114
class WrapperForRWLock : boost::noncopyable {
@@ -132,7 +134,14 @@ namespace mongo {
132134
LockState& _ls;
133135
};
134136

137+
class AcquiringParallelWriter {
138+
public:
139+
AcquiringParallelWriter( LockState& ls );
140+
~AcquiringParallelWriter();
135141

142+
private:
143+
LockState& _ls;
144+
};
136145

137146

138147
}

0 commit comments

Comments
 (0)