summaryrefslogtreecommitdiff
path: root/jstests/sharding/cleanup_orphaned_basic.js
blob: fb8893d5677bed93fbd51d2b4faad5222a79636e (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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
//
// Basic tests of cleanupOrphaned. Validates that non allowed uses of the cleanupOrphaned
// command fail.
//

(function() {
"use strict";

/*****************************************************************************
 * Unsharded mongod.
 ****************************************************************************/

// cleanupOrphaned fails against unsharded mongod.
var mongod = MongoRunner.runMongod();
assert.commandFailed(mongod.getDB('admin').runCommand({cleanupOrphaned: 'foo.bar'}));

/*****************************************************************************
 * Bad invocations of cleanupOrphaned command.
 ****************************************************************************/

var st = new ShardingTest({other: {rs: true, rsOptions: {nodes: 2}}});

var mongos = st.s0;
var mongosAdmin = mongos.getDB('admin');
var dbName = 'foo';
var collectionName = 'bar';
var ns = dbName + '.' + collectionName;
var coll = mongos.getCollection(ns);

// cleanupOrphaned fails against mongos ('no such command'): it must be run
// on mongod.
assert.commandFailed(mongosAdmin.runCommand({cleanupOrphaned: ns}));

// cleanupOrphaned must be run on admin DB.
var shardFooDB = st.shard0.getDB(dbName);
assert.commandFailed(shardFooDB.runCommand({cleanupOrphaned: ns}));

// Must be run on primary.
var secondaryAdmin = st.rs0.getSecondary().getDB('admin');
var response = secondaryAdmin.runCommand({cleanupOrphaned: ns});
print('cleanupOrphaned on secondary:');
printjson(response);
assert.commandFailed(response);

var shardAdmin = st.shard0.getDB('admin');
var badNS = ' \\/."*<>:|?';
assert.commandFailed(shardAdmin.runCommand({cleanupOrphaned: badNS}));

// cleanupOrphaned works on sharded collection.
assert.commandWorked(mongosAdmin.runCommand({enableSharding: coll.getDB().getName()}));

st.ensurePrimaryShard(coll.getDB().getName(), st.shard0.shardName);

assert.commandWorked(mongosAdmin.runCommand({shardCollection: ns, key: {_id: 1}}));

assert.commandWorked(shardAdmin.runCommand({cleanupOrphaned: ns}));

/*****************************************************************************
 * Empty shard.
 ****************************************************************************/

// Ping shard[1] so it will be aware that it is sharded. Otherwise cleanupOrphaned
// may fail.
assert.commandWorked(mongosAdmin.runCommand({
    moveChunk: coll.getFullName(),
    find: {_id: 1},
    to: st.shard1.shardName,
    _waitForDelete: true
}));

assert.commandWorked(mongosAdmin.runCommand({
    moveChunk: coll.getFullName(),
    find: {_id: 1},
    to: st.shard0.shardName,
    _waitForDelete: true
}));

// Collection's home is shard0, there are no chunks assigned to shard1.
st.shard1.getCollection(ns).insert({});
assert.eq(null, st.shard1.getDB(dbName).getLastError());
assert.eq(1, st.shard1.getCollection(ns).count());
response = st.shard1.getDB('admin').runCommand({cleanupOrphaned: ns});
assert.commandWorked(response);
assert.eq({_id: {$maxKey: 1}}, response.stoppedAtKey);
assert.eq(
    0, st.shard1.getCollection(ns).count(), "cleanupOrphaned didn't delete orphan on empty shard.");

/*****************************************************************************
 * Bad startingFromKeys.
 ****************************************************************************/

// startingFromKey of MaxKey.
response = shardAdmin.runCommand({cleanupOrphaned: ns, startingFromKey: {_id: MaxKey}});
assert.commandWorked(response);
assert.eq(null, response.stoppedAtKey);

// startingFromKey doesn't match number of fields in shard key.
assert.commandFailed(shardAdmin.runCommand(
    {cleanupOrphaned: ns, startingFromKey: {someKey: 'someValue', someOtherKey: 1}}));

// startingFromKey matches number of fields in shard key but not field names.
assert.commandFailed(
    shardAdmin.runCommand({cleanupOrphaned: ns, startingFromKey: {someKey: 'someValue'}}));

var coll2 = mongos.getCollection('foo.baz');

assert.commandWorked(
    mongosAdmin.runCommand({shardCollection: coll2.getFullName(), key: {a: 1, b: 1}}));

// startingFromKey doesn't match number of fields in shard key.
assert.commandFailed(shardAdmin.runCommand(
    {cleanupOrphaned: coll2.getFullName(), startingFromKey: {someKey: 'someValue'}}));

// startingFromKey matches number of fields in shard key but not field names.
assert.commandFailed(shardAdmin.runCommand(
    {cleanupOrphaned: coll2.getFullName(), startingFromKey: {a: 'someValue', c: 1}}));

st.stop();
MongoRunner.stopMongod(mongod);
})();