0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-12-01 01:21:03 +01:00
mongodb/jstests/slow1/conc_update.js

62 lines
1.8 KiB
JavaScript

(function() {
"use strict";
const conn = MongoRunner.runMongod({nojournal: ""});
assert.neq(null, conn, "mongod was unable to start up");
db = conn.getDB("concurrency");
db.dropDatabase();
const 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}});
const 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);
let querycount = 0;
let decrements = 0;
let misses = 0;
assert.soon(function() {
const 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()
MongoRunner.stopMongod(conn);
})();