diff options
Diffstat (limited to 'jstests/replsets/replsets_killop.js')
-rw-r--r-- | jstests/replsets/replsets_killop.js | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/jstests/replsets/replsets_killop.js b/jstests/replsets/replsets_killop.js new file mode 100644 index 00000000000..ea1cd560b91 --- /dev/null +++ b/jstests/replsets/replsets_killop.js @@ -0,0 +1,70 @@ +// Test correctness of replication while a secondary's get more requests are killed on the primary +// using killop. SERVER-7952 + +numDocs = 1e5; + +// Set up a replica set. +replTest = new ReplSetTest({name: 'test', nodes: 3}); +nodes = replTest.startSet(); +replTest.initiate(); +primary = replTest.getPrimary(); +secondary = replTest.getSecondary(); +db = primary.getDB('test'); +db.test.save({a: 0}); +replTest.awaitReplication(); +assert.soon(function() { + return secondary.getDB('test').test.count() == 1; +}); + +// Start a parallel shell to insert new documents on the primary. +inserter = startParallelShell('var bulk = db.test.initializeUnorderedBulkOp(); \ + for( i = 1; i < ' + numDocs + + '; ++i ) { \ + bulk.insert({ a: i }); \ + } \ + bulk.execute();'); + +// Periodically kill replication get mores. +for (i = 0; i < 1e3; ++i) { + allOps = db.currentOp(); + for (j in allOps.inprog) { + op = allOps.inprog[j]; + if (op.ns == 'local.oplog.rs' && op.op == 'getmore') { + db.killOp(op.opid); + } + } + sleep(100); +} + +// Wait for the inserter to finish. +inserter(); + +assert.eq(numDocs, db.test.count()); + +// Return true when the correct number of documents are present on the secondary. Otherwise print +// which documents are missing and return false. +function allReplicated() { + count = secondary.getDB('test').test.count(); + if (count == numDocs) { + // Return true if the count is as expected. + return true; + } + + // Identify and print the missing a-values. + foundSet = {}; + c = secondary.getDB('test').test.find(); + while (c.hasNext()) { + foundSet['' + c.next().a] = true; + } + missing = []; + for (i = 0; i < numDocs; ++i) { + if (!(('' + i) in foundSet)) { + missing.push(i); + } + } + print('count: ' + count + ' missing: ' + missing); + return false; +} + +// Wait for the correct number of (replicated) documents to be present on the secondary. +assert.soon(allReplicated, "didn't replicate all docs", 5 * 60 * 1000); |