summaryrefslogtreecommitdiff
path: root/jstests
diff options
context:
space:
mode:
authorAaron <aaron@10gen.com>2012-10-25 14:07:23 -0700
committerAaron <aaron@10gen.com>2012-11-08 16:32:38 -0800
commit6a51b6b01e4ebdd723e6ad33f07934d5558f9ad7 (patch)
tree28bcdb963e99f213a281148a53b3c801c5fb41d8 /jstests
parentf5d6b28def1f23def5cd1ba551f5dc73277407ff (diff)
downloadmongo-6a51b6b01e4ebdd723e6ad33f07934d5558f9ad7.tar.gz
SERVER-3067 Add killop support for foreground index builds.
Diffstat (limited to 'jstests')
-rw-r--r--jstests/slowNightly/index_killop.js53
1 files changed, 53 insertions, 0 deletions
diff --git a/jstests/slowNightly/index_killop.js b/jstests/slowNightly/index_killop.js
new file mode 100644
index 00000000000..b022e31f3b8
--- /dev/null
+++ b/jstests/slowNightly/index_killop.js
@@ -0,0 +1,53 @@
+// Both foreground and background index builds can be aborted using killop. SERVER-3067
+
+t = db.jstests_slownightly_index_killop;
+t.drop();
+
+// Insert a large number of documents, enough to ensure that an index build on these documents will
+// be interrupted before complete.
+for( i = 0; i < 1e6; ++i ) {
+ t.save( { a:i } );
+}
+db.getLastError();
+
+function debug( x ) {
+// printjson( x );
+}
+
+/** @return the op id for the running index build, or -1 if there is no current index build. */
+function getIndexBuildOpId() {
+ inprog = db.currentOp().inprog;
+ debug( inprog );
+ indexBuildOpId = -1;
+ inprog.forEach( function( op ) {
+ // Identify the index build as an insert into the 'test.system.indexes'
+ // namespace. It is assumed that no other clients are concurrently
+ // accessing the 'test' database.
+ if ( op.op == 'insert' && op.ns == 'test.system.indexes' ) {
+ debug( op.opid );
+ indexBuildOpId = op.opid;
+ }
+ } );
+ return indexBuildOpId;
+}
+
+/** Test that building an index with @param 'options' can be aborted using killop. */
+function testAbortIndexBuild( options ) {
+
+ // Create an index asynchronously by using a new connection.
+ new Mongo( db.getMongo().host ).getCollection( t.toString() ).createIndex( { a:1 }, options );
+
+ // When the index build starts, find its op id.
+ assert.soon( function() { return ( opId = getIndexBuildOpId() ) != -1; } );
+ // Kill the index build.
+ db.killOp( opId );
+
+ // Wait for the index build to stop.
+ assert.soon( function() { return getIndexBuildOpId() == -1; } );
+ // Check that no new index has been created. This verifies that the index build was aborted
+ // rather than successfully completed.
+ assert.eq( [ { _id:1 } ], t.getIndexKeys() );
+}
+
+testAbortIndexBuild( { background:false } );
+testAbortIndexBuild( { background:true } );