212 lines
9.3 KiB
JavaScript
212 lines
9.3 KiB
JavaScript
/**
|
|
* Test downgrade behavior for collation:
|
|
* - The server should fail to start up on downgrade to 3.2 or earlier after creating a collection
|
|
* or index with a non-simple collation.
|
|
* - The server should successfully start up on downgrade to 3.2 or earlier after creating a
|
|
* collection or index that omits the collation.
|
|
* - The server should successfully start up on downgrade to 3.2 or earlier after creating a
|
|
* collection or index that explicitly specifies the simple collation with {locale: "simple"}.
|
|
*/
|
|
(function() {
|
|
"use strict";
|
|
|
|
var dbpath = MongoRunner.dataPath + "collation_downgrade";
|
|
resetDbpath(dbpath);
|
|
|
|
var defaultOptions = {
|
|
dbpath: dbpath,
|
|
noCleanData: true,
|
|
// We explicitly set the storage engine as part of the options because not all versions
|
|
// being tested automatically detect it from the storage.bson file.
|
|
storageEngine: jsTest.options().storageEngine || "wiredTiger",
|
|
};
|
|
|
|
var latestOptions = Object.extend({binVersion: "latest"}, defaultOptions);
|
|
|
|
var downgradeVersion = "3.2";
|
|
var downgradeOptions = Object.extend({binVersion: downgradeVersion}, defaultOptions);
|
|
|
|
//
|
|
// Test that downgrade is possible after creating collections or indexes with the simple
|
|
// collation.
|
|
//
|
|
|
|
// Create a collection with a simple collation on the latest version.
|
|
var conn = MongoRunner.runMongod(latestOptions);
|
|
assert.neq(null, conn, "mongod was unable to start up with options: " + tojson(latestOptions));
|
|
|
|
// Set featureCompatibilityVersion to 3.2 to force indices created with the wiredTiger storage
|
|
// engine to use KeyString V0. Otherwise, downgrade will fail due to creating KeyString V1
|
|
// indices rather than exercising the code which prevents downgrading in the presence of
|
|
// non-simple collations.
|
|
assert.commandWorked(conn.getDB("admin").runCommand({setFeatureCompatibilityVersion: "3.2"}));
|
|
|
|
var testDB = conn.getDB("test");
|
|
testDB.dropDatabase();
|
|
assert.commandWorked(testDB.createCollection("simplecollator"));
|
|
|
|
// We should be able to downgrade, since the collection has no collation.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(downgradeOptions);
|
|
assert.neq(null,
|
|
conn,
|
|
"mongod should have been able to downgrade to the latest version of " +
|
|
downgradeVersion + "; options: " + tojson(downgradeOptions));
|
|
|
|
// Start latest again. This time create a collection which specifies the simple collation
|
|
// explicitly.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(latestOptions);
|
|
assert.neq(null, conn, "mongod was unable to start up with options: " + tojson(latestOptions));
|
|
testDB = conn.getDB("test");
|
|
testDB.dropDatabase();
|
|
assert.commandWorked(
|
|
testDB.createCollection("simplecollator", {collation: {locale: "simple"}}));
|
|
|
|
// Again, we should be able to downgrade.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(downgradeOptions);
|
|
assert.neq(null,
|
|
conn,
|
|
"mongod should have been able to downgrade to the latest version of " +
|
|
downgradeVersion + "; options: " + tojson(downgradeOptions));
|
|
|
|
// Start latest and create an index with a simple collation.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(latestOptions);
|
|
assert.neq(null, conn, "mongod was unable to start up with options: " + tojson(latestOptions));
|
|
testDB = conn.getDB("test");
|
|
testDB.dropDatabase();
|
|
assert.commandWorked(testDB.simplecollation.createIndex({a: 1}));
|
|
|
|
// Ensure we can downgrade.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(downgradeOptions);
|
|
assert.neq(null,
|
|
conn,
|
|
"mongod should have been able to downgrade to the latest version of " +
|
|
downgradeVersion + "; options: " + tojson(downgradeOptions));
|
|
|
|
// Start latest and create an index which specifies the simple collation explicitly.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(latestOptions);
|
|
assert.neq(null, conn, "mongod was unable to start up with options: " + tojson(latestOptions));
|
|
testDB = conn.getDB("test");
|
|
testDB.dropDatabase();
|
|
assert.commandWorked(
|
|
testDB.simplecollation.createIndex({a: 1}, {collation: {locale: "simple"}}));
|
|
|
|
// Ensure we can downgrade.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(downgradeOptions);
|
|
assert.neq(null,
|
|
conn,
|
|
"mongod should have been able to downgrade to the latest version of " +
|
|
downgradeVersion + "; options: " + tojson(downgradeOptions));
|
|
|
|
//
|
|
// Test that the server fails to start up on downgrade after creating collections or indexes
|
|
// with a non-simple collation.
|
|
//
|
|
|
|
// Start latest and create a collection with a non-simple collation.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(latestOptions);
|
|
assert.neq(null, conn, "mongod was unable to start up with options: " + tojson(latestOptions));
|
|
testDB = conn.getDB("test");
|
|
testDB.dropDatabase();
|
|
assert.commandWorked(testDB.createCollection("simplecollator"));
|
|
assert.commandWorked(testDB.createCollection("nonsimple", {collation: {locale: "fr"}}));
|
|
|
|
// Downgrade should fail.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(downgradeOptions);
|
|
assert.eq(null,
|
|
conn,
|
|
"mongod shouldn't have been able to downgrade to the latest version of " +
|
|
downgradeVersion + "; options: " + tojson(downgradeOptions));
|
|
|
|
// Start latest and drop the collection with the non-simple collation.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(latestOptions);
|
|
assert.neq(null, conn, "mongod was unable to start up with options: " + tojson(latestOptions));
|
|
testDB = conn.getDB("test");
|
|
testDB.nonsimple.drop();
|
|
|
|
// Now downgrade should succeed.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(downgradeOptions);
|
|
assert.neq(null,
|
|
conn,
|
|
"mongod should have been able to downgrade to the latest version of " +
|
|
downgradeVersion + "; options: " + tojson(downgradeOptions));
|
|
|
|
// Start latest and create an index with a non-simple collation.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(latestOptions);
|
|
assert.neq(null, conn, "mongod was unable to start up with options: " + tojson(latestOptions));
|
|
testDB = conn.getDB("test");
|
|
testDB.dropDatabase();
|
|
assert.commandWorked(testDB.simplecollator.createIndex({a: 1}));
|
|
assert.commandWorked(testDB.nonsimple.createIndex({a: 1}, {collation: {locale: "fr"}}));
|
|
|
|
// Downgrade should fail.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(downgradeOptions);
|
|
assert.eq(null,
|
|
conn,
|
|
"mongod shouldn't have been able to downgrade to the latest version of " +
|
|
downgradeVersion + "; options: " + tojson(downgradeOptions));
|
|
|
|
// Start latest and drop the index with the non-simple collation.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(latestOptions);
|
|
assert.neq(null, conn, "mongod was unable to start up with options: " + tojson(latestOptions));
|
|
testDB = conn.getDB("test");
|
|
assert.commandWorked(testDB.nonsimple.dropIndex({a: 1}));
|
|
|
|
// Now downgrade should succeed.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(downgradeOptions);
|
|
assert.neq(null,
|
|
conn,
|
|
"mongod should have been able to downgrade to the latest version of " +
|
|
downgradeVersion + "; options: " + tojson(downgradeOptions));
|
|
|
|
//
|
|
// Test that downgrade to 3.2.1 and 3.0 always fail. These versions do not have the code capable
|
|
// of unsetting the collation feature bit if all indexes/collections with the collation have
|
|
// been dropped.
|
|
//
|
|
|
|
// Start latest. Create an index with a non-simple collation but then drop it.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(latestOptions);
|
|
assert.neq(null, conn, "mongod was unable to start up with options: " + tojson(latestOptions));
|
|
testDB = conn.getDB("test");
|
|
assert.commandWorked(testDB.nonsimple.createIndex({a: 1}, {collation: {locale: "fr"}}));
|
|
assert.commandWorked(testDB.nonsimple.dropIndex({a: 1}));
|
|
|
|
var downgradeAlwaysFailsVersion = "3.2.1";
|
|
var downgradeAlwaysFailsOptions =
|
|
Object.extend({binVersion: downgradeAlwaysFailsVersion}, defaultOptions);
|
|
|
|
// Downgrade should fail.
|
|
MongoRunner.stopMongod(conn);
|
|
conn = MongoRunner.runMongod(downgradeAlwaysFailsOptions);
|
|
assert.eq(null,
|
|
conn,
|
|
"mongod shouldn't have been able to downgrade to " + downgradeAlwaysFailsVersion +
|
|
"; options: " + tojson(downgradeAlwaysFailsOptions));
|
|
|
|
// Downgrade to 3.0 should also fail.
|
|
downgradeAlwaysFailsVersion = "3.0";
|
|
downgradeAlwaysFailsOptions =
|
|
Object.extend({binVersion: downgradeAlwaysFailsVersion}, defaultOptions);
|
|
conn = MongoRunner.runMongod(downgradeAlwaysFailsOptions);
|
|
assert.eq(null,
|
|
conn,
|
|
"mongod shouldn't have been able to downgrade to " + downgradeAlwaysFailsVersion +
|
|
"; options: " + tojson(downgradeAlwaysFailsOptions));
|
|
})();
|