diff options
Diffstat (limited to 'jstests')
-rw-r--r-- | jstests/core/list_namespaces_invalidation.js | 62 |
1 files changed, 45 insertions, 17 deletions
diff --git a/jstests/core/list_namespaces_invalidation.js b/jstests/core/list_namespaces_invalidation.js index 81f6c7d69f1..6f8033b5fe4 100644 --- a/jstests/core/list_namespaces_invalidation.js +++ b/jstests/core/list_namespaces_invalidation.js @@ -1,10 +1,13 @@ -// SERVER-27996 Missing invalidation for system.namespaces writes +// SERVER-27996/SERVER-28022 Missing invalidation for system.namespaces writes (function() { 'use strict'; let dbInvalidName = 'system_namespaces_invalidations'; let dbInvalid = db.getSiblingDB(dbInvalidName); let num_collections = 3; - function testNamespaceInvalidation(isRename) { + let DROP = 1; + let RENAME = 2; + let MOVE = 3; + function testNamespaceInvalidation(namespaceAction, batchSize) { dbInvalid.dropDatabase(); // Create enough collections to necessitate multiple cursor batches. @@ -16,30 +19,55 @@ // otherwise. let cmd = dbInvalid.system.indexes.count() ? {find: 'system.namespaces'} : {listCollections: dbInvalidName}; - Object.extend(cmd, {batchSize: 2}); + Object.extend(cmd, {batchSize: batchSize}); let res = dbInvalid.runCommand(cmd); assert.commandWorked(res, 'could not run ' + tojson(cmd)); printjson(res); - // Ensure the cursor has data, drop or rename the collections, and exhaust the cursor. + // Ensure the cursor has data, invalidate the namespace, and exhaust the cursor. let cursor = new DBCommandCursor(dbInvalid.getMongo(), res); let errMsg = 'expected more data from command ' + tojson(cmd) + ', with result ' + tojson(res); assert(cursor.hasNext(), errMsg); - for (let j = 0; j < num_collections; j++) { - if (isRename) { - // Rename the collection to something that does not fit in the previously allocated - // memory for the record. - assert.commandWorked(dbInvalid['coll' + j.toString()].renameCollection( - 'coll' + j.toString() + 'lkdsahflaksjdhfsdkljhfskladhfkahfsakfla' + - 'skfjhaslfaslfkhasklfjhsakljhdsjksahkldjslh')); - } else { - assert(dbInvalid['coll' + j.toString()].drop()); - } + if (namespaceAction == RENAME) { + // Rename the collection to something that does not fit in the previously allocated + // memory for the record. + assert.commandWorked( + dbInvalid['coll1'].renameCollection('coll1' + + 'lkdsahflaksjdhfsdkljhfskladhfkahfsakfla' + + 'skfjhaslfaslfkhasklfjhsakljhdsjksahkldjslh')); + } else if (namespaceAction == DROP) { + assert(dbInvalid['coll1'].drop()); + } else if (namespaceAction == MOVE) { + let modCmd = { + collMod: 'coll1', + validator: { + $or: [ + {phone: {$type: "string"}}, + {email: {$regex: /@mongodb\.com$/}}, + {status: {$in: ["Unknown", "Incomplete"]}}, + {address: {$type: "string"}}, + {ssn: {$type: "string"}}, + {favoriteBook: {$type: "string"}}, + {favoriteColor: {$type: "string"}}, + {favoriteBeverage: {$type: "string"}}, + {favoriteDay: {$type: "string"}}, + {favoriteFood: {$type: "string"}}, + {favoriteSport: {$type: "string"}}, + {favoriteMovie: {$type: "string"}}, + {favoriteShow: {$type: "string"}} + ] + } + }; + assert.commandWorked(dbInvalid.runCommand(modCmd)); } assert.gt(cursor.itcount(), 0, errMsg); } - // Test that we invalidate namespaces for both collection drops and renames. - testNamespaceInvalidation(false); - testNamespaceInvalidation(true); + // Test that we invalidate the old namespace record ID when we remove, rename, or move a + // namespace record. + for (let j = 2; j < 7; j++) { + testNamespaceInvalidation(DROP, j); + testNamespaceInvalidation(RENAME, j); + testNamespaceInvalidation(MOVE, j); + } }()); |