diff options
Diffstat (limited to 'jstests/sharding/catalog_cache_refresh_counters.js')
| -rw-r--r-- | jstests/sharding/catalog_cache_refresh_counters.js | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/jstests/sharding/catalog_cache_refresh_counters.js b/jstests/sharding/catalog_cache_refresh_counters.js new file mode 100644 index 00000000000..028ef2f2c59 --- /dev/null +++ b/jstests/sharding/catalog_cache_refresh_counters.js @@ -0,0 +1,114 @@ +/** + * Test that operations that get blocked by catalog cache refreshes get logged to + * shardingStatistics. + */ + +(function() { +'use strict'; + +load('jstests/sharding/libs/sharded_transactions_helpers.js'); +load("jstests/sharding/libs/chunk_bounds_util.js"); +load("jstests/sharding/libs/find_chunks_util.js"); + +let st = new ShardingTest({mongos: 2, shards: 2}); +const configDB = st.s.getDB('config'); +const dbName = "test"; +const collName = "foo"; +const ns = dbName + "." + collName; +const mongos0DB = st.s0.getDB(dbName); +const mongos1DB = st.s1.getDB(dbName); +const mongos0Coll = mongos0DB[collName]; +const mongos1Coll = mongos1DB[collName]; + +let setUp = () => { + /** + * Sets up a test by moving chunks to such that one chunk is on each + * shard, with the following distribution: + * shard0: [-inf, 0) + * shard1: [0, inf) + */ + assert.commandWorked(st.s0.adminCommand({enableSharding: dbName})); + assert.commandWorked(st.s0.adminCommand({movePrimary: dbName, to: st.shard0.shardName})); + assert.commandWorked(st.s0.adminCommand({shardCollection: ns, key: {x: 1}})); + assert.commandWorked(st.s0.adminCommand({split: ns, middle: {x: 0}})); + + flushRoutersAndRefreshShardMetadata(st, {ns}); +}; + +let getOpsBlockedByRefresh = () => { + return assert.commandWorked(st.s1.adminCommand({serverStatus: 1})) + .shardingStatistics.catalogCache.operationsBlockedByRefresh; +}; + +let verifyBlockedOperationsChange = (oldOperationsCount, increasedOps) => { + let newOperationsCount = getOpsBlockedByRefresh(); + increasedOps.forEach(op => { + assert.eq(newOperationsCount[op.opType], oldOperationsCount[op.opType] + op.increase); + }); +}; + +let getShardToTargetForMoveChunk = () => { + const chunkDocs = findChunksUtil.findChunksByNs(configDB, ns).toArray(); + const shardChunkBounds = chunkBoundsUtil.findShardChunkBounds(chunkDocs); + const shardThatOwnsChunk = chunkBoundsUtil.findShardForShardKey(st, shardChunkBounds, {x: 100}); + return st.getOther(shardThatOwnsChunk).shardName; +}; + +let runTest = (operationToRunFn, expectedOpIncreases) => { + let opsBlockedByRefresh = getOpsBlockedByRefresh(); + + // Move chunk to ensure stale shard version for the next operation. + assert.commandWorked( + st.s0.adminCommand({moveChunk: ns, find: {x: 100}, to: getShardToTargetForMoveChunk()})); + + operationToRunFn(); + verifyBlockedOperationsChange(opsBlockedByRefresh, expectedOpIncreases); +}; + +setUp(); + +/** + * Verify that insert operations get logged when blocked by a refresh. + */ +runTest(() => assert.commandWorked(mongos1Coll.insert({x: 250})), [ + {opType: 'countAllOperations', increase: 2}, + {opType: 'countInserts', increase: 1}, + {opType: 'countCommands', increase: 1} +]); + +/** + * Verify that queries get logged when blocked by a refresh. + */ +runTest(() => mongos1Coll.findOne({x: 250}), + [{opType: 'countAllOperations', increase: 1}, {opType: 'countQueries', increase: 1}]); + +/** + * Verify that updates get logged when blocked by a refresh. + */ +runTest(() => assert.commandWorked(mongos1Coll.update({x: 250}, {$set: {a: 1}})), [ + {opType: 'countAllOperations', increase: 2}, + {opType: 'countUpdates', increase: 1}, + {opType: 'countCommands', increase: 1} +]); + +/** + * Verify that deletes get logged when blocked by a refresh. + */ +runTest(() => assert.commandWorked(mongos1Coll.remove({x: 250})), [ + {opType: 'countAllOperations', increase: 2}, + {opType: 'countDeletes', increase: 1}, + {opType: 'countCommands', increase: 1} +]); + +/** + * Verify that non-CRUD commands get logged when blocked by a refresh. + */ +runTest(() => assert.commandWorked(mongos1DB.runCommand( + {createIndexes: collName, indexes: [{key: {a: 1}, name: 'index'}]})), + [ + {opType: 'countAllOperations', increase: 1}, + {opType: 'countCommands', increase: 1}, + ]); + +st.stop(); +})(); |
