summaryrefslogtreecommitdiff
path: root/jstests/sharding/remove3.js
blob: 1ca64fc3d10b51d074993ff2997819f038efba01 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// Validates the remove/drain shard functionality when there is data on the shard being removed
(function() {
'use strict';
 
var st = new ShardingTest({ name: "remove_shard3", shards: 2, mongos: 2 });
 
assert.commandWorked(st.s0.adminCommand({ enableSharding: 'TestDB' }));
st.ensurePrimaryShard('TestDB', 'shard0000');
assert.commandWorked(st.s0.adminCommand({ shardCollection: 'TestDB.Coll', key: { _id: 1 } }));
assert.commandWorked(st.s0.adminCommand({ split: 'TestDB.Coll', middle: { _id: 0 } }));
 
// Insert some documents and make sure there are docs on both shards
st.s0.getDB('TestDB').Coll.insert({ _id: -1, value: 'Negative value' });
st.s0.getDB('TestDB').Coll.insert({ _id: 1, value: 'Positive value' });
 
assert.commandWorked(st.s0.adminCommand({ moveChunk: 'TestDB.Coll',
                                          find: { _id: 1 },
                                          to: 'shard0001',
                                          _waitForDelete: true }));
 
// Make sure both mongos instances know of the latest metadata
assert.eq(2, st.s0.getDB('TestDB').Coll.find({}).toArray().length);
assert.eq(2, st.s1.getDB('TestDB').Coll.find({}).toArray().length);
 
// Remove shard0001
var removeRes;
removeRes = assert.commandWorked(st.s0.adminCommand({ removeShard: 'shard0001' }));
assert.eq('started', removeRes.state);
removeRes = assert.commandWorked(st.s0.adminCommand({ removeShard: 'shard0001' }));
assert.eq('ongoing', removeRes.state);
 
// Move the one chunk off shard0001
assert.commandWorked(st.s0.adminCommand({ moveChunk: 'TestDB.Coll',
                                          find: { _id: 1 },
                                          to: 'shard0000',
                                          _waitForDelete: true }));
                                          
// Remove shard must succeed now
removeRes = assert.commandWorked(st.s0.adminCommand({ removeShard: 'shard0001' }));
assert.eq('completed', removeRes.state);
 
// Make sure both mongos instance refresh their metadata and do not reference the missing shard
assert.eq(2, st.s0.getDB('TestDB').Coll.find({}).toArray().length);
assert.eq(2, st.s1.getDB('TestDB').Coll.find({}).toArray().length);
 
st.stop();
 
})();