diff options
author | Aaron <aaron@10gen.com> | 2012-10-25 14:07:23 -0700 |
---|---|---|
committer | Aaron <aaron@10gen.com> | 2012-11-08 16:32:38 -0800 |
commit | 6a51b6b01e4ebdd723e6ad33f07934d5558f9ad7 (patch) | |
tree | 28bcdb963e99f213a281148a53b3c801c5fb41d8 /jstests | |
parent | f5d6b28def1f23def5cd1ba551f5dc73277407ff (diff) | |
download | mongo-6a51b6b01e4ebdd723e6ad33f07934d5558f9ad7.tar.gz |
SERVER-3067 Add killop support for foreground index builds.
Diffstat (limited to 'jstests')
-rw-r--r-- | jstests/slowNightly/index_killop.js | 53 |
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 } ); |