58 lines
1.5 KiB
JavaScript
58 lines
1.5 KiB
JavaScript
load("jstests/libs/slow_weekly_util.js");
|
|
test = new SlowWeeklyMongod("conc_update");
|
|
db = test.getDB("concurrency");
|
|
db.dropDatabase();
|
|
|
|
NRECORDS = 3 * 1024 * 1024;
|
|
|
|
print("loading " + NRECORDS + " documents (progress msg every 1024*1024 documents)");
|
|
var bulk = db.conc.initializeUnorderedBulkOp();
|
|
for (var i = 0; i < NRECORDS; i++) {
|
|
bulk.insert({x: i});
|
|
}
|
|
assert.writeOK(bulk.execute());
|
|
|
|
print("making an index (this will take a while)");
|
|
db.conc.ensureIndex({x: 1});
|
|
|
|
var c1 = db.conc.count({x: {$lt: NRECORDS}});
|
|
|
|
updater = startParallelShell(
|
|
"db = db.getSisterDB('concurrency');\
|
|
db.concflag.insert({ inprog: true });\
|
|
sleep(20);\
|
|
assert.writeOK(db.conc.update({}, \
|
|
{ $inc: { x: " +
|
|
NRECORDS +
|
|
"}}, false, true)); \
|
|
assert.writeOK(db.concflag.update({}, { inprog: false }));");
|
|
|
|
assert.soon(function() {
|
|
var x = db.concflag.findOne();
|
|
return x && x.inprog;
|
|
}, "wait for fork", 30000, 1);
|
|
|
|
querycount = 0;
|
|
decrements = 0;
|
|
misses = 0;
|
|
|
|
assert.soon(function() {
|
|
c2 = db.conc.count({x: {$lt: NRECORDS}});
|
|
print(c2);
|
|
querycount++;
|
|
if (c2 < c1)
|
|
decrements++;
|
|
else
|
|
misses++;
|
|
c1 = c2;
|
|
return !db.concflag.findOne().inprog;
|
|
}, "update never finished", 2 * 60 * 60 * 1000, 10);
|
|
|
|
print(querycount + " queries, " + decrements + " decrements, " + misses + " misses");
|
|
|
|
assert.eq(NRECORDS, db.conc.count(), "AT END 1");
|
|
|
|
updater(); // wait()
|
|
|
|
test.stop();
|