Files
mongo/jstests/sharding/mongos_validate_writes.js
Kaloian Manassiev 4176a6eadb SERVER-24071 Introduce ChunkRange class
This change introduces a ChunkRange class to be used for parsing and
serialization of chunk min and max bounds. It also switches the chunk
manager and sharding utilities to use ranges encoding the chunk bounds
separately.
2016-05-09 10:07:16 -04:00

88 lines
3.3 KiB
JavaScript

//
// Tests that mongos validating writes when stale does not DOS config servers
//
// Note that this is *unsafe* with broadcast removes and updates
//
(function() {
'use strict';
var st = new ShardingTest({shards: 2, mongos: 3, other: {shardOptions: {verbose: 2}}});
var mongos = st.s0;
var staleMongosA = st.s1;
var staleMongosB = st.s2;
var admin = mongos.getDB("admin");
var config = mongos.getDB("config");
var coll = mongos.getCollection("foo.bar");
var staleCollA = staleMongosA.getCollection(coll + "");
var staleCollB = staleMongosB.getCollection(coll + "");
assert.commandWorked(admin.runCommand({enableSharding: coll.getDB() + ""}));
st.ensurePrimaryShard(coll.getDB().getName(), 'shard0001');
coll.ensureIndex({a: 1});
assert.commandWorked(admin.runCommand({shardCollection: coll + "", key: {a: 1}}));
// Let the stale mongos see the collection state
staleCollA.findOne();
staleCollB.findOne();
// Change the collection sharding state
coll.drop();
coll.ensureIndex({b: 1});
assert.commandWorked(admin.runCommand({shardCollection: coll + "", key: {b: 1}}));
// Make sure that we can successfully insert, even though we have stale state
assert.writeOK(staleCollA.insert({b: "b"}));
// Make sure we unsuccessfully insert with old info
assert.writeError(staleCollB.insert({a: "a"}));
// Change the collection sharding state
coll.drop();
coll.ensureIndex({c: 1});
assert.commandWorked(admin.runCommand({shardCollection: coll + "", key: {c: 1}}));
// Make sure we can successfully upsert, even though we have stale state
assert.writeOK(staleCollA.update({c: "c"}, {c: "c"}, true));
// Make sure we unsuccessfully upsert with old info
assert.writeError(staleCollB.update({b: "b"}, {b: "b"}, true));
// Change the collection sharding state
coll.drop();
coll.ensureIndex({d: 1});
assert.commandWorked(admin.runCommand({shardCollection: coll + "", key: {d: 1}}));
// Make sure we can successfully update, even though we have stale state
assert.writeOK(coll.insert({d: "d"}));
assert.writeOK(staleCollA.update({d: "d"}, {$set: {x: "x"}}, false, false));
assert.eq(staleCollA.findOne().x, "x");
// Make sure we unsuccessfully update with old info
assert.writeError(staleCollB.update({c: "c"}, {$set: {x: "y"}}, false, false));
assert.eq(staleCollB.findOne().x, "x");
// Change the collection sharding state
coll.drop();
coll.ensureIndex({e: 1});
// Deletes need to be across two shards to trigger an error - this is probably an exceptional
// case
assert.commandWorked(admin.runCommand({movePrimary: coll.getDB() + "", to: "shard0000"}));
assert.commandWorked(admin.runCommand({shardCollection: coll + "", key: {e: 1}}));
assert.commandWorked(admin.runCommand({split: coll + "", middle: {e: 0}}));
assert.commandWorked(admin.runCommand({moveChunk: coll + "", find: {e: 0}, to: "shard0001"}));
// Make sure we can successfully remove, even though we have stale state
assert.writeOK(coll.insert({e: "e"}));
assert.writeOK(staleCollA.remove({e: "e"}, true));
assert.eq(null, staleCollA.findOne());
// Make sure we unsuccessfully remove with old info
assert.writeError(staleCollB.remove({d: "d"}, true));
st.stop();
})();