diff options
Diffstat (limited to 'jstests/slow1/conc_update.js')
-rw-r--r-- | jstests/slow1/conc_update.js | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/jstests/slow1/conc_update.js b/jstests/slow1/conc_update.js new file mode 100644 index 00000000000..b7b8b836831 --- /dev/null +++ b/jstests/slow1/conc_update.js @@ -0,0 +1,57 @@ +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(); |