Skip to content

Commit 2feeb81

Browse files
committed
SERVER-4328 mongomutextest wasnt quite right. also now verifying that upgrade actually works and doesnt time out
1 parent 60ef520 commit 2feeb81

File tree

1 file changed

+15
-14
lines changed

1 file changed

+15
-14
lines changed

src/mongo/dbtests/threadedtests.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,10 @@ namespace ThreadedTests {
7575
#endif
7676
ProgressMeter pm;
7777
public:
78-
MongoMutexTest() : pm(N * nthreads) {}
78+
int upgradeWorked, upgradeFailed;
79+
MongoMutexTest() : pm(N * nthreads) {
80+
upgradeWorked = upgradeFailed = 0;
81+
}
7982
void run() {
8083
DEV {
8184
// in _DEBUG builds on linux we mprotect each time a writelock
@@ -93,11 +96,12 @@ namespace ThreadedTests {
9396
private:
9497
virtual void setup() {
9598
}
96-
virtual void subthread(int) {
99+
virtual void subthread(int tnumber) {
97100
Client::initThread("mongomutextest");
98101
sleepmillis(0);
99102
for( int i = 0; i < N; i++ ) {
100-
bool sometimes = std::rand() % 16 == 0;
103+
int x = std::rand();
104+
bool sometimes = (x % 15 == 0);
101105
if( i % 7 == 0 ) {
102106
Lock::GlobalRead r; // nested test
103107
Lock::GlobalRead r2;
@@ -113,17 +117,20 @@ namespace ThreadedTests {
113117
Lock::TempRelease t;
114118
}
115119
}
116-
else if( i == 2 ) {
120+
else if( i % 7 == 4 &&
121+
tnumber == 1 /*only one upgrader legal*/ ) {
117122
Lock::GlobalWrite w;
118123
ASSERT( d.dbMutex.isWriteLocked() );
119124
ASSERT( Lock::isW() );
120-
if( sometimes ) {
125+
if( i % 7 == 2 ) {
121126
Lock::TempRelease t;
122127
}
123128
if( sometimes ) {
124129
w.downgrade();
125130
sleepmillis(0);
126-
w.upgrade();
131+
bool worked = w.upgrade();
132+
if( worked) upgradeWorked++;
133+
else upgradeFailed++;
127134
}
128135
}
129136
else if( i % 7 == 2 ) {
@@ -146,8 +153,6 @@ namespace ThreadedTests {
146153
Lock::TempRelease t;
147154
}
148155
}
149-
// _try
150-
// _temprelrease
151156
else if( i % 7 == 5 ) {
152157
{
153158
Lock::DBRead r("foo");
@@ -158,9 +163,6 @@ namespace ThreadedTests {
158163
{
159164
Lock::DBRead r("bar");
160165
}
161-
/*if( mm->lock_try(1) ) {
162-
mm->unlock();
163-
}*/
164166
}
165167
else if( i % 7 == 6 ) {
166168
if( i > N/2 ) {
@@ -189,9 +191,6 @@ namespace ThreadedTests {
189191
Lock::DBRead r2("foo");
190192
Lock::DBRead r3("local");
191193
}
192-
/*if( mm->lock_shared_try(0) ) {
193-
mm->unlock_shared();
194-
}*/
195194
}
196195
else {
197196
Lock::ThreadSpanningOp::setWLockedNongreedy();
@@ -206,6 +205,8 @@ namespace ThreadedTests {
206205
}
207206
virtual void validate() {
208207
ASSERT( !d.dbMutex.atLeastReadLocked() );
208+
ASSERT( upgradeWorked > upgradeFailed );
209+
ASSERT( upgradeWorked > 4 );
209210
{
210211
Lock::GlobalWrite w;
211212
}

0 commit comments

Comments
 (0)