Files
mongo/jstests/sharding/update_immutable_fields.js
Kaloian Manassiev 9ca37ee188 SERVER-19319 Send setShardVersion command after sharding a collection
The shard collection operation needs to inform the former primary shard
for the database containing this collection that the collection is being
sharded. That way, unsharded operations will be rejected when they come
from mongos instances, which are not yet aware the collection became
sharded.

Also reverts commit 280b8e6c83
("SERVER-19319 Temporarily update some tests to run a query after sharding
a collection to force the version to be set")
2015-07-31 14:33:42 -04:00

77 lines
2.6 KiB
JavaScript

// Tests that updates can't change immutable fields (used in sharded system)
var st = new ShardingTest({shards : 2,
mongos : 1,
verbose : 0})
st.stopBalancer();
var mongos = st.s;
var config = mongos.getDB("config");
var coll = mongos.getCollection(jsTestName() + ".coll1");
var shard0 = st.shard0;
printjson(config.adminCommand({enableSharding : coll.getDB() + ""}))
st.ensurePrimaryShard(coll.getDB().getName(), 'shard0000');
printjson(config.adminCommand({shardCollection : "" + coll, key : {a : 1}}))
var getDirectShardedConn = function( st, collName ) {
var shardConnWithVersion = new Mongo( st.shard0.host );
var configConnStr = st._configDB;
var maxChunk = st.s0.getCollection( "config.chunks" )
.find({ ns : collName }).sort({ lastmod : -1 }).next();
var ssvInitCmd = { setShardVersion : collName,
authoritative : true,
configdb : configConnStr,
version : maxChunk.lastmod,
versionEpoch : maxChunk.lastmodEpoch };
printjson( ssvInitCmd );
assert.commandWorked( shardConnWithVersion.getDB( "admin" ).runCommand( ssvInitCmd ) );
return shardConnWithVersion;
}
var shard0Coll = getDirectShardedConn(st, coll.getFullName()).getCollection(coll.getFullName());
// No shard key
shard0Coll.remove({})
assert.writeError(shard0Coll.save({ _id: 3 }));
// Full shard key in save
assert.writeOK(shard0Coll.save({ _id: 1, a: 1 }));
// Full shard key on replacement (basically the same as above)
shard0Coll.remove({})
assert.writeOK(shard0Coll.update({ _id: 1 }, { a: 1 }, true));
// Full shard key after $set
shard0Coll.remove({})
assert.writeOK(shard0Coll.update({ _id: 1 }, { $set: { a: 1 }}, true));
// Update existing doc (replacement), same shard key value
assert.writeOK(shard0Coll.update({ _id: 1 }, { a: 1 }));
//Update existing doc ($set), same shard key value
assert.writeOK(shard0Coll.update({ _id: 1 }, { $set: { a: 1 }}));
// Error due to mutating the shard key (replacement)
assert.writeError(shard0Coll.update({ _id: 1 }, { b: 1 }));
// Error due to mutating the shard key ($set)
assert.writeError(shard0Coll.update({ _id: 1 }, { $unset: { a: 1 }}));
// Error due to removing all the embedded fields.
shard0Coll.remove({})
assert.writeOK(shard0Coll.save({ _id: 2, a: { c: 1, b: 1 }}));
assert.writeError(shard0Coll.update({}, { $unset: { "a.c": 1 }}));
assert.writeError(shard0Coll.update({}, { $unset: { "a.b": 1, "a.c": 1 }}));
jsTest.log("DONE!"); // distinguishes shutdown failures
st.stop();