summaryrefslogtreecommitdiff
path: root/jstests/sharding/shard_insert_getlasterror_w2.js
blob: a068da936fbcac551d59f959fbd77ef412f4beb5 (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
// replica set as solo shard
// TODO: Add assertion code that catches hang

// The UUID check must be able to contact the shard primaries, but this test manually stops 2/3
// nodes of a replica set.
TestData.skipCheckingUUIDsConsistentAcrossCluster = true;

(function() {
"use strict";

var numDocs = 2000;
var baseName = "shard_insert_getlasterror_w2";
var testDBName = baseName;
var testCollName = 'coll';
var replNodes = 3;

// ~1KB string
var textString = '';
for (var i = 0; i < 40; i++) {
    textString += 'abcdefghijklmnopqrstuvwxyz';
}

// Spin up a sharded cluster, but do not add the shards
var shardingTestConfig =
    {name: baseName, mongos: 1, shards: 1, rs: {nodes: replNodes}, other: {manualAddShard: true}};
var shardingTest = new ShardingTest(shardingTestConfig);

// Get connection to the individual shard
var replSet1 = shardingTest.rs0;

// Add data to it
var testDBReplSet1 = replSet1.getPrimary().getDB(testDBName);
var bulk = testDBReplSet1.foo.initializeUnorderedBulkOp();
for (var i = 0; i < numDocs; i++) {
    bulk.insert({x: i, text: textString});
}
assert.writeOK(bulk.execute());

// Get connection to mongos for the cluster
var mongosConn = shardingTest.s;
var testDB = mongosConn.getDB(testDBName);

// Add replSet1 as only shard
assert.commandWorked(mongosConn.adminCommand({addshard: replSet1.getURL()}));

// Enable sharding on test db and its collection foo
assert.commandWorked(mongosConn.getDB('admin').runCommand({enablesharding: testDBName}));
testDB[testCollName].ensureIndex({x: 1});
assert.commandWorked(mongosConn.getDB('admin').runCommand(
    {shardcollection: testDBName + '.' + testCollName, key: {x: 1}}));

// Test case where GLE should return an error
assert.writeOK(testDB.foo.insert({_id: 'a', x: 1}));
assert.writeError(testDB.foo.insert({_id: 'a', x: 1}, {writeConcern: {w: 2, wtimeout: 30000}}));

// Add more data
bulk = testDB.foo.initializeUnorderedBulkOp();
for (var i = numDocs; i < 2 * numDocs; i++) {
    bulk.insert({x: i, text: textString});
}
assert.writeOK(bulk.execute({w: replNodes, wtimeout: 30000}));

// Take down two nodes and make sure slaveOk reads still work
var primary = replSet1._master;
var secondary1 = replSet1._slaves[0];
var secondary2 = replSet1._slaves[1];
replSet1.stop(secondary1);
replSet1.stop(secondary2);
replSet1.waitForState(primary, ReplSetTest.State.SECONDARY);

testDB.getMongo().adminCommand({setParameter: 1, logLevel: 1});
testDB.getMongo().setSlaveOk();
print("trying some queries");
assert.soon(function() {
    try {
        testDB.foo.find().next();
    } catch (e) {
        print(e);
        return false;
    }
    return true;
}, "Queries took too long to complete correctly.", 2 * 60 * 1000);

// Shutdown cluster
shardingTest.stop();

print('shard_insert_getlasterror_w2.js SUCCESS');
})();